微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > TouchPanel的虚拟按键没有震感

TouchPanel的虚拟按键没有震感

时间:10-02 整理:3721RD 点击:

【问题描述】

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_H
EIGH}}
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.X, touchData.Point.Y, 1, i);
TPD_DEBUG(KERN_ERR "[msg2133a]---X:%d, Y:%d; i=%d \n", touchData.Point.X,
touchData.Point.Y, i);
}
input_sync( tpd->dev );
}
}
TPD_EVENT_END:
mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM);
return 0;
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top