我正在为ARM9 Atmel AT91SAM960板定制Linux。
在设备文件中,Atmel将所有的USART命名为相同的atmel_usart。当然,通过id枚举:
static struct platform_device at91sam9260_uart0_device = {
.name = "atmel_usart",
.id = 1,
.dev = { ...}
}根据Linux模型,所有这些设备(SAM9260上的5个UARTS )都将绑定到atmel_usart。
我不想在所有的UARTS上设置TTYS驱动程序,这将是寄存器。我有自己的几个司机,服务于不同的专业目的(LON,RS-485等)我想要控制哪个司机确实服务于特定的USART。所以我能做些什么:
platform_device。我可以在登记前改变他们的名字。但就我所理解的Linux驱动程序模型的概念而言,设备应该在启动过程中尽早注册,但是绑定到驱动程序的步骤如下.后来。atmel_usart.4。我真的可以吗?还有什么解决办法。我想接触一组最小的内核文件,但我想要所有的自由?
增编自由对我意味着什么:我可以在运行时指定如何使用UARTS
这也意味着,对内核源代码的更改是最小的。
发布于 2011-01-28 10:20:45
我建立了自己的路线纪律司机。您可以将它们构建为内核模块,并在运行时将它们附加到UART。不需要对Linux源代码进行更改。
任何有趣的时间或控制都可以通过ioctl()来完成。具体来说,我用这种方式实现了一个对时间敏感的RS-485协议.
当我这样做(Linux2.6.17)时,没有动态注册机制,所以我重写了现有的行规则。Linux代码非常简单,我很满意这样做是安全的。
发布于 2011-04-17 08:29:23
你的问题很容易解决。5台UART设备目前在内核启动时注册,它们的功能被锁定。这就是它通常用于PCI或USB设备的工作方式,对吗?因此,您需要做的是从启动代码中提取设备注册并动态注册。您甚至可以根据需要注册/取消注册。
at91_register_uart()是从您的董事会文件中为每个需要注册的UART调用的。然后at91_add_device_serial()将platform_device_register所有您的设置。一种解决方案是让所有5个UARTS都调用at91_register_uart(),然后从板中删除对at91_add_device_serial()的调用。然后,您可以使它成为一个导出的函数,可以由可加载的驱动程序调用。您甚至可以向它添加一个参数(int),这样您就可以选择单独注册哪些UARTS,而不是在所有UARTS上循环。您还可以通过创建一个注销设备的函数来镜像此函数。
注意:我认为,如果您以这种方式使用UART,则需要始终将一个UART专用于您的控制台。您可能只允许索引0->3作为输入,然后将0->3映射到0-> 0-4,从而跳过要用于控制台的UART,从而将其隐藏在导出函数中。
https://stackoverflow.com/questions/4815451
复制相似问题