ST意法半导体
直播中

而无返还

8年用户 1251经验值
擅长:光电显示
私信 关注
[问答]

STM32MP157-DK2上的外部音频编解码器 (ADI ADAU1977) 采样率错误值求解


我正在使用 STM32MP157-DK2(开发包 1.2)和 Analog Devices 的 ADAU1977 ADC 评估板。所需的设置需要使用外部编解码器作为 I2S 通信的主机(与板上的板载 Cirrus 编解码器相同)。
遵循 wiki 页面提供的出色文档(对从事该工作的团队表示敬意!),我几乎设法让一切都完美运行。
为了达到这一点,我做了以下事情:
  • 拆焊 SB1 到 SB4,然后焊接 SB13 到 SB16,以便从 SAI2 断开板载编解码器并从 GPIO 接头访问它
  • 根据以下内容在制造商驱动程序的源代码中添加了 codec_of_xlate_dai_id:https ://wiki.st.com/stm32mpu/wiki/SAI_device_tree_configuration
  • 通过 kconfing 和 menuconfig 包含编辑的编解码器驱动程序的源文件,并将它们配置为模块化
  • 根据有关音频图形卡的所有可用文档编辑设备树 (stm32mp157c-dk1.dts),并实际上更改了有关板载 cirrus 编解码器的所有条目以适合我的设置
毕竟我遇到了几个问题,大约一周后,我几乎不知道下一步该去哪里。
我遇到的第一个(也是一个较小的)问题是声卡没有在启动时自动注册,它应该是,因为它是在设备树中配置的。
我可以通过使用 modprobe 手动加载制造商模块来解决这个问题。之后,一切都正确加载,我可以使用 alsamixer 更改所有暴露的参数,在所有 4 个通道上记录,但是......
另一个更大的问题是编解码器以 48kHz 的采样率工作(用示波器验证),这正是我想要的,但 ALSA 子系统“认为”它在 44.1kHz 上工作。我尝试使用带有选项 -r 48000 的 arecord 之类的 alsa 工具以 48kHz 进行记录,它返回:“警告:速率不准确(请求 = 48000Hz,得到 = 44100Hz)”。我可以录制,但音频被 44.1/48 移调,即如果我录制 440Hz 的正弦波,录制的文件包含 ~404Hz 的正弦波。我也尝试在我自己的 C 项目中使用 ALSA API 进行记录,但系统仍然报告 44.1kHz。
通过在编解码器驱动程序和平台驱动程序(adau1977.c 和 audio-graph-card.c)的源文件中插入一些 printk-s,我发现传递给音频图形卡和 ADAU1977 模块的参数包含速率44100 通过调用 params_rate(snd_pcm_hw_params *params) 访问。
我错过了什么吗?hw_params结构的来源是什么?






回帖(1)

黄勇

2023-2-3 14:34:07
在收到您的消息之前,我通过在专家提到的 adau1977_set_sysclk 函数中硬编码约束掩码取得了进展(这也是我一直在研究的那个)。这样我就可以让系统以 48kHz 的频率工作。
我想查看您提供的用于跟踪的链接,但由于 STM32MPU wiki 直到几分钟前才为我关闭,在我等待的过程中,我更加注意了您写的最后一件事。
我认为我已经通过编辑 /etc/pulse/client.conf 禁用了 Pulseaudio:
自动生成 = 否
允许 autospawn-for-root = 否
但由于 systemd,似乎还需要一些额外的步骤。
所以我还必须关闭 conf 文件中的守护进程,并用 systemctl 屏蔽它。
现在它可以正常工作了,看来我在调试 ASoC 和 ALSA 上浪费了很多时间,而整个时间的问题都是由 Pulseaudio 引起的!
现在唯一的问题是,在我手动执行 modprobe 之前,声卡不会在启动时注册。
再次,谢谢你!你的线索和STM32MPU wiki的结合解决了我的问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分