设备驱动-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 ;
下一篇 :