我在MTK平台下调试音频ALSA
发布日期:2021-06-30 18:44:52 浏览次数:2 分类:技术文章

本文共 6687 字,大约阅读时间需要 22 分钟。

#前言

前言我就随便写了,因为是项目的需要,我需要在我们的MTK8167S平台上面调试音频。包括录音和播放。

#硬件原理图

因为是我们公司的项目,我就不能把完整的原理图给出来。因为两个MIC不涉及机密,跟MTK的公版是一样的。可以给出来大家看看。

这个MIC是一个数字MIC,直接输出的就是数字信号,接在MTK8167S的一个数字通路上。

#MTK音频通路框图

嵌入式设备和平台关系很大,所以做什么平台一定要弄清楚平台设备的框图。MTK8167s音频的框图如下 不同平台的差异也有不同,不要硬套,需要确认清楚。

图片上看到很多通路没?这些通路里面的东西都是需要根据tinymix来设置的,当然也有其他办法设置。

#通过tinymix配置通路

我们正常的tinymix查看配置

39      BOOL    1       O00 I05 Switch                           Off40      BOOL    1       O00 I07 Switch                           Off41      BOOL    1       O01 I06 Switch                           Off42      BOOL    1       O01 I08 Switch                           Off43      BOOL    1       O02 I05 Switch                           Off44      BOOL    1       O02 I06 Switch                           Off45      BOOL    1       O03 I05 Switch                           On46      BOOL    1       O03 I07 Switch                           On47      BOOL    1       O03 I10 Switch                           Off48      BOOL    1       O04 I06 Switch                           On49      BOOL    1       O04 I08 Switch                           On50      BOOL    1       O04 I11 Switch                           Off51      BOOL    1       O05 I00 Switch                           On52      BOOL    1       O05 I03 Switch                           Off53      BOOL    1       O05 I05 Switch                           Off54      BOOL    1       O05 I07 Switch                           Off55      BOOL    1       O05 I15 Switch                           Off56      BOOL    1       O06 I01 Switch                           On57      BOOL    1       O06 I04 Switch                           Off58      BOOL    1       O06 I06 Switch                           Off59      BOOL    1       O06 I08 Switch                           Off60      BOOL    1       O06 I16 Switch                           Off61      BOOL    1       O09 I00 Switch                           Off62      BOOL    1       O09 I03 Switch                           On63      BOOL    1       O10 I01 Switch                           Off64      BOOL    1       O10 I04 Switch                           On65      BOOL    1       O11 I02 Switch                           On66      BOOL    1       O11 I05 Switch                           Off67      BOOL    1       O13 I15 Switch                           Off68      BOOL    1       O14 I16 Switch                           Off69      ENUM    1       AIN Mux                                  INT ADC70      ENUM    1       DAIBT Mux                                MRG71      BOOL    1       I2S O03_O04 Switch                       Off72      BOOL    1       INT ADDA O03_O04 Switch                  On73      BOOL    1       MRG BT O02 Switch                        On74      BOOL    1       PCM0 O02 Switch                          Off75      ENUM    1       Left PGA Mux                             OPEN76      ENUM    1       Right PGA Mux                            OPEN77      ENUM    1       AIF TX Mux                               Digital MIC78      ENUM    1       HPOUT Mux                                OPEN79      ENUM    1       LINEOUT Mux                              OPEN80      BOOL    1       DMIC Data Gen Switch                     Off81      BOOL    1       AMIC Data Gen Switch                     Off82      BOOL    1       SDM Tone Gen Switch                      Offaiv8167sm3_bsp:/ #

里面已经有很多开关了,我们要做的时候通过tinymix把in 和 out对接起来。

我们调试的时候可以直接用tinymix来调试,如果tinymix调试通过后就可以在mixer_paths.xml修改,以后开机就不用每次用tinymix设置了。

#简单说下音频框架

整个音频框架叫做ALSA,我们读中文的时候会读成 “阿傻”。alsa-lib是提供alsa接口给应用调用,alsa底层框架是为了满足驱动和平台,我们操作alsa设备也无非就是open、Ioctl、read等操作。

这个图非常经典,在内核驱动里面,alsa的框架是分成三个部分,platform、codec、和machine。Platform 是cpu_dai 、Codec 是 codec_dai 、然后通过Machine 里面的dai_link 把两个关联起来。

看上面的注释

/* Digital audio interface glue - connects codec <---> CPU */

这个结构体就是用来干这个的,耦合cpu_dai 口和 codec_dai 口。

大家可能对dai口还一知半解,dai口就是音频数据传输的接口,在软件上用dai这个词来描述,在硬件上可以是pcm接口,可以是i2c接口、也可以是其他的音频传输接口。

要了解驱动,就要从注册声卡入口开始去看。

网上比较不错的流程框图

#声卡和pcm设备

一个声卡下面可以挂载很多pcm设备,PCM设备是可以用来录音和播放的。PCM设备的生成的代码位置如下

