Linux29内核输入子系统多点上报机制实现(2)

Index: drivers/input/input.c    ===================================================================    --- drivers/input/input.c       (revision 1550)    +++ drivers/input/input.c       (working copy)    @@ -29,6 +29,25 @@          #define INPUT_DEVICES  256         +/*   + * EV_ABS events which should not be cached are listed here.   + */   +static unsigned int input_abs_bypass_init_data[] __initdata = {    +       ABS_MT_TOUCH_MAJOR,    +       ABS_MT_TOUCH_MINOR,    +       ABS_MT_WIDTH_MAJOR,    +       ABS_MT_WIDTH_MINOR,    +       ABS_MT_ORIENTATION,    +       ABS_MT_POSITION_X,    +       ABS_MT_POSITION_Y,    +       ABS_MT_TOOL_TYPE,    +       ABS_MT_BLOB_ID,    +       ABS_MT_TRACKING_ID,    +       0    +};    +static unsigned long input_abs_bypass[BITS_TO_LONGS(ABS_CNT)];    +    +     static LIST_HEAD(input_dev_list);     static LIST_HEAD(input_handler_list);         @@ -149,13 +168,17 @@                    case SYN_CONFIG:                            disposition = INPUT_PASS_TO_ALL;                            break;    -    +                    case SYN_REPORT:                            if (!dev->sync) {                                    dev->sync = 1;                                    disposition = INPUT_PASS_TO_HANDLERS;                            }                            break;    +               case SYN_MT_REPORT:    +                       dev->sync = 0;    +                       disposition = INPUT_PASS_TO_HANDLERS;    +                       break;                    }                    break;         @@ -185,6 +208,11 @@            case EV_ABS:                    if (is_event_supported(code, dev->absbit, ABS_MAX)) {         +                       if (test_bit(code, input_abs_bypass)) {    +                               disposition = INPUT_PASS_TO_HANDLERS;    +                               break;    +                       }    +                            value = input_defuzz_abs_event(value,                                            dev->abs[code], dev->absfuzz[code]);         @@ -1630,10 +1658,20 @@            .open = input_open_file,     };         +static void __init input_init_abs_bypass(void)    +{    +       const unsigned int *p;    +    +       for (p = input_abs_bypass_init_data; *p; p++)    +               input_abs_bypass[BIT_WORD(*p)] |= BIT_MASK(*p);    +}    +     static int __init input_init(void)     {            int err;         +       input_init_abs_bypass();    +            err = class_register(&input_class);            if (err) {                    printk(KERN_ERR "input: unable to register input_dev class\n");  

3、输入子系统的初始化

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwxszp.html