RK3568系列13——ES7202麦克风矩阵配置

  ES7202是一个双通道的模拟麦克风采集芯片,通过最多8个组合使用可以实现麦克风矩阵。项目采用两块ES7202芯片实现四通道音频采集。硬件设计参考公版提供的[RK3568_AIoT_REF_SCH_V11_20210611]。

预备知识

  • DAI(Digital Audio Interface):CPU端声音输出通路,有I2S、PDM、SPDIF等格式
  • codec:物理音频芯片
  • sound-card:软件驱动,用于连接DAI和codec

原理图分析

  • 第一块芯片I2C地址:从高到低[2:0],地址位为0b000,因此I2C地址为0x30
  • 第二块芯片I2C地址:从高到低[2:0],地址位为0b001,因此I2C地址为0x31
  • 第一块芯片DATA脚:连至RK3568的PDM_SDI1_M0
  • 第二块芯片DATA脚:连至RK3568的PDM_SDI2_M0

配置要点

  • RK3568的PDM_SDI0_M0脚已分配给ES8316使用,需要在PIN-CTRL中删除
  • 组合多个CODEC,不能使用simple-audio-card,而要使用multicodecs-card
  • CPU端使用PDM通道

DTS配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/ {
es7202-sound-micarray {
status = "okay";
compatible = "rockchip,multicodecs-card";
rockchip,card-name = "rockchip,es7202-sound";
rockchip,cpu = <&pdm>;
rockchip,codec = <&es7202_30 &es7202_31>;
};
};

&pdm {
status = "okay";
#sound-dai-cells = <0>;
rockchip,path-map = <1 2 3 0>; # 通道顺序,对应sdi1、sdi2、sdi3、sdi0
pinctrl-0 = <&pdmm0_clk1 &pdmm0_sdi1 &pdmm0_sdi2>;
};

&i2c3 {
status = "okay";
clock-frequency = <400000>;

es7202_30: es7202@30 {
status = "okay";
#sound-dai-cells = <0>;
compatible = "ES7202_PDM_ADC_1";
reg = <0x30>;
};

es7202_31: es7202@31 {
status = "okay";
#sound-dai-cells = <0>;
compatible = "ES7202_PDM_ADC_2";
reg = <0x31>;
};
};

Android配置

  • 在HAL层将ES7202加入至合法的麦克风设备列表
1
2
3
4
5
6
7
8
9
10
diff hardware/rockchip/audio/tinyalsa_hal/audio_hw.c

@@ -338,6 +338,7 @@ struct dev_proc_info MIC_IN_NAME[] =
{"rockchipes8316c", NULL,},
{"rockchipes8323c", NULL,},
{"rockchipes8396c", NULL,},
+ {"rockchipes7202s", NULL,},
{"rockchipes7210", NULL,},
{"rockchipes7243", NULL,},
{"rockchiprk", NULL, },
  • 设置声卡路由,由于项目采用的主声卡是ES8316,因此修改的是es8316_config.h,其他声卡修改同目录下的其他配置文件。项目需求为没有插入耳机时,麦克风采用ES7202麦克风阵列;插入耳机时,使用耳机的麦克风
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
diff hardware/rockchip/audio/tinyalsa_hal/codec_config/es8316_config.h

@@ -80,13 +60,14 @@
const struct config_control es8316_headset_normal_controls[] = {
......
},
{
.ctl_name = "Right Headphone Mixer Right DAC Switch",
+ .int_val = {on},
},
};

@@ -126,2 +109,7 @@
const struct config_control es8316_bluetooth_sco_mic_capture_controls[] = {};

+const struct config_control es7202_main_mic_capture_controls[] = {};
+
+const struct config_control es7202_hands_free_mic_capture_controls[] = {};
+
+const struct config_control es7202_bluetooth_sco_mic_capture_controls[] = {};

@@ -290,7 +275,7 @@
//capture
.main_mic_capture = {
- .sound_card = 0,
+ .sound_card = 1,
.devices = DEVICES_0,
- .controls = es8316_main_mic_capture_controls,
- .controls_count = sizeof(es8316_main_mic_capture_controls) / sizeof(struct config_control),
+ .controls = es7202_main_mic_capture_controls,
+ .controls_count = sizeof(es7202_main_mic_capture_controls) / sizeof(struct config_control),
},
  • 设置声卡采样参数(比特率、波特率、声道等)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
diff device/rockchip/rk356x/alpha/media_profiles_default.xml

@@ -640,14 +640,14 @@
<AudioEncoderCap name="aac" enabled="true"
- minBitRate="8192" maxBitRate="96000"
- minSampleRate="8000" maxSampleRate="44100"
- minChannels="1" maxChannels="1" />
+ minBitRate="8192" maxBitRate="128000"
+ minSampleRate="8000" maxSampleRate="48000"
+ minChannels="1" maxChannels="2" />

<AudioEncoderCap name="amrwb" enabled="true"
minBitRate="6600" maxBitRate="23050"
minSampleRate="16000" maxSampleRate="16000"
- minChannels="1" maxChannels="1" />
+ minChannels="1" maxChannels="2" />

<AudioEncoderCap name="amrnb" enabled="true"
minBitRate="5525" maxBitRate="12200"
minSampleRate="8000" maxSampleRate="8000"
- minChannels="1" maxChannels="1" />
+ minChannels="1" maxChannels="2" />

测试工具

1
2
3
4
5
6
7
8
9
10
# 查看系统加载的声卡,ES7202索引为1(第二个声卡)
cat /proc/asound/cards
> 0 [rockchipes8316c]: rockchip_es8316 - rockchip,es8316-codec
> rockchip,es8316-codec
> 1 [rockchipes7202s]: rockchip_es7202 - rockchip,es7202-sound
> rockchip,es7202-sound

# tinycap录制声音:-D为索引为1的声卡 -c为4通道
cd /storage/emulated/0/
tinycap file.wav -D 1 -c 4

参考文档