I2C设备的linux驱动

如何使i2c设备的字符设备,打开,closures,ioctl等function? 过去两周我一直在寻找关于它的信息,但找不到任何工作。 我发现了一些基本的Linux设备驱动程序的信息,但它是为2.6内核编写的,我使用3.4.79(我试图在cubian distr上为cubieboard2写这个驱动程序),所以这本书有许多不赞成使用的函数,写我的驱动程序就像那里,但它仍然不工作(给我内核错误,而我正在修理猫字符设备)。 任何人都可以解释我该怎么做,或者至less给我一个工作的例子。

所以,有我的代码: http : //pastebin.com/T7PBTpym

我只是试图让i2c总线的工作,但在我的示波器上,我没有看到任何i2c线,而我没有得到任何错误,当我编译它。 另外我无法find如何将设备驱动程序附加到i2c总线号码。 因为我的cubieboard2上有4个i2c总线,如何将设备驱动程序附加到i2c-1总线上?

感谢你们。 我几个小时前找到了我想要的东西。 所以我看到有三种类型的驱动程序。 一个应该被插入内核,你需要重建你的内核来使用它们。 还有一些驱动程序可以通过sysfs使用设备属性(它们出现在/sys/bus/i2c/driver/your_driver/ )。 而且,第三 – 我的类型 – 司机看起来像字符设备。 其实,你可以把它们组合起来。

所以,如果你想使用最后一种类型的设备,找到正确的例子有点难,因为几乎所有的例子都是专门用于前两种类型的驱动程序的。 无论如何,如果你想创建一个字符设备,你需要从file_operations结构中描述函数。 但所有的功能,如i2c_transferi2c_smbus_read_byte 。 等( 完整列表 )需要struct i2c_adapterstruct i2c_client 。 还有两个问题,如何到达结构,以及如何将驱动程序附加到适当的i2c总线,如i2c-2?

所以这里没有描述一个函数: i2c_get_adapter 。 作为参数,您需要传递i2c总线号码。 它返回一个链接到一个i2c_adapter结构。 i2c_client结构可以通过i2c_new_dummy函数将i2c_adapter和从机地址作为参数传递给它。

之后,您可以使用函数,如i2c_transferi2c_smbus_read_byte等。最后,您可以描述file_operations结构函数,并释放驱动程序,代表您的i2c设备,而无需使用sysfs并重建您的内核。

结果代码如下所示:

 u8 ret; struct i2c_client * my_client; struct i2c_adapter * my_adap = i2c_get_adapter(1); // 1 means i2c-1 bus my_client = i2c_new_dummy (my_adap, 0x69); // 0x69 - slave address on i2c bus i2c_smbus_write_byte(my_client, 0x0f); ret = i2c_smbus_read_byte(my_client); 

你可以直接在你的函数中使用这个代码作为file_operations结构。

希望这个信息会对像我这样的初学者有用。