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



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

持久性意味着即使在我的配置程序退出后,配置仍保留在芯片内。

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

因此,会调用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_start和serialxr_shutdown位于xr17c15x.c文件的第806行和第902行。

听起来真正的问题是,您不希望Linux在启动时自动加载内核驱动程序并自动初始化设备,从而对您进行事后猜测。

如果是这样,您最好的选择可能是将"modprobe.conf"配置为禁用自动加载供应商的内核驱动程序:

  • http://www.cyberciti.biz/tips/avoid-linux-kernel-module-driver-autoloading.html

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

"希望能有所帮助!

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

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

显然,每当调用最后一个关闭()时,驱动程序都会调用uart_ops.shutdown()。为了防止这种情况发生,我通过在设备文件上维护一个open()来确保至少还需要调用一个close()。

最新更新