Linux kernel 平台设备从何处获得其名称

Linux kernel 平台设备从何处获得其名称,linux-kernel,linux-device-driver,device-driver,Linux Kernel,Linux Device Driver,Device Driver,我正在阅读关于Linux设备模型的文章,该模型是围绕总线、设备和驱动程序构建的 .我能够了解一些设备和驱动程序匹配是如何发生的,但不清楚总线在这里的作用,总线如何与设备匹配 关于平台设备的名称来源,我还有一个疑问 “平台总线只是将每个设备的名称与每个驱动程序的名称进行比较;如果它们相同,则设备与驱动程序匹配。” 现在我不能真正理解上面这一点,我相信设备名首先在dts文件中定义,然后在平台驱动程序代码中定义相应的驱动程序名 若这两个名称匹配,将从驱动程序代码调用探测器,以确认设备是否确实存在 有谁

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

关于平台设备的名称来源,我还有一个疑问

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

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

若这两个名称匹配,将从驱动程序代码调用探测器,以确认设备是否确实存在


有谁能特别从总线的角度告诉我整个过程。

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

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

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

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

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

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

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

下面是我如何实现的。 在这里你可以找到
在这里,

的核心添加到@Federico的答案中,该答案很好地描述了一般情况,平台设备可以通过四种方式(按优先级排列)与平台驱动程序匹配。以下是“巴士”站台的位置:

static int platform\u match(结构设备*dev,结构设备\u驱动程序*drv)
{
结构平台设备*pdev=到平台设备(dev);
结构平台驱动程序*pdrv=至平台驱动程序(drv);
/*首先尝试匹配的样式*/
如果(驱动程序匹配设备(开发、drv))
返回1;
/*然后尝试ACPI样式匹配*/
if(acpi驱动程序匹配设备(开发、drv))
返回1;
/*然后尝试与id表匹配*/
如果(pdrv->id_表)
返回平台匹配id(pdrv->id\U表,pdev)!=NULL;
/*返回到驱动程序名称匹配*/
返回(strcmp(pdev->name,drv->name)==0);
}
这里有两个重要的问题

风格匹配 使用设备树(驱动程序匹配设备的
)进行匹配。如果您还不知道设备树的概念。在此数据结构中,每个设备在表示系统的树中都有自己的节点。每个设备还具有一个兼容的属性,即字符串列表。如果任何平台驱动程序声明其中一个
兼容的
字符串受支持,则将存在匹配项,并调用驱动程序的探测

这是一个:

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

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

名称匹配 如果查看
platform\u match
,您将看到匹配返回到名称匹配。在驱动程序名和设备名之间进行简单的字符串比较。这就是旧平台驱动程序的工作方式。其中一些仍然如此,例如:

静态结构平台驱动程序imx\U ssi\U驱动程序={
.probe=imx\U ssi\U探头,
.remove=imx\u ssi\u remove,
.司机={
.name=“imx ssi”,
.owner=此_模块,
},
};
模块\平台\驱动程序(imx\ U ssi\ U驱动程序);

同样,特定于电路板的初始化必须调用
platform\u device\u add
platform\u add\u devices
来添加平台设备,在名称匹配的情况下,这些设备完全是用C静态创建的(名称用C表示,资源如IRQ和基地址等).

您是否浏览了linux源代码树下的
文档/驱动程序模型/
中的文件?是的,Vivek,我已经看过了,我想澄清这些疑问。感谢Federico的友好回复。如果您能为您提到的每一个案例提供一些示例,那就太好了。如果设备通过GPIO接口呢?而且没有公共汽车。。。。!需要哪种匹配?Linux中的总线概念与我们通常所期望的总线概念不同。Linux总线就是这种匹配设备和驱动程序的机制。关于你的问题。不清楚你的意思。但是您可以查看Linux目录drivers/GPIO中的一些GPIO驱动程序。这里有一个例子,感谢@eepp提供了您的详细答案,您再次为我提供了巨大的帮助。我将仔细阅读您的答案。我可以告诉您我是否有任何与此帖子相关的疑问吗?如果您还有其他问题,请将其发布在SO上,并用
linux内核
标记。应该有人回答;-)你举的例子是“站台巴士”这是虚拟总线。它定义了所有四种匹配设备到驱动程序的方法。但如果我在本例中讨论实际的物理总线,它只使用设备到驱动程序匹配的方法,这是一种风格。现在,设备树和平台驱动程序中的兼容字符串将允许您使用用于总线的控制器和处理此操作的驱动程序
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>;
};