1 static void input_handle_event(struct input_dev *dev,
  2                    unsigned int type, unsigned int code, int value)
  3 {
  4     
  5     int disposition = INPUT_IGNORE_EVENT;
  6     /*定义了一个 disposition 变量,该变量表示使用什么样的方式处理事件。
  7     此处初始化为 INPUT_IGNORE_EVENT,表示如果后面没有对该变量重新赋值,则忽略这个事件。*/
  8     switch (type) {
  9 
 10     case EV_SYN:
 11         switch (code) {
 12         case SYN_CONFIG:
 13             disposition = INPUT_PASS_TO_ALL;
 14             break;
 15 
 16         case SYN_REPORT:
 17             if (!dev->sync) {
 18                 dev->sync = 1;
 19                 disposition = INPUT_PASS_TO_HANDLERS;
 20             }
 21             break;
 22         case SYN_MT_REPORT:
 23             dev->sync = 0;
 24             disposition = INPUT_PASS_TO_HANDLERS;
 25             break;
 26         }
 27         break;
 28 
 29     case EV_KEY:
 30         if (is_event_supported(code, dev->keybit, KEY_MAX) &&
 31             !!test_bit(code, dev->key) != value) {//调用 is_event_supported()函数判断是否支持该按键
 32                 //调用 test_bit()函数来测试按键状态是否改变。
 33             if (value != 2) {
 34                 __change_bit(code, dev->key);/*调用__change_bit()函数改变键的状态。*/  
 35                 if (value)
 36                     input_start_autorepeat(dev, code);
 37                 else
 38                     input_stop_autorepeat(dev);
 39             }
 40 
 41             disposition = INPUT_PASS_TO_HANDLERS;
 42             /*将 disposition变量设置为 INPUT_PASS_TO_HANDLERS,表示事件需要 handler 来处理。*/
 43         }
 44         break;
 45 
 46     case EV_SW:
 47         if (is_event_supported(code, dev->swbit, SW_MAX) &&
 48             !!test_bit(code, dev->sw) != value) {
 49 
 50             __change_bit(code, dev->sw);
 51             disposition = INPUT_PASS_TO_HANDLERS;
 52         }
 53         break;
 54 
 55     case EV_ABS:
 56         if (is_event_supported(code, dev->absbit, ABS_MAX)) {
 57 
 58             if (test_bit(code, input_abs_bypass)) {
 59                 disposition = INPUT_PASS_TO_HANDLERS;
 60                 break;
 61             }
 62 
 63             value = input_defuzz_abs_event(value,
 64                     dev->abs[code], dev->absfuzz[code]);
 65 
 66             if (dev->abs[code] != value) {
 67                 dev->abs[code] = value;
 68                 disposition = INPUT_PASS_TO_HANDLERS;
 69             }
 70         }
 71         break;
 72 
 73     case EV_REL:
 74         if (is_event_supported(code, dev->relbit, REL_MAX) && value)
 75             disposition = INPUT_PASS_TO_HANDLERS;
 76 
 77         break;
 78 
 79     case EV_MSC:
 80         if (is_event_supported(code, dev->mscbit, MSC_MAX))
 81             disposition = INPUT_PASS_TO_ALL;
 82 
 83         break;
 84 
 85     case EV_LED:
 86         if (is_event_supported(code, dev->ledbit, LED_MAX) &&
 87             !!test_bit(code, dev->led) != value) {
 88 
 89             __change_bit(code, dev->led);
 90             disposition = INPUT_PASS_TO_ALL;
 91         }
 92         break;
 93 
 94     case EV_SND:
 95         if (is_event_supported(code, dev->sndbit, SND_MAX)) {
 96 
 97             if (!!test_bit(code, dev->snd) != !!value)
 98                 __change_bit(code, dev->snd);
 99             disposition = INPUT_PASS_TO_ALL;
100         }
101         break;
102 
103     case EV_REP:
104         if (code <= REP_MAX && value >= 0 && dev->rep[code] != value) {
105             dev->rep[code] = value;
106             disposition = INPUT_PASS_TO_ALL;
107         }
108         break;
109 
110     case EV_FF:
111         if (value >= 0)
112             disposition = INPUT_PASS_TO_ALL;
113         break;
114 
115     case EV_PWR:
116         disposition = INPUT_PASS_TO_ALL;
117         break;
118     }
119 
120     if (disposition != INPUT_IGNORE_EVENT && type != EV_SYN)/*处理 EV_SYN 事件,这里并不对其进行关心。*/  
121         dev->sync = 0;
122 
123     /*首先判断 disposition 等于 INPUT_PASS_TO_DEVICE,然后判断 dev->event 是否对其指定了一个处理函数,
124     如果这些条件都满足,则调用自定义的 dev->event()函数处理事件。有些事件是发送给设备,
125     而不是发送给 handler 处理的。event()函数用来向输入子系统报告一个将要发送给设备的事件,
126     例如让 LED 灯点亮事件、蜂鸣器鸣叫事件等。当事件报告给输入子系统后,就要求设备处理这个事件。*/    
127     if ((disposition & INPUT_PASS_TO_DEVICE) && dev->event)
128         dev->event(dev, type, code, value);
129 
130     if (disposition & INPUT_PASS_TO_HANDLERS)  //如果事件需要 handler 处理,则调用 input_pass_event()函数 
131         input_pass_event(dev, type, code, value);
132 }