qcom SM6125平台 dmic调试

1:硬件信息

平台gpio 列表:

对应 SEC_MI2S gpio group

  • gpio125
  • gpio126
  • gpio127
  • gpio128

image-20210924151553616

2:Dmic配置点

2.1:声卡dts配置

&sm6150_snd {
	status = "ok";
	qcom,model = "trinket-idp-snd-card";
    //......
	qcom,audio-routing =
		"AMIC2", "MIC BIAS2",
		"MIC BIAS2", "Analog Mic2",
		"TX DMIC0", "MIC BIAS1",
		"MIC BIAS1", "Digital Mic0",
		"TX DMIC0", "Digital Mic0",
		"TX DMIC1", "MIC BIAS1",
		"MIC BIAS1", "Digital Mic1",
		"TX DMIC1", "Digital Mic1",
		"TX DMIC2", "MIC BIAS3",
		"MIC BIAS3", "Digital Mic2",
		"TX DMIC3", "MIC BIAS3",
		"MIC BIAS3", "Digital Mic3",
    //......
	qcom,cdc-dmic01-gpios = <&cdc_dmic01_gpios>;
	qcom,cdc-dmic23-gpios = <&cdc_dmic23_gpios>;
    //qcom,sec-mi2s-gpios = <&cdc_sec_mi2s_gpios>; //与dmic 同gpio 无法同时使用
	qcom,pri-mi2s-gpios = <&cdc_pri_mi2s_gpios>;
	qcom,tert-mi2s-gpios = <&cdc_tert_mi2s_gpios>;
	asoc-codec  = <&stub_codec>, <&bolero>, <&ext_disp_audio_codec>;
	asoc-codec-names = "msm-stub-codec.1", "bolero_codec",   //codec bolero 需要配置,后面做解析
				"msm-ext-disp-audio-codec-rx";
	qcom,wsa-max-devs = <0>;
	qcom,wsa-devs = <&wsa881x_0211>, <&wsa881x_0212>,
			<&wsa881x_0213>, <&wsa881x_0214>;
	qcom,wsa-aux-dev-prefix = "SpkrLeft", "SpkrRight",
				  "SpkrLeft", "SpkrRight";
	qcom,codec-max-aux-devs = <1>;
	qcom,codec-aux-devs = <&wcd937x_codec>;
	qcom,msm_audio_ssr_devs = <&audio_apr>, <&q6core>,
				<&bolero>;
};

2.2:pinctrl DTS配置

soc中配置	
cdc_dmic01_gpios: cdc_dmic01_pinctrl {
		compatible = "qcom,msm-cdc-pinctrl";
		pinctrl-names = "aud_active", "aud_sleep";
		pinctrl-0 = <&cdc_dmic01_clk_active &cdc_dmic01_data_active>;
		pinctrl-1 = <&cdc_dmic01_clk_sleep &cdc_dmic01_data_sleep>;
	};
	cdc_dmic23_gpios: cdc_dmic23_pinctrl {
		compatible = "qcom,msm-cdc-pinctrl";
		pinctrl-names = "aud_active", "aud_sleep";
		pinctrl-0 = <&cdc_dmic23_clk_active &cdc_dmic23_data_active>;
		pinctrl-1 = <&cdc_dmic23_clk_sleep &cdc_dmic23_data_sleep>;
	};


