Linux驱动开发基础(匹配详解)

所学来自百问网

目录

1. 简介

2. 函数路径

3. driver_override

4. 设备树匹配

5. id_table

6. name

7. 比较顺序


1. 简介

platform_device 与 platform_driver是挂载在platform_bus_type总线下的两条链表,通过分离的思想负责不同的功能实现,两者需要通过匹配规则构成的一个完整的程序,本篇文章对platform_match函数的匹配规则进行分析,除了ACPI style match

2. 函数路径

函数在platfrom.c文件下的platform_bus_type结构体下的platform_match,通过ctrl + 鼠标点击即可看到源码

以下是函数源码:

通过前两行代码可知,该函数获取了platform_device和platform_driver的结构体的信息

3. driver_override

图解:当platform_device中有定义driver_override属性,则函数通过调用的platform_device结构体的driver_override去匹配platform_driver的name,若匹配成功直接返回1,否则返回0

示例:

4. 设备树匹配

 

图解:通过of_driver_match_device函数中的of_match_device函数,该函数根据drv->of_match_table和dev去匹配,of_match_table是of_device_id的指针变量,而of_device_id是device_driver结构体的属性,of_device_id结构体包含name、type、compatible等属性

而设备树的节点的属性从以下获取

图解:在of_match_device函数中,通过dev->of_node去获取设备树节点的属性信息,of_node是device_node的指针变量,device_node包含着设备树节点的name、type,properties,在property中含有compatible属性

比较规则:

1.首先,如果of_match_table中含有compatible值,就跟dev的compatile 属性比较,若一致则成功,否则返回失败;

2.其次,如果of_match_table中含有type值,就跟dev的device_type属性比较,若一致则成功,否则返回失败;

3.最后,如果of_match_table中含有name值,就跟dev的name属性比较,若一致则成功,否则返回失败。

而设备树中建议不再使用devcie_type和name属性,所以基本上只使用设备节点的compatible属性来寻找匹配的platform_driver。

示例:

设备树节点:

5. id_table

图解:在platform_match_id函数中,通过pdrv->id_table和pdev进行比较,在pdrv->id_table中,platform_device_id是platform_driver的属性,id_table是platform_device_id的指针变量,platform_device_id中含有name属性,进入platform_match_id函数可知两者通过name属性比较

示例:

6. name

图解:通过两者设置的name属性进行匹配

示例:

7. 比较顺序

系统会根据以下顺序进行匹配

比较顺序:driver_override - > 设备树 -> ACPI -> id_table -> name

  • 22
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值