Yuhang Zheng

第十九节、设备树下的platform总线

N 人看过

本节用于介绍设备树下的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);
    ...
}