ir-nec-decoder.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. /* ir-nec-decoder.c - handle NEC IR Pulse/Space protocol
  2. *
  3. * Copyright (C) 2010 by Mauro Carvalho Chehab <mchehab@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 <media/ir-core.h>
  15. #include <linux/bitrev.h>
  16. #define NEC_NBITS 32
  17. #define NEC_UNIT 562500 /* ns */
  18. #define NEC_HEADER_PULSE PULSE(16)
  19. #define NEC_HEADER_SPACE SPACE(8)
  20. #define NEC_REPEAT_SPACE SPACE(4)
  21. #define NEC_BIT_PULSE PULSE(1)
  22. #define NEC_BIT_0_SPACE SPACE(1)
  23. #define NEC_BIT_1_SPACE SPACE(3)
  24. /* Used to register nec_decoder clients */
  25. static LIST_HEAD(decoder_list);
  26. static DEFINE_SPINLOCK(decoder_lock);
  27. enum nec_state {
  28. STATE_INACTIVE,
  29. STATE_HEADER_SPACE,
  30. STATE_BIT_PULSE,
  31. STATE_BIT_SPACE,
  32. STATE_TRAILER_PULSE,
  33. STATE_TRAILER_SPACE,
  34. };
  35. struct decoder_data {
  36. struct list_head list;
  37. struct ir_input_dev *ir_dev;
  38. int enabled:1;
  39. /* State machine control */
  40. enum nec_state state;
  41. u32 nec_bits;
  42. unsigned count;
  43. };
  44. /**
  45. * get_decoder_data() - gets decoder data
  46. * @input_dev: input device
  47. *
  48. * Returns the struct decoder_data that corresponds to a device
  49. */
  50. static struct decoder_data *get_decoder_data(struct ir_input_dev *ir_dev)
  51. {
  52. struct decoder_data *data = NULL;
  53. spin_lock(&decoder_lock);
  54. list_for_each_entry(data, &decoder_list, list) {
  55. if (data->ir_dev == ir_dev)
  56. break;
  57. }
  58. spin_unlock(&decoder_lock);
  59. return data;
  60. }
  61. static ssize_t store_enabled(struct device *d,
  62. struct device_attribute *mattr,
  63. const char *buf,
  64. size_t len)
  65. {
  66. unsigned long value;
  67. struct ir_input_dev *ir_dev = dev_get_drvdata(d);
  68. struct decoder_data *data = get_decoder_data(ir_dev);
  69. if (!data)
  70. return -EINVAL;
  71. if (strict_strtoul(buf, 10, &value) || value > 1)
  72. return -EINVAL;
  73. data->enabled = value;
  74. return len;
  75. }
  76. static ssize_t show_enabled(struct device *d,
  77. struct device_attribute *mattr, char *buf)
  78. {
  79. struct ir_input_dev *ir_dev = dev_get_drvdata(d);
  80. struct decoder_data *data = get_decoder_data(ir_dev);
  81. if (!data)
  82. return -EINVAL;
  83. if (data->enabled)
  84. return sprintf(buf, "1\n");
  85. else
  86. return sprintf(buf, "0\n");
  87. }
  88. static DEVICE_ATTR(enabled, S_IRUGO | S_IWUSR, show_enabled, store_enabled);
  89. static struct attribute *decoder_attributes[] = {
  90. &dev_attr_enabled.attr,
  91. NULL
  92. };
  93. static struct attribute_group decoder_attribute_group = {
  94. .name = "nec_decoder",
  95. .attrs = decoder_attributes,
  96. };
  97. /**
  98. * ir_nec_decode() - Decode one NEC pulse or space
  99. * @input_dev: the struct input_dev descriptor of the device
  100. * @duration: duration in ns of pulse/space
  101. *
  102. * This function returns -EINVAL if the pulse violates the state machine
  103. */
  104. static int ir_nec_decode(struct input_dev *input_dev, s64 duration)
  105. {
  106. struct decoder_data *data;
  107. struct ir_input_dev *ir_dev = input_get_drvdata(input_dev);
  108. int u;
  109. u32 scancode;
  110. u8 address, not_address, command, not_command;
  111. data = get_decoder_data(ir_dev);
  112. if (!data)
  113. return -EINVAL;
  114. if (!data->enabled)
  115. return 0;
  116. if (IS_RESET(duration)) {
  117. data->state = STATE_INACTIVE;
  118. return 0;
  119. }
  120. u = TO_UNITS(duration, NEC_UNIT);
  121. if (DURATION(u) == 0)
  122. goto out;
  123. IR_dprintk(2, "NEC decode started at state %d (%i units, %ius)\n",
  124. data->state, u, TO_US(duration));
  125. switch (data->state) {
  126. case STATE_INACTIVE:
  127. if (u == NEC_HEADER_PULSE) {
  128. data->count = 0;
  129. data->state = STATE_HEADER_SPACE;
  130. }
  131. return 0;
  132. case STATE_HEADER_SPACE:
  133. if (u == NEC_HEADER_SPACE) {
  134. data->state = STATE_BIT_PULSE;
  135. return 0;
  136. } else if (u == NEC_REPEAT_SPACE) {
  137. ir_repeat(input_dev);
  138. IR_dprintk(1, "Repeat last key\n");
  139. data->state = STATE_TRAILER_PULSE;
  140. return 0;
  141. }
  142. break;
  143. case STATE_BIT_PULSE:
  144. if (u == NEC_BIT_PULSE) {
  145. data->state = STATE_BIT_SPACE;
  146. return 0;
  147. }
  148. break;
  149. case STATE_BIT_SPACE:
  150. if (u != NEC_BIT_0_SPACE && u != NEC_BIT_1_SPACE)
  151. break;
  152. data->nec_bits <<= 1;
  153. if (u == NEC_BIT_1_SPACE)
  154. data->nec_bits |= 1;
  155. data->count++;
  156. if (data->count != NEC_NBITS) {
  157. data->state = STATE_BIT_PULSE;
  158. return 0;
  159. }
  160. address = bitrev8((data->nec_bits >> 24) & 0xff);
  161. not_address = bitrev8((data->nec_bits >> 16) & 0xff);
  162. command = bitrev8((data->nec_bits >> 8) & 0xff);
  163. not_command = bitrev8((data->nec_bits >> 0) & 0xff);
  164. if ((command ^ not_command) != 0xff) {
  165. IR_dprintk(1, "NEC checksum error: received 0x%08x\n",
  166. data->nec_bits);
  167. break;
  168. }
  169. if ((address ^ not_address) != 0xff) {
  170. /* Extended NEC */
  171. scancode = address << 16 |
  172. not_address << 8 |
  173. command;
  174. IR_dprintk(1, "NEC (Ext) scancode 0x%06x\n", scancode);
  175. } else {
  176. /* normal NEC */
  177. scancode = address << 8 | command;
  178. IR_dprintk(1, "NEC scancode 0x%04x\n", scancode);
  179. }
  180. ir_keydown(input_dev, scancode, 0);
  181. data->state = STATE_TRAILER_PULSE;
  182. return 0;
  183. case STATE_TRAILER_PULSE:
  184. if (u > 0) {
  185. data->state = STATE_TRAILER_SPACE;
  186. return 0;
  187. }
  188. break;
  189. case STATE_TRAILER_SPACE:
  190. if (u < 0) {
  191. data->state = STATE_INACTIVE;
  192. return 0;
  193. }
  194. break;
  195. }
  196. out:
  197. IR_dprintk(1, "NEC decode failed at state %d (%i units, %ius)\n",
  198. data->state, u, TO_US(duration));
  199. data->state = STATE_INACTIVE;
  200. return -EINVAL;
  201. }
  202. static int ir_nec_register(struct input_dev *input_dev)
  203. {
  204. struct ir_input_dev *ir_dev = input_get_drvdata(input_dev);
  205. struct decoder_data *data;
  206. int rc;
  207. rc = sysfs_create_group(&ir_dev->dev.kobj, &decoder_attribute_group);
  208. if (rc < 0)
  209. return rc;
  210. data = kzalloc(sizeof(*data), GFP_KERNEL);
  211. if (!data) {
  212. sysfs_remove_group(&ir_dev->dev.kobj, &decoder_attribute_group);
  213. return -ENOMEM;
  214. }
  215. data->ir_dev = ir_dev;
  216. data->enabled = 1;
  217. spin_lock(&decoder_lock);
  218. list_add_tail(&data->list, &decoder_list);
  219. spin_unlock(&decoder_lock);
  220. return 0;
  221. }
  222. static int ir_nec_unregister(struct input_dev *input_dev)
  223. {
  224. struct ir_input_dev *ir_dev = input_get_drvdata(input_dev);
  225. static struct decoder_data *data;
  226. data = get_decoder_data(ir_dev);
  227. if (!data)
  228. return 0;
  229. sysfs_remove_group(&ir_dev->dev.kobj, &decoder_attribute_group);
  230. spin_lock(&decoder_lock);
  231. list_del(&data->list);
  232. spin_unlock(&decoder_lock);
  233. return 0;
  234. }
  235. static struct ir_raw_handler nec_handler = {
  236. .decode = ir_nec_decode,
  237. .raw_register = ir_nec_register,
  238. .raw_unregister = ir_nec_unregister,
  239. };
  240. static int __init ir_nec_decode_init(void)
  241. {
  242. ir_raw_handler_register(&nec_handler);
  243. printk(KERN_INFO "IR NEC protocol handler initialized\n");
  244. return 0;
  245. }
  246. static void __exit ir_nec_decode_exit(void)
  247. {
  248. ir_raw_handler_unregister(&nec_handler);
  249. }
  250. module_init(ir_nec_decode_init);
  251. module_exit(ir_nec_decode_exit);
  252. MODULE_LICENSE("GPL");
  253. MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>");
  254. MODULE_AUTHOR("Red Hat Inc. (http://www.redhat.com)");
  255. MODULE_DESCRIPTION("NEC IR protocol decoder");