tlmm中配置:
		cdc_dmic01_clk_active: dmic01_clk_active {
			mux {
				pins = "gpio125";
				function = "DMIC0_CLK";
			};

			config {
				pins = "gpio125";
				drive-strength = <8>;
				output-high;
			};
		};

		cdc_dmic01_clk_sleep: dmic01_clk_sleep {
			mux {
				pins = "gpio125";
				function = "DMIC0_CLK";
			};

			config {
				pins = "gpio125";
				drive-strength = <2>;
				bias-disable;
				output-low;
			};
		};

		cdc_dmic01_data_active: dmic01_data_active {
			mux {
				pins = "gpio126";
				function = "DMIC0_DATA";
			};

			config {
				pins = "gpio126";
				drive-strength = <8>;
				input-enable;
			};
		};

		cdc_dmic01_data_sleep: dmic01_data_sleep {
			mux {
				pins = "gpio126";
				function = "DMIC0_DATA";
			};

			config {
				pins = "gpio126";
				drive-strength = <2>;
				pull-down;
				input-enable;
			};
		};

		cdc_dmic23_clk_active: dmic23_clk_active {
			mux {
				pins = "gpio127";
				function = "DMIC1_CLK";
			};

			config {
				pins = "gpio127";
				drive-strength = <8>;
				output-high;
			};
		};

		cdc_dmic23_clk_sleep: dmic23_clk_sleep {
			mux {
				pins = "gpio127";
				function = "DMIC1_CLK";
			};

			config {
				pins = "gpio127";
				drive-strength = <2>;
				bias-disable;
				output-low;
			};
		};

		cdc_dmic23_data_active: dmic23_data_active {
			mux {
				pins = "gpio128";
				function = "DMIC1_DATA";
			};

			config {
				pins = "gpio128";
				drive-strength = <8>;
				input-enable;
			};
		};

		cdc_dmic23_data_sleep: dmic23_data_sleep {
			mux {
				pins = "gpio128";
				function = "DMIC1_DATA";
			};

			config {
				pins = "gpio128";
				drive-strength = <2>;
				pull-down;
				input-enable;
			};
		};

2.3:路由配置

<path name="audio-record">
        <ctl name="MultiMedia1 Mixer TX_CDC_DMA_TX_3" value="1" />
     </path>
<path name="handset-mic">
    <path name="dmic1" />
</path>    
<path name="dmic1">
        <ctl name="TX_CDC_DMA_TX_3 Channels" value="One" />
        <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
        <ctl name="TX DMIC MUX0" value="DMIC0" />
        <ctl name="TX DEC0 MUX" value="MSM_DMIC" />
 </path>

3:SM6125上Dmic调试过程

3.1 Codec Bolero 注册

Dmic的是在内部Codec Bolero上配置的,需要保证它能够成功注册;

int bolero_register_macro(struct device *dev, u16 macro_id,
			  struct macro_ops *ops)
{
//......
	printk(KERN_ERR"%s enter\n", __func__);
//......
	priv = dev_get_drvdata(dev->parent);
//......
	priv->macro_params[macro_id].init = ops->init;
	priv->macro_params[macro_id].exit = ops->exit;
	priv->macro_params[macro_id].io_base = ops->io_base;
	priv->macro_params[macro_id].num_dais = ops->num_dais;
	priv->macro_params[macro_id].dai_ptr = ops->dai_ptr;
	priv->macro_params[macro_id].mclk_fn = ops->mclk_fn;
	priv->macro_params[macro_id].event_handler = ops->event_handler;
	priv->macro_params[macro_id].dev = dev;
	priv->current_mclk_mux_macro[macro_id] =
				bolero_mclk_mux_tbl[macro_id][MCLK_MUX0];
//......
	priv->num_dais += ops->num_dais;
	priv->num_macros_registered++;
	priv->macros_supported[macro_id] = true;
	printk(KERN_ERR"%s num_macros_registered:%d, num_macros:%d\n", __func__, priv->num_macros_registered, priv->num_macros);
	if (priv->num_macros_registered == priv->num_macros) {
		ret = bolero_copy_dais_from_macro(priv);
//......
		ret = snd_soc_register_codec(dev->parent, &bolero,priv->bolero_dais, priv->num_dais);
//......
	}
	return 0;
}

通过解析Bolero驱动可知,配置的macro的数量和加载register成功的数量一致,才会通过 snd_soc_register_codec 注册bolero这个声卡;对应的bolero dai link才会被放到链表中去;

Bolero在设备树中的配置:

&bolero {
	status = "ok";
	qcom,num-macros = <4>;  // priv->num_macros
	qcom,va-without-decimation;
	slew_rate_reg1 = <0xD8E000 0x0>;
	slew_rate_val1 = <0x3 0x0>;
	tx_macro: tx-macro@0a460000 {
		compatible = "qcom,tx-macro";
//......
	};

	rx_macro: rx-macro@0a440000 {
		compatible = "qcom,rx-macro";
//......
		};
	};

	wsa_macro: wsa-macro@0a480000 {
		compatible = "qcom,wsa-macro";
		reg = <0x0a480000 0x0>;
//......
		};
	};
	va_macro: va-macro@0a4a0000 {
		compatible = "qcom,va-macro";
		reg = <0x0a4a0000 0x0>;
		clock-names = "va_core_clk";
		clocks = <&clock_audio_va 0>;
	};

