Lines Matching +full:5 +full:- +full:button
1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 2005 Zymeta Corporation - Michael Downey (downey@zymeta.com)
28 #define ZERO_MASK 0x1F /* 5 bits for a 0 */
34 #define STOP_MASK 0x1F /* 5 bits for the STOP sequence */
37 #define RECV_SIZE 8 /* The UIA-11 type have a 8 byte limit. */
41 * Currently there are 15 and 17 button models so RESERVED codes
88 u8 button; member
132 snprintf(codes + i * 3, 4, "%02x ", dev->in_buffer[i]); in keyspan_print()
134 dev_info(&dev->udev->dev, "%s\n", codes); in keyspan_print()
143 if (dev->data.bits_left >= bits_needed) in keyspan_load_tester()
150 if (dev->data.pos >= dev->data.len) { in keyspan_load_tester()
151 dev_dbg(&dev->interface->dev, in keyspan_load_tester()
152 "%s - Error ran out of data. pos: %d, len: %d\n", in keyspan_load_tester()
153 __func__, dev->data.pos, dev->data.len); in keyspan_load_tester()
154 return -1; in keyspan_load_tester()
158 while ((dev->data.bits_left + 7 < (sizeof(dev->data.tester) * 8)) && in keyspan_load_tester()
159 (dev->data.pos < dev->data.len)) { in keyspan_load_tester()
160 dev->data.tester += (dev->data.buffer[dev->data.pos++] << dev->data.bits_left); in keyspan_load_tester()
161 dev->data.bits_left += 8; in keyspan_load_tester()
167 static void keyspan_report_button(struct usb_keyspan *remote, int button, int press) in keyspan_report_button() argument
169 struct input_dev *input = remote->input; in keyspan_report_button()
171 input_event(input, EV_MSC, MSC_SCAN, button); in keyspan_report_button()
172 input_report_key(input, remote->keymap[button], press); in keyspan_report_button()
185 switch(remote->stage) { in keyspan_check_data()
191 for (i = 0; i < RECV_SIZE && remote->in_buffer[i] == GAP; ++i); in keyspan_check_data()
194 memcpy(remote->data.buffer, remote->in_buffer, RECV_SIZE); in keyspan_check_data()
195 remote->data.len = RECV_SIZE; in keyspan_check_data()
196 remote->data.pos = 0; in keyspan_check_data()
197 remote->data.tester = 0; in keyspan_check_data()
198 remote->data.bits_left = 0; in keyspan_check_data()
199 remote->stage = 1; in keyspan_check_data()
208 memcpy(remote->data.buffer + remote->data.len, remote->in_buffer, RECV_SIZE); in keyspan_check_data()
209 remote->data.len += RECV_SIZE; in keyspan_check_data()
212 while ((remote->data.bits_left >= 14 || remote->data.pos < remote->data.len) && !found) { in keyspan_check_data()
215 remote->stage = 0; in keyspan_check_data()
219 if ((remote->data.tester & SYNC_MASK) == SYNC) { in keyspan_check_data()
220 remote->data.tester = remote->data.tester >> 14; in keyspan_check_data()
221 remote->data.bits_left -= 14; in keyspan_check_data()
225 remote->data.tester = remote->data.tester >> 1; in keyspan_check_data()
226 --remote->data.bits_left; in keyspan_check_data()
232 remote->stage = 0; in keyspan_check_data()
233 remote->data.len = 0; in keyspan_check_data()
235 remote->stage = 2; in keyspan_check_data()
242 * message. We need to parse out the system code, button code, in keyspan_check_data()
245 memcpy(remote->data.buffer + remote->data.len, remote->in_buffer, RECV_SIZE); in keyspan_check_data()
246 remote->data.len += RECV_SIZE; in keyspan_check_data()
252 if ((remote->data.tester & ZERO_MASK) == ZERO) { in keyspan_check_data()
254 remote->data.tester = remote->data.tester >> 5; in keyspan_check_data()
255 remote->data.bits_left -= 5; in keyspan_check_data()
256 } else if ((remote->data.tester & ONE_MASK) == ONE) { in keyspan_check_data()
258 remote->data.tester = remote->data.tester >> 6; in keyspan_check_data()
259 remote->data.bits_left -= 6; in keyspan_check_data()
261 dev_err(&remote->interface->dev, in keyspan_check_data()
262 "%s - Unknown sequence found in system data.\n", in keyspan_check_data()
264 remote->stage = 0; in keyspan_check_data()
269 message.button = 0; in keyspan_check_data()
270 for (i = 0; i < 5; i++) { in keyspan_check_data()
273 if ((remote->data.tester & ZERO_MASK) == ZERO) { in keyspan_check_data()
274 message.button = message.button << 1; in keyspan_check_data()
275 remote->data.tester = remote->data.tester >> 5; in keyspan_check_data()
276 remote->data.bits_left -= 5; in keyspan_check_data()
277 } else if ((remote->data.tester & ONE_MASK) == ONE) { in keyspan_check_data()
278 message.button = (message.button << 1) + 1; in keyspan_check_data()
279 remote->data.tester = remote->data.tester >> 6; in keyspan_check_data()
280 remote->data.bits_left -= 6; in keyspan_check_data()
282 dev_err(&remote->interface->dev, in keyspan_check_data()
283 "%s - Unknown sequence found in button data.\n", in keyspan_check_data()
285 remote->stage = 0; in keyspan_check_data()
291 if ((remote->data.tester & ZERO_MASK) == ZERO) { in keyspan_check_data()
293 remote->data.tester = remote->data.tester >> 5; in keyspan_check_data()
294 remote->data.bits_left -= 5; in keyspan_check_data()
295 } else if ((remote->data.tester & ONE_MASK) == ONE) { in keyspan_check_data()
297 remote->data.tester = remote->data.tester >> 6; in keyspan_check_data()
298 remote->data.bits_left -= 6; in keyspan_check_data()
300 dev_err(&remote->interface->dev, in keyspan_check_data()
301 "%s - Error in message, invalid toggle.\n", in keyspan_check_data()
303 remote->stage = 0; in keyspan_check_data()
307 keyspan_load_tester(remote, 5); in keyspan_check_data()
308 if ((remote->data.tester & STOP_MASK) == STOP) { in keyspan_check_data()
309 remote->data.tester = remote->data.tester >> 5; in keyspan_check_data()
310 remote->data.bits_left -= 5; in keyspan_check_data()
312 dev_err(&remote->interface->dev, in keyspan_check_data()
316 dev_dbg(&remote->interface->dev, in keyspan_check_data()
317 "%s found valid message: system: %d, button: %d, toggle: %d\n", in keyspan_check_data()
318 __func__, message.system, message.button, message.toggle); in keyspan_check_data()
320 if (message.toggle != remote->toggle) { in keyspan_check_data()
321 keyspan_report_button(remote, message.button, 1); in keyspan_check_data()
322 keyspan_report_button(remote, message.button, 0); in keyspan_check_data()
323 remote->toggle = message.toggle; in keyspan_check_data()
326 remote->stage = 0; in keyspan_check_data()
342 dev_dbg(&dev->dev, "%s - failed to set bit rate due to error: %d\n", in keyspan_setup()
351 dev_dbg(&dev->dev, "%s - failed to set resume sensitivity due to error: %d\n", in keyspan_setup()
360 dev_dbg(&dev->dev, "%s - failed to turn receive on due to error: %d\n", in keyspan_setup()
365 dev_dbg(&dev->dev, "%s - Setup complete.\n", __func__); in keyspan_setup()
374 struct usb_keyspan *dev = urb->context; in keyspan_irq_recv()
378 switch (urb->status) { in keyspan_irq_recv()
383 case -ECONNRESET: in keyspan_irq_recv()
384 case -ENOENT: in keyspan_irq_recv()
385 case -ESHUTDOWN: in keyspan_irq_recv()
400 dev_err(&dev->interface->dev, in keyspan_irq_recv()
401 "%s - usb_submit_urb failed with result: %d\n", in keyspan_irq_recv()
409 remote->irq_urb->dev = remote->udev; in keyspan_open()
410 if (usb_submit_urb(remote->irq_urb, GFP_KERNEL)) in keyspan_open()
411 return -EIO; in keyspan_open()
420 usb_kill_urb(remote->irq_urb); in keyspan_close()
429 for (i = 0; i < iface->desc.bNumEndpoints; ++i) { in keyspan_get_in_endpoint()
430 endpoint = &iface->endpoint[i].desc; in keyspan_get_in_endpoint()
452 endpoint = keyspan_get_in_endpoint(interface->cur_altsetting); in keyspan_probe()
454 return -ENODEV; in keyspan_probe()
459 error = -ENOMEM; in keyspan_probe()
463 remote->udev = udev; in keyspan_probe()
464 remote->input = input_dev; in keyspan_probe()
465 remote->interface = interface; in keyspan_probe()
466 remote->in_endpoint = endpoint; in keyspan_probe()
467 …remote->toggle = -1; /* Set to -1 so we will always not match the toggle from the first remote mes… in keyspan_probe()
469 remote->in_buffer = usb_alloc_coherent(udev, RECV_SIZE, GFP_KERNEL, &remote->in_dma); in keyspan_probe()
470 if (!remote->in_buffer) { in keyspan_probe()
471 error = -ENOMEM; in keyspan_probe()
475 remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL); in keyspan_probe()
476 if (!remote->irq_urb) { in keyspan_probe()
477 error = -ENOMEM; in keyspan_probe()
483 error = -ENODEV; in keyspan_probe()
487 if (udev->manufacturer) in keyspan_probe()
488 strscpy(remote->name, udev->manufacturer, sizeof(remote->name)); in keyspan_probe()
490 if (udev->product) { in keyspan_probe()
491 if (udev->manufacturer) in keyspan_probe()
492 strlcat(remote->name, " ", sizeof(remote->name)); in keyspan_probe()
493 strlcat(remote->name, udev->product, sizeof(remote->name)); in keyspan_probe()
496 if (!strlen(remote->name)) in keyspan_probe()
497 snprintf(remote->name, sizeof(remote->name), in keyspan_probe()
499 le16_to_cpu(udev->descriptor.idVendor), in keyspan_probe()
500 le16_to_cpu(udev->descriptor.idProduct)); in keyspan_probe()
502 usb_make_path(udev, remote->phys, sizeof(remote->phys)); in keyspan_probe()
503 strlcat(remote->phys, "/input0", sizeof(remote->phys)); in keyspan_probe()
504 memcpy(remote->keymap, keyspan_key_table, sizeof(remote->keymap)); in keyspan_probe()
506 input_dev->name = remote->name; in keyspan_probe()
507 input_dev->phys = remote->phys; in keyspan_probe()
508 usb_to_input_id(udev, &input_dev->id); in keyspan_probe()
509 input_dev->dev.parent = &interface->dev; in keyspan_probe()
510 input_dev->keycode = remote->keymap; in keyspan_probe()
511 input_dev->keycodesize = sizeof(unsigned short); in keyspan_probe()
512 input_dev->keycodemax = ARRAY_SIZE(remote->keymap); in keyspan_probe()
515 __set_bit(EV_KEY, input_dev->evbit); in keyspan_probe()
517 __set_bit(keyspan_key_table[i], input_dev->keybit); in keyspan_probe()
518 __clear_bit(KEY_RESERVED, input_dev->keybit); in keyspan_probe()
522 input_dev->open = keyspan_open; in keyspan_probe()
523 input_dev->close = keyspan_close; in keyspan_probe()
529 usb_fill_int_urb(remote->irq_urb, in keyspan_probe()
530 remote->udev, in keyspan_probe()
531 usb_rcvintpipe(remote->udev, endpoint->bEndpointAddress), in keyspan_probe()
532 remote->in_buffer, RECV_SIZE, keyspan_irq_recv, remote, in keyspan_probe()
533 endpoint->bInterval); in keyspan_probe()
534 remote->irq_urb->transfer_dma = remote->in_dma; in keyspan_probe()
535 remote->irq_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in keyspan_probe()
538 error = input_register_device(remote->input); in keyspan_probe()
547 fail3: usb_free_urb(remote->irq_urb); in keyspan_probe()
548 fail2: usb_free_coherent(udev, RECV_SIZE, remote->in_buffer, remote->in_dma); in keyspan_probe()
566 input_unregister_device(remote->input); in keyspan_disconnect()
567 usb_kill_urb(remote->irq_urb); in keyspan_disconnect()
568 usb_free_urb(remote->irq_urb); in keyspan_disconnect()
569 usb_free_coherent(remote->udev, RECV_SIZE, remote->in_buffer, remote->in_dma); in keyspan_disconnect()