第十九节、设备树下的platform总线
本节用于介绍设备树下的platform总线
和之前的平台设备总线不同的是使用到了platform_driver里面的device_driver结构体里面的of_device_id
文件位置路径:include/linux/device.h
struct device_driver {
...
const char *name; //常用,用于平台设备与平台驱动的匹配,会在/sys/bus/platform/driver/下生成name的节点
struct module *owner; //模块的所有者,一般是THIS_MODULE
const struct of_device_id *of_match_table; //用于匹配设备树中的节点compatible的属性,优先级最高
...
};
其中对于变量
文件路径位置:include/linux/mod_devicetable.h
struct of_device_id {
char name[32];
char type[32];
char compatible[128];
const void *data;
};
总结下来就是
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函数中获取设备树设备节点的名称:
printk("beep_res is %s\n", pdev->dev.of_node->name);
在Linux内核里面,我们是用一个结构体来描述硬件资源的。
文件位置路径:include/linux/platform_device.h
struct platform_device {
struct device dev; //常用,内嵌的device结构体,
};
platform_device里面的device结构体
文件位置路径:include/linux/device.h
struct device {
...
struct device_node *of_node;
void (*release)(struct device *dev);
...
}