成功注册的 codec:soc:qcom,msm-audio-apr:qcom,q6c

3.2 widget和snd_kcontrol注册

Dmic 通过DMA连接到msm 输出pcm数据

static const struct snd_kcontrol_new msm_int_snd_controls[] = {
//......
	SOC_ENUM_EXT("TX_CDC_DMA_TX_3 SampleRate",
			tx_cdc_dma_tx_3_sample_rate,
			cdc_dma_tx_sample_rate_get,
			cdc_dma_tx_sample_rate_put),
	SOC_ENUM_EXT("TX_CDC_DMA_TX_4 SampleRate",
			tx_cdc_dma_tx_4_sample_rate,
			cdc_dma_tx_sample_rate_get,
			cdc_dma_tx_sample_rate_put),
};

源码中它的加载过程是在msm_int_audrx_init 中完成:

static int msm_int_audrx_init(struct snd_soc_pcm_runtime *rtd)
{
//......
	struct msm_asoc_mach_data *pdata =
				snd_soc_card_get_drvdata(rtd->card);
	printk(KERN_ERR"%s enter\n", __func__);

	ret = snd_soc_add_codec_controls(codec, msm_int_snd_controls,  //对应上面的 msm_int_snd_controls
				ARRAY_SIZE(msm_int_snd_controls));
	if (ret < 0) {
		pr_err("%s: add_codec_controls failed: %d\n",
			__func__, ret);
		return ret;
	}
	if(!msm_common_snd_controls_is_add){
		ret = snd_soc_add_codec_controls(codec, msm_common_snd_controls,
					ARRAY_SIZE(msm_common_snd_controls));  //这个msm_common_snd_controls数组在mi2s2中也会被注册,这里加一个判断,如果未被注册再添加
		if (ret < 0) {
			pr_err("%s: add common snd controls failed: %d\n",
				__func__, ret);
			return ret;
		}
	  msm_common_snd_controls_is_add = 1;
	}
	snd_soc_dapm_new_controls(dapm, msm_int_dapm_widgets,
				ARRAY_SIZE(msm_int_dapm_widgets));
    //......
}

其中msm_int_dapm_widgets

static const struct snd_soc_dapm_widget msm_int_dapm_widgets[] = {
	SND_SOC_DAPM_MIC("Analog Mic1", NULL),
	SND_SOC_DAPM_MIC("Analog Mic2", NULL),
	SND_SOC_DAPM_MIC("Analog Mic3", NULL),
	SND_SOC_DAPM_MIC("Analog Mic4", NULL),
	SND_SOC_DAPM_MIC("Digital Mic0", msm_dmic_event),
	SND_SOC_DAPM_MIC("Digital Mic1", msm_dmic_event),
	SND_SOC_DAPM_MIC("Digital Mic2", msm_dmic_event),
	SND_SOC_DAPM_MIC("Digital Mic3", msm_dmic_event),
};

msm_dmic_event中设置 gpio function为dmic功能

static int msm_dmic_event(struct snd_soc_dapm_widget *w,
			  struct snd_kcontrol *kcontrol, int event)
{
//......
	pdata = snd_soc_card_get_drvdata(codec->component.card);
	switch (dmic_idx) {
	case 0:
	case 1:
		dmic_gpio_cnt = &dmic_0_1_gpio_cnt;
		dmic_gpio = pdata->dmic01_gpio_p;
		break;
	case 2:
	case 3:
		dmic_gpio_cnt = &dmic_2_3_gpio_cnt;
		dmic_gpio = pdata->dmic23_gpio_p;
//......
	}

	dev_dbg(codec->dev, "%s: event %d DMIC%d dmic_gpio_cnt %d\n",
			__func__, event, dmic_idx, *dmic_gpio_cnt);

	switch (event) {
	case SND_SOC_DAPM_PRE_PMU:          //该widget DAPM PowerUP event触发时 设置 pinctrl active state
		(*dmic_gpio_cnt)++;
		if (*dmic_gpio_cnt == 1) {
			ret = msm_cdc_pinctrl_select_active_state(
						dmic_gpio);
//......
			}
		}

