上一篇: 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 ;
下一篇 :
