高通平台更改Speaker通道

文档说明

本文档以SC826(MSM8953平台,Android 7)为例,说明如何更改Speaker音频通道。

原理图

高通平台更改Speaker通道

由图可知:

1)Speaker音频通道为LINEOUT通道;

2)LINEOUT出来后外接了一个外部PA;

3)该外部PA的使能脚由主控GPIO91脚控制,高电平使能。

我们需要设置正确的配置,使Speaker能够正常工作。

分析过程

音频通道会使用mixer_paths*.xml,那么如何查找项目对应的通道配置文件呢。

对应xml配置目录:

hardware/qcom/audio/configs/msm8953/mixer_paths*.xml

如图,有很多xml配置文件:

高通平台更改Speaker通道

至于最终用哪个,在文件

hardware/qcom/audio/hal/msm8916/platform.c

中query_platform()函数中决定:

高通平台更改Speaker通道

由参数 snd_card_name 决定的,这个值是多少?

可在adb shell查看:

cd sys/kernel/debug/asoc/

ls

高通平台更改Speaker通道

其中 msm8953-snd-card-mtp 即为参数 snd_card_name 的值,找到相应分支:

高通平台更改Speaker通道

然后找到对应的 MIXER_XML_PATH_MTP 宏定义:

#define MIXER_XML_PATH_MTP "/system/etc/mixer_paths_mtp.xml"

即可知道,当前项目使用的是mixer_paths_mtp.xml配置文件。

调试方法

配置Speaker的通道为LINEOUT通道

修改 hardware/qcom/audio/configs/msm8953/mixer_paths_mtp.xml

修改代码如下:

<code>--- a/configs/msm8953/mixer_paths_mtp.xml
+++ b/configs/msm8953/mixer_paths_mtp.xml
@@ -993,7 +993,7 @@
<path>

-
+
/<path>
<path>/<code>

经过以上配置后,如果PA的使能脚常高,则Speaker已经可以正常播放声音了。当然,为避免功耗过高或出现poke音,最好对PA的使能脚进行控制。

在dtsi中配置外部PA使能脚IO口

修改 kernel/msm-3.18/arch/arm/boot/dts/qcom/sc820-evk-1/msm8953-audio.dtsi

代码如下:

<code>--- a/arch/arm/boot/dts/qcom/sc820-evk-1/msm8953-audio.dtsi
+++ b/arch/arm/boot/dts/qcom/sc820-evk-1/msm8953-audio.dtsi
@@ -17,6 +17,7 @@
qcom,model = "msm8953-snd-card-mtp";
/*qcom,cdc-us-euro-gpios = ;*/
+ qcom,msm-spk-ext-pa= ;
qcom,msm-mbhc-hphl-swh = <0>;
qcom,msm-mbhc-gnd-swh = <0>;
qcom,msm-hs-micbias-type = "internal";/<code>

添加使能控制代码

声音的播放和停止分别会执行 kernel/msm-3.18/sound/soc/msm/msm8952.c 中的 msm_mi2s_snd_startup() 和 msm_mi2s_snd_shutdown() 函数,只要在其中添加对应GPIO的控制即可。

注意,为防止出现poke音,播放时最好在所有音频参数准备好后再打开PA使能脚,停止播放时最好先关闭PA使能脚,再关闭其他音频参数。即在 msm_mi2s_snd_startup() 函数最后打开 PA使能脚,在 msm_mi2s_snd_shutdown() 函数最开始的地方关闭PA使能脚。

修改 kernel/msm-3.18/sound/soc/msm/msm8952.c 文件。

代码如下:

<code>--- a/sound/soc/msm/msm8952.c
+++ b/sound/soc/msm/msm8952.c

@@ -1215,6 +1215,10 @@ static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream)
if (ret < 0)
pr_err("%s: set fmt cpu dai failed; ret=%d\\n", __func__, ret);
+ gpio_set_value_cansleep(pdata->spk_ext_pa_gpio, 1);
+
return ret;
}
static void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream)
@@ -1227,6 +1231,10 @@ static void msm_mi2s_snd_shutdown(struct
snd_pcm_substream *substream)
pr_debug("%s(): substream = %s stream = %d\\n", __func__,
substream->name, substream->stream);
+ gpio_set_value_cansleep(pdata->spk_ext_pa_gpio, 0);
+
ret = msm_mi2s_sclk_ctl(substream, false);
if (ret < 0)
pr_err("%s:clock disable failed; ret=%d\\n", __func__,/<code>



分享到:


相關文章: