鼠标和按键在android 上的识别和区别

引子: 
 拿到一个蓝牙遥控器,连上后,按确认(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

红色的几个不存在,就不会有鼠标了。。

你可能感兴趣的:(linux,android)