本节用于介绍设备树下的platform总线
和之前的平台设备总线不同的是使用到了platform_driver里面的device_driver结构体里面的of_device_id
文件位置路径:include/linux/device.h
1 2 3 4 5 6 7
| struct device_driver { ... const char *name; struct module *owner; const struct of_device_id *of_match_table; ... };
|
其中对于变量
文件路径位置:include/linux/mod_devicetable.h
1 2 3 4 5 6
| struct of_device_id { char name[32]; char type[32]; char compatible[128]; const void *data; };
|
总结下来就是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| struct platform_device_id beep_idtable = { .name = "beep_test" };
const struct of_device_id of_match_table_test[] = { {.compatible = "keys"}, {} };
struct platform_driver beep_driver = { .probe = beep_probe, .remove = beep_remove, .driver = { .owner = THIS_MODULE, .name = "123", <----优先级最低 .of_match_table = of_match_table_test, <----优先级最高 }, .id_table = &beep_idtable <----优先级次之 };
|
在probe函数里面里面可以直接获取设备树中的资源,设备树中的资源会放到platform_device结构体下面的device结构体下面的of_node中
如在probe函数中获取设备树设备节点的名称:
1
| printk("beep_res is %s\n", pdev->dev.of_node->name);
|
在Linux内核里面,我们是用一个结构体来描述硬件资源的。
文件位置路径:include/linux/platform_device.h
1 2 3
| struct platform_device { struct device dev; };
|
platform_device里面的device结构体
文件位置路径:include/linux/device.h
1 2 3 4 5 6
| struct device { ... struct device_node *of_node; void (*release)(struct device *dev); ... }
|