配置 TTY 设备的命令行



我目前的任务是将一些兼容16550的芯片的驱动程序从QNX移植到Linux。该芯片提供了几个UART,每个UART都被视为标准的16550串行端口,尽管有一些扩展。

现在,在 QNX 中,整个设备驱动程序被打包到一个独立的可执行文件中,既可以作为驱动程序,也可以作为提供的 UART(波特率、环回模式等)的初始配置器。这在 QNX 中是很自然的,因为设备驱动程序在用户空间中运行,只不过是标准的可执行文件。

在Linux,OTOH上,驱动程序现在作为内核模块实现,可随意加载。此外,该模块由制作者提供,所以我不想过多地修改或修补它。

对我来说,剩下的任务是提供一些机制来设置这些 UART 的参数。它们被视为/dev/ttyPREFIXX 设备。我打算通过标准的C编程可执行文件在感兴趣的串行端口上调用标准termios(即tcsetattr()或ioctls)来做到这一点。

这就引出了一个问题:我的方法是否正确?如果是,那么如何实现持久配置?正如我所感知的事实(来自这个例子:http://www.easysw.com/~mike/serial/serial.html),termios 函数作用于 OPEN 设备。简而言之:他们打开设备,设置参数,读取或写入,然后关闭端口。关闭端口后,配置(波特率等)是否丢失?我希望它不是,因为它已经存储在硬件中。

有人可以向我确认配置是持久的吗?而且,如果没有,如何实现这种持久性,对于将来将再次打开该端口并期望使用一些预先建立的参数的应用程序?如果没有,我是否应该修改模块内核以接受一些参数,然后在加载时进行配置?

我现在打算的方法是编写打开端口、设置其配置然后关闭端口的 C 可执行文件。我希望后面的应用程序能够看到具有所需配置的端口。

谢谢。

你可能想看看sttysetserial。令人尊敬的Serial-HOWTO(哇,我最后一次向任何人推荐HOWTO是什么时候?)可能也是一个很好的起点。

好吧,我在这里找到了答案:http://www.gnu.org/software/libc/manual/html_node/Mode-Functions.html#Mode-Functions

引用:"尽管 tcgetattr 和 tcsetattr 使用文件描述符指定终端设备,但属性是终端设备本身的属性,而不是文件描述符的属性。这意味着更改终端属性的影响是持久的;如果另一个进程稍后打开终端文件,它将看到更改的属性,即使它与您最初在更改属性中指定的打开文件描述符没有任何关系。

这样可以清除问题。