dai_link 挂载成功可以在日志里面看出来,日志如下

[    3.950673] <2>.(2)[1:swapper/0][name:mtk_soc_pcm_btcvsd_tx&]mtk_asoc_pcm_btcvsd_tx_platform_probe[    3.966309] <2>.(2)[1:swapper/0]=== weiqifa === snd_pcm_new_stream-709 pcmC0D0p[    3.971799] <2>.(2)[1:swapper/0]mt8167-mt6392 odm:sound: snd-soc-dummy-dai <-> DL1 mapping ok[    3.980427] <2>.(2)[1:swapper/0]=== weiqifa === snd_pcm_new_stream-709 pcmC0D1c[    3.983963] <2>.(2)[1:swapper/0]mt8167-mt6392 odm:sound: snd-soc-dummy-dai <-> VUL mapping ok[    3.990699] <2>.(2)[1:swapper/0]=== weiqifa === snd_pcm_new_stream-709 pcmC0D2p[    3.993650] <2>.(2)[1:swapper/0]mt8167-mt6392 odm:sound: snd-soc-dummy-dai <-> HDMI mapping ok

#常用的调试指令

查看code ccat /sys/kernel/debug/asoc/codecs 查看声卡 cat /proc/asound/cards 查看pcm设备 ls /dev/snd cat /proc/asound/pcm 录音命令 tinycap /sdcard/1.pcm -D 0 -d 1 -c 2 -r 16000 -b 16 查看通路 tinymix

#调试

调试的过程非常有意思,包括硬件调试和软件调试,软件就是看日志看Log。硬件的话,就是要确认硬件的电压、时钟、数据是否正常。

我遇到一个就是MICBIAS电压没有,而且这个电压设置需要MTK的寄存器来控制。MTK答复如下,如果做MTK的音频应该是有帮助的。

跟MICBIAS0相关的寄存器是AUDIO_CODEC_CON03 =0x70c其中bit15~16是设置电压的:MIC Bias Output voltage selection00: 1.9V01: 2.0V10: 2.1V11: 2.2V另外bit17是开关micbias0的:MIC Bias power down0: power down1: power on因此我们做了如下修改:1、enable micbias0:--- a/sound/soc/codecs/mt8167-codec-utils.c+++ b/sound/soc/codecs/mt8167-codec-utils.c@@ -260,6 +260,11 @@  .mask = BIT(14),  .val = BIT(14),  },+ { /* micbias0 */+ .reg = AUDIO_CODEC_CON03,+ .mask = BIT(17),+ .val = BIT(17),+ }, };2. 在enable micbias 同样的位置下方,将MICBIAS0的电压设置为2.2V,       { /* micbias0 */  .reg = AUDIO_CODEC_CON03,  .mask = GENMASK(16, 15),  .val =( 0x3<< 15), },3、同样,MICBIAS1的电压设置是AUDIO_CODEC_CON01=0x704中在bit18~25中,进行设置(具体可自行验证):For test modeRG_AUD_RSV[0]: VIN2 to LCH PGA op input enable0: disable, 1: enableRG_AUD_RSV[1]: VIN0 to RCH PGA op input enable0: disable, 1: enableRG_AUD_RSV[2]: Audio CLK LDO enable0: disable, 1: enableRG_AUD_RSV[3]: ACCDET COMP input monitor enable0: disable, 1: enableRG_AUD_RSV[6:4]: MICBIAS1 voltage selection000: 2.5V001: 2.2V010: 2.1V011: 2.0V100: 1.9VOthers not usedRG_AUD_RSV[7]: ACCDET 2.5X buffer enable0: disable, 1: enable而enable仍旧是在AUDIO_CODEC_CON03 =0x70c中bit3~6中有描述(也就是bit6)For MICBIAS/ACCDET [0]: MICBIAS1 outpout pull low enable0: disable, 1: enable[1]: ACCDET voltage selection to comparator0: 22/27*Vaccdet, 1: 22.2/27*Vaccdet[2]: MICBIAS1 outpout pull low enable0: disable, 1: enable[3]: MICBIAS1 enable0: disable (control by digital), 1: enable以上寄存器的信息可通过如下命令来获取cat /sys/kernel/debug/mt8167_codec_regs

除了这个电压外,就是对应硬件原理图把对应的GPIO口搞对,特别是SPK功放使能引脚的。一定不要害怕dts里面的设置,而是要拿发展的眼光看问题,这里面的所有的东西,都是有意义的,都是要在C里面去解析然后发挥它的光和热的。

看下面

#文末抽奖

  • 转发文章

  • 使用 「我、BUG、爱、加班」三个词造句、我会选出4个同学送书。

感谢水利水电出版社的支持。


  回复「 篮球的大肚子」进入技术群聊

回复「1024」获取1000G学习资料

转载地址:https://linus.blog.csdn.net/article/details/105336961 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:一切不怕从零开始
下一篇:闲来无事,拆个示波器玩玩。

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月11日 00时41分17秒