RK3308--8声道改成双声道+录音增益

改为双声道

修改dts文件

相关路径:

  • Y:\hxy\RK3308\sdk-1.5\kernel\arch\arm64\boot\dts\rockchip
  • Y:\hxy\RK3308\sdk-1.5\kernel\Documentation\devicetree\bindings\sound
  • Y:\hxy\RK3308\sdk-1.5\kernel\sound\soc\rockchip

通过指令grep -rin "rockchip,rk3308-multi-dais"查找相关文件

相关文件:

  • rk3308-evb-dmic-pdm-v13.dts
  • rockchip,multidais.txt
  • rockchip_multi_dais.c

对以下部分进行修改:

	pdm_i2s_dais: pdm-i2s-dais {
		status = "okay";
		compatible = "rockchip,rk3308-multi-dais", "rockchip,multi-dais";
		dais = <&pdm_8ch>, <&i2s_8ch_2>;
-	    capture,channel-mapping = <6 2>;
+		capture,channel-mapping = <2 0>;	
		playback,channel-mapping = <0 2>;
		bitclock-inversion = <1 0>;
	};

<6 2> 改成 <2 0>

一开始SDK刚拿到的时候,在维持8声道配置时编出固件时,用 arecord 指令录不了音(录后拷贝出来发现数据容量很小),其原因就是 dts 文件中有一个vccio口没配置好:

&io_domains {
	status = "okay";

	vccio0-supply = <&vcc_io>;
	vccio1-supply = <&vcc_io>;
-	vccio2-supply = <&vcc_io>;
+	vccio2-supply = <&vcc_1v8>;
	vccio3-supply = <&vcc_1v8>;
	vccio4-supply = <&vcc_1v8>;
	vccio5-supply = <&vcc_io>;
};

RK_EVB_RK3308_DDR3P116SD4_V13_20181029.pdf 文件中可以看到各 vccio 的作用:
硬件图

了解asound.conf的作用

路径:Y:\hxy\RK3308\sdk-1.5\buildroot\board\rockchip\rk3308\fs-overlay\etc

一开始查找路径时找到以下4个路径:

  1. Y:\hxy\RK3308\sdk-1.5\buildroot\output\rockchip_rk3308_release\target\etc
  2. Y:\hxy\RK3308\sdk-1.5\buildroot\output\rockchip_rk3308_64_dueros\target\etc
  3. Y:\hxy\RK3308\sdk-1.5\buildroot\board\rockchip\rk3308\fs-overlay\etc
  4. Y:\hxy\RK3308\sdk-1.5\buildroot\board\minnowboard\fs-overlay-graphical\etc

相关文件:asound.confAsound_Configuration_CN.pdf

录音增益

增益补丁包patch

路径:Y:\hxy\RK3308\sdk-1.5\buildroot\package\alsa-lib

文件:0005-add-gain-for-audio-input.patch,补丁包来着,这个其实已经过时了,里面要求改的 RK 默认的 pcm.c 就已经改好了,如果按照patch包的改法的话,有如下新增:

  1. 1171行的static void add_gain_rk_16(void* pIn,int length, int channels)
  2. 1205行的static void add_gain_rk_32(void* pIn,int length, int channels)
  3. 2096行的add_gain_rk_16((void*)buffer, tmp * pcm->frame_bits / pcm->sample_bits, pcm->channels);函数
  4. 2103行的add_gain_rk_32((void*)buffer, tmp * pcm->frame_bits / pcm->sample_bits, pcm->channels);函数

patch格式解析:参考链接01 参考链接02

patch包的一些内容解析如下:

diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c	
index 9c90afb..281fbe3 100644
--- a/src/pcm/pcm.c		##原文件,a是原文件对应的目录
+++ b/src/pcm/pcm.c		##修改后的文件,b是对应目录,可通过下级目录找到这个文件

下面表示@@-旧文件开始行数,旧行数 +新文件开始行数,新行数@@;旧文件从825行的void DCBDoing开始,共6行;新文件也从825行开始,共23行:

@@ -825,6 +825,23 @@ void DCBDoing(void* pIn, int length, int channels)
     }
 }
 #endif
+void add_gain(void* pIn, int length, int channels)
+{
+    int i = 0;
+    int16_t * pInBuf  =  (int16_t *)pIn;
+    char *alsa_gain_level = getenv("ALSA_LIB_ADD_GAIN");
+    if(alsa_gain_level) {
+        int level = atoi(alsa_gain_level);
+        //printf("gain level:%d\n",level);
+        for(i = 0; i < length; i ++ ) {
+            int curChannel = i % channels;
+            if(curChannel < channels - 2 ) {//audio loopback no need to add gain
+                (*pInBuf) <<= level;
+            }
+            pInBuf++;
+        }
+    }
+}

