【RK3576】【Android14】MIC开发调试

获取更多相关的【RK3576】【Android14】驱动开发,可收藏系列博文,持续更新中:
【RK3576】Android 14 驱动开发实战指南


简介

硬件接口

PDM方案

RK 平台支持 PDM 协议的数字麦或者 ADC,支持 最大8个 MIC 阵列,支持 16 ~ 24 bits 位宽,支持 8 ~ 48k 采样率,支持 高通滤波:3.79 Hz, 60 Hz, 243 Hz, 493 Hz。

使用 PDM接口 连接麦克风阵列(不经过I2S/TDM),则需要依赖SoC内置的 PDM控制器 直接处理PDM信号。

  • PDM麦克风 → RK PDM控制器

    每个PDM麦克风需连接至SoC的PDM接口(CLK时钟线 + DATA数据线),4个麦克风通常需要:

    • 1组共享的PDM_CLK(主时钟,由SoC提供)
    • 4条独立的PDM_DATA线(每个麦克风一条)。
  • 信号流
    PDM麦克风 → PDM控制器(硬件解码为PCM)→ DMA传输 → 内存 → 应用层

驱动开发

DTS配置

/* PDM0控制器 - 基础配置 */

pdm0: pdm@273b0000 {

compatible = "rockchip,rk3576-pdm"; // 驱动兼容性标识

reg = <0x0 0x273b0000 0x0 0x1000>; // 寄存器物理地址范围

interrupts = <0 202 4>; // 中断号(202)及高电平触发(4)

clocks = <&cru 508>, <&cru 507>, <&cru 511>; // 时钟源:主时钟/HCLK/输出时钟

clock-names = "pdm_clk", "pdm_hclk", "pdm_clk_out"; // 时钟标识

dmas = <&dmac0 4>; // 使用DMA控制器0通道4

dma-names = "rx"; // DMA方向(接收)

pinctrl-names = "default", "idle", "clk"; // 引脚状态定义

pinctrl-0 = <&pdm0m0_sdi0 &pdm0m0_sdi1 &pdm0m0_sdi2 &pdm0m0_sdi3>; // 默认数据引脚

pinctrl-1 = <&pdm0m0_clk0_idle &pdm0m0_clk1_idle>; // 空闲时钟引脚

pinctrl-2 = <&pdm0m0_clk0 &pdm0m0_clk1>; // 工作时钟引脚

#sound-dai-cells = <0>; // 无附加参数

sound-name-prefix = "PDM0"; // 声卡设备前缀

status = "disabled"; // 默认禁用

};

/* PDM0引脚复用 - 支持4种模式(m0-m3) */

pdm0 {

// 模式0 (m0) - 基础引脚配置

pdm0m0_clk0: rockchip,pins = <0 20 3 &pcfg_pull_none>; // GPIO0_B4, 功能3, 无上拉

pdm0m0_sdi0: rockchip,pins = <0 24 3 &pcfg_pull_none>; // GPIO0_C0

// 模式1 (m1) - 备用引脚组

pdm0m1_clk0: rockchip,pins = <1 9 5 &pcfg_pull_none>; // GPIO1_B1, 功能5

// 模式2/3配置省略...

};

/* PDM空闲状态引脚 */

&pinctrl {

pdm0m0_clk0_idle: rockchip,pins = <0 20 0 &pcfg_pull_none>; // 空闲状态: GPIO模式(0)

pdm1m1_clk0_idle: rockchip,pins = <4 6 0 &pcfg_pull_none>; // GPIO4_A6

};

/* 虚拟编解码器 */

pdmics: dummy-codec {

compatible = "rockchip,dummy-codec"; // 虚拟设备驱动

#sound-dai-cells = <0>; // 用于声卡绑定

};

/* PDM麦克风阵列声卡 */

pdm_mic_array {

compatible = "simple-audio-card";

simple-audio-card,name = "rockchip,pdm-mic-array"; // 设备名称

simple-audio-card,cpu {

sound-dai = <&pdm1>; // 绑定到PDM1控制器

};

simple-audio-card,codec {

sound-dai = <&pdmics>; // 使用虚拟编解码器

};

};