设备驱动-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 ;
下一篇 :
分类:
linux kernel
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)