我在MTK平台下调试音频ALSA

#前言

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

#硬件原理图

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

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

#MTK音频通路框图

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

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

#通过tinymix配置通路

我们正常的tinymix查看配置

39      BOOL    1       O00 I05 Switch                           Off
40      BOOL    1       O00 I07 Switch                           Off
41      BOOL    1       O01 I06 Switch                           Off
42      BOOL    1       O01 I08 Switch                           Off
43      BOOL    1       O02 I05 Switch                           Off
44      BOOL    1       O02 I06 Switch                           Off
45      BOOL    1       O03 I05 Switch                           On
46      BOOL    1       O03 I07 Switch                           On
47      BOOL    1       O03 I10 Switch                           Off
48      BOOL    1       O04 I06 Switch                           On
49      BOOL    1       O04 I08 Switch                           On
50      BOOL    1       O04 I11 Switch                           Off
51      BOOL    1       O05 I00 Switch                           On
52      BOOL    1       O05 I03 Switch                           Off
53      BOOL    1       O05 I05 Switch                           Off
54      BOOL    1       O05 I07 Switch                           Off
55      BOOL    1       O05 I15 Switch                           Off
56      BOOL    1       O06 I01 Switch                           On
57      BOOL    1       O06 I04 Switch                           Off
58      BOOL    1       O06 I06 Switch                           Off
59      BOOL    1       O06 I08 Switch                           Off
60      BOOL    1       O06 I16 Switch                           Off
61      BOOL    1       O09 I00 Switch                           Off
62      BOOL    1       O09 I03 Switch                           On
63      BOOL    1       O10 I01 Switch                           Off
64      BOOL    1       O10 I04 Switch                           On
65      BOOL    1       O11 I02 Switch                           On
66      BOOL    1       O11 I05 Switch                           Off
67      BOOL    1       O13 I15 Switch                           Off
68      BOOL    1       O14 I16 Switch                           Off
69      ENUM    1       AIN Mux                                  INT ADC
70      ENUM    1       DAIBT Mux                                MRG
71      BOOL    1       I2S O03_O04 Switch                       Off
72      BOOL    1       INT ADDA O03_O04 Switch                  On
73      BOOL    1       MRG BT O02 Switch                        On
74      BOOL    1       PCM0 O02 Switch                          Off
75      ENUM    1       Left PGA Mux                             OPEN
76      ENUM    1       Right PGA Mux                            OPEN
77      ENUM    1       AIF TX Mux                               Digital MIC
78      ENUM    1       HPOUT Mux                                OPEN
79      ENUM    1       LINEOUT Mux                              OPEN
80      BOOL    1       DMIC Data Gen Switch                     Off
81      BOOL    1       AMIC Data Gen Switch                     Off
82      BOOL    1       SDM Tone Gen Switch                      Off
aiv8167sm3_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 selection
00: 1.9V
01: 2.0V
10: 2.1V
11: 2.2V
另外bit17是开关micbias0的:
MIC Bias power down
0: power down
1: 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 mode
RG_AUD_RSV[0]: VIN2 to LCH PGA op input enable
0: disable, 1: enable
RG_AUD_RSV[1]: VIN0 to RCH PGA op input enable
0: disable, 1: enable
RG_AUD_RSV[2]: Audio CLK LDO enable
0: disable, 1: enable
RG_AUD_RSV[3]: ACCDET COMP input monitor enable
0: disable, 1: enable
RG_AUD_RSV[6:4]: MICBIAS1 voltage selection
000: 2.5V
001: 2.2V
010: 2.1V
011: 2.0V
100: 1.9V
Others not used
RG_AUD_RSV[7]: ACCDET 2.5X buffer enable
0: disable, 1: enable而enable仍旧是在AUDIO_CODEC_CON03 =0x70c中
bit3~6中有描述(也就是bit6)
For MICBIAS/ACCDET 
[0]: MICBIAS1 outpout pull low enable
0: disable, 1: enable
[1]: ACCDET voltage selection to comparator
0: 22/27*Vaccdet, 1: 22.2/27*Vaccdet
[2]: MICBIAS1 outpout pull low enable
0: disable, 1: enable
[3]: MICBIAS1 enable
0: disable (control by digital), 1: enable
以上寄存器的信息可通过如下命令来获取
cat /sys/kernel/debug/mt8167_codec_regs

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

