主题中讨论的其他器件:AM625、 SK-AM62B-P1
工具与软件:
使用 AM625 (特别是 SOM Variscite 的 VAR-AM62-AM62)时、我遇到了我们的定制硬件音频问题。 我认为问题出在内核/驱动程序/芯片层面、并不是针对他们的 SOM 的具体问题。
我无法将问题显示在 Variscite EVK 上。 因此、我认为该问题只会出现在我们的定制映像/硬件中存在的某些特定配置/组合导致的。 同样、我认为硬件不存在问题、只是硬件揭示了一些较低级别的错误/问题。
我花了几个星期观察这个问题并试图缩小问题的范围。
问题
问题显示为出现故障音频。 它仅在播放已进行一段时间(大约~45分钟后)后才会显示。 干扰显示为以下两种形式之一:
-每个 ALSA 周期,一些样本是正确的,其余的是零
-每个 ALSA 期间,一些样本为零,其余样本为正确
因此、如果 ALSA 周期为256个样本、则每256个样本可以看到一次干扰。
测试方法
gstreamer 或扬声器测试用于生成正弦波:
gst-launch-1.0 audiotestsrc freq=440! alsasink device=playback1 --verbose
speaker-test -c 2 -r 46512 -t sine -f 440 -D Playback1
音频最终会命中 DAC、因此很容易在示波器上观察到结果。 实际有多个使用不同格式(一个是 I2S、另一个是 TDM)的 DAC。 这两种情况都出现问题。 为了验证该问题不是在离线更远的某个位置发生、而是从 AM62x 出来、可以轻松地确认 MCASP 数据线也存在干扰、从而匹配最终在 DAC 输出上看到的结果。
DSP 在所有这些模块之间路由音频。 如果在 DSP 内生成波形、则没有干扰。 另一项确认是仅当 AM62x 发出干扰音频时才会发生。
没有从 gstreamer 或 Linux (dmesg)向控制台打印错误。 没有报告 xrun。 停止流水线并再次启动它会立即修复它。
关于硬件的独特之处
MCASP (McASP0和 MCASP2)连接到外部 DSP、而不是连接到传统编解码器。 `s、音频器件被配置为` imple-audio-card `s、并带有一个用于允许类型为 soc` nd-audio-dummy 的编解码器的补丁。 然后 ALSA `asound.conf`正确定义了每个输出/输入以使用正确的采样率等、这些都将在 DSP 侧进行处理。 因此、DSP 是主器件、提供 BCK 和 FS 时钟。 采样率不是典型值(46512Hz 和186048Hz)、但在链中的任何位置正确定义。
McASP0为 TDM16、MCASP2为 I2S。 其中任何一个上都显示了该问题。
在另一项测试中、时钟已更改为典型的音频时钟(48kHz)。 问题仍然出现。
我已经建立了一个 从已知映像(`var-thin-image`)开始的最小映像、并且仅添加了进行测试绝对必要的内容:
-`snd-durm-dummy soc`的补丁
-目标硬件的设备树更改
-添加一些默认情况下不包括的 gstreamer 软件包( audiotstsrc、alsasink 等)
-最小`asound.conf`,用于在 McASP0上测试 TDM16的单个立体声输出
然后、我手动初始化 DAC 和 DSP (我的任何应用程序代码都实际未运行)。 然后、只需要运行该简单的 gstreamer 流水线并等待输出出现干扰。
此外、我添加了 CONFIG_DYNAMIC_debug、以查看播放期间是否打印出任何有用的内容。 在启用了对音频相关的基本内容(K3-uDMA*, sound/core/*, sound/ soc /*等)的 print 语句后、没有有用的内容最终被打印出来。
另一个发现是、如果直接访问声卡、似乎不会出现故障。
对于 TDM 输出、使用 dshare 或 dmix、会出现干扰。 如果直接访问它们(例如插入 HW:0、0)、它们似乎不会发生。
以下是出现干扰时的音频示波器捕获: 
您可以看到干扰之间的周期与256个样本的 ALSA 周期完全匹配(5.33ms @ 48kHz)。
这是相应的 MCASP 数据线

这一特定问题已经拖延了一段时间、因此、感谢对这一问题的任何见解。




