static struct i2c_driver i2c_driver = { .driver = { .name = DRIVER_NAME, .owner = THIS_MODULE, }, .probe = i2c_probe, .remove = i2c_remove, .id_table = i2c_id, }; module_i2c_driver(i2c_driver); I2C 读写函数 __s32 i2c_smbus_write_quick(int file, __u8 value); __s32 i2...
在阅读其他人编写的Linux驱动源码发现,最后驱动注册和注销时并未使用传统的“module_init”和“module_exit”,而是使用一个宏“module_xxx_driver”代替,如module_i2c_driver、module_spi_driver、module_platform_driver等等。 Linux驱动程序模型是“总线驱动”+“设备驱动”,比如i2c总线和i2c设备,spi总...
int i2c_register_driver(struct module *owner, struct i2c_driver *driver) /* @ 将前面注册的 i2c_driver 从 Linux 内核中注销掉 @ driver:要注册的 i2c_drive @ 返回值:无 */ void i2c_del_driver(struct i2c_driver *driver) 具体注册i2c_driver的注册流程: /* i2c 驱动的 probe 函数 */ static ...
i2c_del_driver(&(nxp_nci_i2c_driver) , ); } module_exit(nxp_nci_i2c_driver_exit); #define module_init(initfn)\ static inline initcall_t __maybe_unused __inittest(void) { return initfn; } int init_module(void) __attribute__((alias(#initfn))); #define module_exit(exitfn)\ sta...
在这个示例中,我们定义了一个简单的I2C设备驱动,包括probe和remove函数。probe函数在设备被探测到时调用,用于初始化设备相关的资源;remove函数在设备被移除时调用,用于释放设备相关的资源。我们还定义了设备的ID表,以便I2C核心层能够根据ID来匹配设备驱动。最后,通过module_i2c_driver宏将设备驱动注册到I2C核心层中。
4. 配置设备的寄存器、中断等信息 利用module_i2c_driver宏,将i2c_driver结构注册为一个I2C设备驱动程序。5. 编译和加载驱动程序 将驱动程序代码编译成可加载的内核模块。 使用insmod或modprobe命令加载模块。6. 测试和调试 进行必要的测试与调试,确保驱动能正确与硬件交互,实现预期功能。以上步骤涵盖了...
module_i2c_driver — 注册I2C设备驱动的宏定义 i2c_register_board_info — 静态声明(注册)I2C设备,可多个 i2c_verify_client — 如果设备是i2c_client的dev成员则返回其父指针,否则返回NULL。用来校验设备是否为I2C设备 i2c_lock_adapter — I2C总线持锁操作,会找到最根源的那个i2c_adapter。说明你的模块必须符合...
int (*probe)(struct i2c_client *, const struct i2c_device_id *) 当I2C设备和驱动匹配成功以后 probe函数就会执行。 代码语言:javascript 代码运行次数:0 运行 AI代码解释 struct device_driver driver device_driver 驱动结构体,如果使用设备树的话,需要设置device_driver的of_match_table成员变量,也就是驱...
I2C adapter 即I2C适配器 I2C driver 某个I2C设备的设备驱动,可以以driver理解。 I2C client 某个I2C设备的设备声明,可以以device理解。 1. 2. 3. I2C adapter 是CPU集成或外接的I2C适配器,用来控制各种I2C从设备,其驱动需要完成对适配器的完整描述,最主要的工作是需要完成i2c_algorithm结构体。这个结构体包含了...