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.

[参考译文] Linux/AM3358:UART4 DMA 不工作

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/599074/linux-am3358-uart4-dma-not-working

器件型号:AM3358

工具/软件:Linux

你(们)好

目标系统:BeagleBone Green

操作系统:Linux 内核4.9

问题:

首先、我们在禁用 UART DMA 支持的情况下编译内核(CONFIG_SERIAL_8250_DMA)。 UART 工作正常。

然后、我们启用 UART DMA 支持、并在 DTS 中设置以下行:


uart4:串行@481a8000{
兼容="ti、am3352-uart"、"ti、omap3-uart";
ti、hwmods ="uart5";
时钟频率=<48000000>;
reg =<0x481a8000 0x2000>;
中断=<45>;
STATUS ="禁用";
DMA =<&EDMA 30 0>、<&EDMA 31 0>;
dma-names ="TX"、"Rx";
};

而 UART 不起作用。

 永远不会调用通过内核进行的跟踪 OMAP-8250_DMA_TX_COMPLETE ()。

此外、在 am33xx.dtsi 中、只有 UART 0-2具有指定的 DMA 通道。 其他则不是。 这是由硬件限制造成的吗?

谢谢

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

    TI 不支持内核 v4.9。 TI 的最新 Linux SDK 版本基于内核 v4.4.41: www.ti.com/.../PROCESSOR-SDK-AM335X
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    感谢您的快速回复。 我们切换到了4.4内核、并使用上述详细信息重新构建了该内核、但我们仍然无法使 DMA 在 UART4上正常工作。

    (请注意、我必须选择 github.com/.../eca02f01be96d2ced5b2314dc4462c32e4ad0366 、这对于 RS485运行至关重要。)

    这是否可以是 DTS 之外的东西?

    Michael
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已要求软件团队进行检查。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Michael、

    uart4在使用 DMA 时不应有任何问题。

    要使用的 DMA 通道在 dtsi 文件中设置。 因此、我的第一个建议是检查是否有任何其他模块配置为与这些 DMA (30和31)配合使用...

    此外、您在启动电路板时是否遇到任何错误?

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

    你(们)好

    我没有看到使用这些 DMA 通道的任何其他模块(实际上、我从另一个未使用的 UART 剪切和粘贴)。

    启动期间没有错误、但"dmesg | grep serial"报告说每个器 件都标识为8250、而不是16c750s、这正是 AM335x 使用的(根据此处的 www.ti.com/.../spruh73)。 这意味着在8250_port.c 中、使用 port_8250而不是 port_16570。 不过、对 PORT16570进行硬编码未解决此问题。

    静态 const struct serial8250_config uart_config[]={
    [port_unknown]={
    .name="未知",
    .fifo_size= 1,
    .TX_loadsz= 1,
    },
    [port_8250]={
    .name="8250",
    .fifo_size= 1,
    .TX_loadsz= 1,
    .................}
    
    [PORT_16750]={
    .name="TI16750"、
    .fifo_size= 64、
    .TX_loadsz= 64、
    .FCR= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 |
    UART_FCR7_64byte、
    .rxtrig_bytes={1、16、32、56}
    flags= UART_CAP_FIFO | UART_CAP_SLEEP | UART_CAP_AFE、
    }、 

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

    嗯、至少我可以通过以下代码了解为什么将 UART 标识为8250:
    /*
    *它声称是16C750兼容的、但它有一点不同。
    *它具有 EFR 并且没有 FCR7_64byte 位。 AFE (它声称对此进行了处理
    *已经)通过 EFR 而不是 MCR 启用。 类型在此设置为8250
    *让事情变得更好。 未知不起作用的原因有几个和
    *我们不需要自己的类型,因为我们不使用8250的 set_termios()
    *或 PM 回调。
    *

    也就是说、仍然无法使该 DMA 模式正常工作。 (它是否可以是 RS485特定的?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    最新的 TISDK 使用8250、因此:
    [引用]但是"dmesg | grep serial"报告说每个器件都标识为8250、而不是16c750s[/quot]
    是预期行为。

    我将对此进行研究、并将在有任何建议时进行更新。

    此致、
    Yordan