|
HISR 处理完后会进tp task如果是
down则进down的处理touch_panel_down_hdr()
最后几句是:
tp_data_pop(PEN_DOWN, x, y);
touch_panel_event_hdr();
touch_start_longtap();
此函数会起一个timer
void touch_panel_event_hdr(void)
{
kal_bool btmp;
if(TP.low_sample_period!=0)
{
btmp = GPTI_StartItem(touch_panel_handle,
TP.low_sample_period,
touch_panel_event_cb,
NULL);
}
}
回调函数是:
void touch_panel_event_cb(void *parameter)
{
kal_int16 x=0, y=0;
kal_bool valid=KAL_FALSE;
kal_bool btmp;
#ifndef __TOUCH_PANEL_CTP_SUPPORT__
#if defined(DRV_ADC_TOUCH_SCREEN)
if ((kal_bool)touch_up_level == tp_level())
{
TPUpdateNotify();
return;
}
#endif // #if defined(DRV_ADC_TOUCH_SCREEN)
#endif
if(TP.state==DOWN)
{
#ifndef __TOUCH_PANEL_CTP_SUPPORT__
#ifdef TOUCH_PANEL_PRESSURE
if (KAL_TRUE == tp_fun_ptr->tp_pressure_check())
{
#endif
#endif
touch_panel_read_adc(&x, &y);
valid=touch_panel_adc_to_coordinate(&x,&y);/*translate*/
if(touch_panel_exceed_penmove(x, y)&&(valid==KAL_TRUE))
{
TP.longtap_state=KAL_FALSE;
tp_data_pop(PEN_MOVE, x, y);
#ifdef TOUCH_PANEL_DEBUG
dbg_printWithTime("PEN MOVE x=%d y=%d\r\n",x,y);
#endif
drv_trace2(TRACE_GROUP_10, TP_PEN_MOVE, x, y);
TP.pre.x=x;
TP.pre.y=y;
GPTI_StopItem(touch_panel_repeat_handle);
if(TP.repeat_cnt!=0)/*long tap and reapeat timer*/
{
btmp = GPTI_StartItem(touch_panel_repeat_handle,
TP.repeat_cnt,
touch_panel_repeat_cb,
NULL);
}
}
#ifndef __TOUCH_PANEL_CTP_SUPPORT__
#ifdef TOUCH_PANEL_PRESSURE
}
#endif
#endif
/*start polling again*/
touch_panel_event_hdr();
}
}
最后又回touch_panel_event_hdr()构成循环,如此反复
我的疑问是起这个timer的作用是什么?实在没搞明白
中断来了,回到TP TASK 进相应的handler
直接往ring buffer放数据不就是了,为何设置这个timer?
Framework里mmi_pen_poll_handler取buffer的数据时也会起timer,
这个我的理解是buffer里可能放了很多数据,取到一个后用timer来取可能效率会更高
还有一个问题,timer 超时的时候与中断、task的优先级如何?
在加multi touch,可单点TP的流程就搞的一头雾水~ |
|