我最近开始学习为我正在处理的特定项目编写Linux设备驱动程序。以前我所做的大部分工作都是设备运行没有操作系统,因此Linux驱动程序和开发对我来说有点新鲜。 对于我正在研究的项目,我有一个运行基于Linux的操作系统的嵌入式系统。我有一个通过RS232控制的外部设备,我需要为其编写驱动程序。
问题:
1)有没有办法从内核空间访问串口(并可能使用serial.h,serial_core.h等),这通常是怎么做的,有什么好的例子吗?
2)从我发现的情况来看,只需打开dev / ttyS *并写入它就可以更容易地访问用户空间中的串行端口。为这样的设备(RS232设备)编写驱动程序时,最好是在用户空间中进行,还是有办法编写内核模块?如何决定在用户空间上将驱动程序编写为内核模块,反之亦然?
驱动程序是仅适用于UART / serial等通用设备,还是上面的用户空间,还是应该将此驱动程序写为内核模块?我很感激帮助,我一直无法找到很多信息来回答我的问题。
答案 0 :(得分:2)
有几次通过串行端口进行通信的模块可能在内核中。 pppd(点对点协议守护进程)就是一个例子,因为Linux有一些内核代码,因为它是串行的高流量使用,它还需要转向并将IP数据包放入内核空间。
大多数其他用途从用户空间开始会更好用,因为你有一个很好的API已经处理了很多可能发生的错误。这也减少了错误导致大规模系统故障的可能性。
从用户空间执行此类操作会导致一些延迟。读取和写入是缓冲的,并且通常很难分辨硬件实际上在写入操作中的位置,并且取消已经成功的写入调用并非真正可以从用户空间进行,即使硬件没有&# 39;但是还收到了字节。
我建议先尝试从用户空间进行操作,然后根据需要移动到OS驱动程序。即使有必要将其移动到操作系统级驱动程序,您也可能从用户空间获得一些进展。