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

DVD

开发平台:

Others

  1. /* **************************************************************************************
  2.  *  Copyright (c) 2002 ZORAN Corporation, All Rights Reserved
  3.  *  THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF ZORAN CORPORATION
  4.  *
  5.  *  File: $Workfile: nec_ir.c $             
  6.  *
  7.  * Description:
  8.  * ============
  9.  * NEC IR implementation
  10.  * 
  11.  * Log:
  12.  * ====
  13.  * $Revision: 17 $
  14.  * Last Modified by $Author: Rinata $ at $Modtime: 3/11/04 5:06p $ 
  15.  ****************************************************************************************
  16.  * Updates:
  17.  ****************************************************************************************
  18.  * $Log: /I76/I76_Common/I76_Reference/Remote/nec_ir/nec_ir.c $
  19.  * 
  20.  * 17    3/11/04 5:45p Rinata
  21.  * cpu check remote signal after v8 wake it up when remote signal was
  22.  * changed
  23.  * 
  24.  * 16    03-08-01 11:57 Wesleyj
  25.  * remove video_mode_detect 
  26.  * 
  27.  * 15    7/09/03 6:05p Mikex
  28.  * cancel transfer cpu_soft_reset() function on second standby key
  29.  * pressed. The cpu_soft_reset() function will be transfered by core task.
  30.  * 
  31.  * 14    03-07-07 16:14 Ivany
  32.  * Added a mapping table and condition for the keys which repeat-pressed
  33.  * message should not be sent when is pressed.
  34.  * 
  35.  * 13    03-06-19 17:08 Wesleyj
  36.  * add video_mode_detect charge  (Av in stat)
  37.  * 
  38.  * 12    03-06-17 18:28 Admin
  39.  * Merge for ExinoII project
  40.  * 
  41.  * 11    03-05-19 18:54 Kennyz
  42.  * Clear code.
  43.  * 
  44.  * 10    2/02/03 6:22p Lyncolnc
  45.  * Added LONG_REPEAT_DELAY.
  46.  * 
  47.  * 12    17/07/02 20:25 Nirm
  48.  * - Adjustments to timer_0 in order to increase timer-measurement
  49.  * accuracy throughout the system.
  50.  * 
  51.  * 11    5/28/02 18:47 Rinata
  52.  * FF and FB are not with valid repeat
  53.  * 
  54.  * 10    23/04/02 9:37 Nirm
  55.  * - Added dependency in "Config.h".
  56.  * 
  57.  * 9     7/03/02 17:45 Nirm
  58.  * Removed EMERGENCY_EJECT_ENABLED -> replaced by the Exceptioning
  59.  * mechanism.
  60.  * 
  61.  * 8     18/02/02 11:01 Atai
  62.  * make global to static
  63.  * 
  64.  * 7     2/17/02 12:21p Tomasp
  65.  * Code clean up.
  66.  * 
  67.  * 6     1/28/02 19:55 Rinata
  68.  * fix gen timer values for ir 
  69.  * 
  70.  * 5     9/01/02 16:58 Nirm
  71.  * Corrected Include-Paths.
  72.  * 
  73.  * 4     1/06/02 15:46 Rinata
  74.  * 
  75.  * 3     1/01/02 19:10 Atai
  76.  * Code cleaning
  77.  * 
  78.  * 2     25/12/01 12:29 Atai
  79.  * Code cleaning
  80.  **************************************************************************************** */
  81. #include "Config.h" // Global Configuration - do not remove!
  82. #ifndef EXINO_FP
  83. #include "Kernelker_api.h"
  84. #include "Kerneleventdef.h"
  85. #include "CPUcpu_api.h"
  86. #include "CPUTimefunc.h"
  87. #include "PlaycoreCoremaincoremain.h"
  88. #include "PlaycoreCoremaincoredefs.h"
  89. #include "PlaycoreCoremaincoregdef.h"
  90. #include "Remoteir_api.h"
  91. #include "Remoteir_ll.h"
  92. #ifdef ALCO_SD340E 
  93. #else
  94. //#include "Remotenec_irnec_ir.h"
  95. #endif
  96. #ifdef ALCO_SD340E 
  97. #include "CPUTimefunc.h"
  98. #ifdef I76_CPU_POWER_DOWN
  99. #include "DecoderDec_Power.h"
  100. #endif//I76_CPU_POWER_DOWN
  101. extern CONST WORD g_ir_play_key_code;
  102. #endif
  103. extern CONST WORD g_ir_system_code;
  104. extern CONST WORD g_ir_power_key_code;
  105. extern CONST WORD g_ir_eject_key_code;
  106. #ifdef MODIFIED_FOR_T1_2002
  107. extern const WORD g_ir_volume_up_key  ;//add for t1.
  108. extern const WORD g_ir_volume_down_key  ;//
  109. #endif
  110. #if defined(D_TEST)||defined(D_IRCODE_TEST)
  111. WORD ir_customer_code;
  112. #endif
  113. //the time increment for gen_time is 1.25us
  114. #define IR_MARGIN ((WORD)130UL)
  115. #define time_9000_us ((WORD)9000UL)
  116. #define time_4500_us ((WORD)4500UL)
  117. #define time_2250_us ((WORD)2250UL)
  118. #define time_1125_us ((WORD)1125UL)
  119. // State of the remote key decoder
  120. #define IDLE 0
  121. #define LEADER_ON 1
  122. #define LEADER_OFF 2
  123. #define CUSTOM 3
  124. #define DATA1 4
  125. #define DATA2 5
  126. // Hoe many repeat message will ignire before send it to the FSM's
  127. #ifdef LONG_REPEAT_DELAY
  128.   #define REPEAT_DELAY 25
  129. #else
  130.   #define REPEAT_DELAY 5
  131. #endif //LONG_REPEAT_DELAY
  132. #ifdef IR_NO_REPEAT_PULSE
  133. #define IR_INTERVAL 240/20
  134. BYTE last_key = 0;
  135. BYTE ir_interval = 0;
  136. #endif
  137. static unsigned long time_count_old;
  138. void ir_init(void)
  139. {
  140. ir_interrupt_and_timer_init( FALLING_EDGE );
  141. time_count_old = gen_timer();
  142. }
  143. #ifdef I76_CPU_POWER_DOWN
  144. #ifdef ALCO_SD340E 
  145. POWER_UP_KEY_STATUS power_up_pressed = POWER_UP_KEY_IDLE;
  146. #else
  147. int power_up_pressed = 0;
  148. #endif
  149. #endif // I76_CPU_POWER_DOWN
  150. void ir_isr( void )
  151. {
  152.     static BYTE key; // Hold the key code
  153. static BYTE repeat_delay = REPEAT_DELAY; // Repeat code counter
  154. static WORD custom; // Hold the custom (remote ID) code
  155.     static BYTE state = 0; // State holder
  156.     static BYTE count; // bits counter
  157.     static BYTE data1, data2; // Temporary for holding the decoded data
  158. static BYTE valid_repeat = 0;
  159. unsigned long time_count = gen_timer();
  160. unsigned long t0 = time_count - time_count_old;
  161.    switch (state) {
  162. case IDLE:
  163. time_count_old = time_count;
  164. ir_interrupt_set_edge(RISING_EDGE);
  165. state = LEADER_ON;
  166. break;
  167.     case LEADER_ON:
  168. time_count_old = time_count;
  169. ir_interrupt_set_edge(FALLING_EDGE);
  170. state =  ((t0>(time_9000_us-8*IR_MARGIN)) && (t0<(time_9000_us+8*IR_MARGIN))) ? LEADER_OFF:IDLE;
  171.       
  172. break;
  173.     case LEADER_OFF:
  174. if (t0 > time_4500_us - (4*IR_MARGIN) && t0 < time_4500_us + (4*IR_MARGIN)) 
  175. {
  176. state = CUSTOM;
  177. custom = 0;
  178. count = 0;
  179. repeat_delay = REPEAT_DELAY;
  180. else 
  181. {
  182. if (t0 > time_2250_us - (2*IR_MARGIN) && t0 < time_2250_us + (2*IR_MARGIN)) 
  183. {
  184. if (repeat_delay) {
  185. // Delay before sendnig the first repeat
  186. repeat_delay--;
  187. }
  188. else 
  189. {
  190. if (valid_repeat) 
  191. send_remote_event( REMOTE_KEY_REPEATED|key );
  192. }
  193. }
  194. ir_interrupt_set_edge(FALLING_EDGE);
  195. state = IDLE;
  196. }
  197. time_count_old = time_count;
  198. break;
  199.     case CUSTOM:
  200. time_count_old = time_count;
  201. if (t0 > time_1125_us - IR_MARGIN && t0 < time_1125_us + IR_MARGIN) {
  202. custom <<= 1; /* a zero bit */
  203. else {
  204. if (t0 > time_2250_us - (2*IR_MARGIN) && t0 < time_2250_us + (2*IR_MARGIN)) {
  205. custom = (custom << 1) | 1; /* a one bit */
  206. else {
  207. // Garbage ... ignored
  208. ir_interrupt_set_edge(FALLING_EDGE);
  209. state = IDLE;
  210. valid_repeat = 0;
  211. break;
  212. }
  213. }
  214. /* count 16 'custom' bits */
  215. if (++count == 16) {
  216. #if defined(D_TEST)||defined(D_IRCODE_TEST)
  217. ir_customer_code = custom;
  218. #else
  219. if (custom != g_ir_system_code) 
  220. {
  221. // Noise from other remote ... ignore
  222. ir_interrupt_set_edge(FALLING_EDGE);
  223. state = IDLE;
  224. valid_repeat = 0;
  225. break;
  226. }
  227. #endif
  228. state = DATA1;
  229. time_count_old = time_count;
  230. count = 0;
  231. data1 = 0;
  232. }
  233. break;
  234.     case DATA1:
  235. time_count_old = time_count;
  236. count++;
  237. if (t0 > time_1125_us - IR_MARGIN && t0 < time_1125_us + IR_MARGIN) {
  238. data1 <<= 1; /* a zero bit */
  239. else {
  240. if (t0 > time_2250_us - (2*IR_MARGIN) && t0 < time_2250_us + (2*IR_MARGIN)) {
  241. data1 = (data1 << 1) | 1; /* a one bit */
  242. else {
  243. ir_interrupt_set_edge(FALLING_EDGE);
  244. state = IDLE;
  245. valid_repeat = 0;
  246. break;
  247. }
  248. }
  249. if (count == 8) {
  250. state = DATA2;
  251. count = 0;
  252. data2 = 0;
  253. }
  254. break;
  255.     case DATA2:
  256. time_count_old = time_count;
  257. count++;
  258. if (t0 > time_1125_us - IR_MARGIN && t0 < time_1125_us + IR_MARGIN) {
  259. data2 <<= 1; /* a zero bit */
  260. else { 
  261. if (t0 > time_2250_us - (2*IR_MARGIN) && t0 < time_2250_us + (2*IR_MARGIN)) {
  262. data2 = (data2 << 1) | 1; /* a one bit */
  263. else {
  264. ir_interrupt_set_edge(FALLING_EDGE);
  265. state = IDLE;
  266. valid_repeat = 0;
  267. break;
  268. }
  269. }
  270. if (count == 8) 
  271. {
  272. ir_interrupt_set_edge(FALLING_EDGE);
  273. state = IDLE;
  274. if (data1 == (~data2 & 0xff)) 
  275. {
  276. key = (0x00FF&data1);
  277. tr_printf(("irtest:%2xn",key));
  278. #ifndef D_AUX_POWER_KEY//tecobest gxd 20051019
  279. if (key == (BYTE)(0x00FF&g_ir_power_key_code))
  280. switch(g_power_state)
  281. {
  282. case POWER_SEQUENCE_IN_ON_STATE:
  283. g_power_state = POWER_SEQUENCE_OFF_REQUESTED;
  284. break;
  285. case POWER_SEQUENCE_IN_OFF_STATE:
  286. g_power_state = POWER_SEQUENCE_ON_REQUESTED;
  287. break;
  288. case POWER_SEQUENCE_OFF_REQUESTED:
  289. g_power_state = POWER_SEQUENCE_ON_REQUESTED;
  290. cpu_soft_reset();
  291. }
  292. }
  293. #endif
  294. valid_repeat = 1;
  295. send_remote_event( ((WORD)key)&0x00FF );
  296. }
  297. }
  298. break;
  299.     }
  300. }
  301. #endif // EXINO_FP