0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/kernel.h>
0012 #include <linux/errno.h>
0013 #include <linux/slab.h>
0014 #include <linux/module.h>
0015 #include <linux/usb/input.h>
0016
0017
0018 static int debug;
0019 module_param(debug, int, 0444);
0020 MODULE_PARM_DESC(debug, "Enable extra debug messages and information");
0021
0022
0023 #define USB_KEYSPAN_VENDOR_ID 0x06CD
0024 #define USB_KEYSPAN_PRODUCT_UIA11 0x0202
0025
0026
0027 #define ZERO 0x18
0028 #define ZERO_MASK 0x1F
0029 #define ONE 0x3C
0030 #define ONE_MASK 0x3F
0031 #define SYNC 0x3F80
0032 #define SYNC_MASK 0x3FFF
0033 #define STOP 0x00
0034 #define STOP_MASK 0x1F
0035 #define GAP 0xFF
0036
0037 #define RECV_SIZE 8
0038
0039
0040
0041
0042
0043
0044 static const unsigned short keyspan_key_table[] = {
0045 KEY_RESERVED,
0046 KEY_RESERVED,
0047 KEY_STOP,
0048 KEY_PLAYCD,
0049 KEY_RESERVED,
0050 KEY_PREVIOUSSONG,
0051 KEY_REWIND,
0052 KEY_FORWARD,
0053 KEY_NEXTSONG,
0054 KEY_RESERVED,
0055 KEY_RESERVED,
0056 KEY_RESERVED,
0057 KEY_PAUSE,
0058 KEY_VOLUMEUP,
0059 KEY_RESERVED,
0060 KEY_RESERVED,
0061 KEY_RESERVED,
0062 KEY_VOLUMEDOWN,
0063 KEY_RESERVED,
0064 KEY_UP,
0065 KEY_RESERVED,
0066 KEY_MUTE,
0067 KEY_LEFT,
0068 KEY_ENTER,
0069 KEY_RIGHT,
0070 KEY_RESERVED,
0071 KEY_RESERVED,
0072 KEY_DOWN,
0073 KEY_RESERVED,
0074 KEY_KPASTERISK,
0075 KEY_RESERVED,
0076 KEY_MENU
0077 };
0078
0079
0080 static const struct usb_device_id keyspan_table[] = {
0081 { USB_DEVICE(USB_KEYSPAN_VENDOR_ID, USB_KEYSPAN_PRODUCT_UIA11) },
0082 { }
0083 };
0084
0085
0086 struct keyspan_message {
0087 u16 system;
0088 u8 button;
0089 u8 toggle;
0090 };
0091
0092
0093 struct bit_tester {
0094 u32 tester;
0095 int len;
0096 int pos;
0097 int bits_left;
0098 u8 buffer[32];
0099 };
0100
0101
0102 struct usb_keyspan {
0103 char name[128];
0104 char phys[64];
0105 unsigned short keymap[ARRAY_SIZE(keyspan_key_table)];
0106 struct usb_device *udev;
0107 struct input_dev *input;
0108 struct usb_interface *interface;
0109 struct usb_endpoint_descriptor *in_endpoint;
0110 struct urb* irq_urb;
0111 int open;
0112 dma_addr_t in_dma;
0113 unsigned char *in_buffer;
0114
0115
0116 struct bit_tester data;
0117 int stage;
0118 int toggle;
0119 };
0120
0121 static struct usb_driver keyspan_driver;
0122
0123
0124
0125
0126 static void keyspan_print(struct usb_keyspan* dev)
0127 {
0128 char codes[4 * RECV_SIZE];
0129 int i;
0130
0131 for (i = 0; i < RECV_SIZE; i++)
0132 snprintf(codes + i * 3, 4, "%02x ", dev->in_buffer[i]);
0133
0134 dev_info(&dev->udev->dev, "%s\n", codes);
0135 }
0136
0137
0138
0139
0140
0141 static int keyspan_load_tester(struct usb_keyspan* dev, int bits_needed)
0142 {
0143 if (dev->data.bits_left >= bits_needed)
0144 return 0;
0145
0146
0147
0148
0149
0150 if (dev->data.pos >= dev->data.len) {
0151 dev_dbg(&dev->interface->dev,
0152 "%s - Error ran out of data. pos: %d, len: %d\n",
0153 __func__, dev->data.pos, dev->data.len);
0154 return -1;
0155 }
0156
0157
0158 while ((dev->data.bits_left + 7 < (sizeof(dev->data.tester) * 8)) &&
0159 (dev->data.pos < dev->data.len)) {
0160 dev->data.tester += (dev->data.buffer[dev->data.pos++] << dev->data.bits_left);
0161 dev->data.bits_left += 8;
0162 }
0163
0164 return 0;
0165 }
0166
0167 static void keyspan_report_button(struct usb_keyspan *remote, int button, int press)
0168 {
0169 struct input_dev *input = remote->input;
0170
0171 input_event(input, EV_MSC, MSC_SCAN, button);
0172 input_report_key(input, remote->keymap[button], press);
0173 input_sync(input);
0174 }
0175
0176
0177
0178
0179 static void keyspan_check_data(struct usb_keyspan *remote)
0180 {
0181 int i;
0182 int found = 0;
0183 struct keyspan_message message;
0184
0185 switch(remote->stage) {
0186 case 0:
0187
0188
0189
0190
0191 for (i = 0; i < RECV_SIZE && remote->in_buffer[i] == GAP; ++i);
0192
0193 if (i < RECV_SIZE) {
0194 memcpy(remote->data.buffer, remote->in_buffer, RECV_SIZE);
0195 remote->data.len = RECV_SIZE;
0196 remote->data.pos = 0;
0197 remote->data.tester = 0;
0198 remote->data.bits_left = 0;
0199 remote->stage = 1;
0200 }
0201 break;
0202
0203 case 1:
0204
0205
0206
0207
0208 memcpy(remote->data.buffer + remote->data.len, remote->in_buffer, RECV_SIZE);
0209 remote->data.len += RECV_SIZE;
0210
0211 found = 0;
0212 while ((remote->data.bits_left >= 14 || remote->data.pos < remote->data.len) && !found) {
0213 for (i = 0; i < 8; ++i) {
0214 if (keyspan_load_tester(remote, 14) != 0) {
0215 remote->stage = 0;
0216 return;
0217 }
0218
0219 if ((remote->data.tester & SYNC_MASK) == SYNC) {
0220 remote->data.tester = remote->data.tester >> 14;
0221 remote->data.bits_left -= 14;
0222 found = 1;
0223 break;
0224 } else {
0225 remote->data.tester = remote->data.tester >> 1;
0226 --remote->data.bits_left;
0227 }
0228 }
0229 }
0230
0231 if (!found) {
0232 remote->stage = 0;
0233 remote->data.len = 0;
0234 } else {
0235 remote->stage = 2;
0236 }
0237 break;
0238
0239 case 2:
0240
0241
0242
0243
0244
0245 memcpy(remote->data.buffer + remote->data.len, remote->in_buffer, RECV_SIZE);
0246 remote->data.len += RECV_SIZE;
0247
0248 message.system = 0;
0249 for (i = 0; i < 9; i++) {
0250 keyspan_load_tester(remote, 6);
0251
0252 if ((remote->data.tester & ZERO_MASK) == ZERO) {
0253 message.system = message.system << 1;
0254 remote->data.tester = remote->data.tester >> 5;
0255 remote->data.bits_left -= 5;
0256 } else if ((remote->data.tester & ONE_MASK) == ONE) {
0257 message.system = (message.system << 1) + 1;
0258 remote->data.tester = remote->data.tester >> 6;
0259 remote->data.bits_left -= 6;
0260 } else {
0261 dev_err(&remote->interface->dev,
0262 "%s - Unknown sequence found in system data.\n",
0263 __func__);
0264 remote->stage = 0;
0265 return;
0266 }
0267 }
0268
0269 message.button = 0;
0270 for (i = 0; i < 5; i++) {
0271 keyspan_load_tester(remote, 6);
0272
0273 if ((remote->data.tester & ZERO_MASK) == ZERO) {
0274 message.button = message.button << 1;
0275 remote->data.tester = remote->data.tester >> 5;
0276 remote->data.bits_left -= 5;
0277 } else if ((remote->data.tester & ONE_MASK) == ONE) {
0278 message.button = (message.button << 1) + 1;
0279 remote->data.tester = remote->data.tester >> 6;
0280 remote->data.bits_left -= 6;
0281 } else {
0282 dev_err(&remote->interface->dev,
0283 "%s - Unknown sequence found in button data.\n",
0284 __func__);
0285 remote->stage = 0;
0286 return;
0287 }
0288 }
0289
0290 keyspan_load_tester(remote, 6);
0291 if ((remote->data.tester & ZERO_MASK) == ZERO) {
0292 message.toggle = 0;
0293 remote->data.tester = remote->data.tester >> 5;
0294 remote->data.bits_left -= 5;
0295 } else if ((remote->data.tester & ONE_MASK) == ONE) {
0296 message.toggle = 1;
0297 remote->data.tester = remote->data.tester >> 6;
0298 remote->data.bits_left -= 6;
0299 } else {
0300 dev_err(&remote->interface->dev,
0301 "%s - Error in message, invalid toggle.\n",
0302 __func__);
0303 remote->stage = 0;
0304 return;
0305 }
0306
0307 keyspan_load_tester(remote, 5);
0308 if ((remote->data.tester & STOP_MASK) == STOP) {
0309 remote->data.tester = remote->data.tester >> 5;
0310 remote->data.bits_left -= 5;
0311 } else {
0312 dev_err(&remote->interface->dev,
0313 "Bad message received, no stop bit found.\n");
0314 }
0315
0316 dev_dbg(&remote->interface->dev,
0317 "%s found valid message: system: %d, button: %d, toggle: %d\n",
0318 __func__, message.system, message.button, message.toggle);
0319
0320 if (message.toggle != remote->toggle) {
0321 keyspan_report_button(remote, message.button, 1);
0322 keyspan_report_button(remote, message.button, 0);
0323 remote->toggle = message.toggle;
0324 }
0325
0326 remote->stage = 0;
0327 break;
0328 }
0329 }
0330
0331
0332
0333
0334 static int keyspan_setup(struct usb_device* dev)
0335 {
0336 int retval = 0;
0337
0338 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
0339 0x11, 0x40, 0x5601, 0x0, NULL, 0,
0340 USB_CTRL_SET_TIMEOUT);
0341 if (retval) {
0342 dev_dbg(&dev->dev, "%s - failed to set bit rate due to error: %d\n",
0343 __func__, retval);
0344 return(retval);
0345 }
0346
0347 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
0348 0x44, 0x40, 0x0, 0x0, NULL, 0,
0349 USB_CTRL_SET_TIMEOUT);
0350 if (retval) {
0351 dev_dbg(&dev->dev, "%s - failed to set resume sensitivity due to error: %d\n",
0352 __func__, retval);
0353 return(retval);
0354 }
0355
0356 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
0357 0x22, 0x40, 0x0, 0x0, NULL, 0,
0358 USB_CTRL_SET_TIMEOUT);
0359 if (retval) {
0360 dev_dbg(&dev->dev, "%s - failed to turn receive on due to error: %d\n",
0361 __func__, retval);
0362 return(retval);
0363 }
0364
0365 dev_dbg(&dev->dev, "%s - Setup complete.\n", __func__);
0366 return(retval);
0367 }
0368
0369
0370
0371
0372 static void keyspan_irq_recv(struct urb *urb)
0373 {
0374 struct usb_keyspan *dev = urb->context;
0375 int retval;
0376
0377
0378 switch (urb->status) {
0379 case 0:
0380 break;
0381
0382
0383 case -ECONNRESET:
0384 case -ENOENT:
0385 case -ESHUTDOWN:
0386 return;
0387
0388 default:
0389 goto resubmit;
0390 }
0391
0392 if (debug)
0393 keyspan_print(dev);
0394
0395 keyspan_check_data(dev);
0396
0397 resubmit:
0398 retval = usb_submit_urb(urb, GFP_ATOMIC);
0399 if (retval)
0400 dev_err(&dev->interface->dev,
0401 "%s - usb_submit_urb failed with result: %d\n",
0402 __func__, retval);
0403 }
0404
0405 static int keyspan_open(struct input_dev *dev)
0406 {
0407 struct usb_keyspan *remote = input_get_drvdata(dev);
0408
0409 remote->irq_urb->dev = remote->udev;
0410 if (usb_submit_urb(remote->irq_urb, GFP_KERNEL))
0411 return -EIO;
0412
0413 return 0;
0414 }
0415
0416 static void keyspan_close(struct input_dev *dev)
0417 {
0418 struct usb_keyspan *remote = input_get_drvdata(dev);
0419
0420 usb_kill_urb(remote->irq_urb);
0421 }
0422
0423 static struct usb_endpoint_descriptor *keyspan_get_in_endpoint(struct usb_host_interface *iface)
0424 {
0425
0426 struct usb_endpoint_descriptor *endpoint;
0427 int i;
0428
0429 for (i = 0; i < iface->desc.bNumEndpoints; ++i) {
0430 endpoint = &iface->endpoint[i].desc;
0431
0432 if (usb_endpoint_is_int_in(endpoint)) {
0433
0434 return endpoint;
0435 }
0436 }
0437
0438 return NULL;
0439 }
0440
0441
0442
0443
0444 static int keyspan_probe(struct usb_interface *interface, const struct usb_device_id *id)
0445 {
0446 struct usb_device *udev = interface_to_usbdev(interface);
0447 struct usb_endpoint_descriptor *endpoint;
0448 struct usb_keyspan *remote;
0449 struct input_dev *input_dev;
0450 int i, error;
0451
0452 endpoint = keyspan_get_in_endpoint(interface->cur_altsetting);
0453 if (!endpoint)
0454 return -ENODEV;
0455
0456 remote = kzalloc(sizeof(*remote), GFP_KERNEL);
0457 input_dev = input_allocate_device();
0458 if (!remote || !input_dev) {
0459 error = -ENOMEM;
0460 goto fail1;
0461 }
0462
0463 remote->udev = udev;
0464 remote->input = input_dev;
0465 remote->interface = interface;
0466 remote->in_endpoint = endpoint;
0467 remote->toggle = -1;
0468
0469 remote->in_buffer = usb_alloc_coherent(udev, RECV_SIZE, GFP_KERNEL, &remote->in_dma);
0470 if (!remote->in_buffer) {
0471 error = -ENOMEM;
0472 goto fail1;
0473 }
0474
0475 remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
0476 if (!remote->irq_urb) {
0477 error = -ENOMEM;
0478 goto fail2;
0479 }
0480
0481 error = keyspan_setup(udev);
0482 if (error) {
0483 error = -ENODEV;
0484 goto fail3;
0485 }
0486
0487 if (udev->manufacturer)
0488 strlcpy(remote->name, udev->manufacturer, sizeof(remote->name));
0489
0490 if (udev->product) {
0491 if (udev->manufacturer)
0492 strlcat(remote->name, " ", sizeof(remote->name));
0493 strlcat(remote->name, udev->product, sizeof(remote->name));
0494 }
0495
0496 if (!strlen(remote->name))
0497 snprintf(remote->name, sizeof(remote->name),
0498 "USB Keyspan Remote %04x:%04x",
0499 le16_to_cpu(udev->descriptor.idVendor),
0500 le16_to_cpu(udev->descriptor.idProduct));
0501
0502 usb_make_path(udev, remote->phys, sizeof(remote->phys));
0503 strlcat(remote->phys, "/input0", sizeof(remote->phys));
0504 memcpy(remote->keymap, keyspan_key_table, sizeof(remote->keymap));
0505
0506 input_dev->name = remote->name;
0507 input_dev->phys = remote->phys;
0508 usb_to_input_id(udev, &input_dev->id);
0509 input_dev->dev.parent = &interface->dev;
0510 input_dev->keycode = remote->keymap;
0511 input_dev->keycodesize = sizeof(unsigned short);
0512 input_dev->keycodemax = ARRAY_SIZE(remote->keymap);
0513
0514 input_set_capability(input_dev, EV_MSC, MSC_SCAN);
0515 __set_bit(EV_KEY, input_dev->evbit);
0516 for (i = 0; i < ARRAY_SIZE(keyspan_key_table); i++)
0517 __set_bit(keyspan_key_table[i], input_dev->keybit);
0518 __clear_bit(KEY_RESERVED, input_dev->keybit);
0519
0520 input_set_drvdata(input_dev, remote);
0521
0522 input_dev->open = keyspan_open;
0523 input_dev->close = keyspan_close;
0524
0525
0526
0527
0528
0529 usb_fill_int_urb(remote->irq_urb,
0530 remote->udev,
0531 usb_rcvintpipe(remote->udev, endpoint->bEndpointAddress),
0532 remote->in_buffer, RECV_SIZE, keyspan_irq_recv, remote,
0533 endpoint->bInterval);
0534 remote->irq_urb->transfer_dma = remote->in_dma;
0535 remote->irq_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
0536
0537
0538 error = input_register_device(remote->input);
0539 if (error)
0540 goto fail3;
0541
0542
0543 usb_set_intfdata(interface, remote);
0544
0545 return 0;
0546
0547 fail3: usb_free_urb(remote->irq_urb);
0548 fail2: usb_free_coherent(udev, RECV_SIZE, remote->in_buffer, remote->in_dma);
0549 fail1: kfree(remote);
0550 input_free_device(input_dev);
0551
0552 return error;
0553 }
0554
0555
0556
0557
0558 static void keyspan_disconnect(struct usb_interface *interface)
0559 {
0560 struct usb_keyspan *remote;
0561
0562 remote = usb_get_intfdata(interface);
0563 usb_set_intfdata(interface, NULL);
0564
0565 if (remote) {
0566 input_unregister_device(remote->input);
0567 usb_kill_urb(remote->irq_urb);
0568 usb_free_urb(remote->irq_urb);
0569 usb_free_coherent(remote->udev, RECV_SIZE, remote->in_buffer, remote->in_dma);
0570 kfree(remote);
0571 }
0572 }
0573
0574
0575
0576
0577 static struct usb_driver keyspan_driver =
0578 {
0579 .name = "keyspan_remote",
0580 .probe = keyspan_probe,
0581 .disconnect = keyspan_disconnect,
0582 .id_table = keyspan_table
0583 };
0584
0585 module_usb_driver(keyspan_driver);
0586
0587 MODULE_DEVICE_TABLE(usb, keyspan_table);
0588 MODULE_AUTHOR("Michael Downey <downey@zymeta.com>");
0589 MODULE_DESCRIPTION("Driver for the USB Keyspan remote control.");
0590 MODULE_LICENSE("GPL");