设备驱动-i2c驱动-module_i2c_driver的使用

 

上一篇: module_init  宏解析

https://www.cnblogs.com/zhangzhiwei122/p/16125406.html

 

module_i2c_driver 

module_i2c_driver 是一个宏,简化 i2c driver 模块中的重复代码

linux/include/linux/i2c.h 

 914/**
 915 * module_i2c_driver() - Helper macro for registering a modular I2C driver
 916 * @__i2c_driver: i2c_driver struct
 917 *
 918 * Helper macro for I2C drivers which do not do anything special in module
 919 * init/exit. This eliminates a lot of boilerplate. Each module may only
 920 * use this macro once, and calling it replaces module_init() and module_exit()
 921 */
 922#define module_i2c_driver(__i2c_driver) \
 923        module_driver(__i2c_driver, i2c_add_driver, \
 924                        i2c_del_driver)

里面用到 module_driver 也是一个宏,用于简化 重复代码 ; 

第一个参数是 struct i2c_driver 对象的名称 ; 是对象的名称,宏内部会对其进行 取地址 操作 ; 

第二个参数是 自动生成函数 int xxx_init(void) 中调用的函数; int xx_init(){  i2c_add_driver ( & __i2c_driver ); } 

第三个参数是 自动生成函数 void xx_exit(void)  中调用的函数; void xx_exit() {  i2c_del_driver ( &__i2c_driver) ; }

module_driver 

include/linux/device/driver.h

 244/**
 245 * module_driver() - Helper macro for drivers that don't do anything
 246 * special in module init/exit. This eliminates a lot of boilerplate.
 247 * Each module may only use this macro once, and calling it replaces
 248 * module_init() and module_exit().
 249 *
 250 * @__driver: driver name
 251 * @__register: register function for this driver type
 252 * @__unregister: unregister function for this driver type
 253 * @...: Additional arguments to be passed to __register and __unregister.
 254 *
 255 * Use this macro to construct bus specific macros for registering
 256 * drivers, and do not use it on its own.
 257 */
 258#define module_driver(__driver, __register, __unregister, ...) \
 259static int __init __driver##_init(void) \
 260{ \
 261        return __register(&(__driver) , ##__VA_ARGS__); \
 262} \
 263module_init(__driver##_init); \
 264static void __exit __driver##_exit(void) \
 265{ \
 266        __unregister(&(__driver) , ##__VA_ARGS__); \
 267} \
 268module_exit(__driver##_exit);

 

生成module_init 及 module_init 里面调用的函数; 调用的函数内部, 使用 给定的  register 函数,对给定的 driver 对象 进行 register ; 

生成 module_exit 及 module_exit 里面调用的函数; 调用函数内部,使用 给定的 unregister 函数,对给定的 driver 对象进行 unregister ; 

 

 

下一篇 : 

设备驱动-i2c驱动-i2c_add_driver-driver_register-probe函数调用 

https://www.cnblogs.com/zhangzhiwei122/p/16125014.html

posted @ 2022-04-10 11:13  张志伟122  阅读(952)  评论(0编辑  收藏  举报