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.

[参考译文] AM623:AM623 DMA

Guru**** 2416110 points
Other Parts Discussed in Thread: AM623

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1511793/am623-am623-dma

器件型号:AM623

工具/软件:

尊敬的 TI 支持团队:


我正在查找与 AM62x 处理器上 DMA 功能相关的信息。

在我们的应用中、我们将 AM623 OSPI 连接到外部 FPGA。 计划是在从 FPGA 接收到中断时从 FPGA 检索一个包含多个 64 位数据的块。 我们想知道如何在从 FPGA 收到中断时触发 DMA 传输。


以下是我们目前遇到的问题。

  • 是否有适用于 AM62x 的中断驱动 DMA 接口?
  • 该接口是否可用于向存储器或外设高效写入数据或从存储器或外设高效读取数据?
  • SDK 中是否有任何用于实现此类传输的建议驱动程序或示例?

您可以提供的任何文档或指导都会有所帮助。

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

    尊敬的 Maneesh:

    我正在查看您的查询,你可能会期待在一两天内回复.

    此致、

    Anil.

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

    尊敬的 Anil:

    好! 我将等待您的答复。

    谢谢、
    Maneesh N

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

    尊敬的 Maneesh:

    上述特性旨在在哪个内核 (A53 或 DM R5F 内核?

    如果该功能将在 A53 内核上实施、那么哪个操作系统将在 A53 内核上使用?

    根据我的经验、大多数客户使用 GPMC 接口连接到 FPGA。

    在 FPGA 端、它可配置为类似于 NOR 或 PSRAM 存储器。

    在 SoC 侧、GPMC 可配置为 NOR 或 PSRAM 存储器。

    要触发读取或写入等自动事务、可以使用 GPIO 输入。

    下面的常见问题解答有助于了解如何使用 RTOS/NORTOS 端的 GPIO 输入来触发 DMA。

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1378150/faq-how-to-trigger-dma-with-the-help-of-gpio-on-am64x-am243-and-am62x-devices

    供您参考、在读取模式下支持带 DMA 的 OSPI、但由于写入端的一些时序问题、不支持写入模式。

    此致、

    Anil.

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

    您好 Anil、

    感谢您的反馈。
    对于前两个问题、我已要求我的 BSP 团队向我提供他们的答案、因为他们知道他们使用的是哪个核心。 我将在得到这方面的信息后立即对这些问题作出答复。

    关于操作系统问题、我们使用了 Yocto Linux。 我们对其进行了定制、以适应我们的应用和硬件。

    我不知道 GPMC 接口、您能否提供有关该接口的更多详细信息?
    驱动程序、通信基本接口的示例用户空间代码等详细信息会有所帮助。

    此外、我们使用 OSPI 总线作为我们在 FPGA 和 ARM 处理器之间的通信接口。

    因此、FPGA 基本上是在 10us 时发送 64 位数据、但会有一定的延迟(它们之间的这些延迟是随机的,通常为 10us 至 100us)。 问题是我无法足够快地读取数据以清除 FIFO。  

    因此、我们想检查将其移动到 DMA 是否有助于加快读取速度?  

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

    您好、Maneesh、

    我不了解 GPMC 接口、您能否提供有关该接口的更多详细信息?
    驱动程序、通信基本接口的示例用户空间代码等详细信息会有所帮助。
    因此、FPGA 基本上在 10us 时发送 64 位数据、但会有一些延迟(它们之间的这些延迟是随机的,通常为 10us 至 100us)。 问题是我无法足够快地读取数据以清除 FIFO。

    我是 RTOS/NORTOS 方面的专家、我会将您的问题发送给 Linux 专家以帮助解决上述问题。

    此致、

    Anil.

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

    尊敬的 Maneesh:

    首先、Linux 当前不支持直接触发 DMA 传输的 GPIO 中断。

    因此、FPGA 基本上是在 10us 时发送 64 位数据、并有一定的延迟(它们之间的延迟是随机的,通常为 10us 至 100us)。 [/报价]

    这是否意味着 FPGA 以 10~100us 的间隔生成中断? 那有很多中断。

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

    尊敬的 Bin Liu:

    很抱歉耽误了回复。 我将获得正确的详细信息并尽快回复。

    感谢您耐心等待。

    此致、
    Maneesh  

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

    尊敬的 Bin Liu:

    FPGA 至 ARM、寄存器读取/写入通过 OSPI 接口进行
    Arm 通过 OSPI 读取 FPGA 的 32 位 FIFO 寄存器。

    现在、我可以使用 FPGA 中的寄存器来检查 FIFO 的状态。 类似的详细信息(FIFO 为空,不为空,已满)。  

    FPGA 的中断引脚基于状态寄存器。 当 FIFO 有数据且状态寄存器检测到 FIFO 不为空时、在 FPGA 中、它会驱动 GPIO 引脚。

    因此、当我收到 GPIO 中断时、我应该从 FIFO 中读取所有数据、直到状态寄存器指示 FIFO 为空。

    基本上是一个中断、在中断回调中有多次读取、直到状态寄存器指示为空 FIFO。

    数据样本可能具有可变延迟 (10us - 100us)、这些是随机的。 但我们在 10us 内接收到的数据是 64 位。 因此、我们想检查是否可以使用 DMA 接口从 FPGA 和 ARM 读取/写入数据。

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

    尊敬的 Maneesh:

    感谢您提供详细信息。 听起来 ISR 流程如下:

    ISR (){
           while (1){
                   LEN =读取 FIFO 中数据长度的 GPGA 寄存器;
               IF(!LEN)
                      返回;
               开始 DMA 以从 OSPI/QSPI FPGA 传输 LEN 字节;
           }
    }

    while 循环必须在 10us 内完成。

    我的理解是否正确? 如果是、我不能肯定这是否可以实现。

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

    尊敬的 Bin Liu:

    写入 FIFO 的数据样本看起来像这样。
    | D3 64 位 (10us)|-(延迟 US)---| D2 64 位 (10us)|---(延迟 US)--| D1 64 位 (10us)|

    整个过程无需在 10us 内完成。

    我只需要能够足够快地消耗 FIFO。 它的深度为 4096 x 64 位。

    我希望我能够澄清

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

    尊敬的 Maneesh:

    在单个 4096x64 位帧中、GPIO 中断发生一次还是 4096 次?

    我认为 DMA 不支持这两种方式。 如果每个 4096x64 位帧发生一次中断、则 DMA 在下一个 64 位出现之前无法产生 10+us 的脉冲。 如果每 64 位发生一次中断、我认为我们可以对 DMA 循环模式进行编程、每个传输都由每个 GPIO 中断触发、但目前 AM62x DMA 内核驱动程序不支持此功能。

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

    尊敬的 Bin Liu:

    让我试着澄清一下。。。

    一旦 FIFO 中有数据、我就通过输入引脚获得中断。 当前计划是实施一个 ISR(回调函数)、通过 OSPI 读取来消耗 FIFO 输出。

    基本上、

    uint32_t GLOBAL_Buffer[4096 * 2];//仅假设
    ISR (){

       int i = 0;
           while (1){
                   REG_STATUS =读取 FPGA 寄存器;
                   
                   if (FpgaDataSamplesEmpty (reg_status)){
                         休息;
                   }

        
                   if (FpgaDataSamplesEmpty (reg_status)){
                       global_buffer[I++]= ospi_read ();//32 位读取存储在此处。
                   }

      
                   if (FpgaDataSamplesFull (reg_status)){
                       //我不应该达到这一点。
                       printf(“FIFO 已满。 \n“);               
                  }
           }
    }

    FIFO 深度为 4096 x 64 位。 因此、我必须能够足够快地耗尽 FIFO。

    但在测试了一些读取基准测试后、我观察到的是、我无法足够快地耗尽 FIFO。

    因此、后续计划试图理解、
    在中断到达时、
    是否可以对 DMA 进行编程、以读取来自 OSPI 的数据并将其写入 Linux 稍后可以从中读取数据的位置?  

    这是否澄清了我的疑问?

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

    大家好、我将在接下来的两周内离职。 请期待响应延迟。  

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

    尊敬的 Bin Liu:

    您是否回到办公室? 您有任何更新吗?

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

    尊敬的 Maneesh:

    很抱歉耽误你的时间。

    [引述 userid=“653856" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1511793/am623-am623-dma/5838138 #5838138“]

                   if (FpgaDataSamplesEmpty (reg_status)){
                         休息;
                   }

        
                   if (FpgaDataSamplesEmpty (reg_status)){

    [/报价]

    两个“IF"是否“是否都有相同的空条件? 第二个是拼写错误吗?

    是否可以对 DMA 进行编程以读取来自 OSPI 的数据并将其写入 Linux 稍后可以从中读取数据的位置?  [/报价]

    是的、DMA 可以从 OSPI 中读取数据、但在您的用例中似乎存在问题。

    在您的说明中、FPGA 似乎每 4096x16 位数据生成一个中断、但数据以每 10us 64 位的速度到达 FIFO、因此 DMA 传输必须每隔~10us 暂停一次。 那么对 DMA 进行编程的单次传输长度是多少? 如果是 64 位、则不再有中断来恢复接下来的 64 位的 DMA。 如果是 4096x16 位、则 DMA 传输不会暂停、并会从 FIFO 中读取垃圾数据。

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

    尊敬的 Bin Liu:

    “本来就是果子酒,果子酒。

                   if (FpgaDataSamplesEmpty (reg_status)==空){
                         休息;
                   }

        
                   if (FpgaDataSamplesEmpty (reg_status)== data){


    基本上不是这样、只要 FIFO 有数据、它就会为我生成中断、ISR 角色基本上就是将 FIFO 清空。
    如果有更多传入数据、则会再次生成中断。 我的担心是、使用正常的 OSPI 读取操作时、我无法足够快地将 FIFO 清空、因此想知道 DMA 是否可以从 OSPI 中读取并存储它、稍后的 Linux 可以清空 DMA 中存在的数据。

    此外,请分享一些资源(驱动程序,应用程序代码等)。 我需要测试一下。

    谢谢。

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

    您好:Naneesh、

    抱歉、我仍然不清楚 FPGA 如何向 FIFO 生成数据以及中断事件。 但我想我已经说明了 DMA 在 OSPI 接口上的工作原理。 DMA 针对预编程的传输大小在每个中断事件执行一次传输。 DMA 有两种不同的方法来实现此目的:

    -单从模式:每当收到中断时,内核驱动程序用传输数据大小对 DMA 通道进行编程,然后启动 DMA 传输。 传输完成后、DMA 会向 CPU 生成一个中断。 每个 DMA 传输都可以使用不同的传输大小进行编程。 该模式当前在 OSPI 驱动器中实现。 如果由于 DMA 通道设置时间的原因、“数据就绪“中断在高频下发生、则此 DMA 模式将不起作用。

    -循环模式:内核驱动程序使用传输数据大小对 DMA 通道进行编程,而“数据就绪“中断直接路由到 DMA 而不是 CPU。 每当中断发生时、DMA 都会自动传输数据、而不涉及 CPU、直到驱动程序专门将 DMA 通道擦除。 在该模式下、由于 DMA 通道在开始时仅编程一次、因此传输数据大小是固定的。 当前内核驱动程序在 OSPI 接口上不支持此模式。

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

    尊敬的 Bin Liu:

    |-–64bit 数据@ 10us-|-----采样间的延迟 (10us 至 100us)--|-–64bit 数据@ 10us-|……

    -在 FIFO 中看到第 1 个数据后触发 GPIO 中断。 FPGA 通过 OSPI 连接到 ARM。


    -现在,从我计算的基准, FYR

    * 32 位 OSPI 读取时间
    平均读取时间:  0.000038298 秒 (~38.2us)
    最短读取时间:  0.000022815 秒 (~22.8us)
    最大读取时间:  0.002297820 秒 (~2.3 ms)

    因此、对于 64 位、它是 2 次 32 位读取、因为 FIFO 的读取结束是 32 位。

    * 在 GPIO 中断到达后中断回调进入所需的时间
    启动 ISR 所需的最短时间:0.004383 秒 (~4.38ms)
    执行 ISR 所需的最大时间:0.005025 秒 (~5.02ms)

    因此、到 ISR 回调启动时、FIFO 中至少有 72 个样本。 当我读取这些样本时、会有较新的样本填充到 FIFO 中。

    因此、我希望将来自 OSPI 的数据直接写入 DMA。
    因此、一旦 ISR 启动、我只需对 DMA 进行编程、以从 OSPI 中读取大量数据。

    因此、请提供一些资源来帮助我从 OSPI 读取/写入/从 DMA 写入/从 OSPI 写入 DMA、对 DMA 进行编程。

    这是否澄清了我的疑问?  

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

    您好:Naneesh、

    如我所述、每次中断的 DMA 传输必须具有固定的帧长度。 但在您的用例中、OSPI 每 10us 有 64 位数据、每次中断中都没有中断或未知数据长度。 我不能在您的 OSPI/QSPI 用例中使用 DMA。

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

    好的、现在我明白了。

    我可以将中断配置为在 2048 个此类样本填充 FIFO 后触发。 假设我将帧大小固定为 2048 x 64 位。

    我是否可以读取这些数据?

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

    尊敬的 Maneesh:

    我检查了内核 OSPI 驱动程序 (drivers/spi/spi-cadence-quadspi.c)、它使用 DMA memcpy 模式从 OSPI 读取、这意味着整个 2048x64 位数据必须映射到存储器。 但您的 OSPI 数据 FIFO 似乎为 16 位宽。 因此、内核 OSPI 驱动程序似乎仍然无法使用 DMA 来读取用于您的用例的 OSPI/QSPI 数据。

    对于具有 16 位宽 FIFO 的 OSPI/QSPI 配置、DMA 应使用 DEV_TO_MEM 传输、但是当前内核 DMA 驱动程序不支持 AM62x OSPI 接口上的 DEV_TO_MEM 传输。

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

    尊敬的 Bin Liu:

    根据我的理解、“spi-cadencade-quadspi.c"的“的当前实现只具有存储器到存储器传输、即 DMA memcpy、现在没有 dev_to_MEM 正确吗?

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

    正确。

    此外、内核 DMA 驱动程序 (drivers/dma/k3-uDMA.c) 在没有 PDMA 模块的外设上不支持 DEV_TO_MEM(如果您不熟悉 PDMA、请查看 TRM)、OSPI 接口没有 PDMA。 因此、即使 spi-cadence-quadspi.c 通过 DMAPEngine DEV_TO_MEM 传输进行更新、k3-UDMA.c 仍然不支持。

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

    尊敬的 Bin Liu:

    如果我们切换到 RT Linux、您认为我可以看到性能显著提高吗?

    实际上、6.1.46-g7d494fe58c 内核版本是否具有适用于 RT Linux 的补丁/支持?  

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

    尊敬的 Maneesh:

    是的、Processor SDK 支持 RT 内核。 对于内核 6.1.46 等效代码、请使用分支 ti-RT-linux-6.1.y 并发布标签 09.01.00.008-RT

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

    尊敬的 Bin Liu:

    https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/commit/?h=ti-rt-linux-6.1.y 
    是否是此 RT-kernel 的链接?

    ti-RT-linux-6.1.y

    此外、分享一些应用或使用补丁的说明。

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

    是的、 https://git.ti.com/git/ti-linux-kernel/ti-linux-kernel.git 是内核存储库、ti-RT-linux-6.1.y 是 6.1 内核的 RT 分支。

    [报价 userid=“653856" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1511793/am623-am623-dma/5893788 #5893788“]

    此外、分享一些应用或使用补丁的说明。

    [/报价]

    我不确定您讨论过哪个补丁。 只需关闭内核、签出 ti-RT-linux-6.1.y 分支并构建内核。

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

    Bin Liu、

    我已经构建了内核。 那里只有一个适用于 ARM64 的 defconfig。 是否需要在 menuconfig 中进行任何特定更改? 还是它应该立即建立它? 此外、是否有方法可以使用旧的 DTS 文件?

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

    尊敬的 Maneesh:

    我通常不会构建 RT 分支、但内核/configs/目录是否包含文件 TI_RT.CONFIG

    您需要使用以下命令创建 kernel .config 来构建 RT 内核:

    $ make ARCH=... CROSS_COMPILE=…… defconfig ti_arm64_prune.config ti_rt.config