I2C设备linux驱动程序

时间:2014-06-01 10:56:56

标签: c linux linux-kernel linux-device-driver i2c

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

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

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

1 个答案:

答案 0 :(得分:12)

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

因此,如果您想使用最后一种类型的设备,那么找到正确的示例会有点困难,因为几乎所有示例都专门用于前两种类型的驱动程序。无论如何,如果要创建字符设备,则需要描述file_operations结构中的函数。但是所有功能都是i2c_transferi2c_smbus_read_byte。等等(full list)需要struct i2c_adapterstruct i2c_client。还有两个问题,如何获得结构,以及如何将驱动程序连接到相应的i2c总线,例如i2c-2?

所以有一个未描述的功能herei2c_get_adapter。作为参数,您需要传递i2c总线编号。它返回i2c_adapter结构的链接。使用i2c_client函数可以获得的i2c_new_dummy结构将i2c_adapter和从属地址作为参数传递给它。

之后,您可以使用i2c_transferi2c_smbus_read_byte等功能。最后,您可以在不使用sysfs的情况下描述file_operations结构函数和释放驱动程序,代表您的i2c设备并重建你的内核。

结果代码如下:

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结构的函数中使用此代码。

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