linux 驱动-匹配1 (platform_bus_type)

目录

匹配入口

[匹配顺序(platform_match )](#匹配顺序(platform_match ))

方式1:

方式2(重点)

方式3

方式4 (重点)


匹配入口

driver_match_device 实际调用platform_match

cpp 复制代码
driver_match_device(drv, dev);

static inline int driver_match_device(struct device_driver *drv,
				      struct device *dev)
{
	return drv->bus->match ? drv->bus->match(dev, drv) : 1;
}

匹配顺序(platform_match )

static struct platform_driver bcm2835_rng_driver = {

.driver = {

.name = "bcm2835-rng", 方式1 /方式5

.of_match_table = bcm2835_rng_of_match, 方式2 /方式3()

},

.probe = bcm2835_rng_probe,

.id_table = bcm2835_rng_devtype, 方式4

};

cpp 复制代码
static int platform_match(struct device *dev, struct device_driver *drv)
{
	struct platform_device *pdev = to_platform_device(dev);
	struct platform_driver *pdrv = to_platform_driver(drv);

	/* When driver_override is set, only bind to the matching driver */
	if (pdev->driver_override)    	//方式1: 根据device_driver 的name
		return !strcmp(pdev->driver_override, drv->name);

	/* Attempt an OF style match first */
	if (of_driver_match_device(dev, drv))  //方式2: 根据device_driver的of_match_table
		return 1;                              去匹配device_node的compatibale/type/name

	/* Then try ACPI style match */
	if (acpi_driver_match_device(dev, drv))//方式3: 根据 device_driver的drv->acpi_match_table, drv->of_match_table
		return 1;

	/* Then try to match against the id table */
	if (pdrv->id_table)			 //方式4:根据platform_driver驱动的id_table(id->name 与pdev->name)
		return platform_match_id(pdrv->id_table, pdev) != NULL;

	/* fall-back to driver name match */
	return (strcmp(pdev->name, drv->name) == 0);
						//方式5: 根据device_driver的name
}

方式1:

说明:driver_override 主要用于调试驱动,强制指定一个驱动来绑定到这个设备

操作: 用户空间通过特定的接口(如 sysfs)来设置这个值

实例: echo "my_driver" > /sys/bus/platform/devices/my_device/driver_override

方式2(重点)

根据of_device_id 的 compatible, type, name顺序去匹配device_node的compatible, type, name

方式3

acpi 方式,暂略

方式4 (重点)

static struct platform_device_id bcm2835_rng_devtype\[\] = {

{ .name = "bcm2835-rng" },

{ .name = "bcm63xx-rng" },

{ /* sentinel */ }

};

struct platform_device_id {

char namePLATFORM_NAME_SIZE;

kernel_ulong_t driver_data;

};

static const struct platform_device_id *platform_match_id(

const struct platform_device_id *id, struct platform_device *pdev)

{

while (id->name0) {

if (strcmp(pdev->name, id->name) == 0) {

pdev->id_entry = id; 填充platform_device 的id_entry

return id;

}

id++;

}

return NULL;

}

方式5:

strcmp(pdev->name, drv->name) == 0

相关推荐
Android系统攻城狮5 小时前
Linux Gstreamer深度解析之gst_audio_ring_buffer_delay调用流程与实战(七十二)
linux·运维·服务器·gstreamer音视频·音视频进阶
快乐的韭菜根根6 小时前
ubuntu 安装slurm并配置
linux·运维·ubuntu
倒头就睡的小比特8 小时前
Linux基础指令3
linux·服务器
梦帮科技8 小时前
Kali Linux Scapy 畸形报文构造学——深度解剖非法 TCP Flags 与反常序列号
linux·爬虫·神经网络·算法·数学建模·系统架构·模拟退火算法
盛世宏博智慧档案8 小时前
智慧档案平台驱动开发实战:恒湿消毒净化一体机 Modbus-RTU 协议解析
驱动开发·恒湿机
半杯咖啡半行码9 小时前
Linux 驱动开发入门:内核模块编程基础
linux·服务器·网络
Herbert_hwt9 小时前
OpenSpec 实战演练:从“猜数字”到“暗黑模式”的规范驱动开发之旅
驱动开发
别动我齐刘海10 小时前
Linux 系统调试学习2
linux·运维·c++·人工智能·学习·机器学习·机器人
龙虾电话10 小时前
语音机器人打断不进去:VAD 双阈值迟滞里一个共用的 bool,和它引发的连锁误判
linux
honsor10 小时前
机房IP化改造首选:以太网温湿度传感器,PoE供电+Modbus TCP一网搞定
linux·运维·服务器