This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM623: Modem Control Signals (DCD, RI, DTR, DSR) on UART1 instead of UART0

Part Number: AM623

Hello,

we have an external, combined RS‑232 / RS‑485 port. The mode can be switched using GPIOs, which works fine.

On a new hardware revision, we migrated to the AM623 processor and connected the RS‑232 interface to UART1.

Below is the device tree configuration:

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 and TX work as expected. When I toggle CTS and DCD externally, the changes are correctly reflected inside the driver. I can also toggle the output signals RTS and DTR using stty -hupcl, and the changes are visible on the physical port.

At first, everything seemed fine—until I tested the DSR input. Regardless of whether DSR is driven high or low externally, the serial driver always reports it as 0.

I read the modem status using:

cat /proc/tty/driver/serial | grep "^0:"

To investigate further, I added some debug code:

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));

Even there, DSR is always reported as 0, even when it is physically high on the pin.

After that, I checked the TRM and found the following statement:

(TRM excerpt)

According to the documentation, these signals are officially not supported on UART1. What confuses me, however, is that I am able to read and/or drive all of them except for DSR.

We do not actually use DSR in our application, so this is not a functional problem for us. However, this raises the question:

Are the other modem control signals (CTS, RTS, DTR, DCD) really safe to use on UART1 in the long run, or should we move the RS‑232 interface to UART0 instead?