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.

[参考译文] AM625:如何在 RT-Linux 中启用 UART DMA?

Guru**** 2393615 points
Other Parts Discussed in Thread: AM623, AM625

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1488925/am625-how-to-enable-uart-dma-in-rt-linux

器件型号:AM625
主题中讨论的其他器件:AM623

工具与软件:

你(们)好  

我们是否有 FAE 或指南来介绍如何在 RT-Linux 中实现 UART DMA?

SDK 8.6.

此致

Zekun

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

    主题:  AM623处理器上的 UART5数据丢失和输入溢出问题

    问题描述:

    我使用 AM623处理器、并且在 UART5以115200波特接收期间会遇到偶尔的数据丢失(缺少1-3个字节)。 这大约每几百次传输发生一次。 内核日志显示重复的输入溢出错误:

    [ 3816.583194] ttyS ttyS5: 1 input overrun(s)
    [ 3921.439083] ttyS ttyS5: 1 input overrun(s)
    [ 3968.364367] ttyS ttyS5: 1 input overrun(s)
    [ 4055.473693] ttyS ttyS5: 1 input overrun(s)
    Current UART5 Configuration (DTS):
    main_uart5: serial@2850000 {
    compatible = "ti,am64-uart", "ti,am654-uart";
    reg = <0x00 0x02850000 0x00 0x100>;
    interrupts = <GIC_SPI 183 IRQ_TYPE_LEVEL_HIGH>;
    power-domains = <&k3_pds 156 TI_SCI_PD_EXCLUSIVE>;
    clocks = <&k3_clks 156 0>; clock-names = "fclk";
    };
    Request:
    To resolve the overrun issue, I propose adding DMA support to UART5.Please guide me on how to configure this UART5


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

    尊敬的环环先生/女士:

    UART 不应在115200波特下溢出。 即使这样、DMA 也不会起作用。

    您能否与 SDK10.1内核进行测试、看看问题是否仍然发生?

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

    尊敬的 Liubin:

       我在三个 SDK 版本中重复出现了相同的问题: ‌08_06_00_42 ‌、 ‌09_00_00_03 ‌和 ‌09_01_00_08 ‌、但在中不会出现此问题 ‌10_01_10_04 ‌SDK 版本。

    重现步骤

    1. PC 端 ‌:发送~180字节的数据到 AM62板每 ‌100ms ‌或者 ‌500ms ‌.
    2. AM62端数据接收 ‌:
      • 步骤1. ‌:使用以下命令配置串行端口:
        BashCopy 代码
        stty -F /dev/ttyS3 ispeed 115200 ospeed 115200 cs8 -echo time 1
      • 步骤2. ‌:使用以下命令记录接收到的数据:
        BashCopy 代码
        cat /dev/ttyS3 > serial_115200_100_atk.log

    发现的问题

    • 提供了器件建议 ‌200帧 ‌大量数据、 ‌1–3个字节丢失 ‌一帧中。
    • 内核会记录输入溢出错误:
      文本复制代码
      [ 1895.708432] ttyS ttyS3: 1 input overrun(s)
      [ 2280.827981] ttyS ttyS3: 1 input overrun(s)
      [ 2294.383918] ttyS ttyS3: 1 input overrun(s)

    申请
    由于较新的 SDK (10_01_10_04)可修复此问题、因此请提供一个可应用于较旧 SDK 版本的补丁。

    您好 Liubin、我找到了下面的两个链接。 它们是否解决了我所描述的问题?
    通过实际测试、应用链路中提供的修复方法导致了更严重的字节丢失概率、‌11个数据包组中有5个组‌发生字节丢失。

    https://lore.kernel.org/lkml/ffbe6439-9696-4abe-976b-07286b37a219@ti.com/T/
    https://www.ti.com/lit/er/sprz536b/sprz536b.pdf?ts = 1742317798669



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

    是的,这是修复数据丢失问题的补丁。

    通过实际测试、应用链接中提供的修复方法导致更严重的字节丢失概率、‌11个数据包组中有5个组‌出现字节丢失。

    您是否应用了此补丁的 v3或 v4?

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

    纸槽:

     我想问一下、在10.1版本之前的 AM64x Linux-RT 上是否发生了相同的 DMA 问题?

    谢谢

    吉姆

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

    Jim、

    是的、它也会影响 AM64x。 它与勘误表 i2310有关。

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

    Jim、

    为了供您将来参考、每当您有与 e2e 主题相关的问题时、请点击该主题右上角的黄色"+提出相关问题"、它会打开一个新的 e2e 主题并链接到相关主题。

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

    是的、我们  在上使用此补丁的 v4  08_06_00_42

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

    我在 SDK8.6和10.1之间比较了 UART 驱动程序、除了您应用的补丁外还有一些差异、但我不确定还需要哪些其他更改来解决您的数据丢失问题。

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

    在 SDK8.6中、除了应用的补丁 v4、您是否可以尝试下面的内核补丁来查看它是否修复了数据丢失问题? 该补丁基本上会删除"UART_RX_TIMEOUT_QUIRK"标志。

    diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c
    index 537bee8d2258..acc017baf325 100644
    --- a/drivers/tty/serial/8250/8250_omap.c
    +++ b/drivers/tty/serial/8250/8250_omap.c
    @@ -1254,8 +1254,7 @@ static struct omap8250_dma_params am33xx_dma = {
     
     static struct omap8250_platdata am654_platdata = {
            .dma_params     = &am654_dma,
    -       .habit          = UART_HAS_EFR2 | UART_HAS_RHR_IT_DIS |
    -                         UART_RX_TIMEOUT_QUIRK,
    +       .habit          = UART_HAS_EFR2 | UART_HAS_RHR_IT_DIS,
     };
     
     static struct omap8250_platdata am33xx_platdata = {

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

    删除此 UART_RX_TIMEOUT_QUIRK 标志后、内核仍会打印此消息 ‌"TTYs ttyS5:1输入超限(s)" ‌和 ‌缺少数据字节 ‌.

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

    好的、这意味着该问题与勘误表 i2310无关、而是其他问题。 内核在 SDK 8.6和10.1之间有着巨大的差异、因而要判断 SDK10.1内核中进行哪些软件更改来解决该问题并不容易。

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

    您好、Bin、

     我注意到、应用 TI 补丁后、当服务进程未运行时、UART 不会丢失字节。 但是、在运行服务程序时、经常会发生字节丢失。 字节丢失始终与设置的 UART_LSR_OE 一致。 芯片的 FIFO 的大小为64字节、但是在第65字节位置发生重复损耗。 由于我们使用的是带有强制线程化中断的 RT-Linux、因此我怀疑当服务运行时、线程化中断可能无法及时得到处理。 因此、我仍然希望 TI 为 UART DMA 提供一个器件树配置参考、以帮助我验证该假设。

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

    尊敬的环环先生/女士:

    在这种情况下、DMA 不起作用、但会引起更多问题。

    您使用哪款 AM625器件? 它具有多少个 A53内核? 如果有多个 A53、是否已尝试对此 UART 端口使用 IRQ 关联性?

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

    您好、Bin、

    感谢您的支持。

    根本原因分析:
    实时 Linux (RT-Linux)强制使所有中断服务例程(ISR)线程化、这意味着系统中断由内核线程处理、以执行服务函数(然后与用户进程和其他内核线程竞争以进行调度)。 应用 TI 的补丁(该补丁解决了 TI UART 控制器中的一个错误、并降低字节丢失的可能性、但不能完全解决该问题)后、当产品线的服务进程运行时、系统不仅会生成其他进程、还会唤醒许多其他内核线程。 在这种情况下、无法及时调度 UART 接收线程、从而导致 RX FIFO 溢出并永久丢失字节。

    解决和验证:
    UART 接收中断触发阈值从默认的48字节(芯片的 RX FIFO 大小为64字节)调整为16字节。 进行此调整的原因是:

    • 许多处理器的 UART FIFO 缓冲器的大小为8/16/32字节。
    • 线程化中断会引入调度延迟。
    • UART DMA 的基准配置不可用、启用 DMA 可能会引入其他问题。

    验证测试:
    两个 UART 通道每100ms 同时接收180字节。 在两个通道上有20,000个数据集之后、 ‌零字节丢失 ‌观测到的波形。

     

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

    尊敬的环环先生/女士:

    [报价 userid="629361" url="~/support/processors-group/processors/f/processors-forum/1488925/am625-how-to-enable-uart-dma-in-rt-linux/5743531 #5743531"] 解决和验证:
    UART 接收中断触发阈值从默认的48字节(芯片的 RX FIFO 大小为64字节)调整为16字节。 [报价]

    感谢您分享分辨率。

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

    您好、Bin、

       我们的产品目前正在从08_06_00_42版升级到10_01_10_04版的 SDK。 关于您提到的 UART DMA 问题、我想确认在最新的10_01_10_04版本中该问题是否仍然存在。 我对 DMA 相关的问题也很感兴趣。 您能分享一下 DMA 可能会引入哪些具体问题吗? 我们是否可以参考任何技术文档进行进一步调查?

      丢失字节的根本原因与中断线程有关、其中可能无法足够及时地调度 UART 接收线程来读取接收寄存器。 为了提高 UART 接收的稳健性、我们打算在新的 SDK 中实施 DMA。 我们的问题是、即使具有16字节的中断阈值、瞬态系统过载仍可能由于调度延迟而导致 RX FIFO 溢出。 我们相信、启用 DMA 可以通过减少对实时线程调度的依赖来降低这种风险。

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

    尊敬的环环先生/女士:

    从 SDK 8.6到10.1、UART 驱动程序的结构变化不大、因此我不希望出现行为变化。

    问题在于内核调度、这就是我提到 UART IRQ 关联性的原因、这可能会解决问题。

    启用 DMA 后、内核必须提供 DMA 传输完成中断、该中断仍依赖于内核调度。

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

    您好、Bin、

    我们已经尝试过通过 IRQ 关联将 UART 中断绑定到专用 CPU 内核、但 ‌字节丢失问题仍然存在 ‌.

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

    尊敬的环环先生/女士:

       我在三个 SDK 版本中重现了同样的问题: ‌08_06_00_42 ‌、 ‌09_00_00_03 ‌和 ‌09_01_00_08 ‌、但在中不会出现此问题 ‌10_01_10_04 ‌SDK 版本
       我们的产品目前正在从08_06_00_42版升级到10_01_10_04版的 SDK。 关于您提到的 UART DMA 问题、我想确认在最新的10_01_10_04版本中该问题是否仍然存在。 [报价]

    大约两周前、您说 SDK 10.1.10.4不会出现此问题、但现在您询问 SDK 10.1.10.4中是否仍存在此问题。 您能解释一下视差吗? 您在谈论不同的 UART 用例/问题吗?

    由于您现在正在着手升级到 sdk10.1、因此我想了解确切的 UART 测试用例和故障、以便我可以在我这边重现并研究它。