【问题标题】:Linux device driver for a RS232 device in embedded system嵌入式系统中 RS232 设备的 Linux 设备驱动程序
【发布时间】:2015-06-24 20:44:54
【问题描述】:

我最近开始学习为我正在从事的特定项目编写 Linux 设备驱动程序。以前我所做的大部分工作都是在不运行操作系统的设备上完成的,所以 Linux 驱动程序和开发对我来说有点新奇。 对于我正在进行的项目,我有一个运行基于 Linux 的操作系统的嵌入式系统。我有一个通过 RS232 控制的外部设备,我需要为其编写驱动程序。

问题:

1)有没有办法从内核空间访问串行端口(可能使用serial.h,serial_core.h等),这通常是如何完成的,有什么好的例子吗?

2) 从我的发现看来,通过打开 dev/ttyS* 并写入它来访问用户空间中的串行端口似乎要容易得多。在为这样的设备(RS232 设备)编写驱动程序时,是首选在用户空间中执行,还是有办法编写内核模块?如何决定将驱动程序编写为用户空间上的内核模块还是反之亦然?

驱动程序是否仅适用于通用设备,例如 UART/串行,然后是用户空间,还是应该将此驱动程序编写为内核模块?感谢您的帮助,我一直找不到太多信息来回答我的问题。

【问题讨论】:

  • 您的嵌入式设备在没有主机操作系统的情况下运行? (在这种情况下,将没有 /dev/ttySx,当然也没有支持该设备节点的设备驱动程序)
  • 您可能不应该为此串行设备编写任何内核“驱动程序”。内核在特权 CPU 模式下执行,不应因属于用户空间的不必要功能而受到损害。你(应该)希望你的代码是可移植的,这意味着保持它的用户空间,其中 API 是稳定的。此外,您似乎对“RS232 设备驱动程序”的作用感到困惑。驱动程序应该只传输数据;它在物理层工作。它不应该以任何方式检查或处理数据(用于数据链路或行规层)。
  • 如果您拥有 /dev/ttyS*,那么您已经拥有 UART 的设备驱动程序。
  • 我知道已经有一个 UART 驱动程序,但这并不能解决我的问题。我想为通过 RS232 通信的特定设备编写一个内核模块。我想知道是否有一种方法可以使用现有的串行驱动程序 serial.h(不是 /dev/ttyS* 所指的 tty 驱动程序),并将我的驱动程序“分层”在它上面,以便我可以使用它的功能而不是自己重写串行驱动程序。这有可能吗,如果可以,怎么做?

标签: c linux linux-device-driver embedded-linux


【解决方案1】:

有时,通过串行端口进行通信的模块可能位于内核中。 pppd(点对点协议守护进程)就是一个例子,因为 Linux 有一些内核代码专用于此,因为它是串行的高流量使用,它还需要转身并将 IP 数据包放入内核空间。

大多数其他用途在用户空间中会更好地工作,因为您有一个很好的 API 已经处理了很多可能发生的错误。这也减少了您的错误导致大规模系统故障的可能性。

从用户空间做这样的事情确实会导致一些延迟。读取和写入是缓冲的,通常很难判断硬件在写入操作中的实际位置,并且从用户空间取消已经成功的写入调用实际上是不可行的,即使硬件尚未收到字节也是如此。

我建议先尝试从用户空间执行此操作,然后在必要时移至操作系统驱动程序。即使有必要将其移动到操作系统级别的驱动程序中,您也可能能够从用户空间取得一些进展。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    相关资源
    最近更新 更多