2014-09-22 93 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

相關問題