V663/V669/V662耳机半插,图标不消失问题测试
问题反馈——What:线程
1.2017.11.29号 V663 K29客户在组装厂组装发现耳机存在屡次插拔后,图标不消失的问题rest
2.2017.11.30号 V669 Z1因V663小星客户报有插耳机图标不消失的,因此此项目在公司内部进行的验证,发现也有此问题three
3. 2017.11.30号 在发现V663和V669都有此耳机图标不消失的状况,因此对V662的项目也进行验证,也发现有此问题get
4.后又发现v663耳机音量加功能为减,减键无功能cmd
缘由——Why:it
分析方向:io
WHO (负责人)thread
何谦,薛松基础
解决措施:
代码修改部分:
(1) 在v662 mk文件中配置KST_USING_ACCDET_EINT=yes
(2) dts中加入
&accdet {
accdet-mic-vol = <7>;
headset-mode-setting = <0x500 0x200 1 0x1F0 0x800 0x800 0x20>;
accdet-plugout-debounce = <20>;
/*1:ACC mode, 2:low cost without in bias, 6:low cost with in bias*/
accdet-mic-mode = <1>;
/*0--MD_MAX--UP_MAX--DW_MAX*/
headset-three-key-threshold = <0 80 285 500>;
/*0--MD_MAX--VOICE_MAX--UP_MAX--DW_MAX*/
headset-four-key-threshold = <0 60 126 201 450>;
/* ACCDET GPIO standardization ACC mode use */
pinctrl-names = "default", "state_eint_as_int";
pinctrl-0 = <&ACCDET_pins_default>;
pinctrl-1 = <&ACCDET_pins_eint_as_int>;
status = "okay";
};
&pio {
ACCDET_pins_default: eint0default {
};
ACCDET_pins_eint_as_int: eint@0 {
pins_cmd_dat {
pins = <PINMUX_GPIO0__FUNC_ GPIO6>;
slew-rate = <0>;
bias-disable;
};
};
};
(3) 将Z:\37_n_base\v618_v662\alps\kernel-3.18\drivers\misc\mediatek\accdet\mt6735\accdet.c
中原来DCC的代码用CONFIG_ACCDET_EINT_IRQ包起来
CONFIG_ACCDET_EINT_IRQ
pmic_register_interrupt_callback(13, accdet_eint_int_handler);
#endif
#ifdef CONFIG_ACCDET_EINT_IRQ
void accdet_eint_int_handler(void)
{
int ret = 0;
ACCDET_DEBUG("[accdet_eint_int_handler]....\n");
ret = accdet_irq_handler();
if (0 == ret)
ACCDET_DEBUG("[accdet_int_handler] don't finished\n");
}
#enfif
因为ACCDET接地后偏置电压被拉为0,因此考虑不断去打开偏置电压,由于不知道半插拔出时机,因此要建立一盒内核线程不停的去打开MICBIAS1偏置电压
查看mt6328芯片手册,
0xD00寄存器的第四位为控制MICBIAS1的寄存器
代码修改部分以下:具体可对比Z:\37_n_base\v618_v662\update\alps\kst\drv\headset_typec_general\accdet.c
在accdet.c里添加以下代码
int get_interrupt_pin_status(void);
static int accdet_detect_thread(void *data)
{
do {
//printk(KERN_INFO "accdet_detect_thread: running");
//read accdet gpio to detect accdet
get_interrupt_pin_status();
msleep(1000);
}while(!kthread_should_stop() );
return 0;
}
//#endif
//add by hqian end
int get_interrupt_pin_status(void)
{
static int ret = 0;
//volatile int curstatus;
//static int prestatus = 1;
//int temp1 = 0;
int temp2 = 0;
int temp3 = 0;
temp3=pmic_pwrap_read(0x0D00);
// printk("temp3=%x\n",temp3);
//if(cable_type==HEADSET_NO_MIC)
{
//accdet_init();
//enable_accdet(ACCDET_SWCTRL_EN);
temp2=temp3|0x0010;
pmic_pwrap_write(0x0D00, temp2);
//printk("temp2=%d\n",temp2);
}
//ret=Accdet_PMIC_IMM_GetOneChannelValue(1);
return ret;
}
TPPEC的项目只需在mk里配置KST_HEADSET_TYPEC_GENERAL=y,脚本会把update\alps\kst\drv\headset_typec_general\accdet.c拷贝到基础代码
防范措施: