MTK 触摸屏

触摸屏,可以看作是一种硬件中断,在MTK里,表现为Event,event group等概念,源自于nucleus os。一个周期基本操作过程为:点触 -> 采样 -> 校准 -> 解析数据 -> MMI对应事件触发 -> 复位完成。
$(PROJECT)/custom/common/syscomp_tasks_create_func.c 这个文件,实现了很多tasks,触摸屏task创建 custom_tp_task_create 调用了tp_task_create, 具体的实现,在 $(PROJECT)/drv/src/touch_panel_main.c
$(PROJECT)/drv/src/touch_panel.c
所有的tasks创建函数参数都是comptask_handler_struct **handle ,这个结构体为:
typedef struct {
   kal_task_func_ptr    comp_entry_func;  /* task entry function */
   task_init_func_ptr   comp_init_func;   /* task initialization function */
   task_cfg_func_ptr    comp_cfg_func;    /* task configuration function */
   task_reset_func_ptr  comp_reset_func;  /* task reset handler */
   task_end_func_ptr    comp_end_func;    /* task termination handler */
} comptask_handler_struct;

注释也很明了,创建时,填充里面相应的回调函数即可。

函数tp_task_main几乎是最重要的了,首先数据初始化,进入while死循环,不断地从系统获取触摸事件,然后判断是否被按下或释放,并做相应的事件触发处理。讨论一下,这个死循环到底是什么回事呢?里面有意思的代码,仅仅一行:
kal_retrieve_eg_events(TP.event,1,KAL_OR_CONSUME,&event_group,KAL_SUSPEND);
它看起来有着GTK里 gtk_main() 函数般神秘,kal对nucleus os 进行了封装,我们看不到具体的实现,它“睡”一下,来等待事件的发生。

触摸屏现在只是单点触摸,传统的触控屏幕一次只能判断一个触控。 Handwriting,校准算法为三点校正法,就是定义三个点的坐标,触摸点以这三个点作为参考坐标,校准出点的位置,说简单点,解三元一次方程组。还有定义了很多handwriting area和control area,在某个区间(区域范围)属于某个area,判断查找基本是按table找了,具体的数字计算,转化公式蛮复杂的,想弄明白,非得好好静心描绘一张图不可。随便提一下,mtk里的数据查找算法,一般都是最基本的算法,反正达到目的实用就行。

读ADC数据,主要通过spi接口传输。更上一层的,从触摸屏取得的数据,放到一个buffer,供MMI去解析使用. interface/hwdrv/touch_panel_buff.h 里都以 #define的形式定义关于buffer的函数。

还有,就是中断,在Nucleus下,中断分两种,Low level 中断(Lisr)和High level 中断(Hisr),触摸屏里的中断采用的是后者。在eint_def.c 里是这样设置的:
#if defined(TOUCH_PANEL_SUPPORT) || defined(HAND_WRITING)
const kal_uint8 TOUCH_PANEL_EINT_NO = 2;
#endif /* TOUCH_PANEL_SUPPORT || HAND_WRITING */
优先级算是比较靠前的。

关于设置屏与原理图的对应管脚在touch_panel_spi.h这个文件里,如果用 drv_tool工具配置的,有对应生成的代码,否则,就把默认值给修改。

你可能感兴趣的:(function,struct,buffer,MTK,initialization,gtk)