Other Parts Discussed in Thread: AM623
器件型号: AM623
您好:
我们有一个外部组合 RS‑232 / RS‑485 端口。 可以使用 GPIO 来切换该模式、这工作正常。
在新硬件版本中、我们迁移到 AM623 处理器并将 RS‑232 接口连接到 UART1 。
以下是器件树配置:
main_uart1_pins_default: main-uart1-default-pins {
pinctrl-single,pins = <
AM62X_IOPAD(0x01e8, PIN_INPUT, 1) /* (B17) I2C1_SCL.UART1_RXD */
AM62X_IOPAD(0x01ec, PIN_OUTPUT, 1) /* (A17) I2C1_SDA.UART1_TXD */
AM62X_IOPAD(0x0194, PIN_INPUT, 2) /* (B19) MCASP0_AXR3.UART1_CTSn */
AM62X_IOPAD(0x01e0, PIN_INPUT, 4) /* (B16) I2C0_SCL.UART1_DCDn */
AM62X_IOPAD(0x01e4, PIN_INPUT, 4) /* (A16) I2C0_SDA.UART1_DSRn */
AM62X_IOPAD(0x0198, PIN_OUTPUT, 2) /* (A19) MCASP0_AXR2.UART1_RTSn */
AM62X_IOPAD(0x01d8, PIN_OUTPUT, 4) /* (C15) MCAN0_TX.UART1_DTRn */
>;
};
RX 和 TX 工作正常。 最小两个位 CTS 和 DCD 在外部、更改会正确地反映在驱动程序内。 我也可以切换输出信号 RTS 和 DTR 使用stty -hupcl、和可以在物理端口上看到更改。
起初,一切似乎都很好——直到我测试了 DSR 发生正转换。 无论 DSR 是从外部驱动为高电平还是低电平、串行驱动程序始终将其报告为0。
我使用以下命令读取调制解调器状态:
cat /proc/tty/driver/serial | grep "^0:"
为了进行进一步研究、我添加了一些调试代码:
unsigned int serial8250_modem_status(struct uart_8250_port *up)
{
struct uart_port *port = &up->port;
unsigned int status = serial_in(up, UART_MSR);
/* DEBUG: Print MSR register value for UART1 (mapbase 0x02810000) */
if (port->mapbase == 0x02810000)
dev_info(port->dev,
"MSR=0x%02x CTS=%d DSR=%d DCD=%d RI=%d\n",
status,
!!(status & UART_MSR_CTS),
!!(status & UART_MSR_DSR),
!!(status & UART_MSR_DCD),
!!(status & UART_MSR_RI));
即使在那里、 DSR 始终报告为 0 处于高电平状态时也是如此。
之后、我检查了 TRM 并找到以下陈述:
(TRM 摘录)
根据该文件、UART1 正式不支持这些信号。 然而、让我感到困惑的是、我能够读取和/或驱动器 全部 除外 DSR 。
我们实际上并不在我们的应用程序中使用 DSR、因此这对我们来说不是一个功能性问题。 然而、这就提出了一个问题:
从长远来看、其他调制解调器控制信号 (CTS、RTS、DTR、DCD) 是否真的可以在 UART1 上使用、或者我们是否应该将 RS‑232 接口移至 UART0 而是?


