diff options
Diffstat (limited to 'drivers/hid/hid-ntrig.c')
-rw-r--r-- | drivers/hid/hid-ntrig.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/drivers/hid/hid-ntrig.c b/drivers/hid/hid-ntrig.c index 58ba0d3d8aa5..10b08d6ab37c 100644 --- a/drivers/hid/hid-ntrig.c +++ b/drivers/hid/hid-ntrig.c | |||
@@ -31,10 +31,12 @@ struct ntrig_data { | |||
31 | /* Incoming raw values for a single contact */ | 31 | /* Incoming raw values for a single contact */ |
32 | __u16 x, y, w, h; | 32 | __u16 x, y, w, h; |
33 | __u16 id; | 33 | __u16 id; |
34 | __u8 confidence; | 34 | |
35 | bool tipswitch; | ||
36 | bool confidence; | ||
37 | bool first_contact_touch; | ||
35 | 38 | ||
36 | bool reading_mt; | 39 | bool reading_mt; |
37 | __u8 first_contact_confidence; | ||
38 | 40 | ||
39 | __u8 mt_footer[4]; | 41 | __u8 mt_footer[4]; |
40 | __u8 mt_foot_count; | 42 | __u8 mt_foot_count; |
@@ -141,9 +143,10 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, | |||
141 | case 0xff000001: | 143 | case 0xff000001: |
142 | /* Tag indicating the start of a multitouch group */ | 144 | /* Tag indicating the start of a multitouch group */ |
143 | nd->reading_mt = 1; | 145 | nd->reading_mt = 1; |
144 | nd->first_contact_confidence = 0; | 146 | nd->first_contact_touch = 0; |
145 | break; | 147 | break; |
146 | case HID_DG_TIPSWITCH: | 148 | case HID_DG_TIPSWITCH: |
149 | nd->tipswitch = value; | ||
147 | /* Prevent emission of touch until validated */ | 150 | /* Prevent emission of touch until validated */ |
148 | return 1; | 151 | return 1; |
149 | case HID_DG_CONFIDENCE: | 152 | case HID_DG_CONFIDENCE: |
@@ -171,10 +174,14 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, | |||
171 | * to emit a normal (X, Y) position | 174 | * to emit a normal (X, Y) position |
172 | */ | 175 | */ |
173 | if (!nd->reading_mt) { | 176 | if (!nd->reading_mt) { |
174 | input_report_key(input, BTN_TOOL_DOUBLETAP, | 177 | /* |
175 | (nd->confidence != 0)); | 178 | * TipSwitch indicates the presence of a |
179 | * finger in single touch mode. | ||
180 | */ | ||
176 | input_report_key(input, BTN_TOUCH, | 181 | input_report_key(input, BTN_TOUCH, |
177 | (nd->confidence != 0)); | 182 | nd->tipswitch); |
183 | input_report_key(input, BTN_TOOL_DOUBLETAP, | ||
184 | nd->tipswitch); | ||
178 | input_event(input, EV_ABS, ABS_X, nd->x); | 185 | input_event(input, EV_ABS, ABS_X, nd->x); |
179 | input_event(input, EV_ABS, ABS_Y, nd->y); | 186 | input_event(input, EV_ABS, ABS_Y, nd->y); |
180 | } | 187 | } |
@@ -213,7 +220,13 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, | |||
213 | 220 | ||
214 | /* emit a normal (X, Y) for the first point only */ | 221 | /* emit a normal (X, Y) for the first point only */ |
215 | if (nd->id == 0) { | 222 | if (nd->id == 0) { |
216 | nd->first_contact_confidence = nd->confidence; | 223 | /* |
224 | * TipSwitch is superfluous in multitouch | ||
225 | * mode. The footer events tell us | ||
226 | * if there is a finger on the screen or | ||
227 | * not. | ||
228 | */ | ||
229 | nd->first_contact_touch = nd->confidence; | ||
217 | input_event(input, EV_ABS, ABS_X, nd->x); | 230 | input_event(input, EV_ABS, ABS_X, nd->x); |
218 | input_event(input, EV_ABS, ABS_Y, nd->y); | 231 | input_event(input, EV_ABS, ABS_Y, nd->y); |
219 | } | 232 | } |
@@ -243,7 +256,7 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, | |||
243 | 256 | ||
244 | nd->reading_mt = 0; | 257 | nd->reading_mt = 0; |
245 | 258 | ||
246 | if (nd->first_contact_confidence) { | 259 | if (nd->first_contact_touch) { |
247 | switch (value) { | 260 | switch (value) { |
248 | case 0: /* for single touch devices */ | 261 | case 0: /* for single touch devices */ |
249 | case 1: | 262 | case 1: |