Linux驱动:module_platform_driver

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

使用方法:

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 更加简洁,推荐使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值