android之蓝牙遥控器新增键值

时间:2024-10-04 09:59:49

文章目录

  • 简述
  • 连接蓝牙
  • 代码流程
  • 总结

简述

使用android 10平台来适配蓝牙遥控器新增的键值

连接蓝牙

当使用遥控器与蓝牙进行配对成功后,就可以通过getevent获取蓝牙打印的信息,如下所示
在这里插入图片描述
其中000700a0是发送过来的协议(0007)和码值(00a0)的组合。0xfa是驱动定义好的值,如果此处的值为0xf0表示该键还没有定义。

代码流程

kernel/msm-4.14/drivers/hid/
找下关键字段case HID_UP_KEYBOARD:
由于不同的蓝牙遥控器对应的协议会存在差别,此时需要根据实际情况来进行修改。

	switch (usage->hid & HID_USAGE_PAGE) {  
	// usage->hid &HID_USAGE_PAGE -->000700a0 & 0xffff0000 = 00070000-->HID_UP_KEYBOARD
	/** 以上值的定义可在kernel/msm-4.14/include/linux/中查到
	 #define HID_UP_KEYBOARD		0x00070000
	 #define HID_USAGE		0x0000ffff
	 #define HID_USAGE_PAGE		0xffff0000
	 */
	
	...
	case HID_UP_KEYBOARD:
		set_bit(EV_REP, input->evbit);

		if ((usage->hid & HID_USAGE) < 256) {
			if (!hid_keyboard[usage->hid & HID_USAGE]) goto ignore;
			map_key_clear(hid_keyboard[usage->hid & HID_USAGE]);
		} else
			map_key(KEY_UNKNOWN);

		break;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

其中usage->hid & HID_USAGE->0x000700a0&0x0000ffff->0xa0,蓝牙遥控器linux的key,value的修改如下所示,其中unk为0xf0:
在这里插入图片描述

kernel/msm-4.14/include/uapi/linux/
添加新增的键值

#define KEY_CLOSE_SCREEN 250 
#define KEY_OPEN_SCREEN 251
  • 1
  • 2

当按照上面配置后,可以通过getevent获取到添加的值了。上面提到过的驱动定义好的值0xfa等于KEY_CLOSE_SCREEN定义好的值,转化一下就行了。

文件

修改对应的kl文件,通过dumpsys input查看
在这里插入图片描述
framework/base/data/keyboards/
添加如下信息

key 250 CLOSE_SCREEN
key 251 OPEN_SCREEN
  • 1
  • 2

添加完kl文件后需要添加kl文件需要的常量
frameworks/native/include/android/

AKEYCODE_CLOSE_SCREEN = 289,
AKEYCODE_OPEN_SCREEN = 290
  • 1
  • 2

按照AKEYCODE_XXX的格式定义,定义值是给上层使用的。
frameworks/native/include/input/

DEFINE_KEYCODE(CLOSE_SCREEN),
DEFINE_KEYCODE(OPEN_SCREEN),
  • 1
  • 2

frameworks/base/core/java/android/view/
新建常量keycode定义,并同步修改LAST_KEYCODE的值

public static final int KEYCODE_CLOSE_SCREEN = 289;
public static final int KEYCODE_OPEN_SCREEN = 290;
 @TestApi
public static final int LAST_KEYCODE = KEYCODE_OPEN_SCREEN;
  • 1
  • 2
  • 3
  • 4

由于此处修改了framework层的api,需要在编译的时候执行下以下命令
命令1:make api-stubs-docs-update-current-api
frameworks/base/api/ 变化如下所示

在这里插入图片描述

命令2:make test-api-stubs-docs-update-current-api
frameworks/base/api/变化如下所示
在这里插入图片描述
如果不执行这两个命令,整编时报错也是会有相关的错误提示。

比如:
在这里插入图片描述

添加新增的key,value到attrs中
frameworks/base/core/res/res/values/

<enum name="KEYCODE_CLOSE_SCREEN" value="289" />
<enum name="KEYCODE_OPEN_SCREEN" value="290" />
  • 1
  • 2

一般在这个类里面处理获取到的键值进行处理就好了
frameworks/base/services/core/java/com/android/server/policy/

总结

蓝牙遥控器的键值其是就是在kernel层定义定义,然后映射到Android层,这样上层就可以使用了。