I2C设备linux驱动程序

mis*_*skt 8 c linux i2c linux-device-driver linux-kernel

如何为i2c设备制作一个字符设备,具有开放,关闭,ioctl等功能?我在过去两周内一直在寻找有关它的信息,但找不到任何有用的信息.我在Essential Linux设备驱动程序中找到了一些信息,但它是为2.6内核编写的,我使用3.4.79(我试图在cubian distr上为cubieboard2编写这个驱动程序)所以这本书有许多不推荐使用的函数,我试过像那里写我的驱动程序,但它仍然无法工作(当我正在修改cat字符设备时给我内核错误).任何人都可以解释我该怎么做,或者至少给我一个有效的例子.

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

我只是试着让i2c总线正常工作,但在我的示波器上我没有在i2c线上看到任何东西,而我编译时没有任何错误.另外我找不到如何将设备驱动程序连接到i2c总线编号.因为我的cubieboard2上有4个i2c总线,以及如何将设备驱动程序连接到i2c-1总线上?

mis*_*skt 13

感谢你们.几个小时前我找到了我想要的东西.所以我看到有三种类型的驱动程序.应该将一个插入到内核中,您需要重建内核才能使用它们.您还可以通过sysfs使用设备属性(它们出现在/sys/bus/i2c/driver/your_driver/)中使用驱动程序.而且,第三 - 我的类型 - 看起来像角色设备的驱动程序.实际上,你可以将它们结合起来.

因此,如果您想使用最后一种类型的设备,找到正确的示例会有点困难,因为几乎所有示例都专门用于前两种类型的驱动程序.无论如何,如果要创建字符设备,则需要从file_operations结构中描述函数.但所有功能,如i2c_transfer,i2c_smbus_read_byte.等等(完整列表)需要struct i2c_adapter或struct i2c_client.还有两个问题,如何获得结构,以及如何将驱动程序连接到适当的i2c总线,例如i2c-2?

因此,有是没有描述的功能在这里:i2c_get_adapter.作为参数,您需要传递i2c总线编号.它返回一个i2c_adapter结构的链接.i2c_client您可以通过i2c_new_dummy函数传递获得的结构i2c_adapter和作为参数的从属地址.

之后,你可以使用的功能,例如i2c_transfer,i2c_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);
Run Code Online (Sandbox Code Playgroud)

您可以直接在file_operations结构的函数中使用此代码.

希望这些信息对像我这样的初学者有用.