0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RK android平台多MIC开发:从驱动配置到算法适配

jf_44130326 来源:Linux1024 2026-02-06 16:55 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

wKgZPGkaixWAPRCFAAHyJDhX6a8468.png

一、核心前提:不同芯片的共性与差异

瑞芯微各芯片多MIC开发的核心逻辑一致(基于simple-audio-card框架、依赖TinyALSA工具链),但需注意接口与DTS路径差异,下表可快速定位关键信息:

芯片型号

支持的MIC接口

核心参考DTS路径

录音设备节点(默认)

关键Codec示例

RK3399

I2S、外挂ADC

无固定路径(参考ES8323/ES7210示例)

pcmC0D1c

ES8323ES7210RT5640

RK3326/PX30

I2SPDM

arch/arm64/boot/dts/rockchip/rk3326-evb-ai-va-v11.dts

pcmC0D1c

RK809RK817

RK3566/RK3568

I2SPDM

arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10-pdm-mic-array.dts

pcmC1D1c

RK809ES7202ES7243e

提示:若找不到对应DTS文件,可在arch/arm64/boot/dts/rockchip/目录下全局搜索pdmi2smic等关键词,或参考同系列芯片的多MIC配置示例。

二、关键步骤:多MIC开发全流程(附代码与路径)

MIC开发的核心是声卡注册(DTS配置)内核适配测试验证算法集成,每个步骤均需结合芯片特性调整,以下为具体实操:

1.第一步:声卡注册与DTS配置(核心)

声卡是多MIC数据传输的桥梁,需通过DTS配置cpu_dai(如I2S/PDM接口)、codec_dai(如RK809 codec)与dai-link(连接两者),分3种典型场景:

场景1PDMMICRK3326/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";};

场景2I2SMICRK3399/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端:绑定I2S0  simple-audio-card,cpu { sound-dai = <&i2s0>; }; // Codec端:绑定ES8323  simple-audio-card,codec { sound-dai = <&es8323>; };};// ES8323 Codec配置(I2C地址0x11)es8323: es8323@11{ #sound-dai-cells =<0>;  compatible ="everest,es8323";  reg = <0x11>;  clocks = <&cru SCLK_I2S_8CH_OUT>;  clock-names ="mclk";  spk-con-gpio = <&gpio0 11GPIO_ACTIVE_HIGH>;// 喇叭控制GPIO  hp-det-gpio = <&gpio4 28GPIO_ACTIVE_HIGH>;// 耳机检测GPIO  status ="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.第三步:音频测试(验证多通道是否正常)

测试工具使用TinyALSAtinycap录音、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 AuditionAudacity打开,查看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#ifndefRK3368// 注释掉原生SPEEX降噪,避免与第三方算法冲突+//#define SPEEX_DENOISE_ENABLE-#defineSPEEX_DENOISE_ENABLE#endif

步骤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.cstart_input_stream函数),添加算法调用:

1.pcmCxD1c读取8通道原始数据;

2.调用算法处理(如AEC消回音、降噪);

3.输出2通道处理后的数据(供原生APP使用)。

算法集成框架参考:

wKgZPGkaixWAACCYAABgw75klw8313.png

三、常见问题与解决方案(避坑指南)

1.问题1:录音只有2通道,无8通道?

原因1Codec驱动channels_max未设为8(如ES8323驱动需改channels_max = 8);

原因2:内核I2S驱动未强制8通道(RK3399需改rockchip_i2s.c);

解决:检查codec驱动rockchip_i2s.c的通道配置,确保均为8

2.问题2:部分MIC通道无波形?

原因1PDM/I2S引脚未配置(需在DTSpinctrl-0中添加所有MIC的引脚);

原因2MIC硬件故障(如虚焊、供电不足);

解决:先检查DTS引脚配置,再用示波器测量MIC接口的时钟与数据信号。

3.问题3:回采通道无波形?

原因1:未打开回采功能(Codec需配置adc-for-loopback);

原因2:未播放测试音频(回采需先通过tinyplay播放音频);

解决:确认DTSadc-for-loopback已启用,且录音时播放了测试音频。

4.问题4:算法集成后无输出?

原因1tinyalsa_hal未读取正确的录音节点(默认是pcmC0D0c,需改为多MIC节点如pcmC1D1c);

解决:在audio_hw.c中修改pcm_open的参数,指定多MIC的声卡ID和设备ID

四、开发资源汇总

1.关键文件路径(全局搜索关键词)

DTSarch/arm64/boot/dts/rockchip/(搜索pdmi2smic-array);

内核驱动:kernel/sound/soc/rockchip/rockchip_i2s.ckernel/sound/soc/codecs/(搜索Codec型号如es8323);

TinyALSAexternal/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.配置DTScpu_daicodec_daidai-link

3.测试8通道录音,验证硬件正常;

4.集成第三方算法,对接上层APP

附录:多MIC开发脑图

