dvb-usb-remote.c 9.9 KB

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