2014-09-22 92 views
3

我正在尝试使用Raspberry Pi作为开发工具包,通过I2C总线配置SAA6752HS芯片(MPEG-2编码器)。直到我不得不在芯片的地址0xC2处写入,这是一块蛋糕。对于这个任务,我必须使用一个I2C命令,它需要一个189字节的有效载荷。于是,我偶然发现了I2C驱动程序中的32字节限制,由I2C_SMBUS_BLOCK_MAX在/usr/include/linux/i2c.h中定义。不可能强制不同的最大限制值。 I2C库中的所有内容都会结束到函数i2c_smbus_access中,并且任何具有多于32个字节的请求都会使ioctl返回-1。我不知道如何调试到目前为止。为什么I2C_SMBUS_BLOCK_MAX限制为32个字节?

static inline __s32 i2c_smbus_access(int file, char read_write, __u8 command, 
            int size, union i2c_smbus_data *data) 
{ 
     struct i2c_smbus_ioctl_data args; 

     args.read_write = read_write; 
     args.command = command; 
     args.size = size; 
     args.data = data; 
     return ioctl(file,I2C_SMBUS,&args); 
} 

我无法理解为什么会出现这样的限制,考虑到有需要多于32个字节的有效载荷数据的工作设备(SAA6752HS就是这样的例子)。

有没有办法克服这种限制,而不重写一个新的驱动程序?

预先感谢您。

+0

I2C_SMBUS_BLOCK_MAX有此评论:'/ *作为SMBus的规定标准* /'你确定SAA6752HS讲SMBus和I2C不? SMBus和I2C在许多方面是兼容的,但它们不是一回事。 – nos 2014-09-22 20:54:21

+0

是@nos,我在互联网上阅读了很多,但它离解决方案还很遥远。它只能确认问题。那么与SAA6752HS的交易是什么?和其他芯片有相同的问题?那么使用默认的I2C linux驱动程序无法与非SMBus标准I2C芯片进行通信?为什么I2C驱动仅限于SMBus? – 2014-09-22 20:56:50

+0

@nos我相信SAA6752HS不是SMBus标准,但我无法弄清楚如何使用I2C Linux驱动程序处理非SMBus I2C接口。我该如何处理它? – 2014-09-22 20:59:28

回答

5

下面是Linux的I2C接口的文档:https://www.kernel.org/doc/Documentation/i2c/dev-interface

在可以使用ioctl(I2C_SLAVE)设置从机地址和write系统调用写命令最简单的层面。喜欢的东西:

i2c_write(int file, int address, int subaddress, int size, char *data) { 
    char buf[size + 1];    // note: variable length array 
    ioctl(file, I2C_SLAVE, address); // real code would need to check for an error 
    buf[0] = subaddress;    // need to send everything in one call to write 
    memcpy(buf + 1, data, size);  // so copy subaddress and data to a buffer 
    write(file, buf, size + 1); 
} 
+1

同样的问题谢谢。有效。直接引用I2C_SLAVE对我来说是缺失的部分。我真的不明白为什么这个主题在互联网上有太多的错误信息。你可以找到很多论坛帖子,而没有像这样的简单答案。我希望这篇文章能够帮助别人。 – 2014-09-23 11:31:33

+0

+ 3000我浪费了很多时间在另一个芯片的同一问题 – gregoiregentil 2015-07-10 04:47:42

相关问题