[FAQ06834] [TouchPanel]TouchPanel的虚拟按键没有震感 |
Platform:MT6575MT6577MT6589MT6572
Branch:ICSICS2JBJB2
FAQ Content 【问题描述】 Setting->情景模式->使能振动选项,TP虚拟按键无振动效果 【问题原因】 在TouchPanel的driver中,如果虚拟按键是以 input_report_key(tpd->kpd, key_code, key_val);方式上报key值,是不会有触感的。 如果虚拟按键是以坐标形式上报,如下所示: input_report_abs(tpd->dev, ABS_MT_POSITION_X, x); input_report_abs(tpd->dev, ABS_MT_POSITION_Y, y); 上报的,就会有触感。 【解决方法】 把虚拟按键以坐标的形式上报。 1,TPD_HAVE_BUTTON宏要打开:#define TPD_HAVE_BUTTON 2,定义按键的坐标位置(具体定义,可以参考 FAQ03862 --电容屏客制化文件vitual key的配置) #define TPD_BUTTON_HEIGH 100 #define TPD_KEY_COUNT 3 #define TPD_KEYS { KEY_MENU, KEY_HOME,KEY_BACK} #define TPD_KEYS_DIM {{80,850,160,TPD_BUTTON_HEIGH},{240,850,160,TPD_BUTTON_HEIGH},{400,850,160,TPD_BUTTON_HEIGH}} 3, 从TouchPanel中读到的虚拟按键数据有两种,一种是key值(1,2,3),另一种是报的坐标值((x,y)); 如果读出的虚拟按键值为坐标,那直接按TouchPanel报坐标点的方式上报就OK了。 如果是key值,那就需要把key人为的转为坐标,然后在上报。 【例子】 以msg2133为列,它的虚拟按键读取的为key值,需要转成坐标上报,code如下: static void tpd_down(int x, int y, int p, int id) { input_report_abs(tpd->dev, ABS_MT_TOUCH_MAJOR, 100); input_report_abs(tpd->dev, ABS_PRESSURE, 100); input_report_key(tpd->dev, BTN_TOUCH, 1); input_report_abs(tpd->dev, ABS_MT_POSITION_X, x); input_report_abs(tpd->dev, ABS_MT_POSITION_Y, y); /* track id Start 0 */ //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, id, 1); } static void tpd_up(int x, int y,int *count) { input_report_key(tpd->dev, BTN_TOUCH, 0); input_mt_sync(tpd->dev); TPD_EM_PRINT(x, y, x, y, 0, 0); if(FACTORY_BOOT == get_boot_mode()|| RECOVERY_BOOT == get_boot_mode()) { TPD_DEBUG(KERN_ERR "[msg2133a]--tpd_up-BOOT MODE--X:%d, Y:%d; \n", x, y); tpd_button(x, y, 0); } } static void tpd_key(int key_code, int key_val) { input_report_key(tpd->kpd, key_code, key_val); TPD_DEBUG(KERN_ERR "[msg2133a] key_code = %d(%d)\n", key_code, key_val); } static void tpd_check_key(int *key, int *is_down) { static int pre_key = 0; int cur_key; if (*key == 1) cur_key = KEY_MENU; else if (*key == 2) cur_key = KEY_HOME; else if (*key == 4) cur_key = KEY_BACK; else cur_key = 0; if ((pre_key != 0) && (cur_key != pre_key)) { // current key is different from previous key, then need to send key up cur_key = pre_key; pre_key = 0; *is_down = 0; } else { pre_key = cur_key; *is_down = 1; } *key = cur_key; } static int touch_event_handler(void *unused) { TouchScreenInfo_t touchData; u8 touchkeycode = 0; static u32 preKeyStatus = 0; int i=0; TPD_DEBUG(KERN_ERR "[msg2133a]touch_event_handler() do while \n"); touchData.nFingerNum = 0; TPD_DEBUG(KERN_ERR "[msg2133a]touch_event_handler() do while \n"); if (tpd_touchinfo(&touchData)) { TPD_DEBUG(KERN_ERR "[msg2133a]--KeyMode:%d, KeyCode:%d, FingerNum =%d \n", touchData.nTouchKeyMode, touchData.nTouchKeyCode, touchData.nFingerNum ); //key event if( touchData.nTouchKeyMode ) { //report key 以报key的方式上报数据,虚拟按键不会有触感 #if 0 int key_code = touchData.nTouchKeyCode; int key_val; tpd_check_key(&key_code, &key_val); tpd_key(key_code, key_val); input_sync(tpd->kpd); goto TPD_EVENT_END; #else //report coordinate 把key值转变为坐标值,然后在上报数据,此时就会有震感。 touchData.nFingerNum = 1; if( touchData.nTouchKeyCode == 1 ) { //touchkeycode = KEY_MENU; touchData.Point[0].X = 80; touchData.Point[0].Y = 850; } if( touchData.nTouchKeyCode == 2 ) { //touchkeycode = KEY_HOMEPAGE ; touchData.Point[0].X = 240; touchData.Point[0].Y = 850; } if( touchData.nTouchKeyCode == 4 ) { //touchkeycode = KEY_BACK; touchData.Point[0].X = 400; touchData.Point[0].Y = 850; } if( touchData.nTouchKeyCode == 8 ) { //touchkeycode = KEY_SEARCH; //touchData.Point[0].X = 560; //touchData.Point[0].Y = 850; } #endif } //Touch event if( ( touchData.nFingerNum ) == 0 ) //touch end { TPD_DEBUG("------UP------ \n"); TPD_DEBUG(KERN_ERR "[msg2133a]---X:%d, Y:%d; \n", touchData.Point[0].X, touchData.Point[0].Y); tpd_up(touchData.Point[0].X, touchData.Point[0].Y, 0); input_sync( tpd->dev ); } else //touch on screen { TPD_DEBUG("------DOWN------ \n"); for( i = 0; i <( (int)touchData.nFingerNum ); i++ ) { tpd_down(touchData.Point[i].X, touchData.Point[i].Y, 1, i); TPD_DEBUG(KERN_ERR "[msg2133a]---X:%d, Y:%d; i=%d \n", touchData.Point[i].X, touchData.Point[i].Y, i); } input_sync( tpd->dev ); } } TPD_EVENT_END: mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); return 0; } |