Linux I2C驱动程序移植问题

时间:2018-12-03 02:56:05

标签: linux-device-driver i2c

我正在将I2C驱动程序移植到Linux-4。该设备同时为不同功能提供多个I2C地址。

例如:

address 0xAA is for access of SPI flash. 
address 0xA0 is for access of EEPROM.  
address 0x60 is for normal access (control purpose).  

是否可以在单个I2C设备驱动程序中支持访问不同的I2C地址?

任何帮助表示赞赏, 谢谢

3 个答案:

答案 0 :(得分:1)

我认为有可能。使用i2c_transfer(),可以在要与之通信的设备的i2c_msg结构中提供特定的地址。因此,您的驱动程序将能够与i2c设备的所有功能进行通信。

答案 1 :(得分:0)

取决于您在说什么类型的I2C驱动程序,总线(适配器)或芯片(客户端)驱动程序?

i2c-dev.c是一种具有字符设备接口的总线驱动程序,可将内核底层I2C API导出到用户空间。

对于每个已注册的I2C适配器,内核将在i2c-N用户空间界面中添加/dev设备节点。

但是您不能像简单字符设备或文件那样读取/写入连接到/dev/i2c-N的EEPROM芯片。您需要编写一些有关芯片协议的实用程序。

但是在Linux中,有特殊的EEPROM芯片驱动程序,例如eeprom.cat24.c,用于将地址为0x50..0x57(如果我没记错的话)的I2C EEPROM设备注册到内核并创建文件在/sys用户空间界面中。

您可以在以下位置以文件形式访问它们:/sys/bus/i2c/devices/0-005x/eeprom

答案 2 :(得分:0)

感谢DraženGrašovec和user2699113的帮助。

我正在将I2C设备驱动程序(芯片,客户端)移植到Linux-4.9。 该芯片出于不同目的接受不同的I2C设备地址。 我的目标是在Linux设备树文件(.dts)中仅创建一个I2C设备

我通过使用i2c_new_dummy()解决了我的问题。

在驱动程序探测功能中, 我制作了两个i2c_new_dummy()来创建另外两个i2c客户端。
一个(客户端#1)用于访问I2C地址0xAA,另一个(客户端#2)用于访问I2C地址0xA0。
因此,我可以使用client#1与它的SPI闪存进行通信,并使用client#2访问它的EEPROM。