看下面

#文末抽奖

  • 转发文章

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

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



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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 左边补0_java 数字左补齐0

NumberFormat nf NumberFormat.getInstance();//设置是否使用分组nf.setGroupingUsed(false);//设置最大整数位数nf.setMaximumIntegerDigits(2);nf.setMinimumIntegerDigits(2);//可以左补齐两位数的数字//以下是查询当前天数的所有日期String nowDaygetNowYMD();String curD…

一切不怕从零开始

不知道大家有没有看过吴京题为<<一切不怕从零开始>>的演讲。我曾经刷微博的时候看到过,印象和触动最深的是他的那句"我走过很多的路,换过很多的方向,不敢说有什么成就,到今天我觉得唯一能够让我拿出来炫耀的可能就是,我不害怕从头开始"。这样的话,对年龄…

60、二叉搜索树的第k个结点

一、题目 给定一颗二叉搜索树&#xff0c;请找出其中的第k大的结点。例如&#xff0c; 5 / \ 3 7 /\ /\ 2 4 6 8 中&#xff0c;按结点数值大小顺序第三个结点的值为4。 二、解法 1 package algorithm7;2 3 public class KthNode62 {4 public static void main(String[] ar…

机器学习算法3

文章目录转换器与估计器分类算法-K近邻算法一个例子弄懂k-近邻计算距离公式sklearn.neighborsMethodk近邻实例k-近邻算法案例分析对Iris数据集进行分割对特征数据进行标准化朴素贝叶斯概率论基础联合概率与条件概率联合概率条件概率如果每个事件相互独立拉普拉斯平滑sklearn朴素…

嵌入式杂谈之文件系统

文件系统可以说是嵌入式中的一大块&#xff0c;也是绕不过的一部分。之前我对文件系统认知一直停留在在U盘格式的理解上&#xff0c;直到接触了嵌入式Linux才发现这里面大有文章&#xff0c;以Linux启动挂载根文件系统为例&#xff0c;这个文件系统可以是真正的存储设备上的文件…

qtscrcpy自定义按键_按键映射说明.md

# 自定义按键映射说明按键映射文件为json格式&#xff0c;新增自己的按键映射文件需要放在keymap目录中才可以被QtScrcpy识别。按键映射文件的具体编写格式下面会介绍&#xff0c;也可以参考自带的按键映射文件。## 按键映射脚本格式说明### 通用说明- 按键映射中的坐标位置都是…

docker发布spring cloud应用

原文地址&#xff1a;http://www.cnblogs.com/skyblog/p/5163691.html 本文涉及到的项目&#xff1a; cloud-simple-docker&#xff1a;一个简单的spring boot应用 Docker是一种虚拟机技术&#xff0c;准确的说是在linux虚拟机技术LXC基础上又封装了一层&#xff0c;可以看成是…

Linux块设备IO子系统

块设备是Linux三大设备之一&#xff0c;其驱动模型主要针对磁盘&#xff0c;Flash等存储类设备&#xff0c;块设备&#xff08;blockdevice&#xff09;是一种具有一定结构的随机存取设备&#xff0c;对这种设备的读写是按块(所以叫块设备)进行的&#xff0c;他使用缓冲区来存放…

机器学习算法4

文章目录精确率和召回率分类器性能评估混淆矩阵分类模型sklearn.metrics.classification_report决策树认识决策树优缺点信息的度量和作用信息熵决策树划分依据之信息增益api实战method决策树优缺点分析实例随机森林集成方法&#xff08;分类&#xff09;之随机森林学习算法skle…

unity怎么制作云飘动_Unity 如何制作星空粒子效果?

本经验介绍在Unity游戏引擎中使用Particle System&#xff0c;如何使用自带资源&#xff0c;快速制作星空的粒子特效。工具/原料Unity方法/步骤1:首先&#xff0c;新建一个场景&#xff0c;如果有自己的天空盒资源的话&#xff0c;在Window->Lighting下设置下天空(默认天空盒…

