35 #include <linux/input.h>
36 #include <linux/serio.h>
37 #include <linux/kernel.h>
38 #include <linux/module.h>
41 #include <linux/slab.h>
44 #define PREFIX "HIL: "
52 #define HIL_PACKET_MAX_LENGTH 16
54 #define HIL_KBD_SET1_UPBIT 0x01
55 #define HIL_KBD_SET1_SHIFT 1
59 #define HIL_KBD_SET2_UPBIT 0x01
60 #define HIL_KBD_SET2_SHIFT 1
63 #define HIL_KBD_SET3_UPBIT 0x80
64 #define HIL_KBD_SET3_SHIFT 0
71 struct input_dev *
dev;
92 static bool hil_dev_is_command_response(
hil_packet p)
103 static void hil_dev_handle_command_response(
struct hil_dev *
dev)
110 p = dev->
data[idx - 1];
139 for (i = 0; i <
idx; i++)
140 buf[i] = dev->
data[i] & HIL_PKT_DATA_MASK;
147 static void hil_dev_handle_kbd_events(
struct hil_dev *kbd)
149 struct input_dev *dev = kbd->
dev;
150 int idx = kbd->
idx4 / 4;
158 for (i = 1; i < idx - 1; i++)
159 input_report_key(dev, kbd->
data[i] & 0x7f, 1);
165 for (i = 1; i < idx - 1; i++)
166 input_report_key(dev, kbd->
data[i], 1);
170 for (i = 1; i < idx - 1; i++) {
174 key &= (~HIL_KBD_SET1_UPBIT & 0xff);
176 input_report_key(dev, key, !up);
181 for (i = 1; i < idx - 1; i++) {
187 input_report_key(dev, key, !up);
192 for (i = 1; i < idx - 1; i++) {
198 input_report_key(dev, key, !up);
206 static void hil_dev_handle_ptr_events(
struct hil_dev *
ptr)
208 struct input_dev *dev = ptr->
dev;
209 int idx = ptr->
idx4 / 4;
216 "Malformed poll packet %x (idx = %i)\n", p, idx);
226 for (cnt = 1; i < laxis; i++) {
233 val = lo + (hi << 8);
234 #ifdef TABLET_AUTOADJUST
235 if (val < input_abs_get_min(dev,
ABS_X + i))
236 input_abs_set_min(dev,
ABS_X + i, val);
237 if (val > input_abs_get_max(dev,
ABS_X + i))
238 input_abs_set_max(dev,
ABS_X + i, val);
241 val = input_abs_get_max(dev,
ABS_X + i) -
val;
242 input_report_abs(dev,
ABS_X + i, val);
247 input_report_rel(dev,
REL_X + i, val);
251 while (cnt < idx - 1) {
252 unsigned int btn = ptr->
data[cnt++];
258 if (btn > 0x8c || btn < 0x80)
260 btn = (btn - 0x80) >> 1;
262 input_report_key(dev, btn, !up);
268 static void hil_dev_process_err(
struct hil_dev *dev)
282 dev = serio_get_drvdata(serio);
286 hil_dev_process_err(dev);
291 if (!(dev->
idx4 % 4))
298 if ((++dev->
idx4 % 4) == 0) {
300 hil_dev_process_err(dev);
302 if (hil_dev_is_command_response(packet))
303 hil_dev_handle_command_response(dev);
305 hil_dev_handle_ptr_events(dev);
307 hil_dev_handle_kbd_events(dev);
315 static void hil_dev_disconnect(
struct serio *serio)
317 struct hil_dev *dev = serio_get_drvdata(serio);
322 input_unregister_device(dev->
dev);
323 serio_set_drvdata(serio,
NULL);
327 static void hil_dev_keyboard_setup(
struct hil_dev *kbd)
329 struct input_dev *input_dev = kbd->
dev;
337 for (i = 0; i < 128; i++) {
338 __set_bit(hil_kbd_set1[i], input_dev->keybit);
339 __set_bit(hil_kbd_set3[i], input_dev->keybit);
344 input_dev->keycodesize =
sizeof(hil_kbd_set1[0]);
345 input_dev->keycode = hil_kbd_set1;
347 input_dev->name =
strlen(kbd->
rnm) ? kbd->
rnm :
"HIL keyboard";
348 input_dev->phys =
"hpkbd/input0";
354 static void hil_dev_pointer_setup(
struct hil_dev *ptr)
356 struct input_dev *input_dev = ptr->
dev;
360 unsigned int i, btntype;
369 for (i = 0; i < ptr->
naxes; i++)
372 for (i = 3; naxsets > 1 && i < ptr->
naxes + 3; i++)
381 for (i = 0; i < ptr->
naxes; i++)
382 input_set_abs_params(input_dev,
ABS_X + i,
385 for (i = 3; naxsets > 1 && i < ptr->
naxes + 3; i++)
386 input_set_abs_params(input_dev,
ABS_X + i,
389 #ifdef TABLET_AUTOADJUST
390 for (i = 0; i <
ABS_MAX; i++) {
391 int diff = input_abs_get_max(input_dev,
ABS_X + i) / 10;
392 input_abs_set_min(input_dev,
ABS_X + i,
393 input_abs_get_min(input_dev,
ABS_X + i) + diff);
394 input_abs_set_max(input_dev,
ABS_X + i,
395 input_abs_get_max(input_dev,
ABS_X + i) - diff);
412 #ifdef TABLET_SIMULATES_MOUSE
423 for (i = 0; i < ptr->
nbtn; i++) {
424 __set_bit(btntype | i, input_dev->keybit);
434 input_dev->name =
strlen(ptr->
rnm) ? ptr->
rnm :
"HIL pointer device";
437 "HIL pointer device found (did: 0x%02x, axis: %s)\n",
440 "HIL pointer has %i buttons and %i sets of %i axes\n",
444 static int hil_dev_connect(
struct serio *serio,
struct serio_driver *drv)
447 struct input_dev *input_dev;
452 input_dev = input_allocate_device();
453 if (!dev || !input_dev) {
459 dev->
dev = input_dev;
465 serio_set_drvdata(serio, dev);
469 serio_write(serio, 0);
470 serio_write(serio, 0);
471 serio_write(serio, HIL_PKT_CMD >> 8);
478 serio_write(serio, 0);
479 serio_write(serio, 0);
480 serio_write(serio, HIL_PKT_CMD >> 8);
487 serio_write(serio, 0);
488 serio_write(serio, 0);
489 serio_write(serio, HIL_PKT_CMD >> 8);
496 serio_write(serio, 0);
497 serio_write(serio, 0);
498 serio_write(serio, HIL_PKT_CMD >> 8);
507 switch (did & HIL_IDD_DID_TYPE_MASK) {
515 "combo devices are not supported.\n");
520 hil_dev_keyboard_setup(dev);
526 hil_dev_pointer_setup(dev);
533 input_dev->id.bustype =
BUS_HIL;
535 input_dev->id.product = 0x0001;
536 input_dev->id.version = 0x0100;
537 input_dev->dev.parent = &serio->
dev;
540 serio_write(serio, 0);
541 serio_write(serio, 0);
542 serio_write(serio, HIL_PKT_CMD >> 8);
548 error = input_register_device(input_dev);
556 serio_set_drvdata(serio,
NULL);
558 input_free_device(input_dev);
579 .description =
"HP HIL keyboard/mouse/tablet driver",
580 .id_table = hil_dev_ids,
581 .connect = hil_dev_connect,
582 .disconnect = hil_dev_disconnect,
583 .interrupt = hil_dev_interrupt