1. 程式人生 > 其它 >Linux 核心:module_platform_driver巨集

Linux 核心:module_platform_driver巨集

Linux 核心:module_platform_driver巨集

節選自:https://blog.csdn.net/drivelinux/article/details/8656280

背景

在分析platform驅動的時候,看到了這個巨集,因此學習一下。

解析

該函式實際是一個巨集,它在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_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);

最終展開後就是如下形式:

static int __init xxx_init(void)
{
    return platform_driver_register(&xxx);
}
module_init( xxx_init);
static void __exit xxx_init(void)
{
    return platform_driver_unregister(& xxx);
}
module_exit( xxx_exit); 

由上述定義可知,module_platform_driver()巨集的作用就是定義指定名稱的平臺裝置驅動註冊函式和平臺裝置驅動登出函式,並且在函式體內分別通過platform_driver_register()函式和platform_driver_unregister()函式註冊和登出該平臺裝置驅動。