diff options
| -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: |
