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.

[参考译文] AM62A7:在循环模式下拆开 DMA 时、dmaengine_terminate_sync () 不能正常工作。

Guru**** 2416110 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1520297/am62a7-dmaengine_terminate_sync-doesn-t-work-correctly-when-tearing-down-a-dma-in-cyclic-mode

器件型号:AM62A7

工具/软件:

您好:

第一次引导时、dmaengine_prep_dma_cycrocy() 将导致第一个数据块写入环缓冲区中的第一个缓冲区、并且每个连续的数据块将写入下一个缓冲区、然后相应地绕回。

但是,由于 GDB 或软件崩溃,应用程序会停止,然后调用函数 dmaengine_terminate_sync () 来停止 DMA 循环传输。  由于应用程序将在不进行下电上电或 UBoot 的情况下重新启动、因此出于某种未知原因、DMA 会将第一个数据块写入环形缓冲区中的第二个缓冲区、而不是第一个缓冲区。  通过将下一个数据块写入环缓冲区中的连续缓冲区、然后进行相应的绕回、DMA 循环模式仍将正常工作。  我认为 dmaengine_terminate_sync() 调用的低级固件不能清除所有内容。

谢谢、

Victor

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

    您好、Victor、

    您能否确认是否在 Linux SDK 中进行开发?

    此致、

    Vaibhav

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

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

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

    是的、我使用的是 Linux。

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

    您好、Victor、

    很抱歉耽误你的时间。 k3-uDMa.c 中是否有以下更改? 这是为了确保在循环模式下正确进行 DMA 拆卸。

    diff --git a/drivers/dma/ti/k3-udma.c b/drivers/dma/ti/k3-udma.c
    index 1026212f5b30..a7e082268a97 100644
    --- a/drivers/dma/ti/k3-udma.c
    +++ b/drivers/dma/ti/k3-udma.c
    @@ -1039,9 +1039,12 @@ static int udma_stop(struct udma_chan *uc)
                                       UDMA_CHAN_RT_CTL_TDOWN);
                    break;
            case DMA_MEM_TO_MEM:
    -               udma_tchanrt_write(uc, UDMA_CHAN_RT_CTL_REG,
    -                                  UDMA_CHAN_RT_CTL_EN |
    -                                  UDMA_CHAN_RT_CTL_TDOWN);
    +               u32 val = UDMA_CHAN_RT_CTL_EN | UDMA_CHAN_RT_CTL_TDOWN;
    +
    +               if (uc->cyclic)
    +                       val |= UDMA_CHAN_RT_CTL_FTDOWN;
    +
    +               udma_tchanrt_write(uc, UDMA_CHAN_RT_CTL_REG, val);
                    break;
            default:
                    uc->state = old_state;

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

    我的版本没有此更改。  我把它的变化,但没有解决的问题。

    bug 总是以同样的方式出现。  我的环形缓冲器有 16 个缓冲器。  当我的系统执行软重启时、会发生关机。  在随后的启动之后 、循环 DMA 在前 17 次传输中运行正常。  因此、DMA 填充 16 个缓冲区、绕回并填充第一个缓冲区。  然而,在第 18 次传输时,它再次填充第一个缓冲区,而不是第二个缓冲区。  这种情况总是会持续发生。  在这个断续后、后续的传输会进入正确的缓冲区。

    希望这将给您一个线索,说明为什么这总是发生。   

    谢谢、

    Victor

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

    您好、Victor、

    在 Linux 中、“软重启“命令是重新启动命令、还是任何类型的 SoC 热复位或等效器件? 或者您的用户空间应用程序因 GDB 而崩溃、然后重新启动它?

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

    尊敬的 Bin:

     即使应用程序没有重新启动、dmaengine_terminate_sync() 也似乎不起作用。  在某些情况下,应用程序需要禁用和启用 DMA 的功能 。  当我使用 dmaengine_terminate_sync() 禁用并使用 dmaengine_prep_dma_cyclic () 启用测试这些情况时,我的应用程序将崩溃。  我有一种感觉是在 dmaengine_prep_dma_cyclic () 中发生了崩溃。  无论如何、我解决了这个问题、将 SPI 控制器复位为禁用、并重新初始化 SPI 控制器以启用。  在所有这段时间、DMA 引擎继续运行。  

    拆卸的问题是,当我的应用崩溃时,内核只是重新启动它,而无需再次通过 uboot 运行。  如果应用在通过 uboot 的地方进行软重启、则不会出现在错误位置的缓冲区。  因此,它似乎 dmaengine_terminate_sync() 没有做足够的工作,使 DMA 回到正确的状态,需要通过 UBoot 或下电上电。

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

    您好、Victor、

    您是否也看到其他使用 GPMC 和 OSPI 的项目存在类似的拆卸问题? 我想知道问题是否与 PDMA 模块有关、该模块仅存在于 McSPI 上、而不存在于 GPMC 或 OSPI 上。