0

我正在为 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 服务。那我该怎么办:

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

  • 我操作(修补)设备文件,以便能够访问结构platform_device。我可以在注册之前更改他们的名字。但据我了解Linux Driver Model的想法,设备应该在启动期间尽早注册,但与驱动程序的绑定随后......稍后。

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

还有什么解决方案。我想接触最小的内核文件集,但我想要所有可能的自由?

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

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

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

4

2 回答 2

2

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

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

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

于 2011-01-28T10:20:45.707 回答
0

你的问题很容易解决。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),这样您就可以选择单独注册哪些 UART,而不是在所有 UARTS 上循环。您还可以通过制作取消注册设备的功能来镜像此功能。

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

于 2011-04-17T08:29:23.123 回答