我正在使用已加载的 /dev/i2c-1 主驱动程序与 i2c 从设备进行通信,该驱动程序已在我的 Linux 计算机中加载并工作。该从设备需要多个同步写入以及读取的地址偏移。
我确定我需要使用 i2c_transfer() 和 i2c_msg 数组来执行这些操作。我以前从未在内核空间中编写过代码,我需要一些关于如何获得的指导“指向驱动程序实例的设备结构的指针”我的系统上加载的 i2c 主驱动程序,以便我可以从用户空间调用 i2c_transfer() 函数。这是我在网上找到的有关如何使用 i2c_transfer() 的一些提示的链接; https://docs.zephyrproject.org/apidoc/latest/group__i2c__interface_ga540f88fd7f8f85eaad7872fe24a00267.html
i2c_master 驱动程序注册在我系统的总线 1 上。从机地址是 0x6c,我可以使用命令行中的 i2c_set 和 i2c_get 命令手动读取/写入。
如何在系统中找到当前注册的设备/驱动程序结构的指针,以便我可以将其引用到此 c 函数?
答案1
一种方法是在 i2c 设备驱动程序内部创建一个结构指针(指向已注册的设备类型 - 我猜它是 struct i2c_client*),并在加载驱动程序时(在探测函数中)使用设备指针加载它。
然后应该导出结构指针,您可以在可加载内核模块中访问该指针。使用特定的方法和函数写入该设备(您应该在 i2c.h 中找到它)
但该方法并不是很好,因为对该指针的任何错误处理都可能导致内核崩溃。