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.

[参考译文] PROCESSOR-SDK-AM64X:AM64x 串行驱动程序似乎忽略了 DTB 中的 RS485-RTS-ACTIVE-HIGH

Guru**** 1863670 points
Other Parts Discussed in Thread: AM6442, THVD1424
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1434766/processor-sdk-am64x-am64x-serial-driver-seems-to-ignore-rs485-rts-active-high-in-dtb

器件型号:PROCESSOR-SDK-AM64X
主题中讨论的其他器件:AM6442THVD1424

工具与软件:

对 AM6442使用 SDK 10.00.07.04

我在 DTB 中配置了 UART1、如下所示

    main_uart1_pins_default: main-uart1-default-pins {
        pinctrl-single,pins = <
            AM64X_IOPAD(0x0248, PIN_INPUT, 0) /* (D16) UART1_CTSn */
            AM64X_IOPAD(0x024c, PIN_OUTPUT, 0) /* (E16) UART1_RTSn */
            AM64X_IOPAD(0x0240, PIN_INPUT, 0) /* (E15) UART1_RXD */
            AM64X_IOPAD(0x0244, PIN_OUTPUT, 0) /* (E14) UART1_TXD */
        >;
    };

&main_uart1 {
    status = "okay"; 
    pinctrl-names = "default";
    pinctrl-0 = <&main_uart1_pins_default>;
    rs485-rts-active-high;
    rs485-rts-delay = <0 0>;
    linux,rs485-enabled-at-boot-time;
    current-speed = <115200>;
};

并已根据检查 UART_MDR3寄存器值

devmem2 0x02810080

该引脚似乎设置为0x10 (DIR_EN = 1、DIR_POL = 0、因此发送时 RTS 为0)并且作用域 RTS 线路通常为高电平、在 TX 传输时下降、这与我的要求相反。 我已尝试将0x18放入 UART_MDR3寄存器、这将提供 RS485-RTS-ACTIVE-HIGH 的预期行为。

根据 https://www.kernel.org/doc/Documentation/devicetree/bindings/serial/rs485.yaml、 默认情况下 RTS 为高电平有效、但 AM64x 驱动器在配置为高电平有效时似乎正在低电平有效运行!

我们正在使用 THVD1424收发器、该收发器的高电平有效、因此需要反转 RTS、根据 TRM、这应该可以在软件中实现、但6.6.32内核的串行驱动程序似乎不能像我所期望的那样正常工作。

这是一个已知问题、我是否误配置了 DTB、驱动程序是否支持此标志、是否有权变措施(除了安装硬件逆变器!) ????

谢谢!

Jon

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我发现 RS485-RTS-ACTIVE-LOW 提供所需的行为-即 RTS 在传输时为高! 这是 v10.00.07.04 SDK 中的串行驱动程序中的错误吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我认为是一个错误

    从 drivers/tty/serial/serial_core.c

            /*
             * Clear full-duplex and enabled flags, set RTS polarity to active high
             * to get to a defined state with the following properties:
             */
            rs485conf->flags &= ~(SER_RS485_RX_DURING_TX | SER_RS485_ENABLED |
                                  SER_RS485_TERMINATE_BUS |
                                  SER_RS485_RTS_AFTER_SEND);
            rs485conf->flags |= SER_RS485_RTS_ON_SEND;
    
            if (device_property_read_bool(dev, "rs485-rx-during-tx"))
                    rs485conf->flags |= SER_RS485_RX_DURING_TX;
    
            if (device_property_read_bool(dev, "linux,rs485-enabled-at-boot-time"))
                    rs485conf->flags |= SER_RS485_ENABLED;
    
            if (device_property_read_bool(dev, "rs485-rts-active-low")) {
                    rs485conf->flags &= ~SER_RS485_RTS_ON_SEND;
                    rs485conf->flags |= SER_RS485_RTS_AFTER_SEND;
            }
    

    从 drivers/tty/serial/8250/8250_omap.c 中

            /*
             * Retain same polarity semantics as RS485 software emulation,
             * i.e. SER_RS485_RTS_ON_SEND means driving RTS low on send.
             */
            if (rs485->flags & SER_RS485_RTS_ON_SEND)
                    priv->mdr3 &= ~UART_OMAP_MDR3_DIR_POL;
            else
                    priv->mdr3 |= UART_OMAP_MDR3_DIR_POL;
    

    所以 RS485-RTS-ACTIVE-HIGH 保持 SER_RS485_RTS_ON_send 标志设置、然后 OMAP 驱动器清除 UART_OMAP_MDR3_DIR_POL 位、从而导致传输期间 RTS 处于低电平!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jon、

    很抱歉、昨天没有机会查看您的问题。

    我知道这种行为会让人困惑、但仿真的软件和这个硬件驱动的 RS485 DE CONTROL 始终具有如下行为:

    RS485-RTS-active 高电平(是默认设置)会在 TX 中将 RTS 引脚驱动为低电平、而 RS485-RTS-active 低电平会在 TX 中将 RTS 引脚驱动为高电平。

    我认为原因在于驱动器谈论的是"RTS"信号、AM64x 具有"RTSn"(n 为负)引脚、与"RTS"相反。 希望这有道理。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的澄清,我将添加一条评论,以解释我们的 DTS。