IMX8 SAI TDM16问题 我们正在使用 IMX8Nano 内核 5.15 定制板,并且在 SAI5 上使用 TDM16 时出现问题 问题是,对于 TDM 16 流,我们随机地得到 8 个通道不同步的通道切换。我们添加了内核跟踪,并从 fsl_sai 驱动程序中看到以下调试 如果(标志 & FSL_SAI_CSR_FEF){ dev_dbg(dev, “isr: 检测到传输欠载\n”); 在这种情况下,驱动程序应该执行 FIFO 重置,但这不会发生或没有任何效果。 下次发生欠载时,通道将重新调整,因为在 16 通道配置中始终有 8 个通道输出。 SAI 处于从属模式,仅激活传输线: &sai5 { #sound-dai-cells = <0>; pinctrl 名称 = “默认”; pinctrl-0 = <&pinctrl_sai5>; fsl,数据线=<0 0x00 0xff>; dmas = <&sdma2 8 24 0>, <&sdma2 9 24 0>; fsl,txmasterflag = <1>; 状态 = “好的”; }; 使用 simpl-audio-card f 输出1 { 兼容=“简单音频卡”; 简单音频卡,名称=“SAI51”; 简单音频卡,状态=“正常”; 简单音频卡,bitclock-master = <&spdif_codec1>; 简单音频卡,帧主控= <&spdif_codec1>; 简单音频卡,格式=“left_j”; cpu1:简单音频卡,cpu{ sound-dai = <&sai5>; dai-tdm-slot-num = <16>; dai-tdm-时隙宽度 = <32>; }; spdif_codec1: simple-audio-card,codec { sound-dai = <&codec_out1>; }; }; 编解码器输出1:1output_txcodec #sound-dai-cells = <0>; #地址单元格 = <0>; #大小单元格 = <0>; compatible = "linux,spdif-dit"; 声音名称前缀 = “spdif_codec1”; 状态 = “好的”; }; 我们尝试了网上各种帖子中的一些解决方法,但都没有成功。 还有人见过这样的问题吗?我们假设这种欠载是由于中断触发得太早,因此 DMA 中没有足够的数据供所有通道使用。 我们的播放日志中没有错误,TDM8 模式下也没有错误。 任何帮助表示感谢。, 回复:IMX8 SAI TDM16问题 我们把这个问题放在一边。但是从 dts 的角度来看,这里有一些重要的经验教训可以与其他人分享: fsl,数据线=<0 0x00 0xff>; 如果您在引脚映射中指定了多条数据线,请小心此配置。结合此配置: cpu1:简单音频卡,cpu{ sound-dai = <&sai5>; dai-tdm-slot-num = <16>; dai-tdm-时隙宽度 = <32>; }; 这将创建一个 32 通道接口,因为插槽号应该引用每条数据线所需的通道数,而不是 SAI 接口的总通道数。 因此我们看到 64 位的 DMA,因为这本质上是一个 32 通道操作,而我们只需要 16 个。 我们切换到如下所示的 4 X TDM4 配置: 4条数据线 pinctrl_sai5: sai5grp { fsl,引脚=< MX8MN_IOMUXC_SAI2_MCLK_SAI5_MCLK 0xd6 MX8MN_IOMUXC_SAI2_RXC_SAI5_TX_BCLK 0xd6 MX8MN_IOMUXC_SAI2_RXFS_SAI5_TX_同步 0xd6 MX8MN_IOMUXC_SAI2_RXD0_SAI5_TX_DATA0 0xd6 MX8MN_IOMUXC_SAI2_TXFS_SAI5_TX_DATA1 0xd6 MX8MN_IOMUXC_SAI2_TXC_SAI5_TX_DATA2 0xd6 MX8MN_IOMUXC_SAI2_TXD0_SAI5_TX_DATA3 0xd6 >; }; SAI5 &sai5 { #sound-dai-cells = <0>; pinctrl 名称 = “默认”; pinctrl-0 = <&pinctrl_sai5>; fsl,数据线=<0 0x00 0xff>; dmas = <&sdma2 8 24 0>, <&sdma2 9 24 0>; fsl,txmasterflag=<1>; /删除属性/ fsl,共享中断; 状态 = “好的”; }; 卡和编解码器 输出1 { 兼容=“简单音频卡”; 简单音频卡,名称=“SAI51”; 简单音频卡,状态=“正常”; 简单音频卡,bitclock-master = <&spdif_codec1>; 简单音频卡,帧主控= <&spdif_codec1>; 简单音频卡,格式=“left_j”; cpu1:简单音频卡,cpu{ sound-dai = <&sai5>; dai-tdm-slot-num = <4>; dai-tdm-时隙宽度 = <32>; }; spdif_codec1: simple-audio-card,codec { sound-dai = <&codec_out1>; }; }; 编解码器输出1:1output_txcodec #sound-dai-cells = <0>; #地址单元格 = <0>; #大小单元格 = <0>; compatible = "linux,spdif-dit"; 声音名称前缀 = “spdif_codec1”; 状态 = “好的”; }; 注意 slo-num 为 4。每条数据线现在有 4 个数据通道。您将需要使用 ALSA 来映射这些,就像我们一样。我们使用 dmix 创建 8 个立体声,映射如下: C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 0 4 8 12 1 5 9 13 2 6 10 14 3 7 11 15 通道数是这样的,因为我们没有启用fls、多通道和禁用共享中断 希望这对其他人有帮助。 回复:IMX8 SAI TDM16问题 Hello,
感谢您的更新。
仅需确认,请验证您的设计是否启用了 SAI 发送配置 3 寄存器 (TCR3) 的发送通道启用位。
顺祝商祺! 回复:IMX8 SAI TDM16问题 因此,我们已经使用 16 位音频进行了测试,到目前为止没有错误。我们将继续进行浸泡测试,因为才过了几个小时。我们不能在生产中使用它,但是一个有趣的测试, 我想这是有道理的,因为 DMA 控制器是 32 位的,所以对于 16 通道的 32 位音频数据,我们谈论的是每个样本 64 位音频,这将使用两个 DMA 插槽,对于欠载,fifo 不同步 1,代表一半的数据,因此是 8 通道切换。 我们现在需要了解在发生欠载运行时 32 位模式下的 fifo 重置以及为什么这没有影响,我认为它只清除 32 位数据而不是与完整样本相关的 64 位数据。另外,为什么会发生这些欠载现象以及为什么 dma 中断无法跟上系统的速度。 回复:IMX8 SAI TDM16问题 我们已经排除了 DMIX 本身,因为它也发生在其他 Alsa 插件中,例如 DSHARE 回复:IMX8 SAI TDM16问题 我无法在当前测试环境中降低比特率,因为通过 alsa 传输的音频是固定的,接收端编解码器(clck src)也是固定的。我将尝试并测试另一种方法。 作为更新,我们将时钟设置为主模式,认为它可能与从属模式下的时钟稳定性有关,但这没有影响。 我们正在 alsa 中运行一个 dmix 插件,将 16ch 混合到 8 X 2ch,目前正在那里进行调查。 回复:IMX8 SAI TDM16问题 Hello,
如果降低比特率,还会出现错误吗?
顺祝商祺! 回复:IMX8 SAI TDM16问题 我们的 alsa 播放日志中没有错误,TDM8 模式下也没有错误。
記事全体を表示