市场上有一个兼容 16550 的 UART,我想配置它。Linux 驱动程序由制造商提供,我必须通过用户空间程序持续配置(多)UART。
持久性意味着即使我的配置器退出后配置仍保留在芯片内。
我遇到的问题是内核驱动程序中的 uart_ops 操作似乎通过其 .startup 和 .shutdown 操作影响了 MCR(调制解调器控制寄存器)的内容。手头的任务是通过将 MCR 寄存器的第 5 位(从 0 到 7)设置为 1 将 UART 置于环回模式。我通过制造商提供的 IOCTL 来做到这一点(顺便说一句,还有其他方法吗?),但是要访问 IOCTL,我必须提供一个文件描述符:这意味着一个 open()。然后,当我的配置器退出时,系统 close() 文件描述符。
因此,调用了 uart_ops.shutdown() 函数并且我的 MCR 的内容丢失了。后续应用看不到UART处于loopback模式,所以没办法测试。
怎么做?打开端口/关联设备节点,然后在 MCR 中启用环回,然后从不关闭描述符(通过睡眠或无限循环)?这是一个可以接受的解决方案吗?后续应用程序能否在环回模式下看到 UART?
如何避免在后续应用程序测试环回模式之前调用 uart_ops.shutdown 函数及其执行的 MCR 覆盖?
谢谢你。
编辑:
有问题的 UART 是 Exar XR17D158 (http://www.exar.com/connectivity/uart-and-bridging-solutions/pci-uarts/pci-uarts-universal-3-3v-or-5v/xr17d158) 和驱动程序可在此处找到:http ://www.exar.com/common/content/document.ashx ?id=20639&languageid=1033 作为 uart_ops.startup 和 uart_ops.shutdown 成员传递的 serialxr_startup 和 serialxr_shutdown 位于第 806 行和第 902 行在 xr17c15x.c 文件中。