1.概述我们配置linux音频设备树的时候离不开三个概念一个是dai接口对接很多协议一个是codec数模转换芯片(音频的转化或者输出) 另一个是声卡。协议层方面可以分为pcm和其他2.配置层在配置层我们需要配置以下1.声卡层 2.dai层 3.codec层2.1.单独一个麦克风pdmics: dummy-codec { status okay; compatible rockchip,dummy-codec; #sound-dai-cells 0; };2.1.1 声卡compatible类型simple-audio-card # 基础声卡 simple-scu-audio-card # 动态PCM机制声卡 rockchip,multicodecs-card # 复杂/多路拼接声卡你的声卡标签: 你的声卡 { status okay; compatible simple-audio-card; simple-audio-card,name 声卡名字; simple-audio-card,cpu { sound-dai pdm1; }; simple-audio-card,codec { sound-dai pdmics; }; };2.1.2 dai层pdm1 { status okay; pinctrl-names default, clk; pinctrl-0 pdm1m1_sdi1; pinctrl-1 pdm1m1_clk1; rockchip,path-map 1 0 2 3; };rockchip,path-map 1 0 2 3; 是连接通道的划分例子中四个物理通道按顺序分别为1通道 2通道 3通道 4通道2.1.3 codec层虚拟pdmics: dummy-codec { status okay; compatible rockchip,dummy-codec; #sound-dai-cells 0; };2.2 多个输入输出2.2.1 声卡复杂声卡标签:复杂声卡节点名字 { status okay; compatible rockchip,multicodecs-card; rockchip,card-name rockchip-multi; //hp-det-gpio gpio0 RK_PD3 GPIO_ACTIVE_LOW; io-channels saradc 3; io-channel-names adc-detect; keyup-threshold-microvolt 1800000; poll-interval 100; spk-con-gpio gpio2 RK_PB6 GPIO_ACTIVE_HIGH; hp-con-gpio gpio3 RK_PD6 GPIO_ACTIVE_HIGH; rockchip,pre-power-on-delay-ms 30; rockchip,post-power-down-delay-ms 40; rockchip,mclk-fs 256; rockchip,cpu multi_dais; rockchip,codec , ; rockchip,audio-routing Headphone, HPOL, Headphone, HPOR, Speaker, HPOL, Speaker, HPOR, Headphone, Headphone Power, Headphone, Headphone Power, Speaker, Speaker Power, Speaker, Speaker Power, INPUT1, Main Mic, INPUT2, Headset Mic; pinctrl-names default; //pinctrl-0 hp_det; //rockchip,asrc asrc0; play-pause-key { label playpause; linux,code KEY_PLAYPAUSE; press-threshold-microvolt 2000; }; };2.2.2 dsi多协议multi_dais: multi-dais { status okay; compatible rockchip,multi-dais; dais pdm0,sai1; capture,channel-mapping 2 2; playback,channel-mapping 0 2; #sound-dai-cells 0; };capture 和 playback中尖括号中的两个元素对应dais的两个方向一般只有录音有两个都大于0的参数录音中对应输出的元素代表回采有多少个通道。2.2.3 codec芯片标签: 芯片节点名 { status okay; #sound-dai-cells 0; compatible 属性; power-supply ; /* only 1v8 or 3v3, default is 3v3 */ reg ; };3.解决hal冲突固定声卡在调试多声卡的音视频中我们会发生安卓hal层的冲突以及app调用的冲突因此解决这两个问题挺重要的3.1 解决hal冲突dts - hal 匹配链路dts: simple-audio-card,name rockchip,pdm-mic-array; 内核 ALSA: 生成 /proc/asound/cardX/id audio_hw.c: 读取 /proc/asound/cardX/id 拿这个 id 去 MIC_IN_NAME[] 里匹配 你的声卡名 simple-audio-card,name rockchip,pdm-mic-array; 不会原样变成 rockchip,pdm-mic-array ALSA 生成 card id 时只保留字母数字逗号 ,、横线 - 会被过滤掉并且长度有限所以通常会变成类似 rockchippdmmica因此只需要修改android/hardware/rockchip/audio/tinyalsa_hal/audio_hw.c去掉不需要的声卡名字 -656,7 656,6 struct dev_proc_info MIC_IN_NAME[] {rockchiprt5640c, NULL,}, {rockchiprt5670c, NULL,}, {rockchiprt5672c, NULL,}, - {rockchippdmmica, NULL}, {rockchipsoundes, NULL}, {rockchipmulti, NULL}, {NULL, NULL}, /* Note! Must end with NULL, else will cause crash */3.2 固定声卡3.2.1 修改dts -14,4 14,13 / { model Rockchip RK3576 X1013 Board; compatible rockchip,rk3576-evb1-v10, rockchip,rk3576; aliases { sound0 multi_sound; sound1 pdm_mic_array; }; }; 3.2.2 修改sound/soc/soc-core.c -1937,6 1937,7 static int snd_soc_bind_card(struct snd_soc_card *card) struct snd_soc_component *component; struct snd_soc_dai_link *dai_link; int ret, i; int idx SNDRV_DEFAULT_IDX1; mutex_lock(client_mutex); snd_soc_card_mutex_lock_root(card); -1960,8 1961,17 static int snd_soc_bind_card(struct snd_soc_card *card) } /* card bind complete so register a sound card */ - ret snd_card_new(card-dev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1, - card-owner, 0, card-snd_card); if (card-dev card-dev-of_node) { int alias of_alias_get_id(card-dev-of_node, sound); if (alias 0) { idx alias; } } ret snd_card_new(card-dev, idx, SNDRV_DEFAULT_STR1, card-owner, 0, card-snd_card); if (ret 0) {其中snd_card_new第二个参数为负数会触发自动分配此修改只适用于固定了音频接口的方案。4.调试4.1 查看录音过程log安卓上层adb shell logcat | grep -Ei audio_hal|start_input_stream|pcm_open|card|device|route|input内核层adb shell dmesg | grep -Ei snd|asoc|pcm|codec|multi-dais|i2s|pdm4.2 查看声卡查看声卡有哪些cat /proc/asound/cards查看开放了哪些 PCM 数据流通道cat /proc/asound/pcm查看指定声卡的具体信息tinypcminfo -D 你的声卡id4.3 录制音频adb shell logcat | grep -Ei audio_hal|start_input_stream|pcm_open|card|device|route|input5.dts参考路径android/kernel-6.1/Documentation/devicetree/bindings/sound/simple-card.yamlandroid/kernel-6.1/Documentation/devicetree/bindings/sound/rockchip,dummy-codec.txtandroid/kernel-6.1/Documentation/devicetree/bindings/sound/rockchip,pdm.yamlandroid/kernel-6.1/Documentation/devicetree/bindings/sound/simple-card.yamlandroid/kernel-6.1/Documentation/devicetree/bindings/sound/rockchip,pdm.yamlandroid/kernel-6.1/sound/soc/generic/simple-card.candroid/kernel-6.1/sound/soc/codecs/dummy-codec.candroid/kernel-6.1/sound/soc/rockchip/rockchip_pdm_v2.c