[全志平台]解决power键关机产生破音(方法一)
一、前言
在产品开发里碰到了一个常见的bug,就是按power键关机时会有明显的破音。采用在power流程中把功放脚拉低。
二、代码路径
Android\longan\kernel\linux-5.4\drivers\power\reset\gpio-poweroff.c
Android\longan\kernel\linux-5.4\sound\soc\sunxi\sun50iw12-codec.c
三、代码操作
extern出功放脚的操作函数,在gpio-poweroff.c文件的power流程中提前拉动功放脚
sun50iw12-codec.c:
void hotack_codec_spk_ctr(int spkon)
{
if(sunxi_codec_tmp != NULL)
{
struct codec_spk_config *spk_cfg = &(sunxi_codec_tmp->spk_cfg);
if(spkon == 0) {
/* Disable the PA Here */
if (spk_cfg->spk_used) {
gpio_set_value(spk_cfg->spk_gpio, !(spk_cfg->pa_level));
// if (spk_cfg->pa_msleep > 0) {
// msleep(spk_cfg->pa_msleep);
// }
}
} else {
/* Enable the PA Here */
if (spk_cfg->spk_used) {
// if (spk_cfg->pa_msleep > 0) {
// msleep(spk_cfg->pa_msleep);
// }
gpio_direction_output(spk_cfg->spk_gpio, 0x1);
gpio_set_value(spk_cfg->spk_gpio, spk_cfg->pa_level);
}
}
}
}
EXPORT_SYMBOL(hotack_codec_spk_ctr);
gpio-poweroff.c:
.....
extern void hotack_codec_spk_ctr(int spkon);//引出操作函数
static void gpio_poweroff_do_poweroff(void)
{
//set_gpio_spk(0);
+ hotack_codec_spk_ctr(0);//此处添加
// if(gpio_num > 0)
// gpiod_set_value_cansleep(gpio_num, 1);
printk("=====================gpio_poweroff_do_poweroff===========================\n");
BUG_ON(!reset_gpio);
delay_ms(1000);
/* drive it active, also inactive->active edge */
gpiod_direction_output(reset_gpio, 1);
// delay_ms(active_delay);
/* drive inactive, also active->inactive edge */
// gpiod_set_value_cansleep(reset_gpio, 0);
// delay_ms(inactive_delay);
// /* drive it active, also inactive->active edge */
// gpiod_set_value_cansleep(reset_gpio, 1);
/* give it some time */
delay_ms(timeout);
WARN_ON(1);
}
四、总结
此bug的解决思路就是在关机前关掉spk,方法有很多。