首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux设备模型:相同的设备但不同的驱动程序

Linux设备模型:相同的设备但不同的驱动程序
EN

Stack Overflow用户
提问于 2011-01-27 11:00:05
回答 2查看 1.3K关注 0票数 0

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

设备文件中,Atmel将所有的USART命名为相同的atmel_usart。当然,通过id枚举:

代码语言:javascript
复制
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。所以我能做些什么:

  • Atmel设备文件是不可满足的,我可以做得更好。因此,我重命名(补丁)设备文件中的设备。但是,如果我想在UART4上使用TTYS驱动程序,我会遇到麻烦。
  • 我操作(修补)设备文件,以便能够访问结构platform_device。我可以在登记前改变他们的名字。但就我所理解的Linux驱动程序模型的概念而言,设备应该在启动过程中尽早注册,但是绑定到驱动程序的步骤如下.后来。
  • 我可以编写一个具有别名的驱动程序,它将绑定到特定的bus_Id -> atmel_usart.4。我真的可以吗?

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

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-28 10:20:45

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

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

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

票数 2
EN

Stack Overflow用户

发布于 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,从而将其隐藏在导出函数中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4815451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档