Linux用户空间:如何持久地将16550兼容的UART置于环回模式

时间:2012-08-23 22:28:57

标签: linux loopback uart

我想要配置市场上有16550兼容的UART。 Linux驱动程序由制造商提供,我必须通过用户空间程序持续配置(多个)UART。

持久性意味着即使我的配置器退出,配置仍然在芯片内部。

我遇到的问题是内核驱动程序中的uart_ops操作似乎通过其.startup和.shutdown操作影响MCR(调制解调器控制寄存器)的内容。手头的任务是将UART置于环回模式,通过将MCR寄存器的bit5(从0到7)设置为1.我通过制造商提供的IOCTL(有没有其他方式,BTW?),但要访问IOCTL,我必须提供一个文件描述符:这意味着一个open()。然后,当我的配置器退出时,系统close()文件描述符。

因此,调用了uart_ops.shutdown()函数,并且我的MCR内容丢失了。后续应用程序看不到UART处于环回模式,因此无法测试。

怎么做?打开端口/关联的设备节点,然后在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位于xr17c15x.c文件中的第806行和第902行。

2 个答案:

答案 0 :(得分:0)

听起来真正的问题是你不希望Linux在启动时自动加载你的内核驱动程序并自动初始化设备来猜测你。

如果是这样,最好的办法是将“modprobe.conf”配置为禁用自动加载供应商的内核驱动程序:

如果这样可行,您可以通过添加自己的启动脚本来“增强”解决方案,以自己的方式配置。如果你愿意的话。

'希望有所帮助!

答案 1 :(得分:0)

我终于解决了这个问题:不允许Exar驱动程序调用它的uart_ops.shutdown()函数:我只是在开头打开()设备文件,而不是关闭()它以避免驱动程序调用uart_ops.shutdown()函数。为了防止操作系统在程序结束时自动调用close(),我只需将其置于无限循环中:

while(1) {
        sleep(100);
}
return 0; //unreachable

显然,只要调用 last close(),驱动程序就会调用uart_ops.shutdown()。为了防止这种情况发生,我通过在设备文件上维护open()来确保至少仍然需要调用一个close()。