[RK3399][Android7.1] 除錯筆記 --- 解決開關按鍵時產生的Pop聲
阿新 • • 發佈:2018-11-10
Platform: RK3399
OS: Android 7.1
Kernel: v4.4.83
背景:
按鍵音在開啟和關閉的時候,會有pop聲。
原因:
audio codec後面有個功放,功放一直開啟著,當codec開啟和關閉的時候,會有噪聲帶進到功放中。
解決方法:
注:GPIO4_D4是用來控制功放的開關。
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-ecovacs.dts b/arch/arm64/boot/dts/rockchip/rk3399-ecovacs.dts index 80b31d9..486254b 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399-ecovacs.dts +++ b/arch/arm64/boot/dts/rockchip/rk3399-ecovacs.dts @@ -651,8 +651,9 @@ realtek,in1-differential; pinctrl-names = "default"; pinctrl-0 = <&rt5640_hpcon &i2s_8ch_mclk>; - hp-con-gpio = <&gpio4 21 GPIO_ACTIVE_HIGH>; - //hp-det-gpio = <&gpio4 28 GPIO_ACTIVE_LOW>; + //Kris, 181101, Fix pop sound issue. + //GPIO4_D4 + spk-ctl-gpio = <&gpio4 28 GPIO_ACTIVE_LOW>; io-channels = <&saradc 4>; hp-det-adc-value = <500>; status = "okay"; diff --git a/include/sound/rt5640.h b/include/sound/rt5640.h index e3c84b9..747aed1 100644 --- a/include/sound/rt5640.h +++ b/include/sound/rt5640.h @@ -22,6 +22,9 @@ struct rt5640_platform_data { bool dmic2_data_pin; /* 0 = IN1N; 1 = GPIO4 */ int ldo1_en; /* GPIO for LDO1_EN */ + + //Kris, 181101, Fix pop sound issue. + int spk_ctl_gpio; }; #endif diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c index 5f37d75..ee9d1ba 100644 --- a/sound/soc/codecs/rt5640.c +++ b/sound/soc/codecs/rt5640.c @@ -1800,6 +1800,22 @@ static int rt5640_hw_params(struct snd_pcm_substream *substream, return 0; } + +/*Kris, 181101, Fix pop sound issue. {*/ +static int rt5640_digital_mute(struct snd_soc_dai *dai, int mute) +{ + struct snd_soc_codec *codec = dai->codec; + struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec); + + if(mute){ + gpio_direction_output(rt5640->pdata.spk_ctl_gpio, 0); + } else { + gpio_direction_output(rt5640->pdata.spk_ctl_gpio, 1); + } + return 0; +} +/*Kris, 181101, Fix pop sound issue. }*/ + static int rt5640_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { struct snd_soc_codec *codec = dai->codec; @@ -2158,6 +2174,8 @@ static int rt5640_resume(struct snd_soc_codec *codec) static const struct snd_soc_dai_ops rt5640_aif_dai_ops = { .hw_params = rt5640_hw_params, + //Kris, 181101, Fix pop sound issue. + .digital_mute = rt5640_digital_mute, .set_fmt = rt5640_set_dai_fmt, .set_sysclk = rt5640_set_dai_sysclk, .set_pll = rt5640_set_dai_pll, @@ -2272,6 +2290,12 @@ static int rt5640_parse_dt(struct rt5640_priv *rt5640, struct device_node *np) rt5640->pdata.ldo1_en = of_get_named_gpio(np, "realtek,ldo1-en-gpios", 0); + + /*Kris, 181101, Fix pop sound issue. {*/ + rt5640->pdata.spk_ctl_gpio = of_get_named_gpio(np, + "spk-ctl-gpio", 0); + /*Kris, 181101, Fix pop sound issue. }*/ + /* * LDO1_EN is optional (it may be statically tied on the board). * -ENOENT means that the property doesn't exist, i.e. there is no @@ -2337,6 +2361,19 @@ static int rt5640_i2c_probe(struct i2c_client *i2c, msleep(400); } + /*Kris, 181101, Fix pop sound issue. {*/ + if (gpio_is_valid(rt5640->pdata.spk_ctl_gpio)) { + ret = devm_gpio_request_one(&i2c->dev, rt5640->pdata.spk_ctl_gpio, + GPIOF_OUT_INIT_LOW, + "rt5640_spk_ctl"); + if (ret < 0) { + dev_err(&i2c->dev, "Failed to request rt5640 spk_ctl_gpio %d: %d\n", + rt5640->pdata.spk_ctl_gpio, ret); + return ret; + } + } + /*Kris, 181101, Fix pop sound issue. }*/ + ret = regmap_read(rt5640->regmap, RT5640_VENDOR_ID2, &val); if (ret) return -EPROBE_DEFER;