module_platform_driver源码分析

简介: module_platform_driver源码分析

module_platform_driver源码分析


在Linux设备驱动开发使用platform平台驱动模型过程中,在定义且初始化好platform_driver结构体变量以后,我们需要向 Linux 内核注册一个platform 驱动,Linux kernel中有两种方法,源码:include/linux/platform_device.h

方式一:

/*
 * use a macro to avoid include chaining to get THIS_MODULE
 */
#define platform_driver_register(drv) \
  __platform_driver_register(drv, THIS_MODULE)
extern int __platform_driver_register(struct platform_driver *,
          struct module *);
/**
 * __platform_driver_register - register a driver for platform-level devices
 * @drv: platform driver structure
 * @owner: owning module/driver
 */
int __platform_driver_register(struct platform_driver *drv,
        struct module *owner)
{
  drv->driver.owner = owner;
  drv->driver.bus = &platform_bus_type;
    /* 最终调用driver_register来注册drv->driver */
  return driver_register(&drv->driver);
}
EXPORT_SYMBOL_GPL(__platform_driver_register);
/**
 * platform_driver_unregister - unregister a driver for platform-level devices
 * @drv: platform driver structure
 */
void platform_driver_unregister(struct platform_driver *drv)
{
  driver_unregister(&drv->driver);
}
EXPORT_SYMBOL_GPL(platform_driver_unregister);

方式二:

/* 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() - 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);

由以上展开可以看出,module_platform_driver是由module_driver封装而来,并填充了platform_driver_register、platform_driver_unregister两个函数作为宏的参数传递给了 module_driver的宏,这样做的目的是统一了接口函数,使得所有驱动的注册、注销函数都能统一的管理。

因此,展开 module_platform_driver(xxx_driver),第一步展开,调用宏module_driver(xxx_driver,platform_driver_register,platform_driver_unregister);第二步展开是展开宏module_driver,展开的结果是(在宏定义里,## 的作用是将连个参数连在一起, # 的作用是加上双引号):

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()实现了 驱动函数的注册和注销操作。

相关文章
|
存储 算法 编译器
【CMake 基础 】CMake命名解析:项目名、目标名与它们的角色
【CMake 基础 】CMake命名解析:项目名、目标名与它们的角色
491 0
|
消息中间件 负载均衡 监控
【面试问题】RabbitMQ 的集群
【1月更文挑战第27天】【面试问题】RabbitMQ 的集群
|
Shell Python
miniconda使用体验
## 简介 miniconda是什么呢? 这里简单用一个公式来说明 miniconda = virtualenv + pyenv + pypi源 通过miniconda可以实现创建隔离的python包环境,下载特定的python包版本,使用conda源上编译好的whl包。可以说一应俱全。 ## 安装 miniconda在Mac可以直接用Brew安装,一行命令 `brew install mini
1217 0
|
7月前
|
监控 固态存储 Linux
如何判断Linux磁盘是SSD还是HDD?
总的来说,判断磁盘是SSD还是HDD并不复杂,只需要使用正确的命令和方法,就可以轻松得到结果。希望这些信息对你有所帮助,如果你还有其他问题,欢迎随时提问。
696 15
|
缓存 弹性计算 运维
网络管理利器:掌握常用的CMD命令
本文介绍了常用的网络CMD命令及其用法,包括`ping`、`ipconfig`、`tracert`、`nslookup`、`netstat`、`route`、`telnet`、`ftp`、`netsh`、`arp`、`nbtstat`、`hostname`、`systeminfo`、`ipconfig /flushdns`和`tasklist`。这些命令在日常的网络管理和故障排查中非常实用,帮助你轻松进行网络诊断、配置和监控。
703 1
|
机器学习/深度学习 算法 Python
【2023 华数杯全国大学生数学建模竞赛】 A题 隔热材料的结构优化控制研究 问题分析、模型建立及参考文献
本文提供了2023年华数杯全国大学生数学建模竞赛A题的详细分析、数学模型建立及参考文献,聚焦于隔热材料的结构优化控制研究,旨在解决单根隔热材料纤维的热导率测量难题,并探讨如何通过优化织物编织结构来提升隔热性能。
193 0
【2023 华数杯全国大学生数学建模竞赛】 A题 隔热材料的结构优化控制研究 问题分析、模型建立及参考文献
|
Linux SoC
Linux设备树(DTS)介绍
**设备树(DTS)是Linux中用于描述硬件信息的文本文件,旨在减少内核与平台相关代码的耦合。DTS文件包含静态硬件配置,不支持动态变更。它被编译成DTB二进制文件,供内核在启动时解析以了解硬件布局。设备树解决了ARM体系结构代码维护的复杂性问题,通过解耦实现vendor修改的独立和共二进制目标。设备树overlay允许对配置进行增量修改,遵循特定规则,如dts覆盖dtsi,先引用后修改。调试时,可使用内置工具反编译dtb或dtbo映像为dts文本以检查内容。**
1067 7
|
Linux 芯片 开发者
Linux 驱动开发基础知识——内核对设备树的处理与使用(十)
Linux 驱动开发基础知识——内核对设备树的处理与使用(十)
1610 0
Linux 驱动开发基础知识——内核对设备树的处理与使用(十)
|
存储 人工智能 iOS开发
Adobe illustrator2023最新免费版下载及功能介绍AI2023
Adobe Illustrator (AI 2023)是Adobe在设计行业生产的最受欢迎的矢量图形软件之一,它已经成为行业标准之一。全球数百万设计师和艺术家正在使用Illustrator进行设计和艺术创作。Illustrator广泛应用于平面设计、标志设计、图标设计、书籍插图、包装设计、印刷、广告设计和插画设计。
2658 0
|
网络协议 安全 Linux
如何修复 SSH Client_loop: send disconnect: Broken pipe Error
如何修复 SSH Client_loop: send disconnect: Broken pipe Error
4819 1