鼠标和按键在android 上的识别和区别
2017-04-19 10:44
1781 查看
引子:
拿到一个蓝牙遥控器,连上后,按确认(OK)键的时候显示鼠标。导致遥控器不能正常使用。
测试过程:
1 换此蓝牙遥控器在其他产品上,并没出现鼠标。(由此richard 帮忙找到rk 代码加的东西,导致鼠标弹出)
2 借另外的蓝牙遥控器,在我们现有的遥控器上,也没出现鼠标。
3. 确认 OK 键的按键值(28, 232).分析徐工指出的 rk 的代码,发现在 28 和 232 键值的时候,应该都会弹出鼠标。然而,在其他遥控器上也出现了 232 键值后,并未弹出鼠标。
4. 尝试修改自己的红外遥控器的驱动。把上报的键值改为 28 232 也没有出现鼠标。
5. getevent 命令的时候看不到任何不一样的地方。
分析:
应该是注册了成了鼠标。某个按键值触发后就改变为鼠标。
再分析 frameworks/native/services/inputflinger/EventHub.cpp 和 frameworks/native/services/inputflinger/InputReader.cpp
发现
ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(device->keyBitmask)), device->keyBitmask);
ioctl(fd, EVIOCGBIT(EV_REL, sizeof(device->relBitmask)), device->relBitmask);
后
1174 // See if this is a cursor device such as a trackball or mouse.
1175 if (test_bit(BTN_MOUSE, device->keyBitmask)
1176 && test_bit(REL_X, device->relBitmask)
1177 && test_bit(REL_Y, device->relBitmask)) {
1178 device->classes |= INPUT_DEVICE_CLASS_CURSOR;
1179 ALOGV("device->keyBitmask have INPUT_DEVICE_CLASS_CURSOR");
1180 }else
1181 ALOGV("device->keyBitmask not have INPUT_DEVICE_CLASS_CURSOR");
也就是是否显示鼠标,是由 relbitmask 的 EV_KEY EV_REL
以及 和 keybitmask 的 BTN_MOUSE确定的。
修改测试,把红外遥控也改到能显示出鼠标:
16 --- a/kernel/drivers/input/evdev.c
17 +++ b/kernel/drivers/input/evdev.c
18 @@ -568,12 +568,11 @@ static int handle_eviocgbit(struct input_dev *dev,
19 static unsigned long keymax_warn_time;
20 unsigned long *bits;
21 int len;
22 -
23 switch (type) {
24
25 case 0: bits = dev->evbit; len = EV_MAX; break;
26 - case EV_KEY: bits = dev->keybit; len = KEY_MAX; break;
27 - case EV_REL: bits = dev->relbit; len = REL_MAX; break;
28 + case EV_KEY: bits = dev->keybit; len = KEY_MAX; printk("%s EV_KEY %d\n", dev->name, test_bit(BTN_MOUSE,
bits)); break;
29 + case EV_REL: bits = dev->relbit; len = REL_MAX; printk("%s REL_X %d, REL_Y %d\n", dev->name, test_bit(REL_X,
bits), test_bit(REL_Y, bits)); break;
43 --- a/kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c
44 +++ b/kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c
90 ret = input_register_device(input);
91 if (ret)
92 pr_err("remotectl: register input device err, ret: %d\n", ret);
93 input_set_capability(input, EV_KEY, KEY_WAKEUP);
94 + input_set_capability(input, EV_MSC, 0x4);
95 + input_set_capability(input, EV_REL, 0x2);
96 + input_set_capability(input, EV_REL, REL_X);
97 + input_set_capability(input, EV_REL, REL_Y);
98 device_init_wakeup(&pdev->dev, 1);
3 --- a/kernel/arch/arm/boot/dts/rk3288-box.dts
4 +++ b/kernel/arch/arm/boot/dts/rk3288-box.dts
5 @@ -1003,7 +1003,7 @@
6 ir_key1{
7 rockchip,usercode = <0xf708>;
8 rockchip,key_table =
9 - <0xfd KEY_REPLY>,
10 + <0xfd 0x0110>,
11 <0xe5 KEY_BACK>,
12 <0xbc KEY_UP>,
13 <0xf5 KEY_DOWN>,
经测试,当键值是 rk 加的 (28 232) 以及本身的 BTN_LEFT(0x0110) BTN_MIDDLE(0x112) 等都会出现鼠标和实现鼠标的功能。(AMOTION_EVENT_BUTTON_PRIMARY
,AMOTION_EVENT_BUTTON_BACK)
结论:
目前这个蓝牙鼠标可以方法有两个
1. 直接修改 rk 代码,把加的 28 232 等键值去掉。但是,如果我们要求其改的其他按键和现有的(BTN_LEFT等)冲突了,就又会出现鼠标了。
2 要求遥控器厂家把鼠标功能去掉。但是对 usb 的,我不知道怎么改,我有驱动的代码是类似: input_set_capability(input, EV_REL, REL_Y); 去掉 EV_REL
bit 的 REL_Y(0000) 和 REL_X(0001) ,同时去掉 input_set_capability(input, EV_KEY, BTN_MOUSE);
BTN_MOUSE(0x0110)
可以用 getevent 看
add device 5: /dev/input/event0
name: "ff680000.pwm"
events:
KEY (0001): 0000 0001 0002 0003 0004 0005 0006 0007
0008 0009 000a 000b 000e 001c 0066 0067
0069 006a 006c 006f 0071 0072 0073 0074
008b 008f 009e 00b7 00b8 00b9 00ba 00d9
00e8 0110 0184 0191 0192
REL (0002): 0000 0001 0002
MSC (0004): 0004
红色的几个不存在,就不会有鼠标了。。
拿到一个蓝牙遥控器,连上后,按确认(OK)键的时候显示鼠标。导致遥控器不能正常使用。
测试过程:
1 换此蓝牙遥控器在其他产品上,并没出现鼠标。(由此richard 帮忙找到rk 代码加的东西,导致鼠标弹出)
2 借另外的蓝牙遥控器,在我们现有的遥控器上,也没出现鼠标。
3. 确认 OK 键的按键值(28, 232).分析徐工指出的 rk 的代码,发现在 28 和 232 键值的时候,应该都会弹出鼠标。然而,在其他遥控器上也出现了 232 键值后,并未弹出鼠标。
4. 尝试修改自己的红外遥控器的驱动。把上报的键值改为 28 232 也没有出现鼠标。
5. getevent 命令的时候看不到任何不一样的地方。
分析:
应该是注册了成了鼠标。某个按键值触发后就改变为鼠标。
再分析 frameworks/native/services/inputflinger/EventHub.cpp 和 frameworks/native/services/inputflinger/InputReader.cpp
发现
ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(device->keyBitmask)), device->keyBitmask);
ioctl(fd, EVIOCGBIT(EV_REL, sizeof(device->relBitmask)), device->relBitmask);
后
1174 // See if this is a cursor device such as a trackball or mouse.
1175 if (test_bit(BTN_MOUSE, device->keyBitmask)
1176 && test_bit(REL_X, device->relBitmask)
1177 && test_bit(REL_Y, device->relBitmask)) {
1178 device->classes |= INPUT_DEVICE_CLASS_CURSOR;
1179 ALOGV("device->keyBitmask have INPUT_DEVICE_CLASS_CURSOR");
1180 }else
1181 ALOGV("device->keyBitmask not have INPUT_DEVICE_CLASS_CURSOR");
也就是是否显示鼠标,是由 relbitmask 的 EV_KEY EV_REL
以及 和 keybitmask 的 BTN_MOUSE确定的。
修改测试,把红外遥控也改到能显示出鼠标:
16 --- a/kernel/drivers/input/evdev.c
17 +++ b/kernel/drivers/input/evdev.c
18 @@ -568,12 +568,11 @@ static int handle_eviocgbit(struct input_dev *dev,
19 static unsigned long keymax_warn_time;
20 unsigned long *bits;
21 int len;
22 -
23 switch (type) {
24
25 case 0: bits = dev->evbit; len = EV_MAX; break;
26 - case EV_KEY: bits = dev->keybit; len = KEY_MAX; break;
27 - case EV_REL: bits = dev->relbit; len = REL_MAX; break;
28 + case EV_KEY: bits = dev->keybit; len = KEY_MAX; printk("%s EV_KEY %d\n", dev->name, test_bit(BTN_MOUSE,
bits)); break;
29 + case EV_REL: bits = dev->relbit; len = REL_MAX; printk("%s REL_X %d, REL_Y %d\n", dev->name, test_bit(REL_X,
bits), test_bit(REL_Y, bits)); break;
43 --- a/kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c
44 +++ b/kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c
90 ret = input_register_device(input);
91 if (ret)
92 pr_err("remotectl: register input device err, ret: %d\n", ret);
93 input_set_capability(input, EV_KEY, KEY_WAKEUP);
94 + input_set_capability(input, EV_MSC, 0x4);
95 + input_set_capability(input, EV_REL, 0x2);
96 + input_set_capability(input, EV_REL, REL_X);
97 + input_set_capability(input, EV_REL, REL_Y);
98 device_init_wakeup(&pdev->dev, 1);
3 --- a/kernel/arch/arm/boot/dts/rk3288-box.dts
4 +++ b/kernel/arch/arm/boot/dts/rk3288-box.dts
5 @@ -1003,7 +1003,7 @@
6 ir_key1{
7 rockchip,usercode = <0xf708>;
8 rockchip,key_table =
9 - <0xfd KEY_REPLY>,
10 + <0xfd 0x0110>,
11 <0xe5 KEY_BACK>,
12 <0xbc KEY_UP>,
13 <0xf5 KEY_DOWN>,
经测试,当键值是 rk 加的 (28 232) 以及本身的 BTN_LEFT(0x0110) BTN_MIDDLE(0x112) 等都会出现鼠标和实现鼠标的功能。(AMOTION_EVENT_BUTTON_PRIMARY
,AMOTION_EVENT_BUTTON_BACK)
结论:
目前这个蓝牙鼠标可以方法有两个
1. 直接修改 rk 代码,把加的 28 232 等键值去掉。但是,如果我们要求其改的其他按键和现有的(BTN_LEFT等)冲突了,就又会出现鼠标了。
2 要求遥控器厂家把鼠标功能去掉。但是对 usb 的,我不知道怎么改,我有驱动的代码是类似: input_set_capability(input, EV_REL, REL_Y); 去掉 EV_REL
bit 的 REL_Y(0000) 和 REL_X(0001) ,同时去掉 input_set_capability(input, EV_KEY, BTN_MOUSE);
BTN_MOUSE(0x0110)
可以用 getevent 看
add device 5: /dev/input/event0
name: "ff680000.pwm"
events:
KEY (0001): 0000 0001 0002 0003 0004 0005 0006 0007
0008 0009 000a 000b 000e 001c 0066 0067
0069 006a 006c 006f 0071 0072 0073 0074
008b 008f 009e 00b7 00b8 00b9 00ba 00d9
00e8 0110 0184 0191 0192
REL (0002): 0000 0001 0002
MSC (0004): 0004
红色的几个不存在,就不会有鼠标了。。
相关文章推荐
- Mstar虚拟按键触摸屏驱动(芯片msg2133,按键使用android虚拟按键实现,特定报点,识别为按键)
- android 模拟鼠标/按键事件
- Android: 用Instrumentation类发送鼠标或按键事件
- android 拦截鼠标按键
- android识别鼠标左键,右键操作
- Android 按键长按与短按识别
- Android 触屏事件处理_手势识别 鼠标事件
- android蓝牙耳机下的语音(输入/识别)及按键监听
- Android App: 按键识别
- android蓝牙耳机下的语音(输入/识别)及按键监听
- Android平台开发-Android keypad map-Android按键识别及映射过程
- Android 事件处理(含模拟鼠标/按键事件)
- android4.2 给鼠标右键跟笔记本键盘添加右键为menu按键
- Android系统:L版本怎样识别耳机按键长按or短按?
- Android与J2ME区别之我见(1)
- Asp.net 2.0 GridView的几个事件(如实现: 行的双击/单击/捕捉键盘按键/鼠标悬浮/移出效果)(示例代码下载)
- 转载:USB1.1与USB2.0接口区别及识别
- 鼠标手势识别 [Flash]
- Android与J2ME区别之我见(3)
- 无聊中,写一段程序..根据以前的改的,可以获取(不是拦截)鼠标键盘的按键(全局的)