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
< dev
->absmin
[ABS_X
+ i
])
236 dev
->absmin
[ABS_X
+ i
] = val
;
237 if (val
> dev
->absmax
[ABS_X
+ i
])
238 dev
->absmax
[ABS_X
+ i
] = val
;
240 if (i
%3) val
= dev
->absmax
[ABS_X
+ i
] - val
;
241 input_report_abs(dev
, ABS_X
+ i
, val
);
243 val
= (int) (((int8_t)lo
) | ((int8_t)hi
<< 8));
246 input_report_rel(dev
, REL_X
+ i
, val
);
250 while (cnt
< idx
- 1) {
251 unsigned int btn
= ptr
->data
[cnt
++];
256 continue; /* TODO: proximity == touch? */
257 if (btn
> 0x8c || btn
< 0x80)
259 btn
= (btn
- 0x80) >> 1;
260 btn
= ptr
->btnmap
[btn
];
261 input_report_key(dev
, btn
, !up
);
267 static void hil_dev_process_err(struct hil_dev
*dev
)
269 printk(KERN_WARNING PREFIX
"errored HIL packet\n");
271 complete(&dev
->cmd_done
); /* just in case somebody is waiting */
274 static irqreturn_t
hil_dev_interrupt(struct serio
*serio
,
275 unsigned char data
, unsigned int flags
)
281 dev
= serio_get_drvdata(serio
);
284 if (dev
->idx4
>= HIL_PACKET_MAX_LENGTH
* sizeof(hil_packet
)) {
285 hil_dev_process_err(dev
);
290 if (!(dev
->idx4
% 4))
292 packet
= dev
->data
[idx
];
293 packet
|= ((hil_packet
)data
) << ((3 - (dev
->idx4
% 4)) * 8);
294 dev
->data
[idx
] = packet
;
296 /* Records of N 4-byte hil_packets must terminate with a command. */
297 if ((++dev
->idx4
% 4) == 0) {
298 if ((packet
& 0xffff0000) != HIL_ERR_INT
) {
299 hil_dev_process_err(dev
);
300 } else if (packet
& HIL_PKT_CMD
) {
301 if (hil_dev_is_command_response(packet
))
302 hil_dev_handle_command_response(dev
);
303 else if (dev
->is_pointer
)
304 hil_dev_handle_ptr_events(dev
);
306 hil_dev_handle_kbd_events(dev
);
314 static void hil_dev_disconnect(struct serio
*serio
)
316 struct hil_dev
*dev
= serio_get_drvdata(serio
);
321 input_unregister_device(dev
->dev
);
322 serio_set_drvdata(serio
, NULL
);
326 static void hil_dev_keyboard_setup(struct hil_dev
*kbd
)
328 struct input_dev
*input_dev
= kbd
->dev
;
329 uint8_t did
= kbd
->idd
[0];
332 input_dev
->evbit
[0] = BIT_MASK(EV_KEY
) | BIT_MASK(EV_REP
);
333 input_dev
->ledbit
[0] = BIT_MASK(LED_NUML
) | BIT_MASK(LED_CAPSL
) |
334 BIT_MASK(LED_SCROLLL
);
336 for (i
= 0; i
< 128; i
++) {
337 __set_bit(hil_kbd_set1
[i
], input_dev
->keybit
);
338 __set_bit(hil_kbd_set3
[i
], input_dev
->keybit
);
340 __clear_bit(KEY_RESERVED
, input_dev
->keybit
);
342 input_dev
->keycodemax
= HIL_KEYCODES_SET1_TBLSIZE
;
343 input_dev
->keycodesize
= sizeof(hil_kbd_set1
[0]);
344 input_dev
->keycode
= hil_kbd_set1
;
346 input_dev
->name
= strlen(kbd
->rnm
) ? kbd
->rnm
: "HIL keyboard";
347 input_dev
->phys
= "hpkbd/input0";
349 printk(KERN_INFO PREFIX
"HIL keyboard found (did = 0x%02x, lang = %s)\n",
350 did
, hil_language
[did
& HIL_IDD_DID_TYPE_KB_LANG_MASK
]);
353 static void hil_dev_pointer_setup(struct hil_dev
*ptr
)
355 struct input_dev
*input_dev
= ptr
->dev
;
356 uint8_t did
= ptr
->idd
[0];
357 uint8_t *idd
= ptr
->idd
+ 1;
358 unsigned int naxsets
= HIL_IDD_NUM_AXSETS(*idd
);
359 unsigned int i
, btntype
;
362 ptr
->naxes
= HIL_IDD_NUM_AXES_PER_SET(*idd
);
364 switch (did
& HIL_IDD_DID_TYPE_MASK
) {
365 case HIL_IDD_DID_TYPE_REL
:
366 input_dev
->evbit
[0] = BIT_MASK(EV_REL
);
368 for (i
= 0; i
< ptr
->naxes
; i
++)
369 __set_bit(REL_X
+ i
, input_dev
->relbit
);
371 for (i
= 3; naxsets
> 1 && i
< ptr
->naxes
+ 3; i
++)
372 __set_bit(REL_X
+ i
, input_dev
->relbit
);
377 case HIL_IDD_DID_TYPE_ABS
:
378 input_dev
->evbit
[0] = BIT_MASK(EV_ABS
);
380 for (i
= 0; i
< ptr
->naxes
; i
++)
381 input_set_abs_params(input_dev
, ABS_X
+ i
,
382 0, HIL_IDD_AXIS_MAX(idd
, i
), 0, 0);
384 for (i
= 3; naxsets
> 1 && i
< ptr
->naxes
+ 3; i
++)
385 input_set_abs_params(input_dev
, ABS_X
+ i
,
386 0, HIL_IDD_AXIS_MAX(idd
, i
- 3), 0, 0);
388 #ifdef TABLET_AUTOADJUST
389 for (i
= 0; i
< ABS_MAX
; i
++) {
390 int diff
= input_dev
->absmax
[ABS_X
+ i
] / 10;
391 input_dev
->absmin
[ABS_X
+ i
] += diff
;
392 input_dev
->absmax
[ABS_X
+ i
] -= diff
;
403 ptr
->nbtn
= HIL_IDD_NUM_BUTTONS(idd
);
405 input_dev
->evbit
[0] |= BIT_MASK(EV_KEY
);
408 if ((did
& HIL_IDD_DID_ABS_TABLET_MASK
) == HIL_IDD_DID_ABS_TABLET
)
409 #ifdef TABLET_SIMULATES_MOUSE
414 if ((did
& HIL_IDD_DID_ABS_TSCREEN_MASK
) == HIL_IDD_DID_ABS_TSCREEN
)
417 if ((did
& HIL_IDD_DID_REL_MOUSE_MASK
) == HIL_IDD_DID_REL_MOUSE
)
420 for (i
= 0; i
< ptr
->nbtn
; i
++) {
421 __set_bit(btntype
| i
, input_dev
->keybit
);
422 ptr
->btnmap
[i
] = btntype
| i
;
425 if (btntype
== BTN_MOUSE
) {
426 /* Swap buttons 2 and 3 */
427 ptr
->btnmap
[1] = BTN_MIDDLE
;
428 ptr
->btnmap
[2] = BTN_RIGHT
;
431 input_dev
->name
= strlen(ptr
->rnm
) ? ptr
->rnm
: "HIL pointer device";
433 printk(KERN_INFO PREFIX
434 "HIL pointer device found (did: 0x%02x, axis: %s)\n",
436 printk(KERN_INFO PREFIX
437 "HIL pointer has %i buttons and %i sets of %i axes\n",
438 ptr
->nbtn
, naxsets
, ptr
->naxes
);
441 static int hil_dev_connect(struct serio
*serio
, struct serio_driver
*drv
)
444 struct input_dev
*input_dev
;
448 dev
= kzalloc(sizeof(*dev
), GFP_KERNEL
);
449 input_dev
= input_allocate_device();
450 if (!dev
|| !input_dev
) {
456 dev
->dev
= input_dev
;
458 error
= serio_open(serio
, drv
);
462 serio_set_drvdata(serio
, dev
);
464 /* Get device info. MLC driver supplies devid/status/etc. */
465 init_completion(&dev
->cmd_done
);
466 serio_write(serio
, 0);
467 serio_write(serio
, 0);
468 serio_write(serio
, HIL_PKT_CMD
>> 8);
469 serio_write(serio
, HIL_CMD_IDD
);
470 error
= wait_for_completion_killable(&dev
->cmd_done
);
474 init_completion(&dev
->cmd_done
);
475 serio_write(serio
, 0);
476 serio_write(serio
, 0);
477 serio_write(serio
, HIL_PKT_CMD
>> 8);
478 serio_write(serio
, HIL_CMD_RSC
);
479 error
= wait_for_completion_killable(&dev
->cmd_done
);
483 init_completion(&dev
->cmd_done
);
484 serio_write(serio
, 0);
485 serio_write(serio
, 0);
486 serio_write(serio
, HIL_PKT_CMD
>> 8);
487 serio_write(serio
, HIL_CMD_RNM
);
488 error
= wait_for_completion_killable(&dev
->cmd_done
);
492 init_completion(&dev
->cmd_done
);
493 serio_write(serio
, 0);
494 serio_write(serio
, 0);
495 serio_write(serio
, HIL_PKT_CMD
>> 8);
496 serio_write(serio
, HIL_CMD_EXD
);
497 error
= wait_for_completion_killable(&dev
->cmd_done
);
504 switch (did
& HIL_IDD_DID_TYPE_MASK
) {
505 case HIL_IDD_DID_TYPE_KB_INTEGRAL
:
506 case HIL_IDD_DID_TYPE_KB_ITF
:
507 case HIL_IDD_DID_TYPE_KB_RSVD
:
508 case HIL_IDD_DID_TYPE_CHAR
:
509 if (HIL_IDD_NUM_BUTTONS(idd
) ||
510 HIL_IDD_NUM_AXES_PER_SET(*idd
)) {
511 printk(KERN_INFO PREFIX
512 "combo devices are not supported.\n");
516 dev
->is_pointer
= false;
517 hil_dev_keyboard_setup(dev
);
520 case HIL_IDD_DID_TYPE_REL
:
521 case HIL_IDD_DID_TYPE_ABS
:
522 dev
->is_pointer
= true;
523 hil_dev_pointer_setup(dev
);
530 input_dev
->id
.bustype
= BUS_HIL
;
531 input_dev
->id
.vendor
= PCI_VENDOR_ID_HP
;
532 input_dev
->id
.product
= 0x0001; /* TODO: get from kbd->rsc */
533 input_dev
->id
.version
= 0x0100; /* TODO: get from kbd->rsc */
534 input_dev
->dev
.parent
= &serio
->dev
;
536 if (!dev
->is_pointer
) {
537 serio_write(serio
, 0);
538 serio_write(serio
, 0);
539 serio_write(serio
, HIL_PKT_CMD
>> 8);
540 /* Enable Keyswitch Autorepeat 1 */
541 serio_write(serio
, HIL_CMD_EK1
);
542 /* No need to wait for completion */
545 error
= input_register_device(input_dev
);
553 serio_set_drvdata(serio
, NULL
);
555 input_free_device(input_dev
);
560 static struct serio_device_id hil_dev_ids
[] = {
562 .type
= SERIO_HIL_MLC
,
570 static struct serio_driver hil_serio_drv
= {
574 .description
= "HP HIL keyboard/mouse/tablet driver",
575 .id_table
= hil_dev_ids
,
576 .connect
= hil_dev_connect
,
577 .disconnect
= hil_dev_disconnect
,
578 .interrupt
= hil_dev_interrupt
581 static int __init
hil_dev_init(void)
583 return serio_register_driver(&hil_serio_drv
);
586 static void __exit
hil_dev_exit(void)
588 serio_unregister_driver(&hil_serio_drv
);
591 module_init(hil_dev_init
);
592 module_exit(hil_dev_exit
);