当前位置: 首页 > news >正文

了解module_driver宏

module_driver这个宏,在Linux驱动中,应用比较多,所以要重点掌握,这对理解驱动程序很有帮助。

打开“include/linux/device.h”

#define (__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);

打开“include/linux/i2c.h”

#define module_i2c_driver(__i2c_driver) \

module_driver(__i2c_driver, i2c_add_driver, i2c_del_driver)

/*module_init()为驱动入口函数

module_exit()为驱动出口函数

*/

举例:

static struct i2c_driver pcf8563_driver = {
    .driver        = {
        .name    = "rtc-pcf8563",/* 驱动名字,用于和设备匹配 */
        .of_match_table = of_match_ptr(pcf8563_of_match),/*设备树匹配表*/
    },
    .probe        = pcf8563_probe,/*platform的probe函数为pcf8563_probe()*/
    .id_table    = pcf8563_id,/*传统匹配方式ID列表*/
};

module_i2c_driver(pcf8563_driver);

因此module_driver(pcf8563_driver, i2c_add_driver, i2c_del_driver)展开后,就是下面的内容:

static int __init  pcf8563_driver_init(void)

{

return i2c_add_driver( &(pcf8563_driver) );

}

module_init(pcf8563_driver_init);

static void __exit pcf8563_driver_exit(void)

{

i2c_del_driver(&(pcf8563_driver) );

}

module_exit(pcf8563_driver_exit);

同理:

打开“include/linux/platform_device.h”文件,查看“module_platform_driver”。见下图:

“module_platform_driver函数”用来向linux内核注册platform驱动,这是一个宏。

#define module_platform_driver(__platform_driver) \

module_driver(__platform_driver, platform_driver_register, platform_driver_unregister)

因此module_platform_driver(gpio_led_driver)展开后,就是:

static int __init gpio_led_driver_init(void)

{

  return platform_driver_register (&(gpio_led_driver));

   //向Linux内核注册一个platform驱动

}

module_init(gpio_led_driver_init);

static void __exit gpio_led_driver_exit(void)

{

  platform_driver_unregister (&(gpio_led_driver) );

  //卸载一个platform驱动

}

module_exit(gpio_led_driver_exit);

相关文章:

  • Flask中获取请求参数的一些方式总结
  • 什么是GraphQL?
  • Day45(补)【软考】2022年下半年软考软件设计师综合知识真题-计算机软件知识1
  • 电子制造企业数字化转型实战:基于Odoo构建MES平台的深度解决方案
  • DC-7靶机渗透测试全过程
  • 学习数据结构(10)栈和队列下+二叉树(堆)上
  • 机器学习实战(2):数据预处理——机器学习的第一步
  • C++效率掌握之STL库:string底层剖析
  • Zotero7 从下载到安装
  • K-均值(K-means)
  • LM Studio笔记
  • 使用 Vite + React 19 集成 Tailwind CSS 与 shadcn/ui 组件库完整指南
  • 日常知识点之遗留问题梳理(被问到用uml画设计模式)
  • Promise详解大全:介绍、九个方法使用和区别、返回值详解
  • 全面理解-c++11的引用折叠
  • PyQt6/PySide6 的 QPropertyAnimation 类
  • Golang GC 三色标记法
  • 多维度健康养生指南
  • 【计算机网络】网络层数据包(Packet)格式
  • 全方位养生指南:打造健康生活蓝图
  • 特朗普访问卡塔尔,两国签署多项合作协议
  • 小耳朵等来了春天:公益义诊筛查专家走进安徽安庆
  • 京东美团饿了么等外卖平台被约谈
  • 专访|导演刘江:给谍战题材注入现实主义的魂
  • 长沙查处疑似非法代孕:有人企图跳窗,有女子被麻醉躺手术台
  • 云南一男子持刀致邻居3死1重伤案二审开庭,未当庭宣判