如果有中断关闭就要在程序执行完毕后打开中断,如果逻辑出错,会报如下错误: WARNING:at /sda1/yzhao-work-1/QC706EU-S/msm8916_1605_444/kernel/kernel/irq/manage.c:529 irq_set_irq_wake+0x88/0xe8() [ 8518.783716] —[ end trace 35ae10e4ba3033e2 ]— 一般是申请和释放资源不匹配。
下面解决第二个bug,快速双击唤醒,长按不唤醒,这个可以有不同的逻辑实现,以下是我的逻辑,不正确的地方希望指出: 首先要熟悉上报坐标的流程,这里截取有用的一段进行分析,中断的下半部函数为,gsl_ts_xy_worker,其中有process_gslX680_data处理坐标点,和上报坐标点。 gsl屏幕支持多点触控,一次按下时把多个点的坐标值经过record_point计算成为一个点,后用report_data上报。函数中,有三个重要的变量,之前一直忽视了,却起到了区分快速双击和长按的作用:cinfo.finger_num----->记录按下的手指数id_state_old_flag[i]----->记录上一次按下的状态,是数组,按下为1,抬起为0id_state_flag[i]----->记录此次按下的状态,是数组,没按为0,按下为1下面是这个函数的大致代码,和加入的代码,之后再分析区分思路static void process_gslX680_data(struct gsl_ts *ts){ int result = 0; //加入代码,用于计算时间间隔,大于80个时钟周期,两次触摸时间过长,level=0... record_point(x, y , id); //计算x和y report_data(ts, x_new, y_new, 200, id); //上报... //打印调试 pr_err("xhlin^le=%d cinfo.finger_num=%d, id_state_old_flag[i]=%d, id_state_flag[i]=%d,id_sign[i]=%d; /n",level,cinfo.finger_num,id_state_old_flag[1],id_state_flag[1],id_sign[1]);... if(flag == 1) //flag==1 进入休眠,准备唤醒 { result = jiffies - old; //计算两次按下时间间隔 if(result > 80) //判断时间间隔,大于80,说明两次按下时间间隔长,level为0 level = 0; switch(level) { case 0: //第一阶段 if((cinfo.finger_num == 1) && (id_sign[1] <= 8 )) { level = 1; //cinfo.finger_num == 1说明有一个手指头按下,但是可能没有抬起 old = jiffies; //记录下第一次按下的时间 } break; case 1: //第二阶段 if((cinfo.finger_num == 0) && (id_sign[1] ==0 )) level = 2; //在level为1的基础上,cinfo.finger_num == 0说明有手指头抬起,但是可能没有按下第二次 break; case 2://第三阶段 if((cinfo.finger_num == 1) && (id_sign[1] <= 8 )) level = 3; //在level为2的基础上,cinfo.finger_num再次为1,说明有手指头又按下,完成一次双击触摸 break; } if(level == 3) //level为3时候,说明完成一次双击触摸,可以唤醒系统 { level = 0; open_lcd(ts); //唤醒系统 } }...}//唤醒系统void open_lcd(struct gsl_ts *ts){ gsl_halt_flag = 0; flag = 0; old = 0; input_report_key(ts->input,KEY_POWER, 1); //power键按下 input_sync(ts->input); input_report_key(ts->input,KEY_POWER, 0); //power键抬起 input_sync(ts->input); }//一些全局变量static unsigned long old = 0;extern unsigned long volatile jiffies;static int level = 0;static int gsl_halt_flag;static int flag;思路: 调试的时候,根据log:pr_err(“xhlin^le=%d cinfo.finger_num=%d, id_state_old_flag[1]=%d, id_state_flag[1]=%d,id_sign[1]=%d; /n”,level,cinfo.finger_num,id_state_old_flag[1],id_state_flag[1],id_sign[1]); 发现快速双击的时候,cinfo.finger_num会由1,变为0,再变为1 长按的时候,cinfo.finger_num一直为1,且id_sign[1]的值不间断变大 快速双击log
长按log 所以以此区别,来实现双击唤醒,每次唤醒后,和每次无效双击后,要把level清0
新闻热点
疑难解答