如何制作一个字符设备为i2c设备,具有打开,关闭,ioctl等功能?我过去两周一直在寻找关于它的信息,但找不到任何有用的东西。我在Essential Linux设备驱动程序中找到了一些信息,但它是为2.6内核编写的,我使用的是3.4.79 (我正在尝试在cubian发行版上为cubieboard2编写这个驱动程序)所以这本书有很多不推荐使用的函数,我试着像那里一样编写我的驱动程序,但它仍然不能工作(给我内核错误,而我是真的猫字符设备)。有没有人能给我解释一下该怎么做,或者至少给我一个有效的例子。
下面是我的代码:http://pastebin.com/T7PBTpym
我只是尝试让i2c总线工作,但是在我的示波器上我看不到i2c线路上的任何东西,当我编译它时也没有得到任何错误。另外,我找不到如何将设备驱动程序附加到i2c总线编号。因为我的cubieboard2上有4条i2c总线,例如,如何将设备驱动程序附加到i2c-1总线?
发布于 2014-06-02 05:58:47
谢谢你们。我几个小时前就找到我想要的了。因此,我看到有三种类型的驱动程序。其中一个应该插入到内核中,您需要重新构建内核才能使用它们。还有一些驱动程序可以使用设备属性通过sysfs使用(它们出现在/sys/bus/i2c/driver/your_driver/中)。第三,我的类型驱动程序,看起来像字符设备。实际上,您可以将它们组合在一起。
所以,如果你想使用最后一种类型的设备,很难找到正确的例子,因为几乎所有的例子都是针对前两种类型的驱动程序。无论如何,如果你想创建一个字符设备,你需要从file_operations结构中描述函数。而是像i2c_transfer,i2c_smbus_read_byte这样的所有函数。等。(full list)需要struct i2c_adapter或struct i2c_client。这里有两个问题,如何获得这些结构,以及如何将驱动程序附加到适当的i2c总线,如i2c-2?
所以有一个here没有描述的函数:i2c_get_adapter。作为参数,您需要传递i2c总线编号。它返回一个指向i2c_adapter结构的链接。您可以通过i2c_new_dummy函数将i2c_adapter和从属地址作为参数传递给它,从而获得i2c_client结构。
在此之后,您可以使用诸如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);您可以在file_operations结构的函数中直接使用此代码。
希望这些信息对像我这样的初学者有用。
https://stackoverflow.com/questions/23979129
复制相似问题