我想要配置市场上有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行。
答案 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()。