前言
问题描述: 基于 rk3399 linux SDK,音频芯片rt5640 不能录音,分享一下笔者的调试记录。
分析步骤
1. 通过如下命令确认声卡是否注册成功:
可以看出,声卡已经注册上了。
controlC0 --> 用于声卡的控制,例如通道选择,混音,麦克风的控制等
pcmC0D0c --〉 用于录音的 pcm 设备
pcmC0D0p --〉 用于播放的 pcm 设备
声卡注册上之后,就开始调试播放和录音功能。rk3399 官方手册文档是基于android 调试的,安卓上
常用的是tiny工具,就与alsa裁剪的。
linux 常用的音频ALSA 开发工具 是alsa-utils ,
安装即可 :dpkg -i alsa-utils_1.2.2-1kylin1rk1_arm64.deb
2. 验证一下播放
在耳机中也能听到声音,播放没啥问题,基于也说明了,音频驱动iic ,i2s的问题不大。
接下来开始验证录音
3. 验证一下录音
再用上文的aplay 播放,发现放不出声音,接下来开始分析录音问题。
3.1 先打开 地板硬件原理图,找到音频芯片部分,
如圈出来的部分,原理图上 看出重要的信息:
1.麦克风 通过 MIC_IN3P 接到了Mono(单声道),
2.与cpu通信用的是 i2s0.
3.播放接的是L_OUT,
3.2 在检查一下设备树的配置:
手上的源码里 ,图片圈出来的1 部分要改成IN3,
2 部分要改成 i2s0,
i2s 不对,板子里确能放音乐,有点不对劲,经过沟通,板子的内核是最新修改过的,已改成如下:
3.3 接下来大概率 就是音频通路的配置问题了,接着说linux 下如何配录音通路。
1.先通过 amixer contents 查看音频接口
2…在打开rt5640 的datasheet,如下图 Audio Mix Path
如上图所示:从上文原理图得知麦克风介入IN3P,在结合上图中的1. 2. 部分,通过MICBST3 接入RECMIXR器件。
可以 得出 BST3 相关的接口 numid = 33,需要打开这个开关
至此,通路第一条命令 可以得出
amixer cset numid=33 1
3.接着往下走 ,如下图 Audio Mix Path中,圈出来的红色标记3,接到到digital mixer path 部分
如下图:
同理可以得出图片4,5,6 ,7 的通路配置
amixer cset numid=41 1
amixer cset numid=42 1
amixer cset numid=49 1
amixer cset numid=23 1
接下来在设置一下录音的音量
由于我们接的是mono,所以:
amixer cset numid=18 100 100
至此 录音的通路就配置好了,由于硬件接的是Mono,所以不支持耳麦,需要找旧式的台式机耳机测试,这一点也是踩了坑才知道。
接着按上文的方法验证录音,录音功能ok
结语
如果,此时录音还有问题,就需要打印寄存器的值,量硬件波形等等方式,进一步排查。
如有不足之处欢迎您的批评指正!!