所学来自百问网
目录
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