项目需要TP上支持power(映射成屏幕关闭按键)、音量+ 音量- HOME和back按键,TP的驱动需要重新调试,GT928驱动和固件支持按键直接报键值,所以不需要使用按键坐标
1、TP按键上报数组和开关配i的修改
kernel-4.9\include\uapi\linux\input-event-codes.h
#define KEY_MICMUTE 248 /* Mute / unmute the microphone /
#define KEY_SCREENOFF 249 //add by zhaojr for power off and on screen //添加这个按键值,后面我们需要映射到android系统中
kernel-4.9\arch\arm64\boot\dts\include\dt-bindings\input\linux-event-codes.h
#define KEY_MICMUTE 248 / Mute / unmute the microphone */
#define KEY_SCREENOFF 249 //add by zhaojr for power off and on screen //添加这个按键值,后面我们需要映射到android系统中
kernel-4.9\drivers\input\touchscreen\mediatek\GT928\tpd_custom_gt9xx.h
#define TPD_KEY_COUNT 5 //5个按键
//HOME键不能使用成KEY_HOME,因为android上层将其屏蔽了,导致不起作用,所以使用成KEY_HOMEPAGE键
//KEY_SCREENOFF 这里的power键我们设置成SCREENOFF键,后面映射到android系统中
#define TPD_KEYS {KEY_SCREENOFF,KEY_VOLUMEUP,KEY_VOLUMEDOWN, KEY_HOMEPAGE, KEY_BACK}
//这里不需要修改,没有使用坐标映射的方式上报
#define TPD_KEYS_DIM {{60, 850, 50, 30}, {180, 850, 50, 30}, {300, 850, 50, 30}, {420, 850, 50, 30} }
#define GTP_HAVE_TOUCH_KEY 1 //打开这个开关
//替换TP厂家给的数组
//CTP_CFG_GROUP1 for new tp GT928 1024*600 para//cgx //improve semsiky//20101015
#define CTP_CFG_GROUP1 {\
0x00,0x00,0x04,0x58,0x02,0x0A,0x0C,0x01,0x01,0x08,\
0x28,0x05,0x50,0x32,0x03,0x05,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x30,0x99,\
0x2E,0x2A,0xD3,0x07,0x78,0x78,0x00,0x9A,0x03,0x24,\
0x00,0x00,0x00,0x00,0x78,0x00,0x64,0x32,0x00,0x00,\
0x00,0x1E,0x50,0x94,0xD0,0x02,0x07,0x00,0xF0,0x04,\
0x80,0x21,0x00,0x80,0x28,0x50,0x80,0x31,0x32,0x80,\
0x3B,0x28,0x80,0x48,0x00,0x80,0x10,0x30,0x48,0x68,\
0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x17,0x16,0x15,0x14,0x11,0x10,0x0F,0x0E,\
0x0D,0x0C,0x09,0x08,0x07,0x06,0x05,0x04,0x01,0x00,\
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x02,0x04,0x06,0x07,0x08,0x0A,0x0C,\
0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x19,0x1B,\
0x1C,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,\
0x27,0x28,0x29,0x2A,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0xEB,0x01,\
}
#if GTP_HAVE_TOUCH_KEY
//#define GTP_KEY_TAB {KEY_POWER,KEY_VOLUMEUP,KEY_VOLUMEDOWN, KEY_HOMEPAGE, KEY_BACK}
//修改这个数组
#define GTP_KEY_TAB {KEY_SCREENOFF,KEY_VOLUMEUP,KEY_VOLUMEDOWN, KEY_HOMEPAGE, KEY_BACK}
#endif
2、按键上报驱动的修改
kernel-4.9\drivers\input\touchscreen\mediatek\GT928\gt9xx_driver.c
#if GTP_HAVE_TOUCH_KEY
const u16 touch_key_array[] = TPD_KEYS;
#define GTP_MAX_KEY_NUM ( sizeof( touch_key_array )/sizeof( touch_key_array[0] ) )
/*
struct touch_vitual_key_map_t
{
int point_x;
int point_y;
};
static struct touch_vitual_key_map_t touch_key_point_maping_array[]=GTP_KEY_MAP_ARRAY;
*/
#endif
系统启动的初始化:
static s32 tpd_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
s32 err = 0;
s32 ret = 0;
/*int i;*/
u16 version_info;
struct task_struct *thread = NULL;
#if GTP_HAVE_TOUCH_KEY /* GTP_HAVE_TOUCH_KEY */
s32 idx = 0;
#endif
........................................
if GTP_HAVE_TOUCH_KEY
/* for (idx = 0; idx < TPD_KEY_COUNT; idx++)
input_set_capability(tpd->dev, EV_KEY, touch_key_array[idx]);
*/
for (idx = 0; idx < GTP_MAX_KEY_NUM; idx++)
//for (idx = 0; idx < TPD_KEY_COUNT; idx++)
{
input_set_capability(tpd->dev, EV_KEY, touch_key_array[idx]);
}
#endif
....................................................
}
按键值上报的处理:
static int touch_event_handler(void *unused)
{
struct sched_param param = {.sched_priority = 4};
u8 end_cmd[3] = { GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF, 0 };
u8 point_data[2 + 1 + 8 * GTP_MAX_TOUCH + 1] = { GTP_READ_COOR_ADDR >> 8,
GTP_READ_COOR_ADDR & 0xFF };
u8 touch_num = 0;
u8 finger = 0;
......................................
#if GTP_HAVE_TOUCH_KEY
key_value = point_data[3 + 8 * touch_num];
if (key_value || pre_key)
{
for (i = 0; i < TPD_KEY_COUNT; i++)
{
input_report_key(tpd->dev, touch_key_array[i], key_value & (0x01 << i));
GTP_DEBUG("touch_key_array[%d] =%d (key_value & (0x01 << %d))=%d",i,touch_key_array[i],i,(key_value & (0x01 << i)));
/* //去掉坐标对应按键上报的处理,修改成直接上报按键值
if( key_value&(0x01<<i) ) //key=1 menu ;key=2 home; key =4 back;
{
input_x =touch_key_point_maping_array[i].point_x;
input_y = touch_key_point_maping_array[i].point_y;
GTP_DEBUG("button =%d %d",input_x,input_y);
tpd_down( input_x, input_y, 0, 0);
}
*/
}
if((pre_key!=0)&&(key_value ==0))
{
tpd_up( 0, 0, 0);
}
touch_num = 0;
pre_touch = 0;
}
#endif
..................................
}
3、android系统中针对SCREENOFF键的按键值映射
framework层的native层的修改:
frameworks\native\include\input\InputEventLabels.h
static const InputEventLabel KEYCODES[] = {
// NOTE: If you add a new keycode here you must also add it to several other files.
// Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
DEFINE_KEYCODE(UNKNOWN),
DEFINE_KEYCODE(SOFT_LEFT),
DEFINE_KEYCODE(SOFT_RIGHT),
DEFINE_KEYCODE(HOME),
DEFINE_KEYCODE(BACK),
........................
DEFINE_KEYCODE(REFRESH),
+ DEFINE_KEYCODE(SCREENOFF), //add by zhaojr for screen on and off
{ NULL, 0 }
};
frameworks\native\include\android\keycodes.h
/**
* Key codes.
*/
enum {
/** Unknown key code. */
AKEYCODE_UNKNOWN = 0,
/** Soft Left key.
* Usually situated below the display on phones and used as a multi-function
* feature key for selecting a software defined function shown on the bottom left
* of the display. */
AKEYCODE_SOFT_LEFT = 1,
..................................
AKEYCODE_ALL_APPS = 284,
/** refresh key */
AKEYCODE_REFRESH = 285,
/** screen on and off */
+ AKEYCODE_SCREENOFF = 289 //添加这个按键值
}
framework API层的修改:
frameworks\base\data\keyboards\Generic.kl
key 224 BRIGHTNESS_DOWN
key 225 BRIGHTNESS_UP
key 226 HEADSETHOOK
#added by zhaojr for screen on and off
+key 249 SCREENOFF
frameworks\base\api\current.txt
public class KeyEvent extends android.view.InputEvent implements android.os.Parcelable {
ctor public KeyEvent(int, int);
ctor public KeyEvent(long, long, int, int, int);
.....................................................
field public static final int KEYCODE_REFRESH = 285; // 0x11d
+ field public static final int KEYCODE_SCREENOFF = 289; // 0x121 //add by zhaojr for screen on and off
field public static final int KEYCODE_RIGHT_BRACKET = 72; // 0x48
......................................................
}
frameworks\base\core\res\res\values\attrs.xml
<!-- This enum provides the same keycode values as can be found in
{@link android.view.KeyEvent}. -->
<attr name="keycode">
<enum name="KEYCODE_UNKNOWN" value="0" />
<enum name="KEYCODE_SOFT_LEFT" value="1" />
<enum name="KEYCODE_SOFT_RIGHT" value="2" />
<enum name="KEYCODE_HOME" value="3" />
<enum name="KEYCODE_BACK" value="4" />
<enum name="KEYCODE_CALL" value="5" />
.....................................................
<enum name="KEYCODE_ALL_APPS" value="284" />
<enum name="KEYCODE_REFRESH" value="285" />
+ <enum name="KEYCODE_SCREENOFF" value="289" /> <!--add by zhaojr for screen off-->
</attr>
frameworks\base\core\java\android\view\KeyEvent.java
public class KeyEvent extends InputEvent implements Parcelable {
/** Key code constant: Unknown key code. */
public static final int KEYCODE_UNKNOWN = 0;
..............................................................
/** Key code constant: Refresh key. */
public static final int KEYCODE_REFRESH = 285;
/** zhaojr add by for screen on and off ***/
public static final int KEYCODE_SCREENOFF = 289;
//private static final int LAST_KEYCODE = KEYCODE_REFRESH;
+ private static final int LAST_KEYCODE = KEYCODE_SCREENOFF;
........................................................
}
修改好之后上层就可以使用KEYCODE_SCREENOFF这个按键了
其它请参考:
https://blog.csdn.net/An_Times/article/details/88077819