dvb-usb-remote.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  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 legacy_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 ir_scancode *keymap = d->props.rc.legacy.rc_key_map;
  15. int i;
  16. /* See if we can match the raw key code. */
  17. for (i = 0; i < d->props.rc.legacy.rc_key_map_size; i++)
  18. if (keymap[i].scancode == scancode) {
  19. *keycode = keymap[i].keycode;
  20. return 0;
  21. }
  22. /*
  23. * If is there extra space, returns KEY_RESERVED,
  24. * otherwise, input core won't let legacy_dvb_usb_setkeycode
  25. * to work
  26. */
  27. for (i = 0; i < d->props.rc.legacy.rc_key_map_size; i++)
  28. if (keymap[i].keycode == KEY_RESERVED ||
  29. keymap[i].keycode == KEY_UNKNOWN) {
  30. *keycode = KEY_RESERVED;
  31. return 0;
  32. }
  33. return -EINVAL;
  34. }
  35. static int legacy_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 ir_scancode *keymap = d->props.rc.legacy.rc_key_map;
  40. int i;
  41. /* Search if it is replacing an existing keycode */
  42. for (i = 0; i < d->props.rc.legacy.rc_key_map_size; i++)
  43. if (keymap[i].scancode == scancode) {
  44. keymap[i].keycode = 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.legacy.rc_key_map_size; i++)
  49. if (keymap[i].keycode == KEY_RESERVED ||
  50. keymap[i].keycode == KEY_UNKNOWN) {
  51. keymap[i].scancode = scancode;
  52. keymap[i].keycode = 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 legacy_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.legacy.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.legacy.rc_interval));
  134. }
  135. static int legacy_dvb_usb_remote_init(struct dvb_usb_device *d,
  136. struct input_dev *input_dev)
  137. {
  138. int i, err, rc_interval;
  139. input_dev->getkeycode = legacy_dvb_usb_getkeycode;
  140. input_dev->setkeycode = legacy_dvb_usb_setkeycode;
  141. /* set the bits for the keys */
  142. deb_rc("key map size: %d\n", d->props.rc.legacy.rc_key_map_size);
  143. for (i = 0; i < d->props.rc.legacy.rc_key_map_size; i++) {
  144. deb_rc("setting bit for event %d item %d\n",
  145. d->props.rc.legacy.rc_key_map[i].keycode, i);
  146. set_bit(d->props.rc.legacy.rc_key_map[i].keycode, input_dev->keybit);
  147. }
  148. /* setting these two values to non-zero, we have to manage key repeats */
  149. input_dev->rep[REP_PERIOD] = d->props.rc.legacy.rc_interval;
  150. input_dev->rep[REP_DELAY] = d->props.rc.legacy.rc_interval + 150;
  151. input_set_drvdata(input_dev, d);
  152. err = input_register_device(input_dev);
  153. if (err)
  154. input_free_device(input_dev);
  155. rc_interval = d->props.rc.legacy.rc_interval;
  156. INIT_DELAYED_WORK(&d->rc_query_work, legacy_dvb_usb_read_remote_control);
  157. info("schedule remote query interval to %d msecs.", rc_interval);
  158. schedule_delayed_work(&d->rc_query_work,
  159. msecs_to_jiffies(rc_interval));
  160. d->state |= DVB_USB_STATE_REMOTE;
  161. return err;
  162. }
  163. /* Remote-control poll function - called every dib->rc_query_interval ms to see
  164. * whether the remote control has received anything.
  165. *
  166. * TODO: Fix the repeat rate of the input device.
  167. */
  168. static void dvb_usb_read_remote_control(struct work_struct *work)
  169. {
  170. struct dvb_usb_device *d =
  171. container_of(work, struct dvb_usb_device, rc_query_work.work);
  172. int err;
  173. /* TODO: need a lock here. We can simply skip checking for the remote control
  174. if we're busy. */
  175. /* when the parameter has been set to 1 via sysfs while the
  176. * driver was running, or when bulk mode is enabled after IR init
  177. */
  178. if (dvb_usb_disable_rc_polling || d->props.rc.core.bulk_mode)
  179. return;
  180. err = d->props.rc.core.rc_query(d);
  181. if (err)
  182. err("error %d while querying for an remote control event.", err);
  183. schedule_delayed_work(&d->rc_query_work,
  184. msecs_to_jiffies(d->props.rc.core.rc_interval));
  185. }
  186. static int rc_core_dvb_usb_remote_init(struct dvb_usb_device *d,
  187. struct input_dev *input_dev)
  188. {
  189. int err, rc_interval;
  190. d->props.rc.core.rc_props.priv = d;
  191. err = ir_input_register(input_dev,
  192. d->props.rc.core.rc_codes,
  193. &d->props.rc.core.rc_props,
  194. d->props.rc.core.module_name);
  195. if (err < 0)
  196. return err;
  197. if (!d->props.rc.core.rc_query || d->props.rc.core.bulk_mode)
  198. return 0;
  199. /* Polling mode - initialize a work queue for handling it */
  200. INIT_DELAYED_WORK(&d->rc_query_work, dvb_usb_read_remote_control);
  201. rc_interval = d->props.rc.core.rc_interval;
  202. info("schedule remote query interval to %d msecs.", rc_interval);
  203. schedule_delayed_work(&d->rc_query_work,
  204. msecs_to_jiffies(rc_interval));
  205. return 0;
  206. }
  207. int dvb_usb_remote_init(struct dvb_usb_device *d)
  208. {
  209. struct input_dev *input_dev;
  210. int err;
  211. if (dvb_usb_disable_rc_polling)
  212. return 0;
  213. if (d->props.rc.legacy.rc_key_map && d->props.rc.legacy.rc_query)
  214. d->props.rc.mode = DVB_RC_LEGACY;
  215. else if (d->props.rc.core.rc_codes)
  216. d->props.rc.mode = DVB_RC_CORE;
  217. else
  218. return 0;
  219. usb_make_path(d->udev, d->rc_phys, sizeof(d->rc_phys));
  220. strlcat(d->rc_phys, "/ir0", sizeof(d->rc_phys));
  221. input_dev = input_allocate_device();
  222. if (!input_dev)
  223. return -ENOMEM;
  224. input_dev->evbit[0] = BIT_MASK(EV_KEY);
  225. input_dev->name = "IR-receiver inside an USB DVB receiver";
  226. input_dev->phys = d->rc_phys;
  227. usb_to_input_id(d->udev, &input_dev->id);
  228. input_dev->dev.parent = &d->udev->dev;
  229. /* Start the remote-control polling. */
  230. if (d->props.rc.legacy.rc_interval < 40)
  231. d->props.rc.legacy.rc_interval = 100; /* default */
  232. d->rc_input_dev = input_dev;
  233. if (d->props.rc.mode == DVB_RC_LEGACY)
  234. err = legacy_dvb_usb_remote_init(d, input_dev);
  235. else
  236. err = rc_core_dvb_usb_remote_init(d, input_dev);
  237. if (err)
  238. return err;
  239. d->state |= DVB_USB_STATE_REMOTE;
  240. return 0;
  241. }
  242. int dvb_usb_remote_exit(struct dvb_usb_device *d)
  243. {
  244. if (d->state & DVB_USB_STATE_REMOTE) {
  245. cancel_rearming_delayed_work(&d->rc_query_work);
  246. flush_scheduled_work();
  247. if (d->props.rc.mode == DVB_RC_LEGACY)
  248. input_unregister_device(d->rc_input_dev);
  249. else
  250. ir_input_unregister(d->rc_input_dev);
  251. }
  252. d->state &= ~DVB_USB_STATE_REMOTE;
  253. return 0;
  254. }
  255. #define DVB_USB_RC_NEC_EMPTY 0x00
  256. #define DVB_USB_RC_NEC_KEY_PRESSED 0x01
  257. #define DVB_USB_RC_NEC_KEY_REPEATED 0x02
  258. int dvb_usb_nec_rc_key_to_event(struct dvb_usb_device *d,
  259. u8 keybuf[5], u32 *event, int *state)
  260. {
  261. int i;
  262. struct ir_scancode *keymap = d->props.rc.legacy.rc_key_map;
  263. *event = 0;
  264. *state = REMOTE_NO_KEY_PRESSED;
  265. switch (keybuf[0]) {
  266. case DVB_USB_RC_NEC_EMPTY:
  267. break;
  268. case DVB_USB_RC_NEC_KEY_PRESSED:
  269. if ((u8) ~keybuf[1] != keybuf[2] ||
  270. (u8) ~keybuf[3] != keybuf[4]) {
  271. deb_err("remote control checksum failed.\n");
  272. break;
  273. }
  274. /* See if we can match the raw key code. */
  275. for (i = 0; i < d->props.rc.legacy.rc_key_map_size; i++)
  276. if (rc5_custom(&keymap[i]) == keybuf[1] &&
  277. rc5_data(&keymap[i]) == keybuf[3]) {
  278. *event = keymap[i].keycode;
  279. *state = REMOTE_KEY_PRESSED;
  280. return 0;
  281. }
  282. deb_err("key mapping failed - no appropriate key found in keymapping\n");
  283. break;
  284. case DVB_USB_RC_NEC_KEY_REPEATED:
  285. *state = REMOTE_KEY_REPEAT;
  286. break;
  287. default:
  288. deb_err("unknown type of remote status: %d\n",keybuf[0]);
  289. break;
  290. }
  291. return 0;
  292. }
  293. EXPORT_SYMBOL(dvb_usb_nec_rc_key_to_event);