Embedded 为嵌入式系统中的平台总线编写设备驱动程序?

Embedded 为嵌入式系统中的平台总线编写设备驱动程序?,embedded,arm,linux-device-driver,embedded-linux,Embedded,Arm,Linux Device Driver,Embedded Linux,我已经在Linux内核源代码中完成了一些驱动程序实现,可以看出这些是平台驱动程序 drivers/net/ethernet/smsc/smsc911x.c static struct platform_driver smc911x_driver = { .probe = smc911x_drv_probe, .remove = smc911x_drv_remove, .suspend = smc911x_drv_suspend,

我已经在Linux内核源代码中完成了一些驱动程序实现,可以看出这些是平台驱动程序

drivers/net/ethernet/smsc/smsc911x.c

  static struct platform_driver smc911x_driver = {
    .probe           = smc911x_drv_probe,
    .remove  = smc911x_drv_remove,
    .suspend         = smc911x_drv_suspend,
    .resume  = smc911x_drv_resume,
    .driver  = {
            .name    = CARDNAME,
            .owner  = THIS_MODULE,
    },
};
上面是平台设备(基于smsc的以太网控制器)的驱动程序,平台设备是在系统启动期间不会自动探测的设备,不同于pci总线上的传统设备

我想我的理解在这里可以吗

现在我说的是平台设备,是指这些设备(以太网控制器)位于平台总线上,而在ARM体系结构上,默认的平台总线是AMBA

所以,当我们在基于ARM的板上焊接以太网控制器时,它应该位于AMBA总线上或与AMBA总线连接


我们如何确定要编写的驱动程序是平台驱动程序还是普通驱动程序

根据我在开发ARM平台驱动程序方面的有限经验,AMBA设备通常在其内存映射IO寄存器接口的末尾具有标识寄存器

一般来说,如果您查看以太网控制器的参考手册,并且寄存器摘要指定了外围设备/组件标识寄存器(通常在偏移量0xFE0-0xFEC和0xFF0-0xFFC处),那么您应该编写一个AMBA总线驱动程序。公交车司机可以自动识别这些司机


否则,如果寄存器接口没有在偏移量0xFE0-0xFEC和0xFF0-0xFFC处指定任何ID寄存器,那么您可能只想编写一个平台驱动程序。这些设备无法自动识别,您需要专门为设备附加一个驱动程序。

请参阅,我在哪里回答了这个问题。您必须将
平台\u寄存器\u设备()
添加到您的机器文件中。见:例如。如果没有总线探测硬件,则必须使用平台设备。好,@artless已经经历了一个封闭的问题,您已经回答了这个问题,之后有些疑问。平台设备不与任何总线关联,而是与平台总线关联?平台总线是什么?当您说平台设备与CPU集成时,这是否意味着平台设备和cpu在同一个黑色芯片上,而不是在同一个绿色芯片上。典型的PC(Linux heritage)具有PCI总线;许多Linux驱动程序都是用于PCI卡的;也就是说,Linux驱动程序模型希望每个设备都连接到总线上。当没有受支持的总线时,使用平台总线。从文档中可以看出,它们通常的共同点是从CPU总线直接寻址,这就是您的AMBA设备。与PCI、USB、SPI、I2C等总线相比,有一条公共总线将芯片连接到CPU。你是说绿板吗?你不能这样回答。以太网MII是总线,但它不是Linux支持的拓扑。你可以多吃些薯片。你不能只看一块板子就说出来。谢谢@artlessnoise,我想我明白你的意思了,也许不是。让我把我的理解摆在你面前,平台设备是直接连接到CPU芯片而不需要PCI、USB、SPI、I2C等总线的设备,就像AMBA设备一样,平台设备直接从CPU总线寻址(说实话,我没有明白这一点)。是否可以通过xio或MII等链接访问平台设备的寄存器?感谢@tangrs的回答。如果您能提供一些示例,说明具有标识寄存器和AMBA总线驱动程序代码的任何控制器的参考手册,那就太好了。这是一个很好的示例。请注意,设备是如何通过中指定的ID绑定到驱动程序的
clcdfb_id_table
而不是驱动程序名称。好的,我看到PL110是AMBA总线驱动程序代码(PL110位于AMBA总线上)。对于LAN91C111以太网控制器(找不到任何ID寄存器,所以我们需要编写平台驱动程序吗?还有LAN91C11控制器将位于哪条总线上?听起来不错。平台总线不是真正的总线。它基本上是SoC上不在其他总线上的设备的总括。@amitsightomar
i2c
有一个通用命令来列出所有连接的ID。这是总线控制器用于在线探测设备。另一种选择是将连接设备的映射作为参数发送给控制器;spi驱动程序使用此机制。它与平台设备非常相似。