		break;
	case SND_SOC_DAPM_POST_PMD:       //该widget DAPM Power Down event触发时 设置 pinctrl sleep state
		(*dmic_gpio_cnt)--;
		if (*dmic_gpio_cnt == 0) {
			ret = msm_cdc_pinctrl_select_sleep_state(
					dmic_gpio);
//......
		}
//......
	return 0;
}

3.3 dai link注册

在machine驱动中,msm_int_audrx_init是放到msm_wsa_cdc_dma_be_dai_links 中,在machine 加载注册声卡过程中执行该init函数;它的定义是:

static struct snd_soc_dai_link msm_wsa_cdc_dma_be_dai_links[] = {
	/* WSA CDC DMA Backend DAI Links */
	{
		.name = LPASS_BE_WSA_CDC_DMA_RX_0,
		.stream_name = "WSA CDC DMA0 Playback",
		.cpu_dai_name = "msm-dai-cdc-dma-dev.45056",
		.platform_name = "msm-pcm-routing",
		.codec_name = "bolero_codec",
		.codec_dai_name = "wsa_macro_rx1",
		.no_pcm = 1,
		.dpcm_playback = 1,
		.init = &msm_int_audrx_init,
		.id = MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0,
		.be_hw_params_fixup = msm_be_hw_params_fixup,
		.ignore_pmdown_time = 1,
		.ignore_suspend = 1,
		.ops = &msm_cdc_dma_be_ops,
	},
	//......

它的注册过程是在msm_asoc_machine_probe 中完成;

static int msm_asoc_machine_probe(struct platform_device *pdev)
{
//.....
	card = populate_snd_card_dailinks(&pdev->dev);
//.....
	ret = snd_soc_of_parse_card_name(card, "qcom,model");
//.....
	ret = snd_soc_of_parse_audio_routing(card, "qcom,audio-routing");
//.....
	ret = msm_populate_dai_link_component_of_node(card);
//.....
	ret = msm_init_aux_dev(pdev, card);
//.....
	ret = devm_snd_soc_register_card(&pdev->dev, card);
//.....
	}
static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev)
{
		if (tavil_codec) {
			memcpy(msm_sm6150_dai_links + total_links,
					msm_tavil_be_dai_links,
					sizeof(msm_tavil_be_dai_links));
			total_links += ARRAY_SIZE(msm_tavil_be_dai_links);
		} else if (tasha_codec) {
			memcpy(msm_sm6150_dai_links + total_links,
					msm_tasha_be_dai_links,
					sizeof(msm_tasha_be_dai_links));
			total_links += ARRAY_SIZE(msm_tasha_be_dai_links);
		} else {
			memcpy(msm_sm6150_dai_links + total_links,
			       msm_wsa_cdc_dma_be_dai_links,
			       sizeof(msm_wsa_cdc_dma_be_dai_links));
			total_links +=
				ARRAY_SIZE(msm_wsa_cdc_dma_be_dai_links);  //如果tavil_codec  tasha_codec都未注册,添加 msm_sm6150_dai_links 到全局																	snd_card_dailinks中
			memcpy(msm_sm6150_dai_links + total_links,
			       msm_rx_tx_cdc_dma_be_dai_links,
			       sizeof(msm_rx_tx_cdc_dma_be_dai_links));
			total_links +=
				ARRAY_SIZE(msm_rx_tx_cdc_dma_be_dai_links);
		}

DAI link probe, 在注册声卡时,会实例化声卡,将整理好的DAI links 添加到链表中;完成bind后会执行 dai probe

static int snd_soc_instantiate_card(struct snd_soc_card *card)
{
    //......
	for (i = 0; i < card->num_links; i++) 
		ret = soc_bind_dai_link(card, &card->dai_link[i]);         /* bind DAIs */
    //......
	for (i = 0; i < card->num_links; i++)
		snd_soc_add_dai_link(card, card->dai_link+i);             /* 将预定义的DAI link添加到list中 */
    //......
	for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;order++) {
		list_for_each_entry(rtd, &card->rtd_list, list) {
			ret = soc_probe_link_components(card, rtd, order);   
    //......
		}
	}
	ret = soc_probe_aux_devices(card);
    //......
	for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;order++) {
		list_for_each_entry(rtd, &card->rtd_list, list) {       /* probe 该声卡上所有DAI link */
			ret = soc_probe_link_dais(card, rtd, order);
    //......
			}
		}
	}
	snd_soc_dapm_link_dai_widgets(card);
	snd_soc_dapm_connect_dai_link_widgets(card);
    //......
	ret = snd_card_register(card->snd_card);
    //......
