【发布时间】:2015-01-09 08:01:35
【问题描述】:
我正在尝试在嵌入式 Linux 中的 UART 上强制使用 9 位协议。目前我正在 am335x_evm 板上对此进行测试。我打算使用棒奇偶校验来做到这一点。理想情况下,我希望我不需要实际修改 omap-serial.c 驱动程序的任何代码。
使用 9 位协议的原因是为了支持一些使用它的旧硬件。奇偶校验位需要为消息的地址部分为 1,为数据部分为 0,然后为终止字节再次为 1。
我计划在用户空间运行一个进程,该进程将通过标准系统调用(打开、写入、读取、ioctl、tcsetattr 等)与 UART 交互。我将配置 UART 以启用奇偶校验并设置棒奇偶校验。然后我将奇偶校验设置为偶数并调用 write() 来发送我的地址数据。然后我会将奇偶校验设置为 0 并发送数据。我担心的是,如果我将奇偶校验从 1 更改为 0,什么时候会生效?如果 UART 没有完成发送所有地址数据,奇偶校验的变化是否适用于任何未发送的数据?
【问题讨论】:
-
这是一个很好的问题。您始终可以刷新通道,但这会在您的地址和数据之间引入轻微的延迟,您的外围设备可能无法理解。
-
冲洗可能不是一个坏主意。我会记住这一点。不过,您对延迟是正确的。消息的接收者只会等待很短的时间,然后丢弃他们所拥有的。
-
另一种选择是编写自己的串行
line discipline驱动程序。这不是世界上最简单的事情,但也不是最难的。这允许您通过 ioctl(以及可能的读/写)一次向/从用户空间发送消息,而不是字节流。然后学科驱动程序可以从内核空间获得更多访问权限。这种方法也将极大地帮助您接收消息。 -
类似的东西将成为我的后备选项。要使用 ioctl 将我需要的内容发送到 uart 驱动程序中,那么在较低级别我将拥有更多控制权。
-
如果没有支持 9 位的 UART,您可以想出一个方案来传输 8 位数据以及强制 0 或 1 奇偶校验作为第 9 个数据位。但是接收要困难得多,需要修改驱动程序,需要编程的 I/O(即没有 DMA),并且需要在接收时暂停传输。简化描述在digital.ni.com/public.nsf/allkb/…。
标签: linux-kernel driver uart parity