平台:MT6737M
降噪板:roobo、海岸
----------------------------------------------------------------------------------------------------------------------
知识储备:
I2S有3个主要信号:
1. 左对齐(较少使用)
2. I2S格式(即飞利浦规定的格式)
3. 右对齐(也叫日本格式、普通格式)。
------------------------------------------------------------------------------------------------------------------------
MTK audio system
默认方案
mic-->pmic-->cpu-->pmic-->speaker
新方案
mic-->cpu-->pmic-->speaker
需要解决的几个问题:
1、硬件连接
从上图可知,I2S2和UL SRC走的是同一路,所以选择这一路(external ADC)最便捷。
对应到硬件GPIO,选择对应的I2S功能。具体略。
注意:LK和kernel dws都要配置,不知道为什么??
查看gpio状态
:/sys/class/misc/mtgpio # cat pin
cat pin
PIN: [MODE] [PULL_SEL] [DIN] [DOUT] [PULL EN] [DIR] [IES] [SMT]
79:61001010
80:61001010
2、驱动修改
这里以遇到的问题和现象,再到解决方法,再到原因的方式记录吧,比较有意思。
a、现象:
波形叠加导致频率不对,导致数据没有输出,这要好一点的示波器才能发现。
解决方法:
已知降噪板做主设备输出clk,拔掉降噪板,测量平台发现也输出clk。
原因:
平台不支持做从I2S从设备!!!降噪板改吧,乖乖做从设备。。。
b、现象:
波形没有完美的尖尖,导致降噪板识别错误
解决方法和原因:
lowjitter这东东设置一下吧,硬件在设计电平转换的时候用点心其实lowjitter不设置都可以,这也不算高频~~~
这个代码得贴一下,没有参考,全靠MTK给。
EnableALLbySampleRate(AudioAdcI2S->mI2S_SAMPLERATE);
MclkDiv3 = SetCLkMclk(Soc_Aud_I2S2,AudioAdcI2S->mI2S_SAMPLERATE);
SetCLkBclk(MclkDiv3,AudioAdcI2S->mI2S_SAMPLERATE,2,Soc_Aud_I2S_WLEN_WLEN_32BITS);
EnableI2SDivPower(AUDIO_APLL12_DIV2,true);
Audio_I2S_Adc |= Soc_Aud_LOW_JITTER_CLOCK << 12;
c、现象:
百思不得姐
瞎捣鼓下发现表象
真相是。。。。
CAPTURE_FORCE_USE_DRAM
看audio相关寄存器
adb shell cat /sys/kernel/debug/mtksocaudio
adb shell cat /sys/kernel/debug/mtksocanaaudio
adb shell "echo Setafereg,regaddr,0x1f0,regvalue,0x049e29e1> /sys/kernel/debug/mtksocaudio" 打tone音
MTK不喜欢用tinyalsa工具嘛,越原始越本真
tinycap xxx.pcm -D 0 -d 1 -c 2 -r 48000 【-b 16 -p 1024 -n 4】
tinycap打印裸数据,爽!
while (capturing && !pcm_read(pcm, buffer, size)) {
if (fwrite(buffer, 1, size, file) != size) {
fprintf(stderr,"Error capturing sample\n");
break;
}
bytes_read += size;
for (i = 0; i < 16; i++)
{
printf("%d ", buffer[i]);
}
printf("\n");
}
---------------------------------------------------------------------------------------------------------
以上就是个随笔,没有技术上的深度,还在继续学习摸索中,希望走过路过的朋友留下你宝贵的意见,比如也许MTK的I2S是可以做从设备呢?