02-platform总线
对于platform驱动框架,简单理解起来就是 driver和device匹配成功之后,执行probe函数,而probe函数中实现了字符设备驱动的基本流程,以及获取了device的资源。关键点存在于如下几点
1、driver和device如何匹配到
2、driver如何获取到device的信息
一、针对上面这两个关键点,需要了解一下几个driver和device关键的几个结构体:
1、device结构体:
(1)platform_device结构体(https://elixir.bootlin.com/linux/v4.9.125/source/include/linux/platform_device.h#L23)
struct platform_device {
const char *name; //name表示设备名字,就是此名字用于和driver匹配
int id;
bool id_auto;
struct device dev;
u32 num_resources;//device资源数量
struct resource *resource;//resource表示资源,也就是设备信息
const struct platform_device_id *id_entry;
char *driver_override; /* Driver name to force a match */
/* MFD cell pointer */
struct mfd_cell *mfd_cell;
/* arch specific additions */
struct pdev_archdata archdata;
};
(2)struct resource *resource;(https://elixir.bootlin.com/linux/v4.9.125/source/include/linux/ioport.h#L18)
struct resource {
resource_size_t start;//start和end分别表示资源的起始和终止信息,对于内存类的资源,就表示内存起始和终止地址,
resource_size_t end;
const char *name;//资源名字
unsigned long flags;//flags表示资源类型,可选的资源类型(后续学习详细的资源类型意思)
unsigned long desc;
struct resource *parent, *sibling, *child;
};
使用方法如下:

2、driver结构体:
struct platform_driver {
int (*probe)(struct platform_device *);//当driver和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;//每个 platform_driver 结构体有一个 id_table成员变量,id 信息存放着这个 platformd 驱动所支持的驱动类型。
bool prevent_deferred_probe;
};


使用方法如下:

三、driver和device是如何匹配的呢?
首先linux使用bus_type结构体表示总线,platform总线是bus_type结构体的一个实例。platform使用 platform_match 函数来进行device和driver之间的匹配。


接下来,让我们看一下platform_match函数的实现。可以看到可以使用多种方式实现匹配
(1)of_driver_match_device :设备树匹配
OF 类型的匹配,也就是设备树采用的匹配方式,of_driver_match_device 函数定义在文件 include/linux/of_device.h 中。 device_driver 结构体(表示设备驱动)中有个名为of_match_table的成员变量,此成员变量保存着驱动的compatible匹配表,设备树中的每个设备节点的 compatible 属性会和 of_match_table 表中的所有成员比较,查看是否有相同的条目,如果有的话就表示设备和此驱动匹配,设备和驱动匹配成功以后 probe 函数就会执行
(2)platform_match_id(pdrv->id_table, pdev):id_table 匹配,
每个 platform_driver 结构体有一个 id_table成员变量
(3)(strcmp(pdev->name, drv->name):依照device和driver 结构体 中的name匹配
bus_type:https://elixir.bootlin.com/linux/v4.9.125/source/include/linux/device.h#L109
platform_match:https://elixir.bootlin.com/linux/v4.9.125/source/drivers/base/platform.c#L1130
四、driver如何获取到 device中的资源
1、platform_get_resource 函数实际就是获取platform_device结构体中resource的资源
五、最终运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)