
其中,“调试过程”章节可能有点意思(记录了我踩过的坑),其他章节无关紧要。


dts 配置

内核配置

【问题描述】:配置后,声卡已经正常生成,但发现无法正常播、录音。
【问题分析】:开始时,我比较怀疑是声卡控件操作不对导致。结果再三确认不是,这下彻底没有头绪。只能“死马当活马医”,下面一通操作猛如虎。
查看引脚定义时,发现 gpio1-21 不太正常,进一步排查确认引脚存在复用。

修改后

验证 1:确认 MCLK 是否有时钟输出

验证结果:无 MCLK 时钟输出。经测试发现,播放音频时,无 MCLK 时钟输出。接下来需要解决时钟问题。
但是,确认一番后并没有发现问题。
dts配置确认没有问题。引脚正常调用,没被占用。
cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins | grep i2s

检查 MCLK 时钟,也没问题。
cat /sys/kernel/debug/clk/clk_summary | grep -E "i2s0|mclk"cat /sys/kernel/debug/clk/clk_summary | grep i2s0_8ch_mclkout

那为什么主时钟 MCLK 没有输出呢?后面验证发现, MCLK 时钟只有在正常播放或录制音频过程时,才会有输出。
播放音频时(正常情况下)
MCLK(主时钟):输出 12.288M 时钟 ;
SCLK(音频数据位时钟):输出 3M 时钟;
LRCK(音频数据左右声道时钟):输出 48kHz 采样率(与主时钟 12.288M 匹配);
SDO0:变化的频率输出。接音频芯片的 DAC 音频数据脚(DSDIN ),输入的音频数据经过音频芯片的内部解码转换后通过 LOUT/ROUT 输出。
SDI0:无变化。接音频芯片的 ADC 音频数据脚(ASDOUT)。
录制音频时(正常情况下)
MCLK:输出 11.2896M 时钟 ;
SCLK:输出 2.8M 时钟;
LRCK:输出 44kHz 采样率(与主时钟 11.2896M 匹配);
SDO0:无变化;
SDI0:变化的频率输入。
说明:不同音频时钟会有所不同,测试遇到录音时时钟为 11.2896M,播放音频时钟为 12.288M。
【问题解决】:替换 spl 阶段的 bin 文件。将其他平台的rk3588_spl_vx.xx.bin 文件拷贝过来尝试,发现从 RK3568-SDK 中的rk3588_spl_v1.12.bin 可以解决该问题。

拷贝过来同时修改RK3588MINIALL.ini 文件解决该问题。
vim ./rk3588/RK3588_LINUX6.1/rkbin/RKBOOTRK3588MINIALL.ini

录音
arecord -D hw:0,0 -d 5 -f cd -t wav test.wav
播放
gst-play-1.0 test.wavaplay -Dplughw:0,0 test.wavaplay -D hw:0,0 --period-size=1024 --buffer-size=4096 -r 48000 -c 2 -f test
(完)
本人专注 Linux 驱动 & Linux/Android BSP 开发调试,可接外包项目/技术支持/问题定位。有需求或交个朋友可加微信:【Chen_WeChat2025】。
全部0条评论
快来发表一下你的评论吧 !