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/DRA744:DMA 支持的 UART 驱动程序

Guru**** 2539500 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/580226/linux-dra744-dma-supported-uart-driver

器件型号:DRA744

工具/软件:Linux

我们将 DRA74用于我们的项目、在该项目中、我们通过 UART 接口连接到 BT 芯片。

我们观察到、目前在物理线路上使用传统的 OMAP 串行驱动程序时、我们能够实现3Mbps 的速率。 但 DMA 不用于传输。

我们甚至在  中的信息上尝试了基于8250的 UART 驱动  程序、但我们无法观察到在进行512-4096字节传输时使用了 DMA。

我们需要在项目中使用 DMA 来获得性能。

问题:-

DMA 内含 UART 驱动程序是否可用于 DRA74?

它是否在 EVM 上经过验证,是否有任何可用的性能值?

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ishaqe、
    遗憾的是、如果有一个带有 DMA 的驱动程序、我无法回答主要问题。
    但是、考虑到 UART 接口速度慢、您将无法从 DMA 中受益。 唯一的问题是 DMA 会稍微卸载主 CPU、但仅凭这一点不能实现更高的速度。
    我的主要问题是您的目标速度是多少? 是3Mbps 还是更高? 我猜3Mbps 来自 OMAP、其中这是最快的比特率。 DRA74x 现在支持高达12Mbps 的速率。 您可以通过应用适当的时钟分频器(请参阅 TRM)在驱动器中轻松设置此值。
    最后、如果您需要、请按照 TRM 和 DMA 一章中的 UART 编程指南设置 DMA 模式。

    此致、
    STAN
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我可以在 processors.wiki.ti.com/.../Sitara_Linux_UART_-_Switching_to_8250_Driver 中看到 、有一个提到的用于 UART 的支持 DMA 的驱动程序。
    TI 是否在 DRA7x 中对此进行了验证?
    我们将使用的目标速度为3Mbps
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因为内核4.0 8250是首选驱动程序。
    DRA75x 具有与 AM572x Sitaras 相同的 UART 硬件、因此驱动程序应在这两个器件上平均运行。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、谢谢。。
    但是、当我们使用8250驱动程序时、我们不会观察到在我们进行512-4096字节传输时使用了 DMA。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ishaqe、

    您能否告诉我们您使用的是 SDK/Linux 的哪个版本?

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

    我们使用的是 PROCesor SDK 3.01  

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

    我会将其转发给 UART 专家以征求意见。

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

    8250 UART 驱动程序使用 DMA、可与 DRA74x 器件配合使用、有关更多信息、请参阅以下链接:

    processors.wiki.ti.com/.../DRA7xx_GLSDK_6.10.00.02_Post-release_Updates
    processors.wiki.ti.com/.../DRA7xx_GLSDK_7.02.00.02_Post-release_Updates

    在最新的 PSDKLA 中、有一个与 UART-DMA 8250驱动程序相关的已知问题:

    processors.wiki.ti.com/.../Processor_SDK_Linux_Automotive_Release_Notes
    LCPD-9192

    此致、
    帕维尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ishaqe、
    在最新的 PSDK-LA 3.02版本中、默认启用 UART DMA。

    如果不使用默认配置、请确保启用 CONFIG_SERIAL_8250_DMA=y

    但我同意 Stan 关于更高波特率的好处。
    需要注意的是、12 Mbps 可能需要对驱动程序和 DTS 文件进行一些额外的更改、但尚未在 Linux 中进行测试。

    但是、一旦您开始工作、您肯定会看到性能的提升。

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

    您好 RK、

    感谢您提供相关信息。 我们已经进行了必要的更改、使 DMA 能够正常工作、并使其能够用于 UART 1-6。

    现在、我们必须为 uart10启用 DMA、因为在 dra7.dtsi 中未分配 DMA、我们需要使用 DMA 交叉开关映射。

    因此、我进行了如下修改

    uart10{(&U)
    状态="正常";
    pinctrl-names ="默认值";
    +DMA =<&EDMA_Xbar 150 0 48>、<&EDMA_Xbar 151 0 49>;
    +dma-names ="TX"、"Rx";
    };
    
    

    修改之后、DMA 交叉开关映射应该可以工作、但没有工作。 DMA 请求失败。

    我们开始分析、发现某些代码/DTS 修改需要使纵横制工作。

    我进行了以下修改、以完成纵横制工作

    diff -git a/arch/arm/boot/dts/dra7.dtsi b/arch/arm/boot/dts/dra7.dtsi
    INDEX 1825a6f.89734a9 100644
    -- aarch/arm/boot/dts/dra7.dtsi
    ++ b/arch/arm/boot/dts/bs/bds//224,77
    @@@@+7 m Ω
    EDMA_Xbar:dma-router@C78{
    兼容="ti、dra7-dma-crossbar";
    reg =<0xc78 0x7c>;
    - dma-cells =<2>;
    + dma-cells =<3>;
    DMA 请求=<204>;
    TI、dma-safe-map =<0>;
    dma-masters =<&edma>;
    
    diff -git a/drivers/dma/edma.c b/drivers/dma/edma.c
    index 8181ed1.0ac144d 100644
    -- a/drivers/dma/edma.c
    ++ b/drivers/dma/edma/edma.c
    @@@@-chan 2、6 +dma_struct dma_struct dma_ract_dma_dma_late
    转至输出;
    }
    
    + if (dma_spec->args_count =3)
    + 转至输出;
    +
    返回空;
    输出:
    /*该通道将用作硬件同步*/
    

     此更改后、DMA 映射看起来正常、并且可以正常工作。 我已使用 UART 外部回送进行验证。

    请检查并确认上述修改是否正确? 如果不是、请告知我们正确的修改。

    谢谢、

    Vikram

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

    Vikram、

    [引用用户="Vikram Rao"]+ DMA =<&EDMA_Xbar 150 0 48>、<&EDMA_Xbar 151 0 49>;[/引用]

    我建议检查相应的寄存器、看看是否有预期的值。

    CTRL_CORE_DMA_EDMA_DREQ_48_49

    [23:16] DMA_EDMA_DREQ_49 = 0x97 (151)-选择 UART10_DREQ_RX 代替 UART1_DREQ_RX

    [7:0] DMA_EDMA_DREQ_48 = 0x96 (150)-选择 UART10_DREQ_TX 来代替 UART1_DREQ_TX

    也<0>似乎仅用于 AM335x EDMA (<0>是应分配事件的 TC)、因此您也可以尝试将其删除。 有关详细信息、请参阅以下文件:

    Linux-kernel/Documentation/devicetree/bindings/Dma/ti-dma-crossbar.txt

    请注意、McASP1 DMA 事件默认不映射(与 UART10相同)到 EDMA 控制器、交叉开关为:

    DMA_crossbar_128  McASP1_DREQ_RX

    DMA_crossbar_129 McASP1_DREQ_TX

    和 McASP1的映射方式如下:

    linux-kernel/arch/arm/boot/dts/dra7.dtsi

    McASP1:McASP@48460000{

               DMA =<&EDMA_Xbar 129 1>、<&EDMA_Xbar 128 1>;
             dma-names ="TX"、"Rx";

    此致、
    帕维尔

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

    您好、Pavel、

    感谢您的建议。 今天、我有机会验证 uart10 DMA 交叉开关映射、似乎它正在工作。

    日志:

    [935.115121] ti-dma-crossbar 4a002c78.dma-router:将 XBAR151映射到 DMA0
    [935.121913] ti-dma-crossbar 4a002c78.dma-router:将 XBAR150映射到 DMA1
    [935.130928] omap8250 4ae2b000.serial:已将两个
    
    交叉通道[935.1278](
    4ae2b000.serial:)交叉路由器映射到 XBAR2150](非 DMA 4781] DMA 4371]交叉通道[935.241578](非交叉路由器[935.781] DMA 4a4a85241578]从 DMA 4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a241578] DMA 4a4a4a4 DMA 通道已发布 

    更改:

    uart10{
    status ="确定";
    +DMA =<&EDMA_Xbar 150 1>、<&EDMA_Xbar 151 1>;
    +dma-names ="TX"、"Rx";
    }; 

    谢谢、

    Vikram

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

    如果问题得到解决、请在 Pavel 的帖子上按"验证答案"按钮以关闭主题。
    (之后、如果出现问题、您仍可以在此处写入以重新打开)

    谢谢、
    Yordan