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.

[参考译文] AM6411:如何启用 UART2 硬件流控制?

Guru**** 2489685 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1552949/am6411-how-to-enable-uart2-hw-flow-control

器件型号:AM6411


工具/软件:

您好、  

我们正努力 在 UART2 上启用硬件流控制。 我们已将下面的补丁应用于 DTS 文件 、并在 Linux UART 应用程序的 termios 调用中设置 RTSCTS 标志。 UART TX 和 RX 按预期工作、但硬件流控制仍处于禁用状态。  

下面的补丁中有什么问题吗?

diff -git a/arch/arm64/boot/dts/ti/k3-am64x-wiser.dts b/arch/arm64/boot/dts/ti/k3-am64x-wiser.dts

索引 86bf47a96a64..09f7e6aaea4b 100644

-- A/arch/arm64/boot/dts/ti/k3-am64x-wiser.dts

++ b/arch/arm64/boot/dts/ti/k3-am64x-wiser.dts

@@–265、6 +265、7 @@&MAIN_uart2{

pinctrl-names =“default";“;

pinctrl-0 =<&zigibe_pins_default>;

电流速度=<115200>;

+ uart-has-rtscts;

};

 

@@–176、6 +174、8 @@ zigabo_pins_default:zigabo-default-pins{

pinctrl-single、pins =<

AM64X_IOPAD (0x0238、PIN_INPUT、3)/*(B16) UART0_CTSN.UART2_RXD */

AM64X_IOPAD (0x023c、PIN_OUTPUT、3)/*(A16) UART0_RTSn.UART2_TXD */

+ AM64X_IOPAD (0x0294、PIN_OUTPUT_PULLUP、1)/*(J19) GPIO1_76.UART2_RTSn */

+ AM64X_IOPAD (0x028C、PIN_INPUT_PULLUP、1)/*(L20) GPIO1_75.UART2_CTSN *

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

    尊敬的 Geoffrey:

    [报价 userid=“465223" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1552949/am6411-how-to-enable-uart2-hw-flow-control

    + AM64X_IOPAD (0x0294、PIN_OUTPUT_PULLUP、1)/*(J19) GPIO1_76.UART2_RTSn */

    + AM64X_IOPAD (0x028C、PIN_INPUT_PULLUP、1)/*(L20) GPIO1_75.UART2_CTSN *

    [/报价]

    首先请检查引脚多路复用是否设置正确。 确保这两个引脚不会在其他模块上使用。 在 AM64x GPEVM 和 SKEVM 上、这两个引脚用于 SD 卡。

    检查这两个引脚的 padconfig 寄存器是否确实设置正确。

    如果 pinmux 没有问题、请说明您是如何观察到硬件流控制被禁用的。

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

    尊敬的 Bin Liu:

    根据粘贴在初始 POST 上的差异、我们相信引脚已成功改用其他用途 (CMD/CLK)。  并且在其他任何位置都找不到它们被引用。

    关于测试、我们看到的问题是 CTS/RTS 始终为 TTL 低电平、从而发出连续传输的信号、即使 RX 缓冲区溢出或未从中读取 RX 缓冲区也是如此。  在不同的 UART 硬件上使用相同的工具重复完全相同的测试会导致 CTS/RTS 变为 TTL 高电平、直到读取缓冲区。  如果我们断开 RTS 与 CTS 的连接、并将 TTL 低电平应用于 CTS、则传输停止、这意味着 CTS 按预期工作。  但是、不会驱动 RTS、因为应该基于 Rx 缓冲区状态/应该请求暂停传输的任何内容。

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

    尊敬的 Shahbaz:

    请读取相应的 padconfig 寄存器以确保引脚多路复用正确。 AM64x 数据表中列出了寄存器地址、您可以使用 devmem2 工具读取地址。

    您使用哪个 SDK 版本? 我想检查它的内核 UART 驱动程序代码。

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

    我们终于设法使它现在起作用。

    历史记录一点;我们之前将这些 J19 和 L20 引脚配置为 4 位 SDIO(模式 0)。  然后尝试将其重新用于 UART2 CTS/RTS(模式 1)。

    这就是我们所做的更改:

           mmc1_pins_default: mmc1-default-pins {
                   pinctrl-single,pins = <
    -                      AM64X_IOPAD(0x0294, PIN_INPUT, 0) /* (J19) MMC1_CMD */
    -                      AM64X_IOPAD(0x028c, PIN_INPUT, 0) /* (L20) MMC1_CLK */
                           AM64X_IOPAD(0x0288, PIN_INPUT, 0) /* (K21) MMC1_DAT0 */
                           AM64X_IOPAD(0x0284, PIN_INPUT, 0) /* (L21) MMC1_DAT1 */
                           AM64X_IOPAD(0x0280, PIN_INPUT, 0) /* (K19) MMC1_DAT2 */
    @@ -176,6 +174,8 @@ zigbee_pins_default: zigbee-default-pins {
                   pinctrl-single,pins = <
                           AM64X_IOPAD(0x0238, PIN_INPUT, 3) /* (B16) UART0_CTSn.UART2_RXD */
                           AM64X_IOPAD(0x023c, PIN_OUTPUT, 3) /* (A16) UART0_RTSn.UART2_TXD */
    +                      AM64X_IOPAD(0x028c, PIN_INPUT, 1) /* (L20) MMC1_CLK.UART2_CTSn */
    +                      AM64X_IOPAD(0x0294, PIN_OUTPUT_PULLUP, 1) /* (J19) MMC1_CMD.UART2_RTSn */
                   >;
           };

    预期这将是现在在 UART2 上运行 CTS/RTS 流量控制所需的全部内容。

    然而、仅通过这种更改、我们在 RTS 引脚上出现了一些奇怪的行为、导致流控制协议无法正常工作。

    我们如何解决它是从源代码中完全删除 SDIO 定义:

    -&sdhci1 {
    -    status = "okay";
    -    vmmc-supply = <&wifi_3v3_wb>;
    -    bus-width = <4>;
    -    non-removable;
    -    disable-wp;
    -    cap-power-off-card;
    -    keep-power-in-suspend;
    -    ti,driver-strength-ohm = <50>;
    -      pinctrl-0 = <&mmc1_pins_default>;
    -    pinctrl-names = "default";
    -    mmc-pwrseq = <&wfx_pwrseq>;
    -
    -    /* 25Mhz support */
    -    sd-uhs-sdr12;
    -    /* 50Mhz support */
    -    sd-uhs-sdr25;
    -    /* Support hardware reset */
    -    cap-mmc-hw-reset;
    -
    -    /* Force to 26Mhz (max freq. supported by the wf200) */
    -    max-frequency = <26000000>;
    -
    -    #address-cells = <1>;
    -    #size-cells = <0>;
    -
    -    wifi1: wifi@1 {
    -        compatible = "silabs,wf200";
    -        status = "okay";
    -        reg = <1>;
    -    };
    - };
    

    根本不应该要求这样做。

    我不确定这是 sdhci1{}定义本身、还是  pinctrl-0 =<&mmc1_pins_default>; 该结构中的定义、但结果是、在我们删除该块之前、流控制不起作用。  即该块的存在干扰了这 2 个引脚的 pinmux / MODE 更改。

    该构建是使用 6.6 BSP 上的 Yocto scarthgap 完成的、但在其他具有之前 BSP 迭代的 Yocto 版本上也存在相同的问题、因此我相信它无处不在。

    您能否在结束时调查问题并报告?

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

    尊敬的 Shahbaz:

    是的、要将 MMC 引脚更改为不同的引脚多路复用模式、必须禁用相应的 MMC 模块(关闭)。 对于您的用例、您可以如上所示删除整个 sdhci1 节点、更好的解决方案是将以下内容添加到电路板器件树文件中。

    &sdhci1{
      STATUS =“已禁用“;
    }

    过去几天我都不在办公室。 我将在本周晚些时候更新此主题、以详细说明为什么需要这一要求。

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

    尊敬的 Shahbaz:

    我找不到任何文档说明必须为使其引脚处于 GPIO 模式禁用 MMC 模块、但这与 MMCSD_SS_PHY_CTRL_1 寄存器相关。

    对于在 GPIO 模式下使用的 MMC 引脚、必须将寄存器位 31 设置为“1"。“。 但在 MMC 驱动程序 init 中将其设置为“0"。“。 这就是必须禁用 MMC 模块才能使其引脚处于 GPIO 模式的原因。