日期:2015-04-10 星期五
一、相关说明
1,在做耳机测试的时候发现当耳机插入一半的时候,机器就可以识别到有耳机;当耳机头完全插入机器后反而识别不到耳机。
分析:首先,在插入耳机时机器是有产生过中断的。而在后期又不识别了,这个可能和里边的某个电平高低状态有关系。和耳机的驱动相关的代码都差不多是以accdet开头相关的,如accdet.c 、accdet_drv.c 、accdet_custom.c 等等。
二、Action
1,我们找到 accdet.c ,它在以下的路径:mediamek/platform/mt6582/kernel/drivers/accdet/accdet.c 。
2,找到 accdet_eint_func(void) 这个函数,里边有一个
if(cur_eint_state == EINT_PIN_PLUG_IN) 这样的语句。这个就是查看当前的状态是否有耳机插入,这个 cur_eint_state 是一个全局变量。由于我们是能够识别到有耳机插入的(只插入一半时),所以进入这里是没问题的。在这里边之后,又出现了一个条件判断,
if(CUST_EINT_ADDDET_TYPE == CUST_EINTF_TRIGGER_HIGH)
{
mt_eint_set_polarity(CUST_EINT_ACCDET_NUM , (1));
}
else
{
mt_eint_set_polarity(CUST_EINT_ACCDET_NUM , (0));
}
我们对 CUST_EINT_ADDDET_TYPE 做一次全搜索,会发现有这个:
mt_eint_registration(CUST_EINT_ACCDET_NUM,CUST_EINT_ADDDET_TYPE,accdet_eint_func,0);
这个函数是注册中断的。中断号CUST_EINT_ACCDET_NUM 为 15,因为CUST_EINT_ADDDET_TYPE 在初始时给到的值为 Low,所以它的触发中断电平为低电平。看完整段:
if(cur_eint_state == EINT_PIN_PLUG_IN)
{
..............
}
else{
...............
}
代码后,就一定要理清里边的状态逻辑,中断和耳机插入、拔出、触 发中断的电平所对应的逻辑关系。所以我们要在 cust_eint.h文件里将
CUST_EINT_ADDDET_TYPE =CUST_EINT_TRIGGER_LOW 修改为:
CUST_EINT_ADDDET_TYPE =CUST_EINT_TRIGGER_HIGH
这样问题就可以得到解决了。当然了,这个是要在dct工具里边改,eint里。
三、小结
1,遇到问题的时候一定要先根据现象做定位,然后再去找它们在里边的关系。