内核空间的RS232串口通信

Vil*_*ray 4 serial-port linux-device-driver linux-kernel

我正在为Linux v3.2编写内核模块来控制外部激光器,但是我在通过机器上的RS232 串行端口传输信号时遇到了问题。

我的内核中似乎已经编译了一个串行驱动程序,它拥有我想要访问的 ioport 地址的所有权:

# cat /proc/ioports | grep serial
  02e8-02ef : serial
  02f8-02ff : serial
  03f8-03ff : serial
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为 Linux 允许用户空间程序使用/dev/ttyS*设备节点通过串行端口进行通信。例如,以下是我为 LCD 面板设置设备的方法:

# cat /proc/ioports | grep serial
  02e8-02ef : serial
  02f8-02ff : serial
  03f8-03ff : serial
Run Code Online (Sandbox Code Playgroud)

但是,这是一个用户空间接口,因此与我的内核空间模块不兼容。我需要一种在内核空间内产生相同效果(RS232 串行 I/O)的方法。

虽然我可以卸载默认的 Linux串行驱动程序并用我自己的自定义 RS232 驱动程序替换它,但我不想在这里重新发明轮子——默认的 Linux串行驱动程序似乎支持我需要的功能。

是否有一种简单的方法可以通过内核空间中的 RS232 串行端口进行通信(也许通过这个默认的 Linux串行驱动程序),或者我是否只需要编写自己的自定义 RS232 驱动程序?

Ste*_*len 6

看看行纪律。您可以使用它将 tty 设备附加到内核空间中定义的一些读写例程,从而使用串行线编写驱动程序。线路规则从用户空间附加到它,内核将完成所有剩下的工作。

一个很好的例子是slcan (drivers/net/can/slcan.c)。可以在 can-utils ( https://gitorious.org/linux-can/can-utils ) 中找到处理此问题的 libc 调用示例。如果您更喜欢 Linux 设备驱动程序的第 18 章,那么这将是一个很好的第一步:http : //www.makelinux.net/ldd3/chp-18,尽管这本书不是最新的。还可以在http://www.linusakesson.net/programming/tty/上找到一些详细信息。