0

市场上有一个兼容 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 文件中。

4

2 回答 2

0

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

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

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

于 2012-08-24T18:31:54.583 回答
0

听起来真正的问题是您不希望 Linux 通过在启动时自动加载内核驱动程序并自动初始化设备来对您进行第二次猜测。

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

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

'希望有帮助!

于 2012-08-23T22:49:01.333 回答