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

Arm Linux设备型号:相同的设备但不同的驱动程序,arm,linux-device-driver,embedded-linux,atmel,Arm,Linux Device Driver,Embedded Linux,Atmel,我正在为ARM9 Atmel AT91SAM960板定制Linux 在Atmel中,将所有USART命名为相同的Atmel\u USART。当然,对于id枚举: static struct platform_device at91sam9260_uart0_device = { .name = "atmel_usart", .id = 1, .dev = { ...} } 根据Li

我正在为ARM9 Atmel AT91SAM960板定制Linux

在Atmel中,将所有USART命名为相同的
Atmel\u USART
。当然,对于id枚举:

static struct platform_device at91sam9260_uart0_device = {
        .name           = "atmel_usart",
        .id             = 1,
        .dev            = { ...}
}
根据Linux设备模型,所有这些设备(SAM9260上的5个UART)都将绑定到

我不想在所有要注册的UART上设置TTYS驱动程序。我有几个自己的驱动程序,用于不同的专门用途(LON、RS-485等)。我想要控制哪个驱动程序为特定的USART服务。那么我该怎么办:

  • Atmel设备文件不令人满意,我可以做得更好。因此,我重命名(修补)设备文件中的设备。然而,如果我想要UART4上的TTYS驱动程序,我会遇到麻烦

  • 我操作(修补)设备文件, 这样我就可以访问 结构
    平台设备
    。我可以
    在我改变他们的名字之前
    登记。但就我而言
    了解Linux驱动程序模型的概念,
    设备应该是
    在启动期间早期注册,但随后绑定到驱动程序。。。。稍后

  • 我可以写一个驱动程序,它有一个 别名和要绑定的名称 到特定总线\u Id->
    atmel_usart.4
    。我真的可以吗

还有什么解决办法。我想接触一组最小的内核文件,但我想要所有可能的自由

附录自由对我的意义:我可以在运行时指定如何使用UART

  • 使用Atmel串行驱动程序(ttyS)
  • 和我自己的司机

这也意味着,对内核源代码的更改是最小的。

我构建了自己的行规程驱动程序。您可以将它们构建为内核模块,并在运行时将它们连接到UART。无需更改Linux源代码

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


当我这样做时(Linux2.6.17),没有动态注册机制,所以我重写了现有的行规程。Linux代码非常简单,我很满意这样做是安全的。

您的问题很容易解决。5个UART设备目前在内核启动时注册,其功能被锁定。这就是PCI或USB设备的正常工作方式,对吗?因此,您需要做的是从启动代码中提取设备注册,并动态注册它。您甚至可以根据需要注册/取消注册

at91_register_uart()将从您的板文件中为每个需要注册的uart调用。at91_add_device_serial()然后将平台_device_注册您所设置的所有设备。一种解决方案是让所有5个uart调用at91_register_uart(),然后从主板上删除对at91_add_device_serial()的调用。然后,您可以使其成为可加载驱动程序调用的导出函数。您甚至可以向它添加一个参数(int),这样就可以选择单独注册哪些UART,而不是在所有UART上循环。您还可以通过取消注册设备来镜像此功能


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

阐明使用这些更改要实现什么(尽可能自由)..还有,一次连接多少个设备?每次连接设备时,端口是否会动态更改,例如,第一次连接到uart2设备,下一次连接到uart4设备?由于它是一个嵌入式设备,具有连接到UART的特定硬件,因此需要进行许多动态更改。连接如下:UART0=串行控制台| UART1=扩展到其他硬件| UART1=到总线系统的TTYS接口(LON)| UART3=到总线系统的自身驱动程序接口(X)。但请记住,如果使用串行USB设备,它会变得多么动态。