从平台设备获取它的名称

Ami*_*mar 5 device-driver linux-device-driver linux-kernel

我正在阅读围绕总线,设备和驱动程序构建的Linux设备模型.我能够理解设备和驱动程序如何匹配,但不清楚总线在这里的作用,总线如何与设备匹配.

我还有一个疑问,关于平台设备从哪里得到它的名字.

"平台总线只是将每个设备的名称与每个驱动程序的名称进行比较;如果它们相同,则设备与驱动程序匹配."

现在我无法真正理解上述观点.我相信设备名称首先在dts文件中定义,然后相应的驱动程序名称在平台驱动程序代码中定义.

如果这两个名称匹配,则从驱动程序代码调用probe,这将确认设备确实存在.

有没有人能从总线的角度让我知道整个过程.

eep*_*epp 14

为了增加@Federico的答案,该答案很好地描述了一般情况,平台设备可以使用四个(优先级)匹配平台驱动程序.这是平台"总线" 的匹配功能:

static int platform_match(struct device *dev, struct device_driver *drv)
{
        struct platform_device *pdev = to_platform_device(dev);
        struct platform_driver *pdrv = to_platform_driver(drv);

        /* Attempt an OF style match first */
        if (of_driver_match_device(dev, drv))
                return 1;

        /* Then try ACPI style match */
        if (acpi_driver_match_device(dev, drv))
                return 1;

        /* Then try to match against the id table */
        if (pdrv->id_table)
                return platform_match_id(pdrv->id_table, pdev) != NULL;

        /* fall-back to driver name match */
        return (strcmp(pdev->name, drv->name) == 0);
}
Run Code Online (Sandbox Code Playgroud)

这是两个重要的.

风格匹配

使用设备树匹配(of_driver_match_device).如果您还不知道设备树概念,请阅读相关内容.在此数据结构中,每个设备在表示系统的树中具有其自己的节点.每个设备还有一个compatible属性,它是一个字符串列表.如果任何平台驱动程序声明其中一个compatible字符串被支持,则会匹配并且将调用驱动程序的探测器.

是一个节点例子:

gpio0: gpio@44e07000 {
    compatible = "ti,omap4-gpio";
    ti,hwmods = "gpio1";
    gpio-controller;
    #gpio-cells = <2>;
    interrupt-controller;
    #interrupt-cells = <1>;
    reg = <0x44e07000 0x1000>;
    interrupts = <96>;
};
Run Code Online (Sandbox Code Playgroud)

这描述了一个GPIO控制器.它只有一个兼容的字符串ti,omap4-gpio.将探测声明此相同兼容字符串的任何注册平台驱动程序.这是它的驱动程序:

static const struct of_device_id omap_gpio_match[] = {
    {
        .compatible = "ti,omap4-gpio",
        .data = &omap4_pdata,
    },
    {
        .compatible = "ti,omap3-gpio",
        .data = &omap3_pdata,
    },
    {
        .compatible = "ti,omap2-gpio",
        .data = &omap2_pdata,
    },
    { },
};
MODULE_DEVICE_TABLE(of, omap_gpio_match);

static struct platform_driver omap_gpio_driver = {
    .probe      = omap_gpio_probe,
    .driver     = {
        .name   = "omap_gpio",
        .pm = &gpio_pm_ops,
        .of_match_table = of_match_ptr(omap_gpio_match),
    },
};
Run Code Online (Sandbox Code Playgroud)

驱动程序能够驱动三种类型的GPIO,包括之前提到的GPIO.

请注意,平台设备不会神奇地添加到平台总线.架构/电路板初始化将调用platform_device_addplatform_add_devices在此情况下借助OF函数扫描树.

名称匹配

如果你看platform_match,你会看到匹配回到名称匹配.在驱动程序名称和设备名称之间进行简单的字符串比较.这是旧平台驱动程序的工作方式.他们中的一些人仍然这样做,就像这里的一样:

static struct platform_driver imx_ssi_driver = {
    .probe = imx_ssi_probe,
    .remove = imx_ssi_remove,

    .driver = {
        .name = "imx-ssi",
        .owner = THIS_MODULE,
    },
};

module_platform_driver(imx_ssi_driver);
Run Code Online (Sandbox Code Playgroud)

同样,特定于板的初始化将必须调用platform_device_addplatform_add_devices添加平台设备,在名称匹配的情况下,它们完全在C中静态创建(名称在C中给出,资源如IRQ和基地址等).