static int soc_probe_link_dais(struct snd_soc_card *card,
		struct snd_soc_pcm_runtime *rtd, int order)
{
//......
	dev_dbg(card->dev, "ASoC: probe %s dai link %d late %d link name:%s\n",
			card->name, rtd->num, order, dai_link->name);
	/* probe the CODEC DAI */
	for (i = 0; i < rtd->num_codecs; i++) 
		ret = soc_probe_dai(rtd->codec_dais[i], order);
//......
	if (dai_link->init)   // 如果又init 函数,执行init 过程, 对应前面DAI定义的 msm_int_audrx_init
		ret = dai_link->init(rtd);

}

3.4 audio route

源:“Digital Mic1” 目标 “MultiMedia1”

FE

msm-pcm-routing-v2.c

SND_SOC_DAPM_INPUT("BE_IN"),

static const struct snd_soc_dapm_route intercon[] = {
//......
	{"MultiMedia1 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"},
//......
	{"TX_CDC_DMA_TX_3", NULL, "BE_IN"},
//......
    

BE

	static const struct snd_soc_dapm_route tx_audio_map[] = {
	{"TX_AIF1 CAP", NULL, "TX_MCLK"},
	{"TX_AIF2 CAP", NULL, "TX_MCLK"},
//.......
	{"TX_AIF1 CAP", NULL, "TX_AIF1_CAP Mixer"},
	{"TX_AIF2 CAP", NULL, "TX_AIF2_CAP Mixer"},
//.......
	{"TX_AIF1_CAP Mixer", "DEC0", "TX DEC0 MUX"},
	{"TX_AIF1_CAP Mixer", "DEC1", "TX DEC1 MUX"},
	{"TX DEC0 MUX", "MSM_DMIC", "TX DMIC MUX0"},
	{"TX DMIC MUX0", "DMIC0", "TX DMIC0"},
	{"TX DMIC MUX0", "DMIC1", "TX DMIC1"},
&sm6150_snd {
//......
	qcom,audio-routing =
//......
		"TX DMIC0", "MIC BIAS1",
		"MIC BIAS1", "Digital Mic0",
		"TX DMIC0", "Digital Mic0",
		"TX DMIC1", "MIC BIAS1",
		"MIC BIAS1", "Digital Mic1",
		"TX DMIC1", "Digital Mic1",  //SC665S "MIC BIAS1" 来自wcd codec, 移除codec时,需要建立"TX DMIC1"到"Digital Mic1"的route
//......

4:修改内容diff

4.1:设备树修改

--- a/kernel/msm-4.14/arch/arm64/boot/dts/qcom/trinket-audio-overlay.dtsi
+++ b/kernel/msm-4.14/arch/arm64/boot/dts/qcom/trinket-audio-overlay.dtsi
@@ -15,7 +15,7 @@
 #include <dt-bindings/sound/audio-codec-port-types.h>

 &bolero {
                "MIC BIAS2", "Analog Mic2",
                "TX DMIC0", "MIC BIAS1",
                "MIC BIAS1", "Digital Mic0",
+               "TX DMIC0", "Digital Mic0",
                "TX DMIC1", "MIC BIAS1",
                "MIC BIAS1", "Digital Mic1",
+               "TX DMIC1", "Digital Mic1",
+               "TX DMIC2", "Digital Mic2",
+               "TX DMIC3", "Digital Mic3",
                "TX DMIC2", "MIC BIAS3",
                "MIC BIAS3", "Digital Mic2",
                "TX DMIC3", "MIC BIAS3",
@@ -235,17 +237,17 @@
                "WSA_SPK2 OUT", "VA_MCLK";
        qcom,msm-mbhc-hphl-swh = <1>;
        qcom,msm-mbhc-gnd-swh = <1>;
-       //qcom,cdc-dmic01-gpios = <&cdc_dmic01_gpios>;
-       //qcom,cdc-dmic23-gpios = <&cdc_dmic23_gpios>;
-       qcom,sec-mi2s-gpios = <&cdc_sec_mi2s_gpios>;
+       qcom,cdc-dmic01-gpios = <&cdc_dmic01_gpios>;
+       qcom,cdc-dmic23-gpios = <&cdc_dmic23_gpios>;
+//     qcom,sec-mi2s-gpios = <&cdc_sec_mi2s_gpios>;
        qcom,pri-mi2s-gpios = <&cdc_pri_mi2s_gpios>;
        qcom,tert-mi2s-gpios = <&cdc_tert_mi2s_gpios>;
        asoc-codec  = <&stub_codec>, <&bolero>, <&ext_disp_audio_codec>;
        asoc-codec-names = "msm-stub-codec.1", "bolero_codec",
                                "msm-ext-disp-audio-codec-rx";
        qcom,wsa-max-devs = <0>;
-       //qcom,wsa-devs = <&wsa881x_0211>, <&wsa881x_0212>,
-       //              <&wsa881x_0213>, <&wsa881x_0214>;
+       qcom,wsa-devs = <&wsa881x_0211>, <&wsa881x_0212>,
+                       <&wsa881x_0213>, <&wsa881x_0214>;
        qcom,wsa-aux-dev-prefix = "SpkrLeft", "SpkrRight",
                                  "SpkrLeft", "SpkrRight";
        qcom,codec-max-aux-devs = <1>;
-/*     cdc_dmic01_gpios: cdc_dmic01_pinctrl {
+       cdc_dmic01_gpios: cdc_dmic01_pinctrl {
                compatible = "qcom,msm-cdc-pinctrl";
                pinctrl-names = "aud_active", "aud_sleep";
                pinctrl-0 = <&cdc_dmic01_clk_active &cdc_dmic01_data_active>;
                pinctrl-1 = <&cdc_dmic01_clk_sleep &cdc_dmic01_data_sleep>;
-       };*/
-       /*
+       };
+
        cdc_dmic23_gpios: cdc_dmic23_pinctrl {
                compatible = "qcom,msm-cdc-pinctrl";
                pinctrl-names = "aud_active", "aud_sleep";
                pinctrl-0 = <&cdc_dmic23_clk_active &cdc_dmic23_data_active>;
                pinctrl-1 = <&cdc_dmic23_clk_sleep &cdc_dmic23_data_sleep>;
-       };*/
+       };
        cdc_sec_mi2s_gpios: msm_cdc_pinctrl_sec {
+           status = "disabled";
                compatible = "qcom,msm-cdc-pinctrl";
                pinctrl-names = "aud_active", "aud_sleep";
                pinctrl-0 = <&sec_i2s_sck_active &sec_i2s_ws_active
@@ -276,6 +279,7 @@
                pinctrl-1 = <&sec_i2s_sck_sleep &sec_i2s_ws_sleep
                                        &sec_i2s_data0_sleep &sec_i2s_data1_sleep &i2s_mclk1_sleep>;
        };
+/*
        cdc_tert_mi2s_gpios: msm_cdc_pinctrl_tert {
                compatible = "qcom,msm-cdc-pinctrl";
                pinctrl-names = "aud_active", "aud_sleep";
@@ -284,8 +288,9 @@
                pinctrl-1 = <&tert_i2s_sck_sleep &tert_i2s_ws_sleep
                                        &tert_i2s_data0_sleep &tert_i2s_data1_sleep>;
        };
+*/
        wsa_swr_gpios: wsa_swr_clk_data_pinctrl {
-           status = "disabled";
+
                compatible = "qcom,msm-cdc-pinctrl";
                pinctrl-names = "aud_active", "aud_sleep";
                pinctrl-0 = <&wsa_swr_clk_active &wsa_swr_data_active>;
@@ -309,7 +314,7 @@
        };

        wsa_spkr_en1: wsa_spkr_en1_pinctrl {
-           status = "disabled";
+
                compatible = "qcom,msm-cdc-pinctrl";
                pinctrl-names = "aud_active", "aud_sleep";
                pinctrl-0 = <&spkr_1_sd_n_active>;


--- a/kernel/msm-4.14/arch/arm64/boot/dts/qcom/trinket-pinctrl.dtsi
+++ b/kernel/msm-4.14/arch/arm64/boot/dts/qcom/trinket-pinctrl.dtsi
@@ -1098,7 +1098,7 @@
                                output-low;
                        };
                };
-/*
+
                cdc_dmic01_clk_active: dmic01_clk_active {
                        mux {
                                pins = "gpio125";
@@ -1206,7 +1206,7 @@
                                input-enable;
                        };
                };
-*/
+
                tx_swr_clk_sleep: tx_swr_clk_sleep {
                        mux {
                                pins = "gpio106";

4.2:Codec修改

--- a/vendor/qcom/opensource/audio-kernel/asoc/sm6150.c
+++ b/vendor/qcom/opensource/audio-kernel/asoc/sm6150.c
@@ -10,7 +10,7 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/gpio.h>
@@ -83,7 +83,7 @@

 #define SM6150_SOC_VERSION_1_0 0x00010000
 #define SM6150_SOC_MSM_ID 0x163
+unsigned int msm_common_snd_controls_is_add = 0;
 enum {
        SLIM_RX_0 = 0,
        SLIM_RX_1,



@@ -5068,16 +5071,18 @@ static int msm_ext_common_be_init(struct snd_soc_pcm_runtime *rtd)
 {
        int ret = 0;
        struct snd_soc_codec *codec = rtd->codec;
-
-       ret = snd_soc_add_codec_controls(codec, msm_common_snd_controls,
-                                        ARRAY_SIZE(msm_common_snd_controls));
-       if (ret < 0) {
-               dev_err(codec->dev,
-                       "%s: add ext common be controls failed, err = %d\n",
-                       __func__, ret);
-               return ret;
-       }
-
+          if(!msm_common_snd_controls_is_add){
+
+                      ret = snd_soc_add_codec_controls(codec, msm_common_snd_controls,
+                                                       ARRAY_SIZE(msm_common_snd_controls));
+                      if (ret < 0) {
+                              dev_err(codec->dev,
+                                      "%s: add ext common be controls failed, err = %d\n",
+                                      __func__, ret);
+                              return ret;
+                      }
+                          msm_common_snd_controls_is_add = 1;
+         }
        return 0;
 }

@@ -5091,6 +5096,7 @@ static int msm_int_audrx_init(struct snd_soc_pcm_runtime *rtd)
        struct snd_soc_component *aux_comp;
        struct msm_asoc_mach_data *pdata =
                                snd_soc_card_get_drvdata(rtd->card);

        ret = snd_soc_add_codec_controls(codec, msm_int_snd_controls,
                                ARRAY_SIZE(msm_int_snd_controls));
@@ -5099,14 +5105,16 @@ static int msm_int_audrx_init(struct snd_soc_pcm_runtime *rtd)
                        __func__, ret);
                return ret;
        }
-       ret = snd_soc_add_codec_controls(codec, msm_common_snd_controls,
-                               ARRAY_SIZE(msm_common_snd_controls));
-       if (ret < 0) {
-               pr_err("%s: add common snd controls failed: %d\n",
-                       __func__, ret);
-               return ret;
+       if(!msm_common_snd_controls_is_add){
+               ret = snd_soc_add_codec_controls(codec, msm_common_snd_controls,
+                                       ARRAY_SIZE(msm_common_snd_controls));
+               if (ret < 0) {
+                       pr_err("%s: add common snd controls failed: %d\n",
+                               __func__, ret);
+                       return ret;
+               }
+         msm_common_snd_controls_is_add = 1;
        }
-
        snd_soc_dapm_new_controls(dapm, msm_int_dapm_widgets,
                                ARRAY_SIZE(msm_int_dapm_widgets));

4.3:xml修改

--- a/vendor/qcom/opensource/audio-hal/primary-hal/configs/trinket/mixer_paths_idp.xml
+++ b/vendor/qcom/opensource/audio-hal/primary-hal/configs/trinket/mixer_paths_idp.xml
@@ -1624,7 +1624,7 @@
     </path>

     <path name="audio-record">
-        <ctl name="MultiMedia1 Mixer SEC_MI2S_TX" value="1" />
+        <ctl name="MultiMedia1 Mixer TX_CDC_DMA_TX_3" value="1" />
     </path>

     <path name="audio-record usb-headset-mic">
@@ -1662,7 +1662,7 @@
     </path>

     <path name="low-latency-record">
-      <ctl name="MultiMedia8 Mixer SEC_MI2S_TX" value="1" />
+     <ctl name="MultiMedia1 Mixer TX_CDC_DMA_TX_3" value="1" />
     </path>

     <path name="low-latency-record bt-sco">
@@ -2489,9 +2489,11 @@
         <ctl name="TX_CDC_DMA_TX_3 Channels" value="One" />
         <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
         <ctl name="TX DMIC MUX0" value="DMIC0" />
+               <ctl name="TX DEC0 MUX" value="MSM_DMIC" />
     </path>
@@ -2613,13 +2615,7 @@
     </path>

     <path name="handset-mic">
-        <ctl name="SEC_MI2S_RX Channels" value="Two" />
-        <ctl name="Capture Digital Volume" value="192 192" />
-        <ctl name="Left Channel Capture Volume" value="8" />
-        <ctl name="Right Channel Capture Volume" value="8" />
-        <ctl name="Capture Mute" value="0" />
-        <ctl name="Left PGA Mux" value="Line 2L" />
-        <ctl name="ADC Source Mux" value="left data = left ADC, right data = left ADC" />
+      <path name="dmic1" />
     </path>

     <path name="headphones">
(END)

5:Tinymix 测试

Dmic0

tinymix  "TX DEC0 MUX" "MSM_DMIC"
tinymix  "TX_CDC_DMA_TX_3 Channels"  "One"
tinymix  "TX_AIF1_CAP Mixer DEC0"  1
tinymix "TX DMIC MUX0"  "DMIC0"
tinymix "MultiMedia1 Mixer TX_CDC_DMA_TX_3" 1

tinycap /data/dmic0.wav

Dmic1

tinymix  "TX DEC0 MUX" "MSM_DMIC"
tinymix  "TX_CDC_DMA_TX_3 Channels"  "One"
tinymix  "TX_AIF1_CAP Mixer DEC0"  1
tinymix "TX DMIC MUX0"  "DMIC1"
tinymix "MultiMedia1 Mixer TX_CDC_DMA_TX_3" 1

tinycap /data/dmic1.wav

note: Dmic0/1 对应Dmic1

Dmic2

tinymix  "TX DEC0 MUX" "MSM_DMIC"
tinymix  "TX_CDC_DMA_TX_3 Channels"  "One"
tinymix  "TX_AIF1_CAP Mixer DEC0"  1
tinymix "TX DMIC MUX0"  "DMIC2"
tinymix "MultiMedia1 Mixer TX_CDC_DMA_TX_3" 1

tinycap /data/dmic2.wav

Dmic3

tinymix  "TX DEC0 MUX" "MSM_DMIC"
tinymix  "TX_CDC_DMA_TX_3 Channels"  "One"
tinymix  "TX_AIF1_CAP Mixer DEC0"  1
tinymix "TX DMIC MUX0"  "DMIC3"
tinymix "MultiMedia1 Mixer TX_CDC_DMA_TX_3" 1

tinycap /data/dmic2.wav

note: Dmic2/3 对应Dmic2

双mic立体声

tinymix  "TX DEC0 MUX" "MSM_DMIC"
tinymix  "TX DEC1 MUX" "MSM_DMIC"
tinymix  "TX_CDC_DMA_TX_3 Channels"  "Two"
tinymix  "TX_AIF1_CAP Mixer DEC0"  1
tinymix  "TX_AIF1_CAP Mixer DEC1"  1
tinymix "TX DMIC MUX0"  "DMIC0"
tinymix "TX DMIC MUX1"  "DMIC2"
tinymix "MultiMedia1 Mixer TX_CDC_DMA_TX_3" 1

tinycap /data/dmicall.wav

Disable

tinymix  "TX_CDC_DMA_TX_3 Channels"  "One"
tinymix  "TX_AIF1_CAP Mixer DEC0"  0
tinymix  "TX_AIF1_CAP Mixer DEC1"  0
tinymix "TX DMIC MUX0"  "ZERO"
tinymix "TX DMIC MUX1"  "ZERO"
tinymix "MultiMedia1 Mixer TX_CDC_DMA_TX_3" 0

录取的立体声音频

image-20210927164025950

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值