summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/dkms_source_tree/hid-egalax.c32
1 files changed, 18 insertions, 14 deletions
diff --git a/usr/src/dkms_source_tree/hid-egalax.c b/usr/src/dkms_source_tree/hid-egalax.c
index 94ff0f7..17b00df 100644
--- a/usr/src/dkms_source_tree/hid-egalax.c
+++ b/usr/src/dkms_source_tree/hid-egalax.c
@@ -42,7 +42,7 @@ struct egalax_contact {
42 42
43struct egalax_data { 43struct egalax_data {
44 struct egalax_contact contact[MAX_SLOTS]; 44 struct egalax_contact contact[MAX_SLOTS];
45 int valid; 45 int down, valid;
46 int x, y, z; 46 int x, y, z;
47 int slot, prev_slot; 47 int slot, prev_slot;
48 int mask; 48 int mask;
@@ -135,13 +135,13 @@ static int egalax_input_mapped(struct hid_device *hdev, struct hid_input *hi,
135 return -1; 135 return -1;
136} 136}
137 137
138static void report_frame(struct egalax_data *td, struct input_dev *input) 138static void report_contact(struct egalax_data *td, struct input_dev *input)
139{ 139{
140 struct egalax_contact *f = &td->contact[td->slot]; 140 struct egalax_contact *f = &td->contact[td->slot];
141 struct egalax_contact *oldest = 0; 141 struct egalax_contact *oldest = 0;
142 int i; 142 int i;
143 143
144 if (!td->valid) 144 if (!td->down)
145 f->id = -1; 145 f->id = -1;
146 else if (f->id < 0) 146 else if (f->id < 0)
147 f->id = td->trkid++ & MAX_TRKID; 147 f->id = td->trkid++ & MAX_TRKID;
@@ -149,7 +149,6 @@ static void report_frame(struct egalax_data *td, struct input_dev *input)
149 f->y = td->y; 149 f->y = td->y;
150 f->z = td->z; 150 f->z = td->z;
151 151
152 td->mask = 0;
153 if (td->prev_slot != td->slot) { 152 if (td->prev_slot != td->slot) {
154 td->prev_slot = td->slot; 153 td->prev_slot = td->slot;
155 if (td->reported) { 154 if (td->reported) {
@@ -203,31 +202,33 @@ static int egalax_event(struct hid_device *hid, struct hid_field *field,
203 //return 1; 202 //return 1;
204 203
205 switch (usage->hid) { 204 switch (usage->hid) {
206 case HID_DG_INRANGE:
207 case HID_DG_CONFIDENCE: 205 case HID_DG_CONFIDENCE:
208 case HID_DG_CONTACTCOUNT: 206 case HID_DG_CONTACTCOUNT:
209 break; 207 break;
210 208
211 case HID_DG_TIPSWITCH: 209 case HID_DG_TIPSWITCH:
212 td->valid = value; 210 td->down = value;
213 td->mask |= 0x01; 211 td->mask |= 0x01;
214 break; 212 break;
215 213 case HID_DG_INRANGE:
214 td->valid = value;
215 td->mask |= 0x02;
216 break;
216 case HID_DG_CONTACTID: 217 case HID_DG_CONTACTID:
217 td->slot = clamp_val(value, 0, MAX_SLOTS - 1); 218 td->slot = clamp_val(value, 0, MAX_SLOTS - 1);
218 td->mask |= 0x02; 219 td->mask |= 0x04;
219 break; 220 break;
220 case HID_GD_X: 221 case HID_GD_X:
221 td->x = value; 222 td->x = value;
222 td->mask |= 0x04; 223 td->mask |= 0x08;
223 break; 224 break;
224 case HID_GD_Y: 225 case HID_GD_Y:
225 td->y = value; 226 td->y = value;
226 td->mask |= 0x08; 227 td->mask |= 0x10;
227 break; 228 break;
228 case HID_DG_TIPPRESSURE: 229 case HID_DG_TIPPRESSURE:
229 td->z = value; 230 td->z = value;
230 td->mask |= 0x10; 231 td->mask |= 0x20;
231 break; 232 break;
232 233
233 default: 234 default:
@@ -235,8 +236,11 @@ static int egalax_event(struct hid_device *hid, struct hid_field *field,
235 return 0; 236 return 0;
236 } 237 }
237 238
238 if (td->mask == 0x1f) 239 if (td->mask == 0x3f) {
239 report_frame(td, input); 240 td->mask = 0;
241 if (td->valid)
242 report_contact(td, input);
243 }
240 } 244 }
241 245
242 /* we have handled the hidinput part, now remains hiddev */ 246 /* we have handled the hidinput part, now remains hiddev */