【发布时间】: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