android9.0 按键重新映射

项目需要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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值