rc5_ir.c
上传用户:super_houu
上传日期:2008-09-21
资源大小:4099k
文件大小:7k
源码类别:

DVD

开发平台:

Others

  1. // VESTEL RC5 PROTOCOL
  2. // AUTHOR : SEDEF KARA
  3. // DATE : 14.01.2003
  4. // Data size = 14 bits
  5. // 1 startup bit
  6. // 1 check bit that toggles to indicate a new button
  7. // Group size = 5 bits
  8. // Code size = 6 bits
  9. //
  10. // Example codes:
  11. //    _   _   _   _   _    __    _   __   _    __   _
  12. // ... |_| |_| |_| |_| |__|  |__| |_|  |_| |__|  |_| ... = 0xb2
  13. //     S   0   0   0   0  1  0  1   1  0   0  1  0
  14. //
  15. //    _   _   _   _   _    __    _   __   _    _   _
  16. // ... |_| |_| |_| |_| |__|  |__| |_|  |_| |__| |_| ... = 0xb3
  17. //     S   0   0   0   0  1  0  1   1  0   0  1   1
  18. //
  19. //  |  1778礢   |  1778礢   |  1778礢   |  1778礢   |  1778礢   |
  20. //              +-----+                       +-----+
  21. // 0 = ...      |      ...             1 = ...      |   ...
  22. //        +-----+                                   +-----+
  23. //         894礢 894礢                         894礢 894礢
  24. //
  25. #include "Config.h" // Global Configuration - do not remove!
  26. #include "Kernelker_api.h"
  27. #include "Kerneleventdef.h"
  28. #include "CPUcpu_api.h"
  29. #include "CPUTimefunc.h"
  30. #include "PlaycoreCoremaincoremain.h"
  31. #include "PlaycoreCoremaincoredefs.h"
  32. #include "PlaycoreCoremaincoregdef.h"
  33. #include "Remoteir_api.h"
  34. #include "Remoteir_ll.h"
  35. #include "Remoterc5_irrc5_ir.h"
  36. extern CONST WORD g_ir_system_code;
  37. extern CONST WORD g_ir_power_key_code;
  38. extern CONST WORD g_ir_eject_key_code;
  39. #define RC5_CHECK 1 // bit
  40. #define RC5_GROUPSIZE 5 // bits
  41. #define RC5_CODESIZE 6 // bits
  42. #define RC5_SHORTPULSE   894UL // 礢
  43. #define RC5_LONGPULSE 1778UL // 礢
  44. #define RC5_SPACE       88900UL  // 礢
  45. #define RC5_JITTER 200UL // 礢
  46. #define RC5_COMMANDGAP   30000UL // 礢
  47. #define Vestel_DVD 0x02
  48. // State of the remote key decoder
  49. #define ERROR    0
  50. #define IDLE      1
  51. #define HIGH_HEADER 2
  52. #define LOW_HEADER 3
  53. #define STARTUP 4
  54. #define DECODE 5
  55. #define RESYNC 6
  56. #define REPEAT_DELAY 5    // pre-delay before repeating.
  57. #define REPEAT_STEP 2     // delay between repeated events.
  58. void ir_init(void)
  59. {
  60. ir_interrupt_and_timer_init( FALLING_EDGE );
  61. }
  62. void ir_isr( void )
  63. {
  64. static BYTE interruptTypeFlag = 0;
  65.    static BYTE state = IDLE;
  66. static BYTE bitCount;
  67.    static BYTE decode;
  68.    static BYTE group;
  69.    static BYTE code;
  70. static BYTE bit = 0;
  71. static BYTE check = 1;
  72. static BYTE repeating = 0;
  73. static BYTE repeatDelay = REPEAT_DELAY; // Repeat code counter
  74.    static BYTE repeatStep=0;
  75.    static DWORD timeCountOld;
  76.    DWORD timeCount;
  77.    DWORD deltaTime;
  78.   BYTE validRepeat = 0;
  79.   BYTE key = 0;   // Hold the key code
  80.    timeCount =gen_timer();
  81.    deltaTime = timeCount - timeCountOld;
  82. timeCountOld = timeCount;
  83. if (!interruptTypeFlag)
  84.    {
  85.     ir_interrupt_set_edge( RISING_EDGE );
  86.          interruptTypeFlag = 1;
  87.    }
  88. else
  89. {
  90. ir_interrupt_set_edge( FALLING_EDGE );
  91.          interruptTypeFlag = 0;
  92.    }
  93.    switch (state) {
  94.      case ERROR:
  95.          // to be filled later when it is needed.
  96. state = IDLE;
  97. case IDLE:
  98. decode = TRUE;
  99. bitCount = 0;
  100. group = 0;
  101. code = 0;
  102.          bit = FALSE;
  103. if (deltaTime > RC5_SPACE)
  104. state = LOW_HEADER;
  105. else
  106. {
  107. state = ERROR;
  108. }
  109. break;
  110. case LOW_HEADER:
  111. if (deltaTime - RC5_JITTER < RC5_SHORTPULSE  &&  RC5_SHORTPULSE < deltaTime + RC5_JITTER)
  112. state = HIGH_HEADER;
  113. else
  114. {
  115. state = ERROR;
  116. }
  117. break;
  118. case HIGH_HEADER:
  119.          if (deltaTime - RC5_JITTER < RC5_SHORTPULSE  &&  RC5_SHORTPULSE < deltaTime + RC5_JITTER)
  120. state = DECODE;
  121. else
  122. {
  123. state = ERROR;
  124. }
  125. break;
  126. case DECODE:
  127. if (deltaTime - RC5_JITTER < RC5_SHORTPULSE  &&  RC5_SHORTPULSE < deltaTime + RC5_JITTER)
  128.          {
  129. decode = !decode;
  130.          }
  131. else if (deltaTime - RC5_JITTER < RC5_LONGPULSE  &&  RC5_LONGPULSE < deltaTime + RC5_JITTER)
  132. {
  133. bit = !bit;
  134. decode = TRUE;
  135. }
  136. else
  137. {
  138. state = ERROR;
  139. }
  140.    if (decode)
  141. {
  142. bitCount++;
  143. if (bitCount == 1)
  144.             {
  145.                if(bit == check)
  146.                {
  147.                 repeating = 1;
  148.                }
  149.                else
  150.                {
  151.                  repeating = 0;
  152.                }
  153.                check = bit;
  154.             }
  155. else if (bitCount > RC5_CHECK && bitCount <= RC5_CHECK + RC5_GROUPSIZE)
  156.             {
  157. group += bit << (RC5_CHECK + RC5_GROUPSIZE - bitCount);
  158.             }
  159. else
  160.             {
  161. code += bit << (RC5_CHECK + RC5_GROUPSIZE + RC5_CODESIZE - bitCount);
  162.             }
  163. if (bitCount == RC5_CHECK + RC5_GROUPSIZE + RC5_CODESIZE)
  164.             {
  165. if (group == Vestel_DVD)
  166.                {
  167.                   key = (BYTE)(0x00FF&code);
  168. // tr_printf(("Key is %02xn"));
  169. #if 0
  170. if (key == (BYTE)(0x00FF&g_ir_power_key_code))
  171. {
  172. switch(g_power_state)
  173. {
  174. case POWER_SEQUENCE_IN_ON_STATE:
  175. g_power_state = POWER_SEQUENCE_OFF_REQUESTED;
  176. break;
  177. case POWER_SEQUENCE_IN_OFF_STATE:
  178. g_power_state = POWER_SEQUENCE_ON_REQUESTED;
  179. break;
  180. case POWER_SEQUENCE_OFF_REQUESTED:
  181. g_power_state = POWER_SEQUENCE_ON_REQUESTED;
  182. cpu_soft_reset();
  183. }
  184. }
  185. #endif
  186.        switch(key)
  187.            {
  188.                 case IRKC_DOWN:
  189.                 case IRKC_UP:
  190.                 case IRKC_RIGHT:
  191.                 case IRKC_LEFT:
  192.                   validRepeat=1;
  193.                    break;
  194. #ifdef USE_SKIPF_KEY_FOR_STEPF_KEY_IN_PAUSE_MODE
  195. #ifdef D_VESTEL_REMOTE
  196.                 case IRKC_SKIPF: //BT021003: Add STEPF key repeating
  197.   if ( (gcs.pstate == PST_PAUSE) && (IS_COP_ENABLE(COP_STEP)) )
  198.   {
  199.                    validRepeat=1;
  200. break;
  201.   }
  202. #endif //D_VESTEL_REMOTE
  203. #endif //USE_SKIPF_KEY_FOR_STEPF_KEY_IN_PAUSE_MODE
  204.                 default:
  205.                   validRepeat=0;
  206.              }
  207.               if (repeating)
  208.                {
  209.    if(repeatDelay)
  210.                   {
  211.                      repeatDelay--;
  212.                   }
  213.                   else if (validRepeat)
  214.                   {
  215.                      if (!(repeatStep++ % REPEAT_STEP))
  216.         send_remote_event(((WORD)key)&0x00FF );
  217.                   }
  218.                }
  219. else
  220.                {
  221. repeatDelay = REPEAT_DELAY;
  222.                   send_remote_event(((WORD)key)&0x00FF);
  223. }
  224. if (bit)
  225.                { // LOW to HIGH transition of clock
  226. state = IDLE; // If_last bit is 1 then this is the last clock edge of stream
  227. ir_interrupt_set_edge( FALLING_EDGE );
  228.        interruptTypeFlag = 0;
  229.                }
  230. else // HIGH to LOW transition of clock
  231. state = RESYNC; // If_last bit is 0 then we need to wait for one more clock edge
  232.               }
  233.            }
  234.          }
  235. break;
  236. case RESYNC:
  237. if (deltaTime - RC5_JITTER < RC5_SHORTPULSE  &&  RC5_SHORTPULSE < deltaTime + RC5_JITTER){
  238. state = IDLE;
  239.    ir_interrupt_set_edge( FALLING_EDGE );
  240.          interruptTypeFlag = 0;
  241.          }
  242. else if (deltaTime - RC5_JITTER < RC5_LONGPULSE  &&  RC5_LONGPULSE < deltaTime + RC5_JITTER)
  243.          {
  244. state = IDLE;
  245.     ir_interrupt_set_edge( FALLING_EDGE );
  246.          interruptTypeFlag = 0;
  247.          }
  248. else
  249.          {
  250. state = ERROR;
  251.          }
  252.   break;
  253. default:
  254. state = ERROR;
  255. break;
  256.       }
  257.  }