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:EOP 更改断开的 McASP 的 UDMA 循环模式

Guru**** 2609285 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1559488/am623-udma-cyclic-mode-for-mcasp-broken-by-eop-change

器件型号:AM623


工具/软件:

在 SDK 版本 09.02.00.09 和 09.02.00.10 之间、以下补丁中断了来自 McASP 的音频流:

commit 67d5b24398155d07376b04dd8b3d858d049a5e17
Author: Jai Luthra <j-luthra@ti.com>
Date:   Mon Apr 29 16:06:55 2024 +0530

    dmaengine: ti: k3-udma: Fix teardown for cyclic RX with PDMA

    When receiving data in cyclic mode from PDMA peripherals, where reload
    count is set to infinite, any TR in the set can potentially be the last
    one of the overall transfer. In such cases, the EOP flag needs to be set
    in each TR and PDMA's Static TR "Z" parameter should be set, matching
    the size of the TR.

    This is required for the teardown to function properly and cleanup the
    internal state memory. This only affects platforms using BCDMA and not
    those using UDMA-P, which could set EOP flag in the teardown TR
    automatically.

UDMA 的音频流配置为:

  • 具有 ACC32、突发的 PDMA
  • 循环
  • period_len = 65536
  • buf_len = 524288

在该补丁音频流正常工作之前、这意味着输出字节与输入相匹配。

此补丁后、音频流中断:

  1. 输出中每 65536 个字节就会出现不连续的情况、有额外的空字节(观察到 16 字节和 32 字节偏移)
  2. 由于#1、TDM 流被移至不同的通道
  3. 手动跟踪数据流中更改的偏移仍会导致音频信号中断、从而可能指示样本丢失

e2e.ti.com/.../normal_5F00_tdm128.wav

e2e.ti.com/.../bad_5F00_tdm128.wav

