我正在为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
这也意味着对内核源代码的更改很少。
答案 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。