转自:https://blog.csdn.net/weixin_43209963/article/details/108118088
怎么做?
第 166 行指定了 of_match_table,它是用来跟设备树节点匹配的,如果设备树节点中有 compatile 属
性,并且其值等于第 157 行的“ 100as,leddrv”,就会导致第 162 行的 probe 函数被调用。
156 static const struct of_device_id ask100_leds[] = {
157 { .compatible = "100as,leddrv" },
158 { },
159 };
160
161 static struct platform_driver chip_demo_gpio_driver = {
162 .probe = chip_demo_gpio_probe,
163 .remove = chip_demo_gpio_remove,
164 .driver = {
165 .name = "100ask_led",
166 .of_match_table = ask100_leds,
167 },
168 };
169
170 static int __init chip_demo_gpio_drv_init(void)
171 {
172 int err;
173
174 err = platform_driver_register(&chip_demo_gpio_driver);
175 register_led_operations(&board_demo_led_opr);
176
177 return 0;
178 }
179
为什么这么做?
1.要知道内核对设备树的处理流程
从源代码文件 dts 文件开始,设备树的处理过程为:
① dts 在 PC 机上被编译为 dtb 文件;
② u-boot 把 dtb 文件传给内核;
③ 内核解析 dtb 文件,把每一个节点都转换为 device_node 结构体;
④ 对于某些 device_node 结构体,会被转换为 platform_device 结构体。
⑤platform_device 和platform_driver 配对
注意:并非所有的device_node都会转换为platform_device只有以下的device_node会转换:
- 该节点必须含有compatible属性
- 根节点的子节点(节点必须含有compatible属性)
- 含有特殊compatible属性的节点的子节点(子节点必须含有compatible属性)这些特殊的compatilbe属性为:
“simple-bus”,“simple- mfd”,“isa”,"arm,amba-bus " - 根节点是例外的,生成platfrom_device时,即使有compatible属性也不会处理
这里的第⑤怎么实现的呢,有5个比较方式
第一个是最先比较:是否强制选择某个driver
比较 platform_device. driver_override 和 platform_driver.driver.name
可以设置 platform_device 的 driver_override,强制选择某个 platform_driver。
第二个比较:设备树信息
比较: platform_device. dev.of_node 和 platform_driver.driver.of_match_table。
由设备树节点转换得来的 platform_device 中,含有一个结构体: of_node。
它的类型如下:
如果一个 platform_driver 支持设备树,它的 platform_driver.driver.of_match_table 是一个数组,
类型如下:
使用设备树信息来判断 dev 和 drv 是否配对时,
首先,如果 of_match_table 中含有 compatible 值,就跟 dev 的 compatile 属性比较,若一致则成功,
否则返回失败;
其次,如果 of_match_table 中含有 type 值,就跟 dev 的 device_type 属性比较,若一致则成功,否则
返回失败;
最后,如果 of_match_table 中含有 name 值,就跟 dev 的 name 属性比较,若一致则成功,否则返回失败
而设备树中建议不再使用 devcie_type 和 name 属性,所以基本上只使用设备节点的 compatible 属性来寻找匹配的platform_driver。
到这里我们就知道怎么添加设备树节点了吧,我们接着往下看完剩下两个比较device和drevers 的方式吧
第三个比较:platform_device_id
比较 platform_device. name 和 platform_driver.id_table[i].name, id_table 中可能有多项。
platform_driver.id_table 是“ platform_device_id”指针,表示该 drv 支持若干个 device,它里面
列出了各个 device 的{.name, .driver_data},其中的“ name”表示该 drv 支持的设备的名字, driver_data
是些提供给该 device 的私有数据。
最后比较:platform_device.name 和 platform_driver.driver.name
platform_driver.id_table 可能为空,
这时可以根据 platform_driver.driver.name 来寻找同名的 platform_device。