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的资源

 

 

五、最终运行结果:

 

posted @   我是李校长  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示