irpas技术客

module_platform_driver()_铁头小哥_linux module_platform_driver

大大的周 2028

在Linux设备驱动开发使用platform平台驱动模型过程中,在定义且初始化好platform_driver结构体变量以后,我们需要向 Linux 内核注册一个 platform 驱动。下面介绍两种方法。

方法一: /** * 在驱动入口函数里面调用platform_driver_register函数,platform_driver_register函数 * 原型如下所示: */ int platform_driver_register(struct platform_driver *driver) // driver:要注册的 platform 驱动。 // 返回值:负数,失败;0,成功。 /** *还需要在驱动卸载函数中通过platform_driver_unregister函数卸载platform驱动, *platform_driver_unregister 函数原型如下: */ void platform_driver_unregister(struct platform_driver *drv) // drv:要卸载的 platform 驱动。 // 返回值:无。 /** * 具体驱动代码中实现如下所示 */ // 驱动模块加载 static int __init xxx_init(void) { return platform_driver_register(&xxx_driver); } module_init(xxx_init); // 驱动模块卸载 static void __exit xxx_exit(void) { platform_driver_unregister(&xxx_driver); } module_exit(xxx_exit); 方法二:

除了方法一这种传统方法以外, Linux 内核中会大量采用 module_platform_driver 来完成向 Linux 内核注册 platform 驱动的操作。 module_platform_driver 定义在 include/linux/platform_device.h 文件中,如下:

/* module_platform_driver() - Helper macro for drivers that don't do * anything special in module init/exit. This eliminates a lot of * boilerplate. Each module may only use this macro once, and * calling it replaces module_init() and module_exit() */ #define module_platform_driver(__platform_driver) \ module_driver(__platform_driver, platform_driver_register, \ platform_driver_unregister)

可以看出,module_platform_driver 依赖 module_driver,module_driver 也是一个宏,定义在include/linux/device.h 文件中,内容如下:

/** * module_driver() - Helper macro for drivers that don't do anything * special in module init/exit. This eliminates a lot of boilerplate. * Each module may only use this macro once, and calling it replaces * module_init() and module_exit(). * * @__driver: driver name * @__register: register function for this driver type * @__unregister: unregister function for this driver type * @...: Additional arguments to be passed to __register and __unregister. * * Use this macro to construct bus specific macros for registering * drivers, and do not use it on its own. */ #define module_driver(__driver, __register, __unregister, ...) \ static int __init __driver##_init(void) \ { \ return __register(&(__driver) , ##__VA_ARGS__); \ } \ module_init(__driver##_init); \ static void __exit __driver##_exit(void) \ { \ __unregister(&(__driver) , ##__VA_ARGS__); \ } \ module_exit(__driver##_exit); /** * 具体驱动代码中实现如下所示 */ module_platform_driver(xxx_driver);

因此方法一就是方法二的展开形式。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #Linux #内核注册一个 #Platform #驱动 #下面介绍两种方法