文章目录
- 简述
- 连接蓝牙
- 代码流程
- 总结
简述
使用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层,这样上层就可以使用了。