2 * Generic linux-input device driver for keyboard devices
4 * Copyright (c) 2001 Brian S. Julin
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions, and the following disclaimer,
12 * without modification.
13 * 2. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
16 * Alternatively, this software may be distributed under the terms of the
17 * GNU General Public License ("GPL").
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * HP-HIL Technical Reference Manual. Hewlett Packard Product No. 45918A
34 #include <linux/hil.h>
35 #include <linux/input.h>
36 #include <linux/serio.h>
37 #include <linux/kernel.h>
38 #include <linux/module.h>
39 #include <linux/init.h>
40 #include <linux/completion.h>
41 #include <linux/slab.h>
42 #include <linux/pci_ids.h>
44 #define PREFIX "HIL: "
46 MODULE_AUTHOR("Brian S. Julin <bri@calyx.com>");
47 MODULE_DESCRIPTION("HIL keyboard/mouse driver");
48 MODULE_LICENSE("Dual BSD/GPL");
49 MODULE_ALIAS("serio:ty03pr25id00ex*"); /* HIL keyboard */
50 MODULE_ALIAS("serio:ty03pr25id0Fex*"); /* HIL mouse */
52 #define HIL_PACKET_MAX_LENGTH 16
54 #define HIL_KBD_SET1_UPBIT 0x01
55 #define HIL_KBD_SET1_SHIFT 1
56 static unsigned int hil_kbd_set1
[HIL_KEYCODES_SET1_TBLSIZE
] __read_mostly
=
57 { HIL_KEYCODES_SET1
};
59 #define HIL_KBD_SET2_UPBIT 0x01
60 #define HIL_KBD_SET2_SHIFT 1
61 /* Set2 is user defined */
63 #define HIL_KBD_SET3_UPBIT 0x80
64 #define HIL_KBD_SET3_SHIFT 0
65 static unsigned int hil_kbd_set3
[HIL_KEYCODES_SET3_TBLSIZE
] __read_mostly
=
66 { HIL_KEYCODES_SET3
};
68 static const char hil_language
[][16] = { HIL_LOCALE_MAP
};
71 struct input_dev
*dev
;
74 /* Input buffer and index for packets from HIL bus. */
75 hil_packet data
[HIL_PACKET_MAX_LENGTH
];
76 int idx4
; /* four counts per packet */
78 /* Raw device info records from HIL bus, see hil.h for fields. */
79 char idd
[HIL_PACKET_MAX_LENGTH
]; /* DID byte and IDD record */
80 char rsc
[HIL_PACKET_MAX_LENGTH
]; /* RSC record */
81 char exd
[HIL_PACKET_MAX_LENGTH
]; /* EXD record */
82 char rnm
[HIL_PACKET_MAX_LENGTH
+ 1]; /* RNM record + NULL term. */
84 struct completion cmd_done
;
87 /* Extra device details needed for pointing devices. */
88 unsigned int nbtn
, naxes
;
89 unsigned int btnmap
[7];
92 static bool hil_dev_is_command_response(hil_packet p
)
94 if ((p
& ~HIL_CMDCT_POL
) == (HIL_ERR_INT
| HIL_PKT_CMD
| HIL_CMD_POL
))
97 if ((p
& ~HIL_CMDCT_RPL
) == (HIL_ERR_INT
| HIL_PKT_CMD
| HIL_CMD_RPL
))
103 static void hil_dev_handle_command_response(struct hil_dev
*dev
)
110 p
= dev
->data
[idx
- 1];
112 switch (p
& HIL_PKT_DATA_MASK
) {
126 dev
->rnm
[HIL_PACKET_MAX_LENGTH
] = 0;
131 /* These occur when device isn't present */
132 if (p
!= (HIL_ERR_INT
| HIL_PKT_CMD
)) {
133 /* Anything else we'd like to know about. */
134 printk(KERN_WARNING PREFIX
"Device sent unknown record %x\n", p
);
139 for (i
= 0; i
< idx
; i
++)
140 buf
[i
] = dev
->data
[i
] & HIL_PKT_DATA_MASK
;
141 for (; i
< HIL_PACKET_MAX_LENGTH
; i
++)
144 complete(&dev
->cmd_done
);
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;
153 switch (kbd
->data
[0] & HIL_POL_CHARTYPE_MASK
) {
154 case HIL_POL_CHARTYPE_NONE
:
157 case HIL_POL_CHARTYPE_ASCII
:
158 for (i
= 1; i
< idx
- 1; i
++)
159 input_report_key(dev
, kbd
->data
[i
] & 0x7f, 1);
162 case HIL_POL_CHARTYPE_RSVD1
:
163 case HIL_POL_CHARTYPE_RSVD2
:
164 case HIL_POL_CHARTYPE_BINARY
:
165 for (i
= 1; i
< idx
- 1; i
++)
166 input_report_key(dev
, kbd
->data
[i
], 1);
169 case HIL_POL_CHARTYPE_SET1
:
170 for (i
= 1; i
< idx
- 1; i
++) {
171 unsigned int key
= kbd
->data
[i
];
172 int up
= key
& HIL_KBD_SET1_UPBIT
;
174 key
&= (~HIL_KBD_SET1_UPBIT
& 0xff);
175 key
= hil_kbd_set1
[key
>> HIL_KBD_SET1_SHIFT
];
176 input_report_key(dev
, key
, !up
);
180 case HIL_POL_CHARTYPE_SET2
:
181 for (i
= 1; i
< idx
- 1; i
++) {
182 unsigned int key
= kbd
->data
[i
];
183 int up
= key
& HIL_KBD_SET2_UPBIT
;
185 key
&= (~HIL_KBD_SET1_UPBIT
& 0xff);
186 key
= key
>> HIL_KBD_SET2_SHIFT
;
187 input_report_key(dev
, key
, !up
);
191 case HIL_POL_CHARTYPE_SET3
:
192 for (i
= 1; i
< idx
- 1; i
++) {
193 unsigned int key
= kbd
->data
[i
];
194 int up
= key
& HIL_KBD_SET3_UPBIT
;
196 key
&= (~HIL_KBD_SET1_UPBIT
& 0xff);
197 key
= hil_kbd_set3
[key
>> HIL_KBD_SET3_SHIFT
];
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;
210 hil_packet p
= ptr
->data
[idx
- 1];
214 if ((p
& HIL_CMDCT_POL
) != idx
- 1) {
215 printk(KERN_WARNING PREFIX
216 "Malformed poll packet %x (idx = %i)\n", p
, idx
);
220 i
= (p
& HIL_POL_AXIS_ALT
) ? 3 : 0;
221 laxis
= (p
& HIL_POL_NUM_AXES_MASK
) + i
;
223 ax16
= ptr
->idd
[1] & HIL_IDD_HEADER_16BIT
; /* 8 or 16bit resolution */
224 absdev
= ptr
->idd
[1] & HIL_IDD_HEADER_ABS
;
226 for (cnt
= 1; i
< laxis
; i
++) {
227 unsigned int lo
, hi
, val
;
229 lo
= ptr
->data
[cnt
++] & HIL_PKT_DATA_MASK
;
230 hi
= ax16
? (ptr
->data
[cnt
++] & HIL_PKT_DATA_MASK
) : 0;
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
);
244 val
= (int) (((int8_t) lo
) | ((int8_t) hi
<< 8));
247 input_report_rel(dev
, REL_X
+ i
, val
);
251 while (cnt
< idx
- 1) {
252 unsigned int btn
= ptr
->data
[cnt
++];
257 continue; /* TODO: proximity == touch? */
258 if (btn
> 0x8c || btn
< 0x80)
260 btn
= (btn
- 0x80) >> 1;
261 btn
= ptr
->btnmap
[btn
];
262 input_report_key(dev
, btn
, !up
);
268 static void hil_dev_process_err(struct hil_dev
*dev
)
270 printk(KERN_WARNING PREFIX
"errored HIL packet\n");
272 complete(&dev
->cmd_done
); /* just in case somebody is waiting */
275 static irqreturn_t
hil_dev_interrupt(struct serio
*serio
,
276 unsigned char data
, unsigned int flags
)
282 dev
= serio_get_drvdata(serio
);
285 if (dev
->idx4
>= HIL_PACKET_MAX_LENGTH
* sizeof(hil_packet
)) {
286 hil_dev_process_err(dev
);
291 if (!(dev
->idx4
% 4))
293 packet
= dev
->data
[idx
];
294 packet
|= ((hil_packet
)data
) << ((3 - (dev
->idx4
% 4)) * 8);
295 dev
->data
[idx
] = packet
;
297 /* Records of N 4-byte hil_packets must terminate with a command. */
298 if ((++dev
->idx4
% 4) == 0) {
299 if ((packet
& 0xffff0000) != HIL_ERR_INT
) {
300 hil_dev_process_err(dev
);
301 } else if (packet
& HIL_PKT_CMD
) {
302 if (hil_dev_is_command_response(packet
))
303 hil_dev_handle_command_response(dev
);
304 else if (dev
->is_pointer
)
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
;
330 uint8_t did
= kbd
->idd
[0];
333 input_dev
->evbit
[0] = BIT_MASK(EV_KEY
) | BIT_MASK(EV_REP
);
334 input_dev
->ledbit
[0] = BIT_MASK(LED_NUML
) | BIT_MASK(LED_CAPSL
) |
335 BIT_MASK(LED_SCROLLL
);
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
);
341 __clear_bit(KEY_RESERVED
, input_dev
->keybit
);
343 input_dev
->keycodemax
= HIL_KEYCODES_SET1_TBLSIZE
;
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";
350 printk(KERN_INFO PREFIX
"HIL keyboard found (did = 0x%02x, lang = %s)\n",
351 did
, hil_language
[did
& HIL_IDD_DID_TYPE_KB_LANG_MASK
]);
354 static void hil_dev_pointer_setup(struct hil_dev
*ptr
)
356 struct input_dev
*input_dev
= ptr
->dev
;
357 uint8_t did
= ptr
->idd
[0];
358 uint8_t *idd
= ptr
->idd
+ 1;
359 unsigned int naxsets
= HIL_IDD_NUM_AXSETS(*idd
);
360 unsigned int i
, btntype
;
363 ptr
->naxes
= HIL_IDD_NUM_AXES_PER_SET(*idd
);
365 switch (did
& HIL_IDD_DID_TYPE_MASK
) {
366 case HIL_IDD_DID_TYPE_REL
:
367 input_dev
->evbit
[0] = BIT_MASK(EV_REL
);
369 for (i
= 0; i
< ptr
->naxes
; i
++)
370 __set_bit(REL_X
+ i
, input_dev
->relbit
);
372 for (i
= 3; naxsets
> 1 && i
< ptr
->naxes
+ 3; i
++)
373 __set_bit(REL_X
+ i
, input_dev
->relbit
);
378 case HIL_IDD_DID_TYPE_ABS
:
379 input_dev
->evbit
[0] = BIT_MASK(EV_ABS
);
381 for (i
= 0; i
< ptr
->naxes
; i
++)
382 input_set_abs_params(input_dev
, ABS_X
+ i
,
383 0, HIL_IDD_AXIS_MAX(idd
, i
), 0, 0);
385 for (i
= 3; naxsets
> 1 && i
< ptr
->naxes
+ 3; i
++)
386 input_set_abs_params(input_dev
, ABS_X
+ i
,
387 0, HIL_IDD_AXIS_MAX(idd
, i
- 3), 0, 0);
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
);
406 ptr
->nbtn
= HIL_IDD_NUM_BUTTONS(idd
);
408 input_dev
->evbit
[0] |= BIT_MASK(EV_KEY
);
411 if ((did
& HIL_IDD_DID_ABS_TABLET_MASK
) == HIL_IDD_DID_ABS_TABLET
)
412 #ifdef TABLET_SIMULATES_MOUSE
417 if ((did
& HIL_IDD_DID_ABS_TSCREEN_MASK
) == HIL_IDD_DID_ABS_TSCREEN
)
420 if ((did
& HIL_IDD_DID_REL_MOUSE_MASK
) == HIL_IDD_DID_REL_MOUSE
)
423 for (i
= 0; i
< ptr
->nbtn
; i
++) {
424 __set_bit(btntype
| i
, input_dev
->keybit
);
425 ptr
->btnmap
[i
] = btntype
| i
;
428 if (btntype
== BTN_MOUSE
) {
429 /* Swap buttons 2 and 3 */
430 ptr
->btnmap
[1] = BTN_MIDDLE
;
431 ptr
->btnmap
[2] = BTN_RIGHT
;
434 input_dev
->name
= strlen(ptr
->rnm
) ? ptr
->rnm
: "HIL pointer device";
436 printk(KERN_INFO PREFIX
437 "HIL pointer device found (did: 0x%02x, axis: %s)\n",
439 printk(KERN_INFO PREFIX
440 "HIL pointer has %i buttons and %i sets of %i axes\n",
441 ptr
->nbtn
, naxsets
, ptr
->naxes
);
444 static int hil_dev_connect(struct serio
*serio
, struct serio_driver
*drv
)
447 struct input_dev
*input_dev
;
451 dev
= kzalloc(sizeof(*dev
), GFP_KERNEL
);
452 input_dev
= input_allocate_device();
453 if (!dev
|| !input_dev
) {
459 dev
->dev
= input_dev
;
461 error
= serio_open(serio
, drv
);
465 serio_set_drvdata(serio
, dev
);
467 /* Get device info. MLC driver supplies devid/status/etc. */
468 init_completion(&dev
->cmd_done
);
469 serio_write(serio
, 0);
470 serio_write(serio
, 0);
471 serio_write(serio
, HIL_PKT_CMD
>> 8);
472 serio_write(serio
, HIL_CMD_IDD
);
473 error
= wait_for_completion_killable(&dev
->cmd_done
);
477 init_completion(&dev
->cmd_done
);
478 serio_write(serio
, 0);
479 serio_write(serio
, 0);
480 serio_write(serio
, HIL_PKT_CMD
>> 8);
481 serio_write(serio
, HIL_CMD_RSC
);
482 error
= wait_for_completion_killable(&dev
->cmd_done
);
486 init_completion(&dev
->cmd_done
);
487 serio_write(serio
, 0);
488 serio_write(serio
, 0);
489 serio_write(serio
, HIL_PKT_CMD
>> 8);
490 serio_write(serio
, HIL_CMD_RNM
);
491 error
= wait_for_completion_killable(&dev
->cmd_done
);
495 init_completion(&dev
->cmd_done
);
496 serio_write(serio
, 0);
497 serio_write(serio
, 0);
498 serio_write(serio
, HIL_PKT_CMD
>> 8);
499 serio_write(serio
, HIL_CMD_EXD
);
500 error
= wait_for_completion_killable(&dev
->cmd_done
);
507 switch (did
& HIL_IDD_DID_TYPE_MASK
) {
508 case HIL_IDD_DID_TYPE_KB_INTEGRAL
:
509 case HIL_IDD_DID_TYPE_KB_ITF
:
510 case HIL_IDD_DID_TYPE_KB_RSVD
:
511 case HIL_IDD_DID_TYPE_CHAR
:
512 if (HIL_IDD_NUM_BUTTONS(idd
) ||
513 HIL_IDD_NUM_AXES_PER_SET(*idd
)) {
514 printk(KERN_INFO PREFIX
515 "combo devices are not supported.\n");
519 dev
->is_pointer
= false;
520 hil_dev_keyboard_setup(dev
);
523 case HIL_IDD_DID_TYPE_REL
:
524 case HIL_IDD_DID_TYPE_ABS
:
525 dev
->is_pointer
= true;
526 hil_dev_pointer_setup(dev
);
533 input_dev
->id
.bustype
= BUS_HIL
;
534 input_dev
->id
.vendor
= PCI_VENDOR_ID_HP
;
535 input_dev
->id
.product
= 0x0001; /* TODO: get from kbd->rsc */
536 input_dev
->id
.version
= 0x0100; /* TODO: get from kbd->rsc */
537 input_dev
->dev
.parent
= &serio
->dev
;
539 if (!dev
->is_pointer
) {
540 serio_write(serio
, 0);
541 serio_write(serio
, 0);
542 serio_write(serio
, HIL_PKT_CMD
>> 8);
543 /* Enable Keyswitch Autorepeat 1 */
544 serio_write(serio
, HIL_CMD_EK1
);
545 /* No need to wait for completion */
548 error
= input_register_device(input_dev
);
556 serio_set_drvdata(serio
, NULL
);
558 input_free_device(input_dev
);
563 static struct serio_device_id hil_dev_ids
[] = {
565 .type
= SERIO_HIL_MLC
,
573 MODULE_DEVICE_TABLE(serio
, hil_dev_ids
);
575 static struct serio_driver hil_serio_drv
= {
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
586 static int __init
hil_dev_init(void)
588 return serio_register_driver(&hil_serio_drv
);
591 static void __exit
hil_dev_exit(void)
593 serio_unregister_driver(&hil_serio_drv
);
596 module_init(hil_dev_init
);
597 module_exit(hil_dev_exit
);