dvb-usb-remote.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. /* dvb-usb-remote.c is part of the DVB USB library.
  2. *
  3. * Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@desy.de)
  4. * see dvb-usb-init.c for copyright information.
  5. *
  6. * This file contains functions for initializing the input-device and for handling remote-control-queries.
  7. */
  8. #include "dvb-usb-common.h"
  9. #include <linux/usb/input.h>
  10. static int dvb_usb_getkeycode(struct input_dev *dev,
  11. int scancode, int *keycode)
  12. {
  13. struct dvb_usb_device *d = input_get_drvdata(dev);
  14. struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
  15. int i;
  16. /* See if we can match the raw key code. */
  17. for (i = 0; i < d->props.rc_key_map_size; i++)
  18. if (keymap[i].scan == scancode) {
  19. *keycode = keymap[i].event;
  20. return 0;
  21. }
  22. /*
  23. * If is there extra space, returns KEY_RESERVED,
  24. * otherwise, input core won't let dvb_usb_setkeycode
  25. * to work
  26. */
  27. for (i = 0; i < d->props.rc_key_map_size; i++)
  28. if (keymap[i].event == KEY_RESERVED ||
  29. keymap[i].event == KEY_UNKNOWN) {
  30. *keycode = KEY_RESERVED;
  31. return 0;
  32. }
  33. return -EINVAL;
  34. }
  35. static int dvb_usb_setkeycode(struct input_dev *dev,
  36. int scancode, int keycode)
  37. {
  38. struct dvb_usb_device *d = input_get_drvdata(dev);
  39. struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
  40. int i;
  41. /* Search if it is replacing an existing keycode */
  42. for (i = 0; i < d->props.rc_key_map_size; i++)
  43. if (keymap[i].scan == scancode) {
  44. keymap[i].event = keycode;
  45. return 0;
  46. }
  47. /* Search if is there a clean entry. If so, use it */
  48. for (i = 0; i < d->props.rc_key_map_size; i++)
  49. if (keymap[i].event == KEY_RESERVED ||
  50. keymap[i].event == KEY_UNKNOWN) {
  51. keymap[i].scan = scancode;
  52. keymap[i].event = keycode;
  53. return 0;
  54. }
  55. /*
  56. * FIXME: Currently, it is not possible to increase the size of
  57. * scancode table. For it to happen, one possibility
  58. * would be to allocate a table with key_map_size + 1,
  59. * copying data, appending the new key on it, and freeing
  60. * the old one - or maybe just allocating some spare space
  61. */
  62. return -EINVAL;
  63. }
  64. /* Remote-control poll function - called every dib->rc_query_interval ms to see
  65. * whether the remote control has received anything.
  66. *
  67. * TODO: Fix the repeat rate of the input device.
  68. */
  69. static void dvb_usb_read_remote_control(struct work_struct *work)
  70. {
  71. struct dvb_usb_device *d =
  72. container_of(work, struct dvb_usb_device, rc_query_work.work);
  73. u32 event;
  74. int state;
  75. /* TODO: need a lock here. We can simply skip checking for the remote control
  76. if we're busy. */
  77. /* when the parameter has been set to 1 via sysfs while the driver was running */
  78. if (dvb_usb_disable_rc_polling)
  79. return;
  80. if (d->props.rc_query(d,&event,&state)) {
  81. err("error while querying for an remote control event.");
  82. goto schedule;
  83. }
  84. switch (state) {
  85. case REMOTE_NO_KEY_PRESSED:
  86. break;
  87. case REMOTE_KEY_PRESSED:
  88. deb_rc("key pressed\n");
  89. d->last_event = event;
  90. case REMOTE_KEY_REPEAT:
  91. deb_rc("key repeated\n");
  92. input_event(d->rc_input_dev, EV_KEY, event, 1);
  93. input_event(d->rc_input_dev, EV_KEY, d->last_event, 0);
  94. input_sync(d->rc_input_dev);
  95. break;
  96. default:
  97. break;
  98. }
  99. /* improved repeat handling ???
  100. switch (state) {
  101. case REMOTE_NO_KEY_PRESSED:
  102. deb_rc("NO KEY PRESSED\n");
  103. if (d->last_state != REMOTE_NO_KEY_PRESSED) {
  104. deb_rc("releasing event %d\n",d->last_event);
  105. input_event(d->rc_input_dev, EV_KEY, d->last_event, 0);
  106. input_sync(d->rc_input_dev);
  107. }
  108. d->last_state = REMOTE_NO_KEY_PRESSED;
  109. d->last_event = 0;
  110. break;
  111. case REMOTE_KEY_PRESSED:
  112. deb_rc("KEY PRESSED\n");
  113. deb_rc("pressing event %d\n",event);
  114. input_event(d->rc_input_dev, EV_KEY, event, 1);
  115. input_sync(d->rc_input_dev);
  116. d->last_event = event;
  117. d->last_state = REMOTE_KEY_PRESSED;
  118. break;
  119. case REMOTE_KEY_REPEAT:
  120. deb_rc("KEY_REPEAT\n");
  121. if (d->last_state != REMOTE_NO_KEY_PRESSED) {
  122. deb_rc("repeating event %d\n",d->last_event);
  123. input_event(d->rc_input_dev, EV_KEY, d->last_event, 2);
  124. input_sync(d->rc_input_dev);
  125. d->last_state = REMOTE_KEY_REPEAT;
  126. }
  127. default:
  128. break;
  129. }
  130. */
  131. schedule:
  132. schedule_delayed_work(&d->rc_query_work,msecs_to_jiffies(d->props.rc_interval));
  133. }
  134. int dvb_usb_remote_init(struct dvb_usb_device *d)
  135. {
  136. struct input_dev *input_dev;
  137. int i;
  138. int err;
  139. if (d->props.rc_key_map == NULL ||
  140. d->props.rc_query == NULL ||
  141. dvb_usb_disable_rc_polling)
  142. return 0;
  143. usb_make_path(d->udev, d->rc_phys, sizeof(d->rc_phys));
  144. strlcat(d->rc_phys, "/ir0", sizeof(d->rc_phys));
  145. input_dev = input_allocate_device();
  146. if (!input_dev)
  147. return -ENOMEM;
  148. input_dev->evbit[0] = BIT_MASK(EV_KEY);
  149. input_dev->name = "IR-receiver inside an USB DVB receiver";
  150. input_dev->phys = d->rc_phys;
  151. usb_to_input_id(d->udev, &input_dev->id);
  152. input_dev->dev.parent = &d->udev->dev;
  153. input_dev->getkeycode = dvb_usb_getkeycode;
  154. input_dev->setkeycode = dvb_usb_setkeycode;
  155. /* set the bits for the keys */
  156. deb_rc("key map size: %d\n", d->props.rc_key_map_size);
  157. for (i = 0; i < d->props.rc_key_map_size; i++) {
  158. deb_rc("setting bit for event %d item %d\n",
  159. d->props.rc_key_map[i].event, i);
  160. set_bit(d->props.rc_key_map[i].event, input_dev->keybit);
  161. }
  162. /* Start the remote-control polling. */
  163. if (d->props.rc_interval < 40)
  164. d->props.rc_interval = 100; /* default */
  165. /* setting these two values to non-zero, we have to manage key repeats */
  166. input_dev->rep[REP_PERIOD] = d->props.rc_interval;
  167. input_dev->rep[REP_DELAY] = d->props.rc_interval + 150;
  168. input_set_drvdata(input_dev, d);
  169. err = input_register_device(input_dev);
  170. if (err) {
  171. input_free_device(input_dev);
  172. return err;
  173. }
  174. d->rc_input_dev = input_dev;
  175. INIT_DELAYED_WORK(&d->rc_query_work, dvb_usb_read_remote_control);
  176. info("schedule remote query interval to %d msecs.", d->props.rc_interval);
  177. schedule_delayed_work(&d->rc_query_work,msecs_to_jiffies(d->props.rc_interval));
  178. d->state |= DVB_USB_STATE_REMOTE;
  179. return 0;
  180. }
  181. int dvb_usb_remote_exit(struct dvb_usb_device *d)
  182. {
  183. if (d->state & DVB_USB_STATE_REMOTE) {
  184. cancel_rearming_delayed_work(&d->rc_query_work);
  185. flush_scheduled_work();
  186. input_unregister_device(d->rc_input_dev);
  187. }
  188. d->state &= ~DVB_USB_STATE_REMOTE;
  189. return 0;
  190. }
  191. #define DVB_USB_RC_NEC_EMPTY 0x00
  192. #define DVB_USB_RC_NEC_KEY_PRESSED 0x01
  193. #define DVB_USB_RC_NEC_KEY_REPEATED 0x02
  194. int dvb_usb_nec_rc_key_to_event(struct dvb_usb_device *d,
  195. u8 keybuf[5], u32 *event, int *state)
  196. {
  197. int i;
  198. struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
  199. *event = 0;
  200. *state = REMOTE_NO_KEY_PRESSED;
  201. switch (keybuf[0]) {
  202. case DVB_USB_RC_NEC_EMPTY:
  203. break;
  204. case DVB_USB_RC_NEC_KEY_PRESSED:
  205. if ((u8) ~keybuf[1] != keybuf[2] ||
  206. (u8) ~keybuf[3] != keybuf[4]) {
  207. deb_err("remote control checksum failed.\n");
  208. break;
  209. }
  210. /* See if we can match the raw key code. */
  211. for (i = 0; i < d->props.rc_key_map_size; i++)
  212. if (rc5_custom(&keymap[i]) == keybuf[1] &&
  213. rc5_data(&keymap[i]) == keybuf[3]) {
  214. *event = keymap[i].event;
  215. *state = REMOTE_KEY_PRESSED;
  216. return 0;
  217. }
  218. deb_err("key mapping failed - no appropriate key found in keymapping\n");
  219. break;
  220. case DVB_USB_RC_NEC_KEY_REPEATED:
  221. *state = REMOTE_KEY_REPEAT;
  222. break;
  223. default:
  224. deb_err("unknown type of remote status: %d\n",keybuf[0]);
  225. break;
  226. }
  227. return 0;
  228. }
  229. EXPORT_SYMBOL(dvb_usb_nec_rc_key_to_event);