0

我在可以配置为 DTE/DCE 的硬件上运行嵌入式 linux 内核。在名为 tty_io.c 的文件中的 tty/串行驱动程序中有一个函数 tty_tiocmset(),它从 tty_ioctl 中获取一个位模式,用于设置/清除特定的调制解调器控制信号。有趣的是,tty_tiocmset() 函数会屏蔽除 TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2|TIOCM_LOOP 之外的所有其他调制解调器信号(此屏蔽显示在下面的代码中)。但是,如果您查看文档,似乎应该能够设置/清除所有调制解调器信号http://www.kernel.org/doc/man-pages/online/pages/man4/tty_ioctl.4.html向下到“调制解调器控制”。

有没有人知道为什么这个掩码在没有其他信号(如 RI、CD、CTS、DSR)的情况下存在?还有另一种方法可以使用未经修改的驱动程序来控制其他调制解调器信号吗?

4

1 回答 1

0

Linux 最初托管在 x86 PC 平台上,该平台使用 8250 型 UART。调制解调器信号名称 OUT1 和 OUT2 不是 EIA/RS-232 名称,但确实出现在 Western Digital 8250 数据表中!列出的 5 位tty_tiocmset()匹配(按名称和功能)8250 调制解调器控制寄存器中可用的 5 位。任何额外的控制线都必须由 8250 外部的逻辑来实现。

有没有人知道为什么这个掩码在没有其他信号(如 RI、CD、CTS、DSR)的情况下存在?

您提到的这四个是DTE 端口的输入信号,PC 通常配置(或假设/默认)为 DTE。
输入信号不会出现在输出控制寄存器中。
当 Linux 嵌入到 DCE 端口的设备中时,也许这是一个错误?
这些输入信号确实出现在调制解调器状态寄存器中。

还有另一种方法可以使用未经修改的驱动程序来控制其他调制解调器信号吗?

您可以重新映射OUT1OUT2您需要输出的任何其他 DTE 信号。
如果您需要为 DCE 设置端口,那么您可能必须重新映射所有四个控制线。
对于 DCE 端口(即调制解调器),通常只有 4 条输出控制线:DCD、CTS、DSR 和 RI。8250 MCR 中正好有 4 个输出控制位(环回除外)!

于 2012-12-03T01:54:58.067 回答