前言
问题描述: 基于 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
结语
如果,此时录音还有问题,就需要打印寄存器的值,量硬件波形等等方式,进一步排查。 如有不足之处欢迎您的批评指正!!
|