一尘不染

I2C设备linux驱动程序

linux

如何使用打开,关闭,ioctl等功能为i2c设备制作字符设备?最近两周我一直在寻找有关它的信息,找不到任何有效的方法。我在Essential LinuxDevice Drivers中找到了一些信息,但是它是针对2.6内核编写的,我使用3.4.79(我正尝试在cubian
distr上为cubieboard2编写此驱动程序),因此本书有许多不推荐使用的功能,我试图在那里写我的驱动程序,但仍然不起作用(在我尝试使用cat字符设备时,请给我内核错误)。任何人都可以向我解释该怎么做,或者至少给我一个有效的例子。

因此,有我的代码:http :
//pastebin.com/T7PBTpym

我只是尝试使i2c总线正常工作,但是在我的示波器上,我在i2c线上看不到任何东西,而在编译时却没有错误。我也找不到如何将设备驱动程序附加到i2c总线号。因为我的cubieboard2上有4条i2c总线,例如,如何将设备驱动程序附加到i2c-1总线?


阅读 200

收藏
2020-06-07

共1个答案

一尘不染

感谢大伙们。几个小时前我已经找到了想要的东西。因此,正如我所看到的,有三种类型的驱动程序。应该将其中一个插入内核,然后需要重建内核才能使用它们。您还可以通过sysfsusing设备属性使用驱动程序(它们显示在中/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结构中直接使用此代码。

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

2020-06-07