[芦半山]Android native分析工具ASAN和HWASAN原理解析

ASAN和HWASAN原理解析由于虚拟机的存在&#xff0c;Android应用开发者们通常不用考虑内存访问相关的错误。而一旦我们深入到Native世界中&#xff0c;原本面容和善的内存便开始凶恶起来。这时&#xff0c;由于程序员写法不规范、逻辑疏漏而导致的内存错误会统统跳到我们面前&am…

线性回归,岭回归

文章目录线性回归回归算法回归算法之线性回归优缺点损失函数梯度下降算法LinearRegression属性加入交叉验证线性回归案例分析波士顿房价预测5.性能评测案例欠拟合与过拟合解决过拟合的方法回归算法之岭回归sklearn.linear_model.Ridge方法属性案例分析线性回归 回归算法 回归…

resnet152训练_Resnet-152的图像预处理

152层的 Resnet的图片输入尺寸为224*224&#xff0c;那对于大多数情况&#xff0c;图片的分辨率都是大于这个数值&#xff0c;那么该如何把图片的尺寸裁剪到这样一个尺寸&#xff0c;又如何进行数据增强呢&#xff1f;第一&#xff0c;调整尺寸(Rescaling)先将图片较短的那条边…

重处理报表的坑

1.创建报表时&#xff0c;会记录符合条件的FileID 2.重处理报表时&#xff0c;不会根据条件去找符合条件的数据&#xff1b;而是根据原先的FileID去生成&#xff1b; 意味着新增了数据&#xff0c;原先的报表重处理也增加不了数据...必须要重新生成报表 转载于:https://www.cnb…

C 语言中,x += 5 == 4 是什么意思?

#讨论这个有意义吗&#xff1f;这个是在知乎上看到的一个问题&#xff0c;评论挺多的。其中有人提到&#xff0c;研究这个东西有什么用&#xff1f;编程的时候我们不能这么写的。我记得在大学的时候&#xff0c;我们的副院长给我们上课&#xff0c;就给我们提到&#xff0c;要习…

UEditor编辑器第一次赋值失败的解决方法

网上查了很多方式都不是很好用&#xff0c;最后想到了这样的处理方式 首先在js中定义一个全局变量 var ue null; 然后在初始化显示编辑器的时候js这样写 if (ue null) { ue new baidu.editor.ui.Editor(); ue.render(email_template); } ue.setContent("11111");…

linux命令deploy_Linux deploy 使用教程

Linux deploy是一个可以快速在Android设备上安装运行Linux操作系统的App&#xff0c;遵循GPLv3协议。我已经用了一段时间&#xff0c;讲讲我的使用经验&#xff0c;以下Linux deploy我简写为Ld。首先下载安装Ld&#xff0c;运行Ld后进入了一个全黑的界面&#xff0c;其实是个自…

一次深刻的面试经历

没有吐槽&#xff0c;没有埋怨&#xff0c;没有鸡汤&#xff0c;纯分享。近期我到某名牌房地产公司参加了一次面试&#xff0c;面试岗位是企划主管&#xff0c;我把面试经历跟大家简单分享一下。面试背景&#xff1a;我一直从事广告传媒工作&#xff0c;在工作中服务过不同的客…

帆软报表嵌入python程序_在线报表FineReport中如何进行嵌入式部署

2.部分复制也可以选择性的只复制必要性文件至已有工程中。必须复制的文件fr-server-7.1.jar&#xff1a;包含了报表服务的所有功能&#xff0c;必须拷贝至WEB-INF\lib下&#xff1b;fr-third-7.1.jar&#xff1a;包含了报表服务引用的第三方插件&#xff0c;必须拷贝至WEB-INF\…

android ——多线程编程

1、定义一个线程只需要新建一个类继承自Thread。然后重写run()方法&#xff0c;并在里面编写耗时逻辑即可&#xff1a; class MyThread extends Thread{public void run(){//处理具体的逻辑&#xff5d;&#xff5d; 启动的时候只需要new出MyThread的实例&#xff0c;然后调用它…