引子:
拿到一个蓝牙遥控器,连上后,按确认(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
红色的几个不存在,就不会有鼠标了。。