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 }