wKgZPGkaixWAZQfrAANxnMnAnrA668.png  

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    4035

    浏览量

    134450
  • 音频
    +关注

    关注

    31

    文章

    3224

    浏览量

    86277
  • Mic
    Mic
    +关注

    关注

    0

    文章

    72

    浏览量

    30186
  • 瑞芯微
    +关注

    关注

    27

    文章

    841

    浏览量

    54647
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    分享RK***瑞芯微开发Android 配置说明

    》进行配置。【注】如果根据下一节的 kernel 端配置正确后能够显示,但是显示方向不对,请参考根据本节所列文档进行调整。瑞芯微RK***开发板,友坚科技专注于三星、瑞芯微
    发表于 08-16 18:33

    初级小白实战资料,零基础入门rk3399平台下linux4.4+android8.1开发

    直播时间:7月30日(本周五)19:30直播主题:一起玩安卓刷机与Linux设备驱动(基于RK3399平台下Linux4.4+Android8.1
    发表于 07-27 17:53

    RK系列开发板音频驱动适配指南(一)

    简称“OpenHarmony”)操作系统,目前如果使用到多媒体(音频)是需要做一系列的适配动作,才能应用到各种场景。方案:基于OpenHarmony适配RK系列开发板音频
    发表于 09-19 10:41

    RK系列开发板音频驱动适配指南(一)

    RK系列开发板音频驱动适配指南(一)RK系列开发板音频驱动
    发表于 10-08 11:02

    RK系列开发板音频驱动适配指南(二)

    RK系列开发板音频驱动适配指南(一)RK系列开发板音频驱动
    发表于 10-09 11:30

    RK系列开发板音频驱动适配指南(三)

    驱动适配,本次主要介绍音频驱动适配中的Codec模块适配RK系列
    发表于 10-10 09:11

    RK系列开发板音频驱动适配指南(五)

    工具烧录,即可验证驱动RK系列开发板音频驱动适配指南,DAI
    发表于 10-18 09:50

    迅为RK3576开发Android 屏显示

    迅为RK3576开发Android 屏显示
    的头像 发表于 01-16 16:58 2068次阅读
    迅为<b class='flag-5'>RK</b>3576<b class='flag-5'>开发</b>板<b class='flag-5'>Android</b> <b class='flag-5'>多</b>屏显示

    一文搞定RK平台Wi-Fi/BT调试!配置问题解决全攻略

    专用芯片,Wi-Fi/BT 的稳定运行直接影响产品体验。本文配置、编译、测试问题排查,手把手带你搞定 RK 平台 Wi-Fi/BT 调
    的头像 发表于 02-09 16:57 2557次阅读
    一文搞定<b class='flag-5'>RK</b><b class='flag-5'>平台</b>Wi-Fi/BT调试!<b class='flag-5'>从</b><b class='flag-5'>配置</b><b class='flag-5'>到</b>问题解决全攻略

    一文吃透RK平台OTA升级开发逻辑调试的完整指南

    在 Rockchip(简称 RKAndroid 平台开发中,OTA(Over The Air)升级是实现设备软件迭代的核心方式。无论是本地卡刷升级,还是在线无缝更新,掌握 OTA 升
    的头像 发表于 02-09 16:26 689次阅读
    一文吃透<b class='flag-5'>RK</b><b class='flag-5'>平台</b>OTA升级<b class='flag-5'>开发</b>:<b class='flag-5'>从</b>逻辑<b class='flag-5'>到</b>调试的完整指南

    RK平台UART开发驱动配置测试全流程

    完善的 UART 开发支持,本文将结合官方开发指南,功能特点、驱动配置、测试验证三个维度,带大家快速掌握
    的头像 发表于 02-04 17:44 2080次阅读
    <b class='flag-5'>RK</b><b class='flag-5'>平台</b>UART<b class='flag-5'>开发</b>!<b class='flag-5'>从</b><b class='flag-5'>驱动</b><b class='flag-5'>配置</b><b class='flag-5'>到</b>测试全流程

    硬核进阶:RK3576 Android15 驱动与系统开发实战指南

    android15,想与大家探讨更多,不仅仅是驱动,更包含android其他方面。 各位嵌入式与Android开发的朋友们,我们的 
    的头像 发表于 01-26 22:29 798次阅读
    硬核进阶:<b class='flag-5'>RK</b>3576 <b class='flag-5'>Android</b>15 <b class='flag-5'>驱动</b>与系统<b class='flag-5'>开发</b>实战指南

    RK 平台 SPI 开发完全指南(驱动 + 配置 + 测试 + 优化)

    Linux 平台 SPI 驱动已形成完善的开发体系,支持 Master/Slave 双模式、速率适配及灵活
    的头像 发表于 01-30 22:35 1129次阅读
    <b class='flag-5'>RK</b> <b class='flag-5'>平台</b> SPI <b class='flag-5'>开发</b>完全指南(<b class='flag-5'>驱动</b> + <b class='flag-5'>配置</b> + 测试 + 优化)

    rk3576 android15平台camera编译配置都做了什么?

    、芯片平台、产品类型),实现相机相关配置文件、固件、IQ参数文件的条件化拷贝,以及相机专属库的编译打包,最终将这些文件部署开发板的system/vendor分区,是相机硬件与软件
    的头像 发表于 03-06 17:15 3141次阅读
    <b class='flag-5'>rk</b>3576 <b class='flag-5'>android</b>15<b class='flag-5'>平台</b>camera编译<b class='flag-5'>配置</b>都做了什么?

    RK3568+Android11 GT911触控驱动移植与配置实战

    RK3568平台Android11系统开发中,汇顶GT911作为小尺寸5点电容触控芯片是常见选型,其驱动移植核心围绕 设备树
    的头像 发表于 03-19 11:20 672次阅读
    <b class='flag-5'>RK3568+Android</b>11 GT911触控<b class='flag-5'>驱动</b>移植与<b class='flag-5'>配置</b>实战