ir-lirc-codec.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. /* ir-lirc-codec.c - rc-core to classic lirc interface bridge
  2. *
  3. * Copyright (C) 2010 by Jarod Wilson <jarod@redhat.com>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation version 2 of the License.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. */
  14. #include <linux/sched.h>
  15. #include <linux/wait.h>
  16. #include <media/lirc.h>
  17. #include <media/lirc_dev.h>
  18. #include <media/rc-core.h>
  19. #include "rc-core-priv.h"
  20. #define LIRCBUF_SIZE 256
  21. /**
  22. * ir_lirc_raw_event() - Send raw IR data to lirc to be relayed to userspace
  23. *
  24. * @dev: the struct rc_dev descriptor of the device
  25. * @ev: the struct ir_raw_event descriptor of the pulse/space
  26. */
  27. void ir_lirc_raw_event(struct rc_dev *dev, struct ir_raw_event ev)
  28. {
  29. int sample;
  30. /* Packet start */
  31. if (ev.reset) {
  32. /* Userspace expects a long space event before the start of
  33. * the signal to use as a sync. This may be done with repeat
  34. * packets and normal samples. But if a reset has been sent
  35. * then we assume that a long time has passed, so we send a
  36. * space with the maximum time value. */
  37. sample = LIRC_SPACE(LIRC_VALUE_MASK);
  38. IR_dprintk(2, "delivering reset sync space to lirc_dev\n");
  39. /* Carrier reports */
  40. } else if (ev.carrier_report) {
  41. sample = LIRC_FREQUENCY(ev.carrier);
  42. IR_dprintk(2, "carrier report (freq: %d)\n", sample);
  43. /* Packet end */
  44. } else if (ev.timeout) {
  45. if (dev->gap)
  46. return;
  47. dev->gap_start = ktime_get();
  48. dev->gap = true;
  49. dev->gap_duration = ev.duration;
  50. if (!dev->send_timeout_reports)
  51. return;
  52. sample = LIRC_TIMEOUT(ev.duration / 1000);
  53. IR_dprintk(2, "timeout report (duration: %d)\n", sample);
  54. /* Normal sample */
  55. } else {
  56. if (dev->gap) {
  57. int gap_sample;
  58. dev->gap_duration += ktime_to_ns(ktime_sub(ktime_get(),
  59. dev->gap_start));
  60. /* Convert to ms and cap by LIRC_VALUE_MASK */
  61. do_div(dev->gap_duration, 1000);
  62. dev->gap_duration = min_t(u64, dev->gap_duration,
  63. LIRC_VALUE_MASK);
  64. gap_sample = LIRC_SPACE(dev->gap_duration);
  65. lirc_buffer_write(dev->lirc_dev->buf,
  66. (unsigned char *)&gap_sample);
  67. dev->gap = false;
  68. }
  69. sample = ev.pulse ? LIRC_PULSE(ev.duration / 1000) :
  70. LIRC_SPACE(ev.duration / 1000);
  71. IR_dprintk(2, "delivering %uus %s to lirc_dev\n",
  72. TO_US(ev.duration), TO_STR(ev.pulse));
  73. }
  74. lirc_buffer_write(dev->lirc_dev->buf,
  75. (unsigned char *) &sample);
  76. wake_up(&dev->lirc_dev->buf->wait_poll);
  77. }
  78. static ssize_t ir_lirc_transmit_ir(struct file *file, const char __user *buf,
  79. size_t n, loff_t *ppos)
  80. {
  81. struct rc_dev *dev = file->private_data;
  82. unsigned int *txbuf = NULL;
  83. struct ir_raw_event *raw = NULL;
  84. ssize_t ret = -EINVAL;
  85. size_t count;
  86. ktime_t start;
  87. s64 towait;
  88. unsigned int duration = 0; /* signal duration in us */
  89. int i;
  90. start = ktime_get();
  91. if (!dev->tx_ir) {
  92. ret = -EINVAL;
  93. goto out;
  94. }
  95. if (dev->send_mode == LIRC_MODE_SCANCODE) {
  96. struct lirc_scancode scan;
  97. if (n != sizeof(scan))
  98. return -EINVAL;
  99. if (copy_from_user(&scan, buf, sizeof(scan)))
  100. return -EFAULT;
  101. if (scan.flags || scan.keycode || scan.timestamp)
  102. return -EINVAL;
  103. raw = kmalloc_array(LIRCBUF_SIZE, sizeof(*raw), GFP_KERNEL);
  104. if (!raw)
  105. return -ENOMEM;
  106. ret = ir_raw_encode_scancode(scan.rc_proto, scan.scancode,
  107. raw, LIRCBUF_SIZE);
  108. if (ret < 0)
  109. goto out;
  110. count = ret;
  111. txbuf = kmalloc_array(count, sizeof(unsigned int), GFP_KERNEL);
  112. if (!txbuf) {
  113. ret = -ENOMEM;
  114. goto out;
  115. }
  116. for (i = 0; i < count; i++)
  117. /* Convert from NS to US */
  118. txbuf[i] = DIV_ROUND_UP(raw[i].duration, 1000);
  119. if (dev->s_tx_carrier) {
  120. int carrier = ir_raw_encode_carrier(scan.rc_proto);
  121. if (carrier > 0)
  122. dev->s_tx_carrier(dev, carrier);
  123. }
  124. } else {
  125. if (n < sizeof(unsigned int) || n % sizeof(unsigned int))
  126. return -EINVAL;
  127. count = n / sizeof(unsigned int);
  128. if (count > LIRCBUF_SIZE || count % 2 == 0)
  129. return -EINVAL;
  130. txbuf = memdup_user(buf, n);
  131. if (IS_ERR(txbuf))
  132. return PTR_ERR(txbuf);
  133. }
  134. for (i = 0; i < count; i++) {
  135. if (txbuf[i] > IR_MAX_DURATION / 1000 - duration || !txbuf[i]) {
  136. ret = -EINVAL;
  137. goto out;
  138. }
  139. duration += txbuf[i];
  140. }
  141. ret = dev->tx_ir(dev, txbuf, count);
  142. if (ret < 0)
  143. goto out;
  144. if (dev->send_mode == LIRC_MODE_SCANCODE) {
  145. ret = n;
  146. } else {
  147. for (duration = i = 0; i < ret; i++)
  148. duration += txbuf[i];
  149. ret *= sizeof(unsigned int);
  150. /*
  151. * The lircd gap calculation expects the write function to
  152. * wait for the actual IR signal to be transmitted before
  153. * returning.
  154. */
  155. towait = ktime_us_delta(ktime_add_us(start, duration),
  156. ktime_get());
  157. if (towait > 0) {
  158. set_current_state(TASK_INTERRUPTIBLE);
  159. schedule_timeout(usecs_to_jiffies(towait));
  160. }
  161. }
  162. out:
  163. kfree(txbuf);
  164. kfree(raw);
  165. return ret;
  166. }
  167. static long ir_lirc_ioctl(struct file *filep, unsigned int cmd,
  168. unsigned long arg)
  169. {
  170. struct rc_dev *dev = filep->private_data;
  171. u32 __user *argp = (u32 __user *)(arg);
  172. int ret = 0;
  173. __u32 val = 0, tmp;
  174. if (_IOC_DIR(cmd) & _IOC_WRITE) {
  175. ret = get_user(val, argp);
  176. if (ret)
  177. return ret;
  178. }
  179. switch (cmd) {
  180. /* mode support */
  181. case LIRC_GET_SEND_MODE:
  182. if (!dev->tx_ir)
  183. return -ENOTTY;
  184. val = dev->send_mode;
  185. break;
  186. case LIRC_SET_SEND_MODE:
  187. if (!dev->tx_ir)
  188. return -ENOTTY;
  189. if (!(val == LIRC_MODE_PULSE || val == LIRC_MODE_SCANCODE))
  190. return -EINVAL;
  191. dev->send_mode = val;
  192. return 0;
  193. /* TX settings */
  194. case LIRC_SET_TRANSMITTER_MASK:
  195. if (!dev->s_tx_mask)
  196. return -ENOTTY;
  197. return dev->s_tx_mask(dev, val);
  198. case LIRC_SET_SEND_CARRIER:
  199. if (!dev->s_tx_carrier)
  200. return -ENOTTY;
  201. return dev->s_tx_carrier(dev, val);
  202. case LIRC_SET_SEND_DUTY_CYCLE:
  203. if (!dev->s_tx_duty_cycle)
  204. return -ENOTTY;
  205. if (val <= 0 || val >= 100)
  206. return -EINVAL;
  207. return dev->s_tx_duty_cycle(dev, val);
  208. /* RX settings */
  209. case LIRC_SET_REC_CARRIER:
  210. if (!dev->s_rx_carrier_range)
  211. return -ENOTTY;
  212. if (val <= 0)
  213. return -EINVAL;
  214. return dev->s_rx_carrier_range(dev,
  215. dev->carrier_low,
  216. val);
  217. case LIRC_SET_REC_CARRIER_RANGE:
  218. if (!dev->s_rx_carrier_range)
  219. return -ENOTTY;
  220. if (val <= 0)
  221. return -EINVAL;
  222. dev->carrier_low = val;
  223. return 0;
  224. case LIRC_GET_REC_RESOLUTION:
  225. if (!dev->rx_resolution)
  226. return -ENOTTY;
  227. val = dev->rx_resolution / 1000;
  228. break;
  229. case LIRC_SET_WIDEBAND_RECEIVER:
  230. if (!dev->s_learning_mode)
  231. return -ENOTTY;
  232. return dev->s_learning_mode(dev, !!val);
  233. case LIRC_SET_MEASURE_CARRIER_MODE:
  234. if (!dev->s_carrier_report)
  235. return -ENOTTY;
  236. return dev->s_carrier_report(dev, !!val);
  237. /* Generic timeout support */
  238. case LIRC_GET_MIN_TIMEOUT:
  239. if (!dev->max_timeout)
  240. return -ENOTTY;
  241. val = DIV_ROUND_UP(dev->min_timeout, 1000);
  242. break;
  243. case LIRC_GET_MAX_TIMEOUT:
  244. if (!dev->max_timeout)
  245. return -ENOTTY;
  246. val = dev->max_timeout / 1000;
  247. break;
  248. case LIRC_SET_REC_TIMEOUT:
  249. if (!dev->max_timeout)
  250. return -ENOTTY;
  251. /* Check for multiply overflow */
  252. if (val > U32_MAX / 1000)
  253. return -EINVAL;
  254. tmp = val * 1000;
  255. if (tmp < dev->min_timeout || tmp > dev->max_timeout)
  256. return -EINVAL;
  257. if (dev->s_timeout)
  258. ret = dev->s_timeout(dev, tmp);
  259. if (!ret)
  260. dev->timeout = tmp;
  261. break;
  262. case LIRC_SET_REC_TIMEOUT_REPORTS:
  263. if (!dev->timeout)
  264. return -ENOTTY;
  265. dev->send_timeout_reports = !!val;
  266. break;
  267. default:
  268. return lirc_dev_fop_ioctl(filep, cmd, arg);
  269. }
  270. if (_IOC_DIR(cmd) & _IOC_READ)
  271. ret = put_user(val, argp);
  272. return ret;
  273. }
  274. static const struct file_operations lirc_fops = {
  275. .owner = THIS_MODULE,
  276. .write = ir_lirc_transmit_ir,
  277. .unlocked_ioctl = ir_lirc_ioctl,
  278. #ifdef CONFIG_COMPAT
  279. .compat_ioctl = ir_lirc_ioctl,
  280. #endif
  281. .read = lirc_dev_fop_read,
  282. .poll = lirc_dev_fop_poll,
  283. .open = lirc_dev_fop_open,
  284. .release = lirc_dev_fop_close,
  285. .llseek = no_llseek,
  286. };
  287. int ir_lirc_register(struct rc_dev *dev)
  288. {
  289. struct lirc_dev *ldev;
  290. int rc = -ENOMEM;
  291. unsigned long features = 0;
  292. ldev = lirc_allocate_device();
  293. if (!ldev)
  294. return rc;
  295. if (dev->driver_type != RC_DRIVER_IR_RAW_TX) {
  296. features |= LIRC_CAN_REC_MODE2;
  297. if (dev->rx_resolution)
  298. features |= LIRC_CAN_GET_REC_RESOLUTION;
  299. }
  300. if (dev->tx_ir) {
  301. features |= LIRC_CAN_SEND_PULSE | LIRC_CAN_SEND_SCANCODE;
  302. if (dev->s_tx_mask)
  303. features |= LIRC_CAN_SET_TRANSMITTER_MASK;
  304. if (dev->s_tx_carrier)
  305. features |= LIRC_CAN_SET_SEND_CARRIER;
  306. if (dev->s_tx_duty_cycle)
  307. features |= LIRC_CAN_SET_SEND_DUTY_CYCLE;
  308. }
  309. if (dev->s_rx_carrier_range)
  310. features |= LIRC_CAN_SET_REC_CARRIER |
  311. LIRC_CAN_SET_REC_CARRIER_RANGE;
  312. if (dev->s_learning_mode)
  313. features |= LIRC_CAN_USE_WIDEBAND_RECEIVER;
  314. if (dev->s_carrier_report)
  315. features |= LIRC_CAN_MEASURE_CARRIER;
  316. if (dev->max_timeout)
  317. features |= LIRC_CAN_SET_REC_TIMEOUT;
  318. snprintf(ldev->name, sizeof(ldev->name), "ir-lirc-codec (%s)",
  319. dev->driver_name);
  320. ldev->features = features;
  321. ldev->buf = NULL;
  322. ldev->chunk_size = sizeof(int);
  323. ldev->buffer_size = LIRCBUF_SIZE;
  324. ldev->fops = &lirc_fops;
  325. ldev->dev.parent = &dev->dev;
  326. ldev->rdev = dev;
  327. ldev->owner = THIS_MODULE;
  328. rc = lirc_register_device(ldev);
  329. if (rc < 0)
  330. goto out;
  331. dev->send_mode = LIRC_MODE_PULSE;
  332. dev->lirc_dev = ldev;
  333. return 0;
  334. out:
  335. lirc_free_device(ldev);
  336. return rc;
  337. }
  338. void ir_lirc_unregister(struct rc_dev *dev)
  339. {
  340. lirc_unregister_device(dev->lirc_dev);
  341. dev->lirc_dev = NULL;
  342. }