附加的文件 normal_tdm128.wav 是使用从 09.00.00.010 开始的 arecord 的记录。 文件 bad_tdm128.wav 是使用来自 09.02.00.010 的 arecord 的记录。 这两个录音都是 128 个频道,有 24 个频道流音频和其余零。 两个录音在一个信道上都有提示音输入、由于距离的关系、在至少 3 个其他信道上的音量要小得多。

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

    此未解决的问题与此问题相同:
    e2e.ti.com/.../am625-a-cyclic-mode-udma-issue-in-sdk-10-01-10-04

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

    您好、Matthew、  

    您能否使用最新的 11.1 SDK 运行测试并分享您的观察结果。  

    另外、如果您能让我们知道在我们的 EVM 上重现此问题的方法、不胜感激。

    此致、

    Suren

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

    我将尝试使用 11.1 重新创建。 我们正在使用 McASP 捕获 I2S、因此在 EVM 上复制可能需要数据源。

    我们的声卡是来自 McASP2 的 4 个 TDM32 流通道、具有以下设备树配置:

        sound0: sound@0 {
            compatible = "simple-audio-card";
            simple-audio-card,name = "A2B_TDM";
            simple-audio-card,format = "dsp_a";
            simple-audio-card,mclk-fs = <512>;
            simple-audio-card,bitclock-master = <&sound_slave>;
            simple-audio-card,frame-master = <&sound_slave>;
    
            status="okay";
    
            sound_master: simple-audio-card,cpu {
                sound-dai = <&mcasp2>;
            };
    
            sound_slave: simple-audio-card,codec {
                sound-dai = <&codec_test>;
            };
        };
    	
        codec_test: codec_test {
            #sound-dai-cells = <0>;
            compatible = "linux,snd-soc-dummy";
            status="okay";
          };
    
    &mcasp2 {
        status = "okay";
        #sound-dai-cells = <0>;
    
        pinctrl-names = "default";
        pinctrl-0 = <&mcasp2_pins_default>;
    
        op-mode = <0>;      /* MCASP_IIS_MODE */
        tdm-slots = <32>;
        ext-clk-provider;   /* external clocks provided, override DAI_FMT to be bclk/fs consumer */
        extended-tdm-fs;    /* TDM mode defaults to 1-bit-width frame sync, this flags extends to 1-word-width */
    
        /*    1 : Tx, 2 : Rx */
        serial-dir = <
            2 2 2 2
            0 0 0 0
            0 0 0 0
            1 1 1 1
        >;
    
        tx-num-evt = <0>;
        rx-num-evt = <0>;
    };

    此外、BCDMA 配置的计算结果如下:

    • buf_len = 524288 (512K)
    • period_len = 65536 (64k)
    • 周期= 8
    • 16 个发送请求、每组 2 个:
      • icnt0=65528、icnt1=1、DIM1=65528
      • icnt0=8、icnt1=1、DIM1=8、EOP 置位
    • PDMA (DEV_TO_MEM) 模式、具有:
      • ACC32=1
      • BURST=1
      • 循环=1
    • bstcnt Zap为 32764 μ s (我突然意识到这很可能是问题!)  Zapμ s
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    添加的用于设置 bstcount 的代码似乎错误:

    	} else if (uc->ud->match_data->type == DMA_TYPE_BCDMA &&
    		   uc->config.dir == DMA_DEV_TO_MEM && !uc->config.pkt_mode &&
    		   uc->cyclic) {
    		/*
    		 * For cyclic TR mode PDMA must close the packet after every TR
    		 * transfer, as we have to set EOP in each TR to prevent short
    		 * packet errors seen on channel teardown.
    		 */
    		struct cppi5_tr_type1_t *tr_req = d->hwdesc[0].tr_req_base;
    
    		d->static_tr.bstcnt =
    			(tr_req->icnt0 * tr_req->icnt1) / dev_width;

    这会基于一个 TR 来设置 bstcnt、但是 UDMA_PREP_DMA_CORY_tr () 中的驱动程序在调用 UDMA_GET_TR_COUNTERS () 时、每个周期可能会根据大小生成一个或两个 TR:

    static int udma_get_tr_counters(size_t len, unsigned long align_to,
    				u16 *tr0_cnt0, u16 *tr0_cnt1, u16 *tr1_cnt0)
    {
    	if (len < SZ_64K) {
    		*tr0_cnt0 = len;
    		*tr0_cnt1 = 1;
    
    		return 1;
    	}
    
    	if (align_to > 3)
    		align_to = 3;
    
    realign:
    	*tr0_cnt0 = SZ_64K - BIT(align_to);
    	if (len / *tr0_cnt0 >= SZ_64K) {
    		if (align_to) {
    			align_to--;
    			goto realign;
    		}
    		return -EINVAL;
    	}
    
    	*tr0_cnt1 = len / *tr0_cnt0;
    	*tr1_cnt0 = len % *tr0_cnt0;
    
    	return 2;
    }

    因此、对于 64k 到 128k-1 的输入长度、每次传输将有两个 TR、我们最终得到:

    1. 65536 字节后的 EOP(在第二个 TR 上设置)
    2. bstcnt 设置为 32464、DEV_WIDTH=2、总共 65528
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Matthew、

    您是否可以提供相同的修补程序、以便让我的团队审核该修补程序并将其上传到社区以供使用。

    通过上述更改、您是否能够解决该问题?

    此致、

    Suren

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

    使用 9.03 的附加补丁时、TDM 通道不会混合:

    Workaround for bug in commit 67d5b24398155d07376b04dd8b3d858d049a5e17
    Original commit title:
        dmaengine: ti: k3-udma: Fix teardown for cyclic RX with PDMA
    
    The original commit sets EOP at the end of BCDMA transfer and sets bstcnt
    based on the contents of transmit resquest (TR) #0. The driver, however, will
    use two TRs when transfer size is >=64k bytes with EOP set on the second TR. 
    In this case bstcnt should equal the total bytes for both TRs.
    
    diff --git a/drivers/dma/ti/k3-udma.c b/drivers/dma/ti/k3-udma.c
    index 4291bbf998ab..81b62df45be2 100644
    --- a/drivers/dma/ti/k3-udma.c
    +++ b/drivers/dma/ti/k3-udma.c
    @@ -3220,6 +3220,11 @@ static int udma_configure_statictr(struct udma_chan *uc, struct udma_desc *d,
     
     		d->static_tr.bstcnt =
     			(tr_req->icnt0 * tr_req->icnt1) / dev_width;
    +
    +		// Data may be in two TR if >=64k
    +		if( !(tr_req->flags & CPPI5_TR_CSF_EOP) ){
    +			d->static_tr.bstcnt += (tr_req[1].icnt0 * tr_req[1].icnt1) / dev_width;
    +		}
     	} else {
     		d->static_tr.bstcnt = 0;
     	}
    

    请注意、11.01 使用相同的代码、但它已被移动到其他文件。

    在测试中、我仍然看到录制的音频不连续、录制的音频需要 8 秒。 我正在努力确定这是否与 EOP 更改有关、或者是否是单独的问题。

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

    我还有两个关于 BCDMA 流程的问题:

    1. 当传输分成两个传输请求而第二个请求只有 8 个字节时、是否会对性能产生影响?
    2. 对于 McASP 到 PDMA 到 BCDMA 的应用、在哪里  设置了 64KB 的数据包长度 (k3-UDMA.c 中的 period_len)?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Matthew。

    感谢您分享代码更改。 我已经将其发送给我们的软件专家以进行审核并提供意见。

    还就代码更改对性能的影响与他们联系。

    您是否在 11.1 SDK 上测试了音频录制? 如果我理解正确、立体声录制工作正常、您只会在多个 tdm 插槽/通道上看到这些不连续性?

    此致、

    Suren

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

    您好、Matthew、

    下面是到目前为止的分析:

    ALSA 最大周期大小限制为 64K

    UDMA 最大 TR 大小限制设置为 64K-1  

    由于存在额外的字节、它正在拆分为两个 TR、UDMA 驱动程序目前无法很好地支持这一情况。  

    您能尝试减少周期大小并尝试一下吗?

    此致、

    Suren

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

    我们最终解决了访问问题、因此我现在可以再次发表评论。

    我尝试使用录制文件来减小周期大小、但仍然会导致音频出现不连续。

    我们前进的道路是消除 EOP 更改的补丁。

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

    您好、Matthew、

    对迟迟未作出答复深表歉意。 我的开发团队实际上正在调查此问题、并一直在处理报告的问题。

    他们对在我们最后重现问题以验证修复程序(他们正在积极处理)有一些疑问  

    您是否可以共享用于处理这些问题的录制命令? 还是用于验证不连续性的示例应用程序?

    感谢您的回答。

    谢谢、

    Suren