1.在normal mode下,tp button也是和其它触摸事件一样,以坐标形式的input_event进行上报。在初始化时会通过tpd_button_setting()函数根据定义在tpd_custom_XXX.h文件中的配置信息将虚拟按键的坐标信息写在/sys/board_properties /virtualkeys.mtk-tpd中。工作时,tp driver将按下的点的坐标进行上报,Android上层会读取sys中的按键配置信息,再判断上报的坐标是否属于某个按键的坐标范围,以此将坐标信息转化为具体的按键键值。
2.在factory mode和recovery mode下,由于Android还未启动,所以按键事件不能采取1中的上报机制,而是利用tpd_button()函数来对按键进行直接上报处理。
所以,对于normal mode,按键事件不需要调用tpd_button()函数上报,而在factory mode和recovery mode下,必须调用tpd_button()函数对虚拟按键事件进行上报。
http://blog.csdn.net/sergeycao/article/details/8152110
#define TPD_HAVE_BUTTON //report key as coordinate,Vibration feedback
static void tpd_down(int x, int y, int p) {
// input_report_abs(tpd->dev, ABS_PRESSURE, p);
input_report_key(tpd->dev, BTN_TOUCH, 1);
input_report_abs(tpd->dev, ABS_MT_TOUCH_MAJOR, 25);
input_report_abs(tpd->dev, ABS_MT_POSITION_X, x);
input_report_abs(tpd->dev, ABS_MT_POSITION_Y, y);
//input_report_abs(tpd->dev, ABS_MT_TRACKING_ID, p);
input_mt_sync(tpd->dev);
if (FACTORY_BOOT == get_boot_mode()|| RECOVERY_BOOT == get_boot_mode())
{
tpd_button(x, y, 1);
}
if(y > TPD_RES_Y) //virtual key debounce to avoid android ANR issue
{
msleep(50);
TPD_DEBUG("D virtual key \n");
}
TPD_EM_PRINT(x, y, x, y, p-1, 1);
}
\mediatek\custom\common\kernel\touchpanel\src\Tpd_button.c
void tpd_button(unsigned int x, unsigned int y, unsigned int down) {
int i;
if(down) {
for(i=0;i
{
if(x>=tpd_keys_dim[i][0]-(tpd_keys_dim[i][2]/2) &&
x<=tpd_keys_dim[i][0]+(tpd_keys_dim[i][2]/2) &&
y>=tpd_keys_dim[i][1]-(tpd_keys_dim[i][3]/2) &&
y<=tpd_keys_dim[i][1]+(tpd_keys_dim[i][3]/2) &&
!(tpd->btn_state&(1<<i)))
{
input_report_key(tpd->kpd, tpd_keys[i], 1);
input_sync(tpd->kpd);
tpd->btn_state|=(1<<i);
TPD_DEBUG("[mtk-tpd] press key %d (%d)\n",i, tpd_keys[i]);
printk("[mtk-tpd] press key %d (%d)\n",i, tpd_keys[i]);
}
}
} else {
for(i=0;i
if(tpd->btn_state&(1<<i)) {
input_report_key(tpd->kpd, tpd_keys[i], 0);
input_sync(tpd->kpd);
TPD_DEBUG("[mtk-tpd] release key %d (%d)\n",i, tpd_keys[i]);
printk("[mtk-tpd] release key %d (%d)\n",i, tpd_keys[i]);
}
}
tpd->btn_state=0;
}
}