【问题标题】:From where platform device gets it name平台设备从哪里得到它的名字
【发布时间】:2013-10-08 10:11:24
【问题描述】:

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

我对平台设备的名称从何而来还有一个疑问。

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

现在我不能真正理解上面的点。我相信设备名称是首先在 dts 文件中定义的,然后在平台驱动程序代码中定义相应的驱动程序名称。

如果这两个名称匹配,则从驱动程序代码中调用探针,以确认设备确实存在。

谁能让我从巴士的角度了解整个过程。

【问题讨论】:

  • 你浏览过linux源码树下Documentation/driver-model/中的文件了吗?
  • 是的,Vivek,我已经经历过,并且有这些我想澄清的疑虑。

标签: linux-kernel linux-device-driver device-driver


【解决方案1】:

为了补充@Federico 的回答,它很好地描述了一般情况,平台设备可以使用四个东西(优先级)匹配到平台驱动程序。这是平台“总线”的match function

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);
}

这里有两个重要的。

OF 风格匹配

使用设备树匹配 (of_driver_match_device)。如果你还不知道设备树的概念,go read about it。在这个数据结构中,每个设备在代表系统的树中都有自己的节点。每个设备还有一个compatible 属性,它是一个字符串列表。如果任何平台驱动程序声明支持compatible 字符串之一,则会有一个匹配项,并且将调用驱动程序的探测器。

这是example of a node

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>;
};

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

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),
    },
};

该驱动程序能够驱动三种类型的 GPIO,包括前面提到的那一种。

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

名称匹配

如果您查看platform_match,您将看到匹配回退到名称匹配。在驱动程序名称和设备名称之间进行简单的字符串比较。这就是旧平台驱动程序的工作方式。他们中的一些人仍然这样做,例如this one here

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);

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

【讨论】:

  • 感谢@eepp 的详细回答,再次为我提供了很大的帮助。我将通过您的回答。如果我对这篇文章有任何疑问,可以告诉您吗?
  • 如果您还有其他问题,请在 SO 上发布并使用linux-kernel 标记。有人应该回答;-)
  • 您给出的示例是“平台总线”,它是虚拟总线。它定义了将设备与驱动程序匹配的所有四种方法。但是如果我谈论实际的物理总线,请在这个例子中说lxr.free-electrons.com/source/drivers/spi/spi-davinci.c它仅使用设备与驱动程序匹配的方法来匹配样式。现在,设备树和平台驱动程序中的 .compatible 字符串将让您将用于总线的控制器和处理此控制器的驱动程序定义在 .name="spi_davinci" 下。请确认我的理解可以吗??
  • 您指向的文件也是一个平台驱动程序,是的,它使用OF样式匹配。
  • @Makouda 当一个平台驱动被注册时(例如使用module_platform_driver()),它被传递一个探测回调,当被调用时传递一个指向struct platform_device实例的指针。 struct platform_device 的实例要么由 OF infrastructure 创建,要么手动(旧式,静态)创建,例如 here
【解决方案2】:

在 Linux 内核中有不同的总线(SPI、I2C、PCI、USB ......)。

每条总线都有在总线上注册的驱动程序和设备的列表。

每次将新设备或新驱动程序连接到总线时,它都会启动匹配循环。

假设您注册了一个新的 SPI 设备。 SPI 总线启动一个匹配循环,在该循环中它调用 SPI 匹配函数来验证您的设备是否与已在总线上注册的驱动程序匹配。如果不匹配,则什么都不做。

现在,假设您注册了一个新的 SPI 驱动程序。总线再次启动匹配循环,以验证是否有任何已注册设备与此新驱动程序匹配。如果匹配,则调用驱动程序probe() 函数。

每条总线都有自己的方法来匹配驱动程序和设备。为了实现总线,您必须编写匹配函数。因此,您可以实现按名称、整数值或任何您想要的方式匹配的总线。

每次注册驱动程序或设备时都会启动总线机制。

这里是我如何实现ZIO bus。 在这里你可以找到SPI bus 这里是bus system的核心

【讨论】:

  • 感谢 Federico 的友好回复。如果您能为您提到的每个案例提供一些示例,那就太好了。
  • 如果设备要通过 GPIO 连接怎么办?并且没有 BUS....!需要哪个匹配项?
  • Linux 中总线的概念与我们通常想要的总线不同。 Linux 总线正是这种匹配设备和驱动程序的机制。关于你的问题。不清楚你的意思。但是您可以在 Linux 目录 drivers/gpio 中查看一些 GPIO 驱动程序。这里是一个例子lxr.free-electrons.com/source/drivers/gpio/gpio-ts4800.c
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
相关资源
最近更新 更多