ir-functions.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /*
  2. * some common functions to handle infrared remote protocol decoding for
  3. * drivers which have not yet been (or can't be) converted to use the
  4. * regular protocol decoders...
  5. *
  6. * (c) 2003 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  21. */
  22. #include <linux/module.h>
  23. #include <linux/string.h>
  24. #include <linux/jiffies.h>
  25. #include <media/ir-common.h>
  26. #include "ir-core-priv.h"
  27. /* -------------------------------------------------------------------------- */
  28. MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
  29. MODULE_LICENSE("GPL");
  30. /* RC5 decoding stuff, moved from bttv-input.c to share it with
  31. * saa7134 */
  32. /* decode raw bit pattern to RC5 code */
  33. static u32 ir_rc5_decode(unsigned int code)
  34. {
  35. unsigned int org_code = code;
  36. unsigned int pair;
  37. unsigned int rc5 = 0;
  38. int i;
  39. for (i = 0; i < 14; ++i) {
  40. pair = code & 0x3;
  41. code >>= 2;
  42. rc5 <<= 1;
  43. switch (pair) {
  44. case 0:
  45. case 2:
  46. break;
  47. case 1:
  48. rc5 |= 1;
  49. break;
  50. case 3:
  51. IR_dprintk(1, "ir-common: ir_rc5_decode(%x) bad code\n", org_code);
  52. return 0;
  53. }
  54. }
  55. IR_dprintk(1, "ir-common: code=%x, rc5=%x, start=%x, toggle=%x, address=%x, "
  56. "instr=%x\n", rc5, org_code, RC5_START(rc5),
  57. RC5_TOGGLE(rc5), RC5_ADDR(rc5), RC5_INSTR(rc5));
  58. return rc5;
  59. }
  60. void ir_rc5_timer_end(unsigned long data)
  61. {
  62. struct card_ir *ir = (struct card_ir *)data;
  63. struct timeval tv;
  64. unsigned long current_jiffies;
  65. u32 gap;
  66. u32 rc5 = 0;
  67. /* get time */
  68. current_jiffies = jiffies;
  69. do_gettimeofday(&tv);
  70. /* avoid overflow with gap >1s */
  71. if (tv.tv_sec - ir->base_time.tv_sec > 1) {
  72. gap = 200000;
  73. } else {
  74. gap = 1000000 * (tv.tv_sec - ir->base_time.tv_sec) +
  75. tv.tv_usec - ir->base_time.tv_usec;
  76. }
  77. /* signal we're ready to start a new code */
  78. ir->active = 0;
  79. /* Allow some timer jitter (RC5 is ~24ms anyway so this is ok) */
  80. if (gap < 28000) {
  81. IR_dprintk(1, "ir-common: spurious timer_end\n");
  82. return;
  83. }
  84. if (ir->last_bit < 20) {
  85. /* ignore spurious codes (caused by light/other remotes) */
  86. IR_dprintk(1, "ir-common: short code: %x\n", ir->code);
  87. } else {
  88. ir->code = (ir->code << ir->shift_by) | 1;
  89. rc5 = ir_rc5_decode(ir->code);
  90. /* two start bits? */
  91. if (RC5_START(rc5) != ir->start) {
  92. IR_dprintk(1, "ir-common: rc5 start bits invalid: %u\n", RC5_START(rc5));
  93. /* right address? */
  94. } else if (RC5_ADDR(rc5) == ir->addr) {
  95. u32 toggle = RC5_TOGGLE(rc5);
  96. u32 instr = RC5_INSTR(rc5);
  97. /* Good code */
  98. ir_keydown(ir->dev, instr, toggle);
  99. IR_dprintk(1, "ir-common: instruction %x, toggle %x\n",
  100. instr, toggle);
  101. }
  102. }
  103. }
  104. EXPORT_SYMBOL_GPL(ir_rc5_timer_end);