dvb-usb-remote.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  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. unsigned int scancode, unsigned 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. unsigned int scancode, unsigned 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_sync(d->rc_input_dev);
  94. input_event(d->rc_input_dev, EV_KEY, d->last_event, 0);
  95. input_sync(d->rc_input_dev);
  96. break;
  97. default:
  98. break;
  99. }
  100. /* improved repeat handling ???
  101. switch (state) {
  102. case REMOTE_NO_KEY_PRESSED:
  103. deb_rc("NO KEY PRESSED\n");
  104. if (d->last_state != REMOTE_NO_KEY_PRESSED) {
  105. deb_rc("releasing event %d\n",d->last_event);
  106. input_event(d->rc_input_dev, EV_KEY, d->last_event, 0);
  107. input_sync(d->rc_input_dev);
  108. }
  109. d->last_state = REMOTE_NO_KEY_PRESSED;
  110. d->last_event = 0;
  111. break;
  112. case REMOTE_KEY_PRESSED:
  113. deb_rc("KEY PRESSED\n");
  114. deb_rc("pressing event %d\n",event);
  115. input_event(d->rc_input_dev, EV_KEY, event, 1);
  116. input_sync(d->rc_input_dev);
  117. d->last_event = event;
  118. d->last_state = REMOTE_KEY_PRESSED;
  119. break;
  120. case REMOTE_KEY_REPEAT:
  121. deb_rc("KEY_REPEAT\n");
  122. if (d->last_state != REMOTE_NO_KEY_PRESSED) {
  123. deb_rc("repeating event %d\n",d->last_event);
  124. input_event(d->rc_input_dev, EV_KEY, d->last_event, 2);
  125. input_sync(d->rc_input_dev);
  126. d->last_state = REMOTE_KEY_REPEAT;
  127. }
  128. default:
  129. break;
  130. }
  131. */
  132. schedule:
  133. schedule_delayed_work(&d->rc_query_work,msecs_to_jiffies(d->props.rc_interval));
  134. }
  135. int dvb_usb_remote_init(struct dvb_usb_device *d)
  136. {
  137. struct input_dev *input_dev;
  138. int i;
  139. int err;
  140. if (d->props.rc_key_map == NULL ||
  141. d->props.rc_query == NULL ||
  142. dvb_usb_disable_rc_polling)
  143. return 0;
  144. usb_make_path(d->udev, d->rc_phys, sizeof(d->rc_phys));
  145. strlcat(d->rc_phys, "/ir0", sizeof(d->rc_phys));
  146. input_dev = input_allocate_device();
  147. if (!input_dev)
  148. return -ENOMEM;
  149. input_dev->evbit[0] = BIT_MASK(EV_KEY);
  150. input_dev->name = "IR-receiver inside an USB DVB receiver";
  151. input_dev->phys = d->rc_phys;
  152. usb_to_input_id(d->udev, &input_dev->id);
  153. input_dev->dev.parent = &d->udev->dev;
  154. input_dev->getkeycode = dvb_usb_getkeycode;
  155. input_dev->setkeycode = dvb_usb_setkeycode;
  156. /* set the bits for the keys */
  157. deb_rc("key map size: %d\n", d->props.rc_key_map_size);
  158. for (i = 0; i < d->props.rc_key_map_size; i++) {
  159. deb_rc("setting bit for event %d item %d\n",
  160. d->props.rc_key_map[i].event, i);
  161. set_bit(d->props.rc_key_map[i].event, input_dev->keybit);
  162. }
  163. /* Start the remote-control polling. */
  164. if (d->props.rc_interval < 40)
  165. d->props.rc_interval = 100; /* default */
  166. /* setting these two values to non-zero, we have to manage key repeats */
  167. input_dev->rep[REP_PERIOD] = d->props.rc_interval;
  168. input_dev->rep[REP_DELAY] = d->props.rc_interval + 150;
  169. input_set_drvdata(input_dev, d);
  170. err = input_register_device(input_dev);
  171. if (err) {
  172. input_free_device(input_dev);
  173. return err;
  174. }
  175. d->rc_input_dev = input_dev;
  176. INIT_DELAYED_WORK(&d->rc_query_work, dvb_usb_read_remote_control);
  177. info("schedule remote query interval to %d msecs.", d->props.rc_interval);
  178. schedule_delayed_work(&d->rc_query_work,msecs_to_jiffies(d->props.rc_interval));
  179. d->state |= DVB_USB_STATE_REMOTE;
  180. return 0;
  181. }
  182. int dvb_usb_remote_exit(struct dvb_usb_device *d)
  183. {
  184. if (d->state & DVB_USB_STATE_REMOTE) {
  185. cancel_rearming_delayed_work(&d->rc_query_work);
  186. flush_scheduled_work();
  187. input_unregister_device(d->rc_input_dev);
  188. }
  189. d->state &= ~DVB_USB_STATE_REMOTE;
  190. return 0;
  191. }
  192. #define DVB_USB_RC_NEC_EMPTY 0x00
  193. #define DVB_USB_RC_NEC_KEY_PRESSED 0x01
  194. #define DVB_USB_RC_NEC_KEY_REPEATED 0x02
  195. int dvb_usb_nec_rc_key_to_event(struct dvb_usb_device *d,
  196. u8 keybuf[5], u32 *event, int *state)
  197. {
  198. int i;
  199. struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
  200. *event = 0;
  201. *state = REMOTE_NO_KEY_PRESSED;
  202. switch (keybuf[0]) {
  203. case DVB_USB_RC_NEC_EMPTY:
  204. break;
  205. case DVB_USB_RC_NEC_KEY_PRESSED:
  206. if ((u8) ~keybuf[1] != keybuf[2] ||
  207. (u8) ~keybuf[3] != keybuf[4]) {
  208. deb_err("remote control checksum failed.\n");
  209. break;
  210. }
  211. /* See if we can match the raw key code. */
  212. for (i = 0; i < d->props.rc_key_map_size; i++)
  213. if (rc5_custom(&keymap[i]) == keybuf[1] &&
  214. rc5_data(&keymap[i]) == keybuf[3]) {
  215. *event = keymap[i].event;
  216. *state = REMOTE_KEY_PRESSED;
  217. return 0;
  218. }
  219. deb_err("key mapping failed - no appropriate key found in keymapping\n");
  220. break;
  221. case DVB_USB_RC_NEC_KEY_REPEATED:
  222. *state = REMOTE_KEY_REPEAT;
  223. break;
  224. default:
  225. deb_err("unknown type of remote status: %d\n",keybuf[0]);
  226. break;
  227. }
  228. return 0;
  229. }
  230. EXPORT_SYMBOL(dvb_usb_nec_rc_key_to_event);