Linux驱动:module_platform_driver

本文详细介绍了Linux驱动中`module_platform_driver`的使用方法和工作原理。通过展开宏定义,揭示了它如何简化驱动注册过程,并与自定义`module_init`和`module_exit`达到相同效果。结论推荐使用`module_platform_driver`以实现更简洁的驱动注册。
AI助手已提取文章相关产品:

该宏是用来定义驱动的入口函数

使用方法:

include <linux/platform_device.h>

static struct platform_driver power_supply_driver ={
      .driver  = { 
        .name = "power-supply",
        .owner = THIS_MODULE,
        .of_match_table = power_supply_id_table,
    },
    .probe   = power_supply_probe,
    .remove  = power_supply_remove,
    .suspend = power_supply_suspend,
    .resume  = power_supply_resume,
}


module_platform_driver(power_supply_driver)

platform_driver

struct platform_driver {
    int (*probe)(struct platform_device *);
    int (*remove)(struct platform_device *);
    void (*shutdown)(struct platform_device *);
    int (*suspend)(struct platform_device *, pm_message_t state);
    int (*resume)(struct platform_device *);
    struct device_driver driver;
    const struct platform_device_id *id_table;
    bool prevent_deferred_probe;
 };

原理:

  • module_platform_driver :
#define module_platform_driver(__platform_driver) \
    module_driver(__platform_driver, platform_driver_register, \
            platform_driver_unregister)

上面的宏定义展开如下:

module_driver(power_supply_driver, platform_driver_register, \
            platform_driver_unregister)

  • module_driver
    定义:linux/device.h
#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);

展开规则:

 __driver         ----->    power_supply_driver
 __register      ----->   platform_driver_unregister
 __unregister  ----->   platform_driver_register
 __VA_ARGS__ ----->  .....

注意

    C99 引入了对参数个数可变的函数式宏的正式支持。在宏原型的末尾加上符号 ... (就像在参数可变的函数定义中), 宏定义中的伪宏__VA_ARGS__ 就会在调用是 替换成可变参数。
    ##__VA_ARGS__
    当可变参数...的个数为0 时,'##'操作将使预处理器(preprocessor)去除掉它前面的那个逗号,保证编译能够通过

所以上面的方法最终形式如下:


 static int __init power_supply_driver_init(void)
 {
   return platform_driver_register(&(power_supply_driver) );
 }
module_init(power_supply_driver_init); 
static void __exit power_supply_driver_exit(void) 
{ 
    platform_driver_unregister(&(power_supply_driver) ); 
} 
module_exit(power_supply_driver_exit);

结论

驱动中使用module_platform_driver 来注册驱动 跟自定义module_init &&module_exit 的结果是一致的,module_platform_driver 更加简洁,推荐使用

您可能感兴趣的与本文相关内容

Linux内核源代码中,`module_platform_driver`是一个用于简化平台驱动程序注册和注销的宏,而不是一个直接定义的函数。它通常用于设备驱动程序中,以减少样板代码。该宏的定义可以在`include/linux/platform_device.h`文件中找到。 该宏的典型定义如下: ```c #define module_platform_driver(__platform_driver) \ module_driver(__platform_driver, platform_driver_register, \ platform_driver_unregister) ``` 进一步展开,`module_driver`宏通常定义在`include/linux/device.h`中,其定义如下: ```c #define module_driver(__driver, __register, __unregister) \ static int __init __driver##_init(void) \ { \ return __register(&__driver); \ } \ module_init(__driver##_init); \ static void __exit __driver##_exit(void) \ { \ __unregister(&__driver); \ } \ module_exit(__driver##_exit); ``` 通过使用`module_platform_driver`宏,驱动程序开发者可以避免手动编写初始化和退出函数,从而提高代码的可读性和可维护性[^1]。 ### 示例 以下是一个使用`module_platform_driver`的简单示例: ```c #include <linux/module.h> #include <linux/platform_device.h> static int my_platform_probe(struct platform_device *pdev) { pr_info("My Platform Driver Probe\n"); return 0; } static int my_platform_remove(struct platform_device *pdev) { pr_info("My Platform Driver Remove\n"); return 0; } static struct platform_driver my_platform_driver = { .probe = my_platform_probe, .remove = my_platform_remove, .driver = { .name = "my-platform-device", }, }; module_platform_driver(my_platform_driver); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("A Simple Platform Driver Example"); ``` 在这个示例中,`module_platform_driver(my_platform_driver)`会自动创建初始化和退出函数,并分别注册和注销平台驱动程序。 ### 总结 `module_platform_driver`宏的定义位于`include/linux/platform_device.h`,它依赖于`module_driver`宏,而后者定义在`include/linux/device.h`中。这种设计简化了平台驱动程序的注册过程,使开发者能够更专注于驱动逻辑的实现[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值