高通平臺更改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>



分享到:


相關文章: