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.

[参考译文] RTOS/AM5728:共享 EDMA 配置

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/657483/rtos-am5728-shared-edma-configuration

器件型号:AM5728

工具/软件:TI-RTOS

我的应用程序具有一些由运行 TI-RTOS 的 IPU/M4内核控制的外设、还有一些由运行 Linux 的 MPU/A15内核控制的外设。 我想对系统 M4侧的这些外设(UART、SPI)使用 DMA 传输。 浏览 Linux 内核文档(kernel_src/Documentation/devicetree/bindings/tma/ti-edma.txt)、我发现有几个相关的器件树参数:

  • TI、EDMA-memcpy 通道、告诉 Linux 哪些通道可用于 memcpy 操作(如果有)
  • TI-EDMA 保留插槽范围、告诉 Linux 不能使用哪个参数集(即保留供 IPU 和 DSP 使用)
  • DMA、它告诉 Linux 哪些 DMA 通道可用于哪些外设

我的理解是、我需要告诉 Linux 不要使用某些通道和参数集、这样 IPU 的功能和 Linux 的功能之间就不会发生冲突。 这是有道理的、在 Linux 方面、这似乎是一件非常简单的事情。

问题出在议会联盟方面。 我不知道我应该如何知道议会联盟的推动者将使用哪些渠道和参数集,我也不知道我如何能够对此产生任何影响,也不能找到任何相关的文件。 我尝试使用调试器单步执行 IPU 内核上的 UART 示例、看起来要使用的参数集是从基于通道编号的 edma3DrvChBoundRes 对象中检索的。 我尝试跟踪此对象的设置方式、但在源代码中找不到任何相关内容。

您能否提供有关如何确定 IPU 驱动程序设置以正确配置 Linux 设备树的指导?

作为参考、我将使用适用于 AM57xx 器件的 TI 处理器 SDK RTOS 4.02.00.09版中的库和驱动程序。

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

    您的理解是正确的- IPU 和 Linux 之间的 EDMA 通道应该没有冲突。 我一直在尝试从 EDMA 专家那里获得更多的信息、但我们现在似乎没有这样的文档来涵盖该主题。 实质上,EDMA 通道由 EDMA_DRV_OPEN() API 在 EDMA_DRV_Open ()之后分配,然后在分配通道之后调用 EDM3_RM_LOADResource (),并在启动 EDMA 传输之前设置参数。

    EDMA LLD 程序包\ti\sd\EDMA3\drv\docs 和程序包\ti\sda\EDMA3\rm\docs 中的文档 EDMA 驱动程序用户指南和资源管理器用户指南可能会有所帮助。

    >>我尝试跟踪此对象的设置方式,但在源代码中找不到任何有关该对象的内容。
    如果您使用 UART 示例设置了 AM572x EVM、则应能够进入函数并识别调用流程。

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

    Garrett、

    感谢您的回复。 我已经使用调试器单步执行 UART 示例、我可以看到通道和参数集的分配位置。 例如、我可以看到 EDMA3_DRV_getParam 将获得当前映射到指定通道的参数集、并且 EDMA3_DRV_requestChannel 可用于分配和设置与传输配合使用的通道。 我没有看到内部映射在调试期间的初始化位置(尽管我在搜索源树时确实找到了"默认"映射的位置;请参阅下面的)。

    RM 手册引用了 dmaChannelPaRAMMap 对象、该对象将 DMA 通道映射到参数集、但不清楚这实际上是在哪里定义的。 搜索源树(例如、EDMA3_LLD_2_21_05_30B 目录内的 grep -RNW "dmaChannelPaRAMMap")会生成一整组二进制文件匹配、 但在源代码中设置映射的位置不明显、除非在没有定义其他映射的情况下设置通道映射的一对一参数的函数。 我必须假定它将始终是一对一的映射、因为我没有看到其他定义。

    《技术参考手册》介绍了如何将多个参数集链接在一起以进行更复杂的传输(例如、参数集1的"link"字段可以指向设置29、进而指向125等等)、这是我要做的事情。 但是、从我在 RM 和驱动程序文档中看到的情况来看、RM 和 EDMA3驱动程序似乎都不通过可用的 API 或 XDC 构建选项(其中的后者、我找不到任何文档)来支持这一点。 也就是说、没有明显的方法可以使用提供的库来:a)请求与任何通道取消关联的参数插槽;B)将多个参数集与给定通道相关联。

    我假设我的最佳选择是手动决定我将为我的 IPU 应用程序使用某些参数集(例如500-512)、并在内核器件树中保留这些参数集。 然后、我可以进入我的 IPU 应用程序、使用我自己的代码根据需要手动寻址和配置每个参数集。 最后、我将使用 EDMA3_DRV_getParam 函数获取当前与通道关联的参数集、并将其链接到我手动"分配"的其他设置之一。 您是否同意这是最佳方法? 或者、我是否错过了 API 或 XDC 配置中的某些内容?

    如果我在现有文档中遗漏了一些内容、请告诉我、那里有很多内容、我很容易忽略了一些内容。

    Scott

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

    对于 UART、DMA 事件是固定的、如 AM572x 下的 UART_SoC.c 所示。 然后,EDMA 通道和参数集由 EDMA3_DRV_requestChannel()调用确定,它将调用 EDMA LLD。 我相信它来自 sample_tda2xx_cfg.c

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

    谢谢、Eric。

    根据您的响应、EDMA3驱动程序似乎不直接支持使用未直接映射到通道的参数集、因此、如果我要使用参数集、我可以手动配置额外的参数集。 这听起来是否准确?

    我最终还能够跟踪映射来自与 TDA2xx 系列芯片相关的文件、但在 AM57xx 和 TDA2xx 系列的构建过程之间没有明显的联系。 如果我想覆盖默认文件中找到的通道到参数映射、建议在我的应用程序构建过程中使用这种方法 (例如、通过定义我自己的表并通过 API 调用或在链接时通过覆盖符号覆盖提供的表)? 或者、在运行时、我是否应该在调用 edma3init 之前覆盖表中的值?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Scott
    在 EDMA 中、有多个区域、我将向您发送包含所有这些区域的文件。 IPU 位于区域4中、它们为该区域分配某些参数。 我仍在努力查看将哪些参数分配给区域4。 希望在本周结束时能够弄清这一点。

    此致
    Mohsen
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Scott
    很抱歉、我们收到了额外的电子邮件、但我想我知道如何配置。 以下文件是 tDA2x 的示例配置。 您可以配置哪个参数属于哪个区域、这样您就可以选择所需的区域。

    EDMA3_LLD_2_12_04_28\packages/ti\sdo\EDMA3\rm\src\configs\EDMA3_tda2xx_cfg.c

    可用于 AM572x。 您应该将此文件添加到项目中、EDMA 会将其用作 EDMA 的配置文件。

    我希望这能回答你的问题

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

    尽管我不得不使用此文件、但这似乎是答案:
    EDMA3_LLD_2_12_04_28/packages/ti/sdo/EDMA3/drv/sample/src/platforms/sample_tda2xx_cfg.c


    无论出于何种原因、编译都会查找符号 sampleInstInitConfig (而不是您引用的文件中的 defInstInitConfig)。


    Scott