This source file includes following definitions.
- is_not_elan_touchpad
- elan_input_mapping
- elan_get_device_param
- elan_convert_res
- elan_get_device_params
- elan_input_configured
- elan_report_mt_slot
- elan_usb_report_input
- elan_i2c_report_input
- elan_raw_event
- elan_start_multitouch
- elan_mute_led_get_brigtness
- elan_mute_led_set_brigtness
- elan_init_mute_led
- elan_probe
- elan_remove
1
2
3
4
5
6
7
8
9
10 #include <linux/hid.h>
11 #include <linux/input/mt.h>
12 #include <linux/leds.h>
13 #include <linux/module.h>
14 #include <linux/usb.h>
15
16 #include "hid-ids.h"
17
18 #define ELAN_MT_I2C 0x5d
19 #define ELAN_SINGLE_FINGER 0x81
20 #define ELAN_MT_FIRST_FINGER 0x82
21 #define ELAN_MT_SECOND_FINGER 0x83
22 #define ELAN_INPUT_REPORT_SIZE 8
23 #define ELAN_I2C_REPORT_SIZE 32
24 #define ELAN_FINGER_DATA_LEN 5
25 #define ELAN_MAX_FINGERS 5
26 #define ELAN_MAX_PRESSURE 255
27 #define ELAN_TP_USB_INTF 1
28
29 #define ELAN_FEATURE_REPORT 0x0d
30 #define ELAN_FEATURE_SIZE 5
31 #define ELAN_PARAM_MAX_X 6
32 #define ELAN_PARAM_MAX_Y 7
33 #define ELAN_PARAM_RES 8
34
35 #define ELAN_MUTE_LED_REPORT 0xBC
36 #define ELAN_LED_REPORT_SIZE 8
37
38 #define ELAN_HAS_LED BIT(0)
39
40 struct elan_drvdata {
41 struct input_dev *input;
42 u8 prev_report[ELAN_INPUT_REPORT_SIZE];
43 struct led_classdev mute_led;
44 u8 mute_led_state;
45 u16 max_x;
46 u16 max_y;
47 u16 res_x;
48 u16 res_y;
49 };
50
51 static int is_not_elan_touchpad(struct hid_device *hdev)
52 {
53 if (hdev->bus == BUS_USB) {
54 struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
55
56 return (intf->altsetting->desc.bInterfaceNumber !=
57 ELAN_TP_USB_INTF);
58 }
59
60 return 0;
61 }
62
63 static int elan_input_mapping(struct hid_device *hdev, struct hid_input *hi,
64 struct hid_field *field, struct hid_usage *usage,
65 unsigned long **bit, int *max)
66 {
67 if (is_not_elan_touchpad(hdev))
68 return 0;
69
70 if (field->report->id == ELAN_SINGLE_FINGER ||
71 field->report->id == ELAN_MT_FIRST_FINGER ||
72 field->report->id == ELAN_MT_SECOND_FINGER ||
73 field->report->id == ELAN_MT_I2C)
74 return -1;
75
76 return 0;
77 }
78
79 static int elan_get_device_param(struct hid_device *hdev,
80 unsigned char *dmabuf, unsigned char param)
81 {
82 int ret;
83
84 dmabuf[0] = ELAN_FEATURE_REPORT;
85 dmabuf[1] = 0x05;
86 dmabuf[2] = 0x03;
87 dmabuf[3] = param;
88 dmabuf[4] = 0x01;
89
90 ret = hid_hw_raw_request(hdev, ELAN_FEATURE_REPORT, dmabuf,
91 ELAN_FEATURE_SIZE, HID_FEATURE_REPORT,
92 HID_REQ_SET_REPORT);
93 if (ret != ELAN_FEATURE_SIZE) {
94 hid_err(hdev, "Set report error for parm %d: %d\n", param, ret);
95 return ret;
96 }
97
98 ret = hid_hw_raw_request(hdev, ELAN_FEATURE_REPORT, dmabuf,
99 ELAN_FEATURE_SIZE, HID_FEATURE_REPORT,
100 HID_REQ_GET_REPORT);
101 if (ret != ELAN_FEATURE_SIZE) {
102 hid_err(hdev, "Get report error for parm %d: %d\n", param, ret);
103 return ret;
104 }
105
106 return 0;
107 }
108
109 static unsigned int elan_convert_res(char val)
110 {
111
112
113
114
115 return (val * 10 + 790) * 10 / 254;
116 }
117
118 static int elan_get_device_params(struct hid_device *hdev)
119 {
120 struct elan_drvdata *drvdata = hid_get_drvdata(hdev);
121 unsigned char *dmabuf;
122 int ret;
123
124 dmabuf = kmalloc(ELAN_FEATURE_SIZE, GFP_KERNEL);
125 if (!dmabuf)
126 return -ENOMEM;
127
128 ret = elan_get_device_param(hdev, dmabuf, ELAN_PARAM_MAX_X);
129 if (ret)
130 goto err;
131
132 drvdata->max_x = (dmabuf[4] << 8) | dmabuf[3];
133
134 ret = elan_get_device_param(hdev, dmabuf, ELAN_PARAM_MAX_Y);
135 if (ret)
136 goto err;
137
138 drvdata->max_y = (dmabuf[4] << 8) | dmabuf[3];
139
140 ret = elan_get_device_param(hdev, dmabuf, ELAN_PARAM_RES);
141 if (ret)
142 goto err;
143
144 drvdata->res_x = elan_convert_res(dmabuf[3]);
145 drvdata->res_y = elan_convert_res(dmabuf[4]);
146
147 err:
148 kfree(dmabuf);
149 return ret;
150 }
151
152 static int elan_input_configured(struct hid_device *hdev, struct hid_input *hi)
153 {
154 int ret;
155 struct input_dev *input;
156 struct elan_drvdata *drvdata = hid_get_drvdata(hdev);
157
158 if (is_not_elan_touchpad(hdev))
159 return 0;
160
161 ret = elan_get_device_params(hdev);
162 if (ret)
163 return ret;
164
165 input = devm_input_allocate_device(&hdev->dev);
166 if (!input)
167 return -ENOMEM;
168
169 input->name = "Elan Touchpad";
170 input->phys = hdev->phys;
171 input->uniq = hdev->uniq;
172 input->id.bustype = hdev->bus;
173 input->id.vendor = hdev->vendor;
174 input->id.product = hdev->product;
175 input->id.version = hdev->version;
176 input->dev.parent = &hdev->dev;
177
178 input_set_abs_params(input, ABS_MT_POSITION_X, 0, drvdata->max_x,
179 0, 0);
180 input_set_abs_params(input, ABS_MT_POSITION_Y, 0, drvdata->max_y,
181 0, 0);
182 input_set_abs_params(input, ABS_MT_PRESSURE, 0, ELAN_MAX_PRESSURE,
183 0, 0);
184
185 __set_bit(BTN_LEFT, input->keybit);
186 __set_bit(INPUT_PROP_BUTTONPAD, input->propbit);
187
188 ret = input_mt_init_slots(input, ELAN_MAX_FINGERS, INPUT_MT_POINTER);
189 if (ret) {
190 hid_err(hdev, "Failed to init elan MT slots: %d\n", ret);
191 return ret;
192 }
193
194 input_abs_set_res(input, ABS_X, drvdata->res_x);
195 input_abs_set_res(input, ABS_Y, drvdata->res_y);
196
197 ret = input_register_device(input);
198 if (ret) {
199 hid_err(hdev, "Failed to register elan input device: %d\n",
200 ret);
201 input_free_device(input);
202 return ret;
203 }
204
205 drvdata->input = input;
206
207 return 0;
208 }
209
210 static void elan_report_mt_slot(struct elan_drvdata *drvdata, u8 *data,
211 unsigned int slot_num)
212 {
213 struct input_dev *input = drvdata->input;
214 int x, y, p;
215
216 bool active = !!data;
217
218 input_mt_slot(input, slot_num);
219 input_mt_report_slot_state(input, MT_TOOL_FINGER, active);
220 if (active) {
221 x = ((data[0] & 0xF0) << 4) | data[1];
222 y = drvdata->max_y -
223 (((data[0] & 0x07) << 8) | data[2]);
224 p = data[4];
225
226 input_report_abs(input, ABS_MT_POSITION_X, x);
227 input_report_abs(input, ABS_MT_POSITION_Y, y);
228 input_report_abs(input, ABS_MT_PRESSURE, p);
229 }
230 }
231
232 static void elan_usb_report_input(struct elan_drvdata *drvdata, u8 *data)
233 {
234 int i;
235 struct input_dev *input = drvdata->input;
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272 if (data[0] == ELAN_SINGLE_FINGER) {
273 for (i = 0; i < ELAN_MAX_FINGERS; i++) {
274 if (data[2] & BIT(i + 3))
275 elan_report_mt_slot(drvdata, data + 3, i);
276 else
277 elan_report_mt_slot(drvdata, NULL, i);
278 }
279 input_report_key(input, BTN_LEFT, data[2] & 0x01);
280 }
281
282
283
284
285
286
287 if (data[0] == ELAN_MT_FIRST_FINGER) {
288 memcpy(drvdata->prev_report, data,
289 sizeof(drvdata->prev_report));
290 return;
291 }
292
293 if (data[0] == ELAN_MT_SECOND_FINGER) {
294 int first = 0;
295 u8 *prev_report = drvdata->prev_report;
296
297 if (prev_report[0] != ELAN_MT_FIRST_FINGER)
298 return;
299
300 for (i = 0; i < ELAN_MAX_FINGERS; i++) {
301 if (prev_report[2] & BIT(i + 3)) {
302 if (!first) {
303 first = 1;
304 elan_report_mt_slot(drvdata, prev_report + 3, i);
305 } else {
306 elan_report_mt_slot(drvdata, data + 1, i);
307 }
308 } else {
309 elan_report_mt_slot(drvdata, NULL, i);
310 }
311 }
312 input_report_key(input, BTN_LEFT, prev_report[2] & 0x01);
313 }
314
315 input_mt_sync_frame(input);
316 input_sync(input);
317 }
318
319 static void elan_i2c_report_input(struct elan_drvdata *drvdata, u8 *data)
320 {
321 struct input_dev *input = drvdata->input;
322 u8 *finger_data;
323 int i;
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344 finger_data = data + 2;
345 for (i = 0; i < ELAN_MAX_FINGERS; i++) {
346 if (data[1] & BIT(i + 3)) {
347 elan_report_mt_slot(drvdata, finger_data, i);
348 finger_data += ELAN_FINGER_DATA_LEN;
349 } else {
350 elan_report_mt_slot(drvdata, NULL, i);
351 }
352 }
353
354 input_report_key(input, BTN_LEFT, data[1] & 0x01);
355 input_mt_sync_frame(input);
356 input_sync(input);
357 }
358
359 static int elan_raw_event(struct hid_device *hdev,
360 struct hid_report *report, u8 *data, int size)
361 {
362 struct elan_drvdata *drvdata = hid_get_drvdata(hdev);
363
364 if (is_not_elan_touchpad(hdev))
365 return 0;
366
367 if (data[0] == ELAN_SINGLE_FINGER ||
368 data[0] == ELAN_MT_FIRST_FINGER ||
369 data[0] == ELAN_MT_SECOND_FINGER) {
370 if (size == ELAN_INPUT_REPORT_SIZE) {
371 elan_usb_report_input(drvdata, data);
372 return 1;
373 }
374 }
375
376 if (data[0] == ELAN_MT_I2C && size == ELAN_I2C_REPORT_SIZE) {
377 elan_i2c_report_input(drvdata, data);
378 return 1;
379 }
380
381 return 0;
382 }
383
384 static int elan_start_multitouch(struct hid_device *hdev)
385 {
386 int ret;
387
388
389
390
391
392 static const unsigned char buf[] = { 0x0D, 0x00, 0x03, 0x21, 0x00 };
393 unsigned char *dmabuf = kmemdup(buf, sizeof(buf), GFP_KERNEL);
394
395 if (!dmabuf)
396 return -ENOMEM;
397
398 ret = hid_hw_raw_request(hdev, dmabuf[0], dmabuf, sizeof(buf),
399 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
400
401 kfree(dmabuf);
402
403 if (ret != sizeof(buf)) {
404 hid_err(hdev, "Failed to start multitouch: %d\n", ret);
405 return ret;
406 }
407
408 return 0;
409 }
410
411 static enum led_brightness elan_mute_led_get_brigtness(struct led_classdev *led_cdev)
412 {
413 struct device *dev = led_cdev->dev->parent;
414 struct hid_device *hdev = to_hid_device(dev);
415 struct elan_drvdata *drvdata = hid_get_drvdata(hdev);
416
417 return drvdata->mute_led_state;
418 }
419
420 static int elan_mute_led_set_brigtness(struct led_classdev *led_cdev,
421 enum led_brightness value)
422 {
423 int ret;
424 u8 led_state;
425 struct device *dev = led_cdev->dev->parent;
426 struct hid_device *hdev = to_hid_device(dev);
427 struct elan_drvdata *drvdata = hid_get_drvdata(hdev);
428
429 unsigned char *dmabuf = kzalloc(ELAN_LED_REPORT_SIZE, GFP_KERNEL);
430
431 if (!dmabuf)
432 return -ENOMEM;
433
434 led_state = !!value;
435
436 dmabuf[0] = ELAN_MUTE_LED_REPORT;
437 dmabuf[1] = 0x02;
438 dmabuf[2] = led_state;
439
440 ret = hid_hw_raw_request(hdev, dmabuf[0], dmabuf, ELAN_LED_REPORT_SIZE,
441 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
442
443 kfree(dmabuf);
444
445 if (ret != ELAN_LED_REPORT_SIZE) {
446 hid_err(hdev, "Failed to set mute led brightness: %d\n", ret);
447 return ret;
448 }
449
450 drvdata->mute_led_state = led_state;
451 return 0;
452 }
453
454 static int elan_init_mute_led(struct hid_device *hdev)
455 {
456 struct elan_drvdata *drvdata = hid_get_drvdata(hdev);
457 struct led_classdev *mute_led = &drvdata->mute_led;
458
459 mute_led->name = "elan:red:mute";
460 mute_led->brightness_get = elan_mute_led_get_brigtness;
461 mute_led->brightness_set_blocking = elan_mute_led_set_brigtness;
462 mute_led->max_brightness = LED_ON;
463 mute_led->dev = &hdev->dev;
464
465 return devm_led_classdev_register(&hdev->dev, mute_led);
466 }
467
468 static int elan_probe(struct hid_device *hdev, const struct hid_device_id *id)
469 {
470 int ret;
471 struct elan_drvdata *drvdata;
472
473 drvdata = devm_kzalloc(&hdev->dev, sizeof(*drvdata), GFP_KERNEL);
474
475 if (!drvdata)
476 return -ENOMEM;
477
478 hid_set_drvdata(hdev, drvdata);
479
480 ret = hid_parse(hdev);
481 if (ret) {
482 hid_err(hdev, "Hid Parse failed\n");
483 return ret;
484 }
485
486 ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
487 if (ret) {
488 hid_err(hdev, "Hid hw start failed\n");
489 return ret;
490 }
491
492 if (is_not_elan_touchpad(hdev))
493 return 0;
494
495 if (!drvdata->input) {
496 hid_err(hdev, "Input device is not registered\n");
497 ret = -ENAVAIL;
498 goto err;
499 }
500
501 ret = elan_start_multitouch(hdev);
502 if (ret)
503 goto err;
504
505 if (id->driver_data & ELAN_HAS_LED) {
506 ret = elan_init_mute_led(hdev);
507 if (ret)
508 goto err;
509 }
510
511 return 0;
512 err:
513 hid_hw_stop(hdev);
514 return ret;
515 }
516
517 static void elan_remove(struct hid_device *hdev)
518 {
519 hid_hw_stop(hdev);
520 }
521
522 static const struct hid_device_id elan_devices[] = {
523 { HID_USB_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_HP_X2),
524 .driver_data = ELAN_HAS_LED },
525 { HID_USB_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_HP_X2_10_COVER),
526 .driver_data = ELAN_HAS_LED },
527 { HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_TOSHIBA_CLICK_L9W) },
528 { }
529 };
530 MODULE_DEVICE_TABLE(hid, elan_devices);
531
532 static struct hid_driver elan_driver = {
533 .name = "elan",
534 .id_table = elan_devices,
535 .input_mapping = elan_input_mapping,
536 .input_configured = elan_input_configured,
537 .raw_event = elan_raw_event,
538 .probe = elan_probe,
539 .remove = elan_remove,
540 };
541
542 module_hid_driver(elan_driver);
543
544 MODULE_LICENSE("GPL");
545 MODULE_AUTHOR("Alexandrov Stanislav");
546 MODULE_DESCRIPTION("Driver for HID ELAN Touchpads");