我们知道android 5.0上层已经实现了虚拟按键功能,要使用只要打开就可以.
然而在TP驱动中你如何实现虚拟按键功能呢?我只需要指定虚拟按键位置,然后将这按键事件上报给上层,android上层会实现相应的按键功能.
1 .TP驱动中有个关键动作是按下和松开 .
//0 按下 1 松开
static int Backkeydown=0;
static int Homekeydown=0;
static int Menukeydown=0;
static int VolumeUpkeydown=0;
static int VolumeDownkeydown=0;
static const int key_codes[] = {KEY_HOME,KEY_MENU,KEY_BACK,KEY_VOLUMEDOWN,KEY_VOLUMEUP};
static const char *key_names[] = {"Key_Home", "Key_Menu", "Key_Back", "Key_Volumedown","Key_Volumeup"};
由于我们定义的是物理按键,我们需要指定物理按键的位置.
static void gtp_touch_down(struct goodix_ts_data* ts,s32 id,s32 x,s32 y,s32 w){
if ( y > 1024 ) {
if ( x < 40 && x > 0 ) {
if(VolumeDownkeydown==0){
input_event(ts->input_dev, EV_KEY,KEY_VOLUMEDOWN, 1);
VolumeDownkeydown=1;
GTP_INFO("VolumeDown Key Press\n");
}
} else if ( x < 150 && x > 85 ) {
if(VolumeUpkeydown==0){
input_event(ts->input_dev, EV_KEY,KEY_VOLUMEUP, 1);
VolumeUpkeydown=1;
GTP_INFO("VolumeUp Key Press\n");
}
} else if ( x < 340 && x > 308 ) {
if(Backkeydown==0){
input_event(ts->input_dev, EV_KEY,KEY_BACK, 1);
Backkeydown=1;
GTP_INFO("Back Key Press\n");
}
}else if ( x < 450 && x > 405 ) {
if(Homekeydown==0){
input_event(ts->input_dev, EV_KEY,KEY_HOME, 1);
Homekeydown=1;
GTP_INFO("Home Key Press\n");
}
}else if ( x < 550 && x > 480 ) {
if(Menukeydown==0){
input_event(ts->input_dev, EV_KEY,KEY_MENU, 1);
Menukeydown=1;
GTP_INFO("Menu Key Press\n");
}
}
}
在松开的方法中定义:
static void gtp_touch_up(struct goodix_ts_data* ts, s32 id){
if(VolumeDownkeydown==1)
{
VolumeDownkeydown=0;
input_event(ts->input_dev, EV_KEY, KEY_VOLUMEDOWN, 0);
GTP_INFO("Volumedown Key release \n");
}
if(VolumeUpkeydown==1)
{
VolumeUpkeydown=0;
input_event(ts->input_dev, EV_KEY, KEY_VOLUMEUP, 0);
GTP_INFO("Volumeup Key release \n");
}
if(Backkeydown==1)
{
Backkeydown=0;
input_event(ts->input_dev, EV_KEY, KEY_BACK, 0);
GTP_INFO("Back Key release\n");
}
if(Homekeydown==1)
{
Homekeydown=0;
input_event(ts->input_dev, EV_KEY, KEY_HOME, 0);
GTP_INFO("Home Key release \n");
}
if(Menukeydown==1)
{
Menukeydown=0;
input_event(ts->input_dev, EV_KEY, KEY_MENU, 0);
GTP_INFO("Menu Key release \n");
}
}
注意:上报事件的方法要和驱动一致,不然虚拟按键会太灵敏.
有帮助的话记得点个赞哦!