修改pcm.c

路径:Y:\hxy\RK3308\sdk-1.5\buildroot\output\rockchip_rk3308_release\build\alsa-lib-1.1.5\src\pcm

在8声道的时候,录音得到的声音很小,有添加录音增益补丁之后,在控制台上输入指令export ALSA_LIB_ADD_GAIN=4才能实现录音增益;在刚修改完为双声道的时候,遇到了在控制台上输入上面指令失效的问题,这时候还要对 pcm.c 进行修改(notepad++快速跳转到某行的快捷方法:Ctrl+G):

1.2090行,snd_pcm_readi函数中有这样的一个判断条件:

if(pcm->channels != 2 && tmp > 0){...}

改为以下:

if(pcm->channels <= 2 && tmp > 0) {...}

2.增加一个2089行中一个printf信息如下:

printf("dcb size=%d,tmp=%d,sam_bits=%d,framebits=%d,format=%d,channels=%d,\n",size,tmp,pcm->sample_bits,pcm->frame_bits,pcm->format,pcm->channels);

3.注释掉add_gain_rk_16函数和add_gain_rk_32函数中的判断条件:

if(curChannel < channels - 2 ) {...}

并各增加以下语句:

printf("rk_16 channels:%d level:%d \n",channels,level);
printf("rk_32 channels:%d level:%d \n",channels,level);
  1. 改完之后,要到cd work/hxy/RK3308/sdk-1.5/buildroot/output/rockchip_rk3308_release/下执行 make alsa-lib-rebuild 命令
  2. 试过在Y:\hxy\RK3308\sdk-1.5\buildroot\output\rockchip_rk3308_release\build\alsa-lib-1.1.5\src\pcm下进行make,但没有效果

mic硬件电路图

相关文件:EVB_CN.pdf
mic规格:MSM261D4030H1CPM

6+0+2 麦克风阵列方案说明

圆形麦克风阵列,对于不同的麦克风位置,可实现不同的通道组合,例如下图的方案,等间距布置在圆周上的6个麦克风
PDM麦克风阵列
在本麦克风阵列方案中,圆周阵列麦也可设计用来做语音唤醒功能,因此不需要单独的唤醒麦。同时,为获得更好的回声消除效果,在左右声道喇叭网络上,通过主控自带的ADC将输出端的音频信号回采,这样的回采方式能最贴近喇叭播放的实际效果。

因此6+0+2麦克风阵列的含义是:6个圆周麦克风(capture)、0个唤醒麦、2路回采(playback)音频信号。

PDM麦克风原理图

电路中,每2个数字麦对应一个PDM_SDI信号,如下图,因此6个麦需要使用3个SDI信号:
PDM麦克风原理图

连接座

FPC:Flexible Printed Circuit,挠性印刷电路
麦克风阵列子板通过30Pin_0.5mm间距的FPC线与RK3308_EVB主板连接,其接口定义如下:
麦克风阵列接口
PDM麦克风对应的PCB板丝印为: RK_EVB_DMIC-PDM_6C70_V11_20180427J

控制台console试验

录音arecord试验

1.先使用以下3个指令:

  • export ALSA_LIB_ADD_GAIN=4
  • arecord -Dhw:0,0 -c 2 -r 8000 -f S16_LE /data/test01.wav
  • aplay /data/test01.wav

使用以下printf 出的 log 信息如下(后面再源代码中注释掉了):

rk_16 channels:2 level:3 
dcb size=1000,tmp=1000,sam_bits=16,framebits=32,format=2,channels=2,

改了文件系统类型试验

2.若文件系统类型改为ext2类型的话,会导致aplay无法播放音频,arecord能录到(有push出来进行试听)

dts参数修改意义的试验

问题1capture,channel-mapping = <2 0>; 是不是意味着只用了6个mic中的2个,具体是哪两个?

答:通过物理试验,在麦上触摸会发出刺耳的声音,从而判断出是mic1和mic2。

问题2:用了 mic1 和 mic2,实际的录音是取的哪个mic的数据?是哪个mic声音大取哪个?还是合一起了?还是我们这边软件自己选取的?

答:通过音源离mic远近进行播放,听左右喇叭播出的声音有啥不同,如果是合成的,那两个喇叭播出来的声音应该是一样的,实际上并不是,而是 mic1 和 mic2 对应喇叭的左右声道。

问题3:手册上说PDM支持8路录音是什么意思?因为这里只有6个麦,对应只有6路才对,另外两路是干嘛的?

答:有可能另外两路是模拟mic,或者是其他输入源,如耳机。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值