我正在使用
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结构的来源是什么?