設備驅動-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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM