在智能音箱、视频会议设备等场景中,多MIC(麦克风)配置是实现远场拾音、降噪、回声消除的核心基础。瑞芯微(Rockchip)在多MIC开发上提供了统一框架与差异化配置,本文将结合官方技术文档,从声卡注册与DTS配置、音频测试、算法集成、常见问题解决四大维度,手把手教你完成多MIC开发,附具体文件路径与实操代码。

一、核心前提:不同芯片的共性与差异
瑞芯微各芯片多MIC开发的核心逻辑一致(基于simple-audio-card框架、依赖TinyALSA工具链),但需注意接口与DTS路径差异,下表可快速定位关键信息:
|
芯片型号
|
支持的MIC接口
|
核心参考DTS路径
|
录音设备节点(默认)
|
关键Codec示例
|
|
RK3399
|
I2S、外挂ADC
|
无固定路径(参考ES8323/ES7210示例)
|
pcmC0D1c
|
ES8323、ES7210、RT5640
|
|
RK3326/PX30
|
I2S、PDM
|
arch/arm64/boot/dts/rockchip/rk3326-evb-ai-va-v11.dts
|
pcmC0D1c
|
RK809、RK817
|
|
RK3566/RK3568
|
I2S、PDM
|
arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10-pdm-mic-array.dts
|
pcmC1D1c
|
RK809、ES7202、ES7243e
|
提示:若找不到对应DTS文件,可在arch/arm64/boot/dts/rockchip/目录下全局搜索pdm、i2s、mic等关键词,或参考同系列芯片的多MIC配置示例。
二、关键步骤:多MIC开发全流程(附代码与路径)
多MIC开发的核心是声卡注册(DTS配置)→内核适配→测试验证→算法集成,每个步骤均需结合芯片特性调整,以下为具体实操:
1.第一步:声卡注册与DTS配置(核心)
声卡是多MIC数据传输的“桥梁”,需通过DTS配置cpu_dai(如I2S/PDM接口)、codec_dai(如RK809 codec)与dai-link(连接两者),分3种典型场景:
场景1:PDM多MIC(RK3326/PX30/RK3566/RK3568通用)
PDM接口支持多通道(1-8ch),1-2通道通常用于“回采”,3-8通道用于MIC拾音,以RK3566为例:
// 路径:arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10-pdm-mic-array.dtsrk809_sound_micarray: rk809-sound-micarray {compatible ="simple-audio-card";simple-audio-card,name ="rockchip,rk809-codec";//声卡名称simple-audio-card,mclk-fs = <256>;//主时钟倍数(固定)// dai-link0:播放(I2S接口)simple-audio-card,dai-link@0 {format="i2s";cpu { sound-dai = <&i2s1_8ch>; };//绑定I2S1_8ch播放接口codec { sound-dai = <&rk809_codec 0>; };//绑定Codec播放端};//dai-link1:录音(PDM接口,多MIC)simple-audio-card,dai-link@1 {format="pdm";cpu { sound-dai = <&pdm>; };//绑定PDM录音接口codec { sound-dai = <&rk809_codec 1>; };//绑定Codec录音端};};//使能I2S1_8ch播放接口&i2s1_8ch {status ="okay";#sound-dai-cells = <0>;rockchip,clk-trcm = <1>;pinctrl-0= <&i2s1m0_sclktx &i2s1m0_lrcktx &i2s1m0_sdo0>;};//使能PDM录音接口(多MIC核心)&pdm {status ="okay";#sound-dai-cells = <0>;pinctrl-0= <&pdmm0_clk &pdmm0_clk1 &pdmm0_sdi0&pdmm0_sdi1 &pdmm0_sdi2 &pdmm0_sdi3>;};//配置RK809 Codec(需支持回采与多通道)&rk809_codec {#sound-dai-cells = <1>;compatible ="rockchip,rk809-codec","rockchip,rk817-codec";clocks = <&cru I2S1_MCLKOUT>;clock-names ="mclk";adc-for-loopback;//使能回采功能pdmdata-out-enable;//PDM数据使能hp-volume = <20>;//耳机音量(可调整)spk-volume = <3>;//喇叭音量(可调整)mic-in-differential;//差分MIC输入(提升抗干扰)status ="okay";};
场景2:I2S多MIC(RK3399/RK3326通用)
若MIC通过I2S接口连接(如RK3399使用ES8323 Codec),需配置I2S多通道与Codec驱动:
// RK3399 ES8323示例(无固定路径,需自定义)es8323-sound {status ="okay";compatible ="simple-audio-card";simple-audio-card,format ="i2s";simple-audio-card,name ="rockchip,es8323-codec";simple-audio-card,mclk-fs = <256>;// CPU端:绑定I2S0simple-audio-card,cpu { sound-dai = <&i2s0>; };// Codec端:绑定ES8323simple-audio-card,codec { sound-dai = <&es8323>; };};// ES8323 Codec配置(I2C地址0x11)es8323: es8323@11{compatible ="everest,es8323";reg = <0x11>;clocks = <&cru SCLK_I2S_8CH_OUT>;clock-names ="mclk";spk-con-gpio = <&gpio0 11GPIO_ACTIVE_HIGH>;// 喇叭控制GPIOhp-det-gpio = <&gpio4 28GPIO_ACTIVE_HIGH>;// 耳机检测GPIOstatus ="okay";};// 同时修改ES8323驱动,支持8通道(关键!)// 路径:kernel/sound/soc/codecs/es8323.c(需全局搜索驱动文件)staticstructsnd_soc_dai_driveres8323_dai = {.capture = {.stream_name ="Capture",.channels_min =2,.channels_max =8,// 原默认2,改为8通道.rates = es8323_RATES,.formats = es8323_FORMATS,},};
场景3:外挂ADC +虚拟声卡(所有芯片通用)
若ADC驱动无标准声卡逻辑(如仅初始化寄存器),需用dummy-codec(虚拟Codec)注册声卡:
// 定义虚拟Codecdummy_codec: dummy-codec {compatible ="rockchip,dummy-codec";#sound-dai-cells = <0>;};//注册声卡(以RT5640为播放Codec,虚拟Codec为录音)rt5640-sound {compatible ="simple-audio-card";simple-audio-card,name ="rockchip,rt5640-codec";simple-audio-card,mclk-fs = <256>;//播放链路(RT5640)simple-audio-card,dai-link@0 {format="i2s";cpu { sound-dai = <&i2s0>; };codec { sound-dai = <&rt5640>; };};//录音链路(虚拟Codec)simple-audio-card,dai-link@1 {format="i2s";cpu { sound-dai = <&i2s0>; };codec { sound-dai = <&dummy_codec>; };};};
2.第二步:内核强制8通道(RK3399 、RK3576必做,其他芯片可选)
部分芯片(如RK3399)默认I2S驱动仅支持2通道,需修改内核代码强制8通道:
// 路径:kernel/sound/soc/rockchip/rockchip_i2s.cstaticintrockchip_i2s_hw_params(structsnd_pcm_substream *substream,structsnd_pcm_hw_params *params){// ... 原有代码 ...if(substream->stream == SNDRV_PCM_STREAM_CAPTURE) {regmap_update_bits(i2s->regmap, I2S_RXCR, I2S_RXCR_VDW_MASK | I2S_RXCR_CSR_MASK, val);}else{regmap_update_bits(i2s->regmap, I2S_TXCR, I2S_TXCR_VDW_MASK | I2S_TXCR_CSR_MASK, val);// 新增:播放时强制录音8通道(用于回采+MIC)dev_info(i2s->dev,"for echo fixed 8 channels capture when playbackn");val =0;val |= I2S_CHN_8;// 8通道val |= I2S_TXCR_VDW(16);// 16bit(32bit需改为I2S_TXCR_VDW(32))regmap_update_bits(i2s->regmap, I2S_RXCR, I2S_RXCR_VDW_MASK | I2S_RXCR_CSR_MASK, val);}// ... 原有代码 ...}// 修改DAI驱动,支持8通道staticstructsnd_soc_dai_driver rockchip_i2s_dai = {.capture = {.stream_name ="Capture",.channels_min =2,.channels_max =8,// 原默认2,改为8.rates = SNDRV_PCM_RATE_8000_192000,.formats = (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE),},};
3.第三步:音频测试(验证多通道是否正常)
测试工具使用TinyALSA(tinycap录音、tinymix配置通路),需先通过mm编译external/tinyalsa/生成工具,再按以下步骤操作:
步骤1:确认声卡注册成功
# 查看已注册声卡(需出现目标Codec,如rockchip,rk809-codec)adb shellcat/proc/asound/cards# 查看录音设备节点(多MIC通常对应pcmCxD1c,如RK3566为pcmC1D1c)adb shellls-l /dev/snd/
示例输出(RK3566):
crw-rw----1system audio116,72024-05-2010:00pcmC1D1c // 多MIC录音节点
步骤2:打开录音通路
# 格式:tinymix -D [声卡ID] [通路ID] [使能值]# 示例:RK3566打开声卡1的录音通路(通路ID需根据Codec调整,默认1为录音)adbshell tinymix -D111# (可选)打开喇叭放音通路(用于测试回采)adbshell tinymix -D102
步骤3:录制8通道音频
# 格式:tinycap[保存路径]-D[声卡ID]-d[设备ID]-c[通道数]-r[采样率]-b[位宽]-p[周期大小]-n[周期数]# 示例:RK3566录制8通道、16K采样率、16bit音频adb shell tinycap /sdcard/multi-mic-record.wav-D1-d1-c8-r16000-b16-p1024-n3
步骤4:分析录音文件
将录音文件导出到PC,用Adobe Audition或Audacity打开,查看8个通道的波形:
•1-2通道:回采信号(若播放了测试音频,应有波形);
•3-8通道:MIC拾音(说话时应有波形,静音时无杂波)。
4.第四步:多MIC算法集成(对接AI降噪/回声消除)
Android原生录音机仅支持1-2通道,需集成第三方多MIC算法(如AEC、波束成形),核心是在tinyalsa_hal中嵌入算法,步骤如下:
步骤1:修改TinyALSA HAL,关闭原生降噪
// 路径:hardware/rockchip/audio/tinyalsa_hal/audio_hw.h// 注释掉原生SPEEX降噪,避免与第三方算法冲突+//#define SPEEX_DENOISE_ENABLE-
步骤2:屏蔽通道固定代码(避免强制2通道)
// 路径:external/tinyalsa/pcm.c// 注释掉以下代码(强制通道检查的逻辑)/*if(!(pcm->config.channels == 1)) {if(channalFlags == -1 ) {if(startCheckCount < SAMPLECOUNT) {startCheckCount += count;} else {channalFlags = channel_check(data,count/2);}}//if(channalFlags == -1)channel_fixed(data,count/2, channalFlags);}*/
步骤3:嵌入第三方算法
在hardware/rockchip/audio/tinyalsa_hal/的录音流程中(如audio_hw.c的start_input_stream函数),添加算法调用:
1.从pcmCxD1c读取8通道原始数据;
2.调用算法处理(如AEC消回音、降噪);
3.输出2通道处理后的数据(供原生APP使用)。
算法集成框架参考:

三、常见问题与解决方案(避坑指南)
1.问题1:录音只有2通道,无8通道?
•原因1:Codec驱动channels_max未设为8(如ES8323驱动需改channels_max = 8);
•原因2:内核I2S驱动未强制8通道(RK3399需改rockchip_i2s.c);
•解决:检查codec驱动和rockchip_i2s.c的通道配置,确保均为8。
2.问题2:部分MIC通道无波形?
•原因1:PDM/I2S引脚未配置(需在DTS的pinctrl-0中添加所有MIC的引脚);
•原因2:MIC硬件故障(如虚焊、供电不足);
•解决:先检查DTS引脚配置,再用示波器测量MIC接口的时钟与数据信号。
3.问题3:回采通道无波形?
•原因1:未打开回采功能(Codec需配置adc-for-loopback);
•原因2:未播放测试音频(回采需先通过tinyplay播放音频);
•解决:确认DTS中adc-for-loopback已启用,且录音时播放了测试音频。
4.问题4:算法集成后无输出?
•原因1:tinyalsa_hal未读取正确的录音节点(默认是pcmC0D0c,需改为多MIC节点如pcmC1D1c);
•解决:在audio_hw.c中修改pcm_open的参数,指定多MIC的声卡ID和设备ID。
四、开发资源汇总
1.关键文件路径(全局搜索关键词):
◦DTS:arch/arm64/boot/dts/rockchip/(搜索pdm、i2s、mic-array);
◦内核驱动:kernel/sound/soc/rockchip/rockchip_i2s.c、kernel/sound/soc/codecs/(搜索Codec型号如es8323);
◦TinyALSA:external/tinyalsa/、hardware/rockchip/audio/tinyalsa_hal/。
2.工具下载:
◦音频分析:Audacity(免费)、Adobe Audition;
◦ADB工具:Android SDK Platform Tools。
五、总结
瑞芯微多MIC开发的核心是“DTS配置通道+内核适配8通道+算法处理多通道数据”,不同芯片的差异主要在接口(PDM/I2S)与文件路径,开发者可按以下流程快速落地:
1.确定芯片的MIC接口(PDM/I2S)与参考DTS;
2.配置DTS的cpu_dai、codec_dai与dai-link;
3.测试8通道录音,验证硬件正常;
4.集成第三方算法,对接上层APP。
附录:多MIC开发脑图
-
Android
+关注
关注
12文章
4035浏览量
134450 -
音频
+关注
关注
31文章
3224浏览量
86277 -
Mic
+关注
关注
0文章
72浏览量
30186 -
瑞芯微
+关注
关注
27文章
841浏览量
54647
发布评论请先 登录
分享RK***瑞芯微开发板Android 配置说明
初级小白实战资料,零基础入门rk3399平台下linux4.4+android8.1开发
RK系列开发板音频驱动适配指南(一)
一文搞定RK平台Wi-Fi/BT调试!从配置到问题解决全攻略
一文吃透RK平台OTA升级开发:从逻辑到调试的完整指南
rk3576 android15平台camera编译配置都做了什么?
RK android平台多MIC开发:从驱动配置到算法适配
评论