Linux设备型号:相同设备但驱动程序不同

时间:2011-01-27 11:00:05

标签: arm linux-device-driver embedded-linux atmel

我正在为ARM9 Atmel AT91SAM960主板定制Linux。

device file Atmel中,所有USART的名称都相同atmel_usart。当然有id枚举:

static struct platform_device at91sam9260_uart0_device = {
        .name           = "atmel_usart",
        .id             = 1,
        .dev            = { ...}
}

根据Linux设备模型,所有这些设备(SAM9260上的5个UARTS)将绑定到the driver named atmel_usart

我不想在所有要注册的UARTS上设置TTYS驱动程序。我有几个自己的驱动程序,用于不同的专用目的(LON,RS-485等)我想控制哪个驱动程序确实服务某个USART。那我该怎么做:

  • Atmel设备文件不可满足,我可以做得更好。所以我重命名(补丁)设备文件中的设备。但是,如果我想在UART4上使用TTYS驱动程序,我会遇到麻烦。

  • 我操纵(修补)设备文件, 这样我就可以访问了 结构platform_device。我可以 在我之前改变他们的名字 注册他们。但就我而言 了解 Linux Driver Model 的想法, 设备应该是 在启动期间提前注册,但是对驱动程序的绑定遵循....稍后。

  • 我可以写一个驱动程序,它有一个 别名和将绑定的名称 到特定的bus_Id - > atmel_usart.4。我能真的吗?

还有其他解决方案。我想触摸一组最小的内核文件,但我希望所有的自由都可以吗?

附录自由对我意味着什么:我可以在运行时指定如何使用UARTS

  • 使用Atmel-Serial驱动程序(ttyS)
  • 与我自己的司机

这也意味着对内核源代码的更改很少。

2 个答案:

答案 0 :(得分:2)

我建立了自己的线路纪律驱动程序。您可以将它们构建为内核模块,并在运行时将它们附加到UART。不需要对Linux源代码进行任何更改。

任何有趣的计时或控制内容都可以通过ioctl()来完成。具体来说,我以这种方式实现了时序敏感的RS-485协议。

当我这样做(Linux 2.6.17)时,没有动态注册机制,所以我覆盖了现有的线路规则。 Linux代码非常简单,我很满意这是一件安全的事情。

答案 1 :(得分:0)

你的问题很容易解决。 5个UART设备目前在内核启动时注册,其功能已锁定。现在它是如何正常用于PCI或USB设备的,对吧?因此,您需要做的是将设备注册从启动代码中拉出并动态注册。您甚至可以根据需要注册/注销。

对于每个需要注册的UART,都会从您的电路板文件中调用

at91_register_uart()。 at91_add_device_serial()然后将platform_device_register所有你设置的那些。一个解决方案是让所有5个UARTS都调用at91_register_uart(),但是从你的主板上删除对at91_add_device_serial()的调用。然后,您可以将其设为可加载驱动程序可以调用的导出函数。您甚至可以向它添加一个参数(int),这样您就可以选择要单独注册哪些UARTS,而不是在所有UARTS上循环。您还可以通过制作取消注册设备的功能来镜像此功能。

注意:如果您使用的话,我认为您需要始终将一个UART专用作控制台。您可以在导出的函数中隐藏它,只允许在输入中使用索引0-> 3,然后将0-> 3映射到0-4,跳过要用于控制台的UART。