0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 #include <linux/hil.h>
0035 #include <linux/input.h>
0036 #include <linux/serio.h>
0037 #include <linux/kernel.h>
0038 #include <linux/module.h>
0039 #include <linux/completion.h>
0040 #include <linux/slab.h>
0041 #include <linux/pci_ids.h>
0042
0043 #define PREFIX "HIL: "
0044
0045 MODULE_AUTHOR("Brian S. Julin <bri@calyx.com>");
0046 MODULE_DESCRIPTION("HIL keyboard/mouse driver");
0047 MODULE_LICENSE("Dual BSD/GPL");
0048 MODULE_ALIAS("serio:ty03pr25id00ex*");
0049 MODULE_ALIAS("serio:ty03pr25id0Fex*");
0050
0051 #define HIL_PACKET_MAX_LENGTH 16
0052
0053 #define HIL_KBD_SET1_UPBIT 0x01
0054 #define HIL_KBD_SET1_SHIFT 1
0055 static unsigned int hil_kbd_set1[HIL_KEYCODES_SET1_TBLSIZE] __read_mostly =
0056 { HIL_KEYCODES_SET1 };
0057
0058 #define HIL_KBD_SET2_UPBIT 0x01
0059 #define HIL_KBD_SET2_SHIFT 1
0060
0061
0062 #define HIL_KBD_SET3_UPBIT 0x80
0063 #define HIL_KBD_SET3_SHIFT 0
0064 static unsigned int hil_kbd_set3[HIL_KEYCODES_SET3_TBLSIZE] __read_mostly =
0065 { HIL_KEYCODES_SET3 };
0066
0067 static const char hil_language[][16] = { HIL_LOCALE_MAP };
0068
0069 struct hil_dev {
0070 struct input_dev *dev;
0071 struct serio *serio;
0072
0073
0074 hil_packet data[HIL_PACKET_MAX_LENGTH];
0075 int idx4;
0076
0077
0078 char idd[HIL_PACKET_MAX_LENGTH];
0079 char rsc[HIL_PACKET_MAX_LENGTH];
0080 char exd[HIL_PACKET_MAX_LENGTH];
0081 char rnm[HIL_PACKET_MAX_LENGTH + 1];
0082
0083 struct completion cmd_done;
0084
0085 bool is_pointer;
0086
0087 unsigned int nbtn, naxes;
0088 unsigned int btnmap[7];
0089 };
0090
0091 static bool hil_dev_is_command_response(hil_packet p)
0092 {
0093 if ((p & ~HIL_CMDCT_POL) == (HIL_ERR_INT | HIL_PKT_CMD | HIL_CMD_POL))
0094 return false;
0095
0096 if ((p & ~HIL_CMDCT_RPL) == (HIL_ERR_INT | HIL_PKT_CMD | HIL_CMD_RPL))
0097 return false;
0098
0099 return true;
0100 }
0101
0102 static void hil_dev_handle_command_response(struct hil_dev *dev)
0103 {
0104 hil_packet p;
0105 char *buf;
0106 int i, idx;
0107
0108 idx = dev->idx4 / 4;
0109 p = dev->data[idx - 1];
0110
0111 switch (p & HIL_PKT_DATA_MASK) {
0112 case HIL_CMD_IDD:
0113 buf = dev->idd;
0114 break;
0115
0116 case HIL_CMD_RSC:
0117 buf = dev->rsc;
0118 break;
0119
0120 case HIL_CMD_EXD:
0121 buf = dev->exd;
0122 break;
0123
0124 case HIL_CMD_RNM:
0125 dev->rnm[HIL_PACKET_MAX_LENGTH] = 0;
0126 buf = dev->rnm;
0127 break;
0128
0129 default:
0130
0131 if (p != (HIL_ERR_INT | HIL_PKT_CMD)) {
0132
0133 printk(KERN_WARNING PREFIX "Device sent unknown record %x\n", p);
0134 }
0135 goto out;
0136 }
0137
0138 for (i = 0; i < idx; i++)
0139 buf[i] = dev->data[i] & HIL_PKT_DATA_MASK;
0140 for (; i < HIL_PACKET_MAX_LENGTH; i++)
0141 buf[i] = 0;
0142 out:
0143 complete(&dev->cmd_done);
0144 }
0145
0146 static void hil_dev_handle_kbd_events(struct hil_dev *kbd)
0147 {
0148 struct input_dev *dev = kbd->dev;
0149 int idx = kbd->idx4 / 4;
0150 int i;
0151
0152 switch (kbd->data[0] & HIL_POL_CHARTYPE_MASK) {
0153 case HIL_POL_CHARTYPE_NONE:
0154 return;
0155
0156 case HIL_POL_CHARTYPE_ASCII:
0157 for (i = 1; i < idx - 1; i++)
0158 input_report_key(dev, kbd->data[i] & 0x7f, 1);
0159 break;
0160
0161 case HIL_POL_CHARTYPE_RSVD1:
0162 case HIL_POL_CHARTYPE_RSVD2:
0163 case HIL_POL_CHARTYPE_BINARY:
0164 for (i = 1; i < idx - 1; i++)
0165 input_report_key(dev, kbd->data[i], 1);
0166 break;
0167
0168 case HIL_POL_CHARTYPE_SET1:
0169 for (i = 1; i < idx - 1; i++) {
0170 unsigned int key = kbd->data[i];
0171 int up = key & HIL_KBD_SET1_UPBIT;
0172
0173 key &= (~HIL_KBD_SET1_UPBIT & 0xff);
0174 key = hil_kbd_set1[key >> HIL_KBD_SET1_SHIFT];
0175 input_report_key(dev, key, !up);
0176 }
0177 break;
0178
0179 case HIL_POL_CHARTYPE_SET2:
0180 for (i = 1; i < idx - 1; i++) {
0181 unsigned int key = kbd->data[i];
0182 int up = key & HIL_KBD_SET2_UPBIT;
0183
0184 key &= (~HIL_KBD_SET1_UPBIT & 0xff);
0185 key = key >> HIL_KBD_SET2_SHIFT;
0186 input_report_key(dev, key, !up);
0187 }
0188 break;
0189
0190 case HIL_POL_CHARTYPE_SET3:
0191 for (i = 1; i < idx - 1; i++) {
0192 unsigned int key = kbd->data[i];
0193 int up = key & HIL_KBD_SET3_UPBIT;
0194
0195 key &= (~HIL_KBD_SET1_UPBIT & 0xff);
0196 key = hil_kbd_set3[key >> HIL_KBD_SET3_SHIFT];
0197 input_report_key(dev, key, !up);
0198 }
0199 break;
0200 }
0201
0202 input_sync(dev);
0203 }
0204
0205 static void hil_dev_handle_ptr_events(struct hil_dev *ptr)
0206 {
0207 struct input_dev *dev = ptr->dev;
0208 int idx = ptr->idx4 / 4;
0209 hil_packet p = ptr->data[idx - 1];
0210 int i, cnt, laxis;
0211 bool absdev, ax16;
0212
0213 if ((p & HIL_CMDCT_POL) != idx - 1) {
0214 printk(KERN_WARNING PREFIX
0215 "Malformed poll packet %x (idx = %i)\n", p, idx);
0216 return;
0217 }
0218
0219 i = (p & HIL_POL_AXIS_ALT) ? 3 : 0;
0220 laxis = (p & HIL_POL_NUM_AXES_MASK) + i;
0221
0222 ax16 = ptr->idd[1] & HIL_IDD_HEADER_16BIT;
0223 absdev = ptr->idd[1] & HIL_IDD_HEADER_ABS;
0224
0225 for (cnt = 1; i < laxis; i++) {
0226 unsigned int lo, hi, val;
0227
0228 lo = ptr->data[cnt++] & HIL_PKT_DATA_MASK;
0229 hi = ax16 ? (ptr->data[cnt++] & HIL_PKT_DATA_MASK) : 0;
0230
0231 if (absdev) {
0232 val = lo + (hi << 8);
0233 #ifdef TABLET_AUTOADJUST
0234 if (val < input_abs_get_min(dev, ABS_X + i))
0235 input_abs_set_min(dev, ABS_X + i, val);
0236 if (val > input_abs_get_max(dev, ABS_X + i))
0237 input_abs_set_max(dev, ABS_X + i, val);
0238 #endif
0239 if (i % 3)
0240 val = input_abs_get_max(dev, ABS_X + i) - val;
0241 input_report_abs(dev, ABS_X + i, val);
0242 } else {
0243 val = (int) (((int8_t) lo) | ((int8_t) hi << 8));
0244 if (i % 3)
0245 val *= -1;
0246 input_report_rel(dev, REL_X + i, val);
0247 }
0248 }
0249
0250 while (cnt < idx - 1) {
0251 unsigned int btn = ptr->data[cnt++];
0252 int up = btn & 1;
0253
0254 btn &= 0xfe;
0255 if (btn == 0x8e)
0256 continue;
0257 if (btn > 0x8c || btn < 0x80)
0258 continue;
0259 btn = (btn - 0x80) >> 1;
0260 btn = ptr->btnmap[btn];
0261 input_report_key(dev, btn, !up);
0262 }
0263
0264 input_sync(dev);
0265 }
0266
0267 static void hil_dev_process_err(struct hil_dev *dev)
0268 {
0269 printk(KERN_WARNING PREFIX "errored HIL packet\n");
0270 dev->idx4 = 0;
0271 complete(&dev->cmd_done);
0272 }
0273
0274 static irqreturn_t hil_dev_interrupt(struct serio *serio,
0275 unsigned char data, unsigned int flags)
0276 {
0277 struct hil_dev *dev;
0278 hil_packet packet;
0279 int idx;
0280
0281 dev = serio_get_drvdata(serio);
0282 BUG_ON(dev == NULL);
0283
0284 if (dev->idx4 >= HIL_PACKET_MAX_LENGTH * sizeof(hil_packet)) {
0285 hil_dev_process_err(dev);
0286 goto out;
0287 }
0288
0289 idx = dev->idx4 / 4;
0290 if (!(dev->idx4 % 4))
0291 dev->data[idx] = 0;
0292 packet = dev->data[idx];
0293 packet |= ((hil_packet)data) << ((3 - (dev->idx4 % 4)) * 8);
0294 dev->data[idx] = packet;
0295
0296
0297 if ((++dev->idx4 % 4) == 0) {
0298 if ((packet & 0xffff0000) != HIL_ERR_INT) {
0299 hil_dev_process_err(dev);
0300 } else if (packet & HIL_PKT_CMD) {
0301 if (hil_dev_is_command_response(packet))
0302 hil_dev_handle_command_response(dev);
0303 else if (dev->is_pointer)
0304 hil_dev_handle_ptr_events(dev);
0305 else
0306 hil_dev_handle_kbd_events(dev);
0307 dev->idx4 = 0;
0308 }
0309 }
0310 out:
0311 return IRQ_HANDLED;
0312 }
0313
0314 static void hil_dev_disconnect(struct serio *serio)
0315 {
0316 struct hil_dev *dev = serio_get_drvdata(serio);
0317
0318 BUG_ON(dev == NULL);
0319
0320 serio_close(serio);
0321 input_unregister_device(dev->dev);
0322 serio_set_drvdata(serio, NULL);
0323 kfree(dev);
0324 }
0325
0326 static void hil_dev_keyboard_setup(struct hil_dev *kbd)
0327 {
0328 struct input_dev *input_dev = kbd->dev;
0329 uint8_t did = kbd->idd[0];
0330 int i;
0331
0332 input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP);
0333 input_dev->ledbit[0] = BIT_MASK(LED_NUML) | BIT_MASK(LED_CAPSL) |
0334 BIT_MASK(LED_SCROLLL);
0335
0336 for (i = 0; i < 128; i++) {
0337 __set_bit(hil_kbd_set1[i], input_dev->keybit);
0338 __set_bit(hil_kbd_set3[i], input_dev->keybit);
0339 }
0340 __clear_bit(KEY_RESERVED, input_dev->keybit);
0341
0342 input_dev->keycodemax = HIL_KEYCODES_SET1_TBLSIZE;
0343 input_dev->keycodesize = sizeof(hil_kbd_set1[0]);
0344 input_dev->keycode = hil_kbd_set1;
0345
0346 input_dev->name = strlen(kbd->rnm) ? kbd->rnm : "HIL keyboard";
0347 input_dev->phys = "hpkbd/input0";
0348
0349 printk(KERN_INFO PREFIX "HIL keyboard found (did = 0x%02x, lang = %s)\n",
0350 did, hil_language[did & HIL_IDD_DID_TYPE_KB_LANG_MASK]);
0351 }
0352
0353 static void hil_dev_pointer_setup(struct hil_dev *ptr)
0354 {
0355 struct input_dev *input_dev = ptr->dev;
0356 uint8_t did = ptr->idd[0];
0357 uint8_t *idd = ptr->idd + 1;
0358 unsigned int naxsets = HIL_IDD_NUM_AXSETS(*idd);
0359 unsigned int i, btntype;
0360 const char *txt;
0361
0362 ptr->naxes = HIL_IDD_NUM_AXES_PER_SET(*idd);
0363
0364 switch (did & HIL_IDD_DID_TYPE_MASK) {
0365 case HIL_IDD_DID_TYPE_REL:
0366 input_dev->evbit[0] = BIT_MASK(EV_REL);
0367
0368 for (i = 0; i < ptr->naxes; i++)
0369 __set_bit(REL_X + i, input_dev->relbit);
0370
0371 for (i = 3; naxsets > 1 && i < ptr->naxes + 3; i++)
0372 __set_bit(REL_X + i, input_dev->relbit);
0373
0374 txt = "relative";
0375 break;
0376
0377 case HIL_IDD_DID_TYPE_ABS:
0378 input_dev->evbit[0] = BIT_MASK(EV_ABS);
0379
0380 for (i = 0; i < ptr->naxes; i++)
0381 input_set_abs_params(input_dev, ABS_X + i,
0382 0, HIL_IDD_AXIS_MAX(idd, i), 0, 0);
0383
0384 for (i = 3; naxsets > 1 && i < ptr->naxes + 3; i++)
0385 input_set_abs_params(input_dev, ABS_X + i,
0386 0, HIL_IDD_AXIS_MAX(idd, i - 3), 0, 0);
0387
0388 #ifdef TABLET_AUTOADJUST
0389 for (i = 0; i < ABS_MAX; i++) {
0390 int diff = input_abs_get_max(input_dev, ABS_X + i) / 10;
0391 input_abs_set_min(input_dev, ABS_X + i,
0392 input_abs_get_min(input_dev, ABS_X + i) + diff);
0393 input_abs_set_max(input_dev, ABS_X + i,
0394 input_abs_get_max(input_dev, ABS_X + i) - diff);
0395 }
0396 #endif
0397
0398 txt = "absolute";
0399 break;
0400
0401 default:
0402 BUG();
0403 }
0404
0405 ptr->nbtn = HIL_IDD_NUM_BUTTONS(idd);
0406 if (ptr->nbtn)
0407 input_dev->evbit[0] |= BIT_MASK(EV_KEY);
0408
0409 btntype = BTN_MISC;
0410 if ((did & HIL_IDD_DID_ABS_TABLET_MASK) == HIL_IDD_DID_ABS_TABLET)
0411 #ifdef TABLET_SIMULATES_MOUSE
0412 btntype = BTN_TOUCH;
0413 #else
0414 btntype = BTN_DIGI;
0415 #endif
0416 if ((did & HIL_IDD_DID_ABS_TSCREEN_MASK) == HIL_IDD_DID_ABS_TSCREEN)
0417 btntype = BTN_TOUCH;
0418
0419 if ((did & HIL_IDD_DID_REL_MOUSE_MASK) == HIL_IDD_DID_REL_MOUSE)
0420 btntype = BTN_MOUSE;
0421
0422 for (i = 0; i < ptr->nbtn; i++) {
0423 __set_bit(btntype | i, input_dev->keybit);
0424 ptr->btnmap[i] = btntype | i;
0425 }
0426
0427 if (btntype == BTN_MOUSE) {
0428
0429 ptr->btnmap[1] = BTN_MIDDLE;
0430 ptr->btnmap[2] = BTN_RIGHT;
0431 }
0432
0433 input_dev->name = strlen(ptr->rnm) ? ptr->rnm : "HIL pointer device";
0434
0435 printk(KERN_INFO PREFIX
0436 "HIL pointer device found (did: 0x%02x, axis: %s)\n",
0437 did, txt);
0438 printk(KERN_INFO PREFIX
0439 "HIL pointer has %i buttons and %i sets of %i axes\n",
0440 ptr->nbtn, naxsets, ptr->naxes);
0441 }
0442
0443 static int hil_dev_connect(struct serio *serio, struct serio_driver *drv)
0444 {
0445 struct hil_dev *dev;
0446 struct input_dev *input_dev;
0447 uint8_t did, *idd;
0448 int error;
0449
0450 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
0451 input_dev = input_allocate_device();
0452 if (!dev || !input_dev) {
0453 error = -ENOMEM;
0454 goto bail0;
0455 }
0456
0457 dev->serio = serio;
0458 dev->dev = input_dev;
0459
0460 error = serio_open(serio, drv);
0461 if (error)
0462 goto bail0;
0463
0464 serio_set_drvdata(serio, dev);
0465
0466
0467 init_completion(&dev->cmd_done);
0468 serio_write(serio, 0);
0469 serio_write(serio, 0);
0470 serio_write(serio, HIL_PKT_CMD >> 8);
0471 serio_write(serio, HIL_CMD_IDD);
0472 error = wait_for_completion_killable(&dev->cmd_done);
0473 if (error)
0474 goto bail1;
0475
0476 reinit_completion(&dev->cmd_done);
0477 serio_write(serio, 0);
0478 serio_write(serio, 0);
0479 serio_write(serio, HIL_PKT_CMD >> 8);
0480 serio_write(serio, HIL_CMD_RSC);
0481 error = wait_for_completion_killable(&dev->cmd_done);
0482 if (error)
0483 goto bail1;
0484
0485 reinit_completion(&dev->cmd_done);
0486 serio_write(serio, 0);
0487 serio_write(serio, 0);
0488 serio_write(serio, HIL_PKT_CMD >> 8);
0489 serio_write(serio, HIL_CMD_RNM);
0490 error = wait_for_completion_killable(&dev->cmd_done);
0491 if (error)
0492 goto bail1;
0493
0494 reinit_completion(&dev->cmd_done);
0495 serio_write(serio, 0);
0496 serio_write(serio, 0);
0497 serio_write(serio, HIL_PKT_CMD >> 8);
0498 serio_write(serio, HIL_CMD_EXD);
0499 error = wait_for_completion_killable(&dev->cmd_done);
0500 if (error)
0501 goto bail1;
0502
0503 did = dev->idd[0];
0504 idd = dev->idd + 1;
0505
0506 switch (did & HIL_IDD_DID_TYPE_MASK) {
0507 case HIL_IDD_DID_TYPE_KB_INTEGRAL:
0508 case HIL_IDD_DID_TYPE_KB_ITF:
0509 case HIL_IDD_DID_TYPE_KB_RSVD:
0510 case HIL_IDD_DID_TYPE_CHAR:
0511 if (HIL_IDD_NUM_BUTTONS(idd) ||
0512 HIL_IDD_NUM_AXES_PER_SET(*idd)) {
0513 printk(KERN_INFO PREFIX
0514 "combo devices are not supported.\n");
0515 error = -EINVAL;
0516 goto bail1;
0517 }
0518
0519 dev->is_pointer = false;
0520 hil_dev_keyboard_setup(dev);
0521 break;
0522
0523 case HIL_IDD_DID_TYPE_REL:
0524 case HIL_IDD_DID_TYPE_ABS:
0525 dev->is_pointer = true;
0526 hil_dev_pointer_setup(dev);
0527 break;
0528
0529 default:
0530 goto bail1;
0531 }
0532
0533 input_dev->id.bustype = BUS_HIL;
0534 input_dev->id.vendor = PCI_VENDOR_ID_HP;
0535 input_dev->id.product = 0x0001;
0536 input_dev->id.version = 0x0100;
0537 input_dev->dev.parent = &serio->dev;
0538
0539 if (!dev->is_pointer) {
0540 serio_write(serio, 0);
0541 serio_write(serio, 0);
0542 serio_write(serio, HIL_PKT_CMD >> 8);
0543
0544 serio_write(serio, HIL_CMD_EK1);
0545
0546 }
0547
0548 error = input_register_device(input_dev);
0549 if (error)
0550 goto bail1;
0551
0552 return 0;
0553
0554 bail1:
0555 serio_close(serio);
0556 serio_set_drvdata(serio, NULL);
0557 bail0:
0558 input_free_device(input_dev);
0559 kfree(dev);
0560 return error;
0561 }
0562
0563 static const struct serio_device_id hil_dev_ids[] = {
0564 {
0565 .type = SERIO_HIL_MLC,
0566 .proto = SERIO_HIL,
0567 .id = SERIO_ANY,
0568 .extra = SERIO_ANY,
0569 },
0570 { 0 }
0571 };
0572
0573 MODULE_DEVICE_TABLE(serio, hil_dev_ids);
0574
0575 static struct serio_driver hil_serio_drv = {
0576 .driver = {
0577 .name = "hil_dev",
0578 },
0579 .description = "HP HIL keyboard/mouse/tablet driver",
0580 .id_table = hil_dev_ids,
0581 .connect = hil_dev_connect,
0582 .disconnect = hil_dev_disconnect,
0583 .interrupt = hil_dev_interrupt
0584 };
0585
0586 module_serio_driver(hil_serio_drv);