appblast.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:33k
源码类别:

DVD

开发平台:

C/C++

  1. /* =======================
  2.  * IMPROVEMENTS THOUGHT OF
  3.  * =======================
  4.  *
  5.  * =====================
  6.  * MODIFICATION HISTORY: 
  7.  * =====================
  8.  *
  9.  * Date    Initials  Modification
  10.  * ----      --------  ------------
  11.  * 18.03.2002   TM      CREATED
  12.  * 03.02.03     TM Adapt to new STBLAST
  13.  * 03.08.03     TM Adapt to 5517 mboard
  14.  */
  15. /* Includes --------------------------------------------------------------- */
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <string.h>
  19. #include "stlite.h"                     /* System */
  20. #include "stdevice.h"
  21. #include "stddefs.h"
  22. #include "stcommon.h" 
  23. #include "stsys.h"
  24. #include "stblast.h"                    /* STAPI */
  25. #include "stboot.h"                     /* Dependencies */
  26. #include "sttbx.h"
  27. #include "stevt.h"
  28. #include "usif.h"
  29. #include "sing_data.h"
  30. #include "appblast.h"
  31. #include "blast.h"
  32. #include "rckeymap.h"
  33. #include "osp.h"
  34. #if 0     /* BLOCK COMMENTED OUT by Louie on 9/23/2004 */
  35. #undef USE_RC5_REMOTE
  36. #endif /* BLOCK COMMENT */
  37. #pragma ST_device (device_access8_t)
  38. typedef volatile U8 device_access8_t;
  39. #ifdef INTEGRATE_FRONT_PANEL_KEYBOARD
  40. #define PIO_OUT                         0 
  41. #define PIO_OUT_SET                     (1 * 4)
  42. #define PIO_OUT_CLR                     (2 * 4)
  43. #define PIO_IN                          (4 * 4)
  44. #define PIO_C0                          (8 * 4)
  45. #define PIO_C0_SET                      (9 * 4)
  46. #define PIO_C0_CLR                      (10 * 4)
  47. #define PIO_C1                          (12 * 4)
  48. #define PIO_C1_SET                      (13 * 4)
  49. #define PIO_C1_CLR                      (14 * 4)
  50. #define PIO_C2                          (16 * 4)
  51. #define PIO_C2_SET                      (17 * 4)
  52. #define PIO_C2_CLR                      (18 * 4)
  53.            
  54. #define KEYBOARD_SENSE_PIO_ADDRESS PIO_3_BASE_ADDRESS
  55. #define KEYBOARD_SCAN1_PIO_ADDRESS PIO_4_BASE_ADDRESS
  56. #define KEYBOARD_SCAN1_BIT PIO_BIT_0 /* PIO2.0 */
  57. #define KEYBOARD_SENSE_MASK 0xF0 /*0x0F*/ /*four key bits */
  58. #define NO_OF_FRONT_PANEL_KEY_SENSE_BITS 4
  59. device_access8_t * Keyboard_sense_p = (device_access8_t *) KEYBOARD_SENSE_PIO_ADDRESS;
  60. /*
  61.  * VICKY - 08.10.98
  62.  * modified the bounce time from 100msec to 1sec
  63.  */
  64. #define KEYBOARD_BOUNCE_SETTLE_TIME  ( ST_GetClocksPerSecond()/ 10 ) /* 100 mSec */
  65. #define KEYBOARD_SCAN_LINE_SETTLE_TIME  ( ST_GetClocksPerSecond() / 1000 ) /* 1 mSec */
  66.     #define READ_KEY_BITS
  67.        ( (* ( Keyboard_sense_p + PIO_IN ) /*>>1*/) & KEYBOARD_SENSE_MASK  )
  68. #endif /*INTEGRATE_FRONT_PANEL_KEYBOARD*/
  69. #define SWITCH1_MASK 0x10 /* POWER_STANDBY */
  70. #define SWITCH2_MASK 0x01 /* VOL_DOWN_CUM_LEFT_ARROW_KEY */ 
  71. #define SWITCH3_MASK 0x20 /* VOL_UP_CUM_RIGHT_ARROW_KEY */
  72. #define SWITCH4_MASK 0x02 /* PROG_NEXT_CUM_UP_ARROW_KEY */
  73. #define SWITCH5_MASK 0x40 /* PROG_NEXT_CUM_DOWN_ARROW_KEY */
  74. #define SWITCH6_MASK 0x04 /* MENU_KEY */
  75. #define SWITCH7_MASK 0x80 /* SELECT_KEY */
  76. #define SYMBOL_BUFFER_SIZE   200
  77. #define REMOTE_KEY_BUFFER_SIZE  20
  78. #define SOFTWARE_UPDATE_ID  "1.0"
  79. /*static message_queue_t *pstUsifMsgQueue;*/
  80. static task_t *pKeyboardRCTask;
  81. static task_t *pBlastReadTask;
  82. static STBLAST_ProtocolParams_t  RcProtocolReceive;
  83. //static STBLAST_ProtocolParams_t  RcProtocolTransmit;
  84. static U8 aucRemoteKeyBuffer [ REMOTE_KEY_BUFFER_SIZE ];
  85. semaphore_t *psemRemoteKeySensedSignal;
  86. #ifdef TM_BLAST  /*TMTM*/
  87. extern semaphore_t BlasterSemaphoreRead;
  88. extern semaphore_t BlasterSemaphoreWrite;
  89. #else
  90. extern semaphore_t BlasterSemaphore;
  91. #endif
  92. #if defined (CHENG_ENABLE_STILL_LAYER)||defined (CHENG_ENABLE_STILL_VIEWPORT)
  93. extern BOOL DEMO_OPEN;
  94. #endif
  95. extern void SRDBE_PrintXpdrDatabase(void);
  96. extern void SRDBE_PrintProgDatabase(void);
  97. extern void NVM_RWTest(void);
  98. /*****************************************************************************
  99.                             CODE
  100. *****************************************************************************/
  101. //TMTM
  102. #ifdef TMGFX_TEST
  103. extern int Red_Test( void );
  104. extern int Green_Test( void );
  105. extern int Blue_Test( void );
  106. extern int Yellow_Test( void );
  107. extern int GFX_Cls( void );
  108. void Keycallback(U8 key)
  109. {
  110. STTBX_Print(("999key value received: %dn", key));
  111. switch(key)
  112. {
  113. case rc_kKeyRed:
  114. Red_Test();
  115. break;
  116. case rc_kKeyGreen:
  117. Green_Test();
  118. break;
  119. case rc_kKeyBlue:
  120. Blue_Test();
  121. break;
  122. case rc_kKeyYellow:
  123. Yellow_Test();
  124. break;
  125. case rc_kKeyExit:
  126. GFX_Cls();
  127. break;
  128. }
  129. //if (key != rc_kKeyInvalid)
  130. //SRCMD_UserInputCallBack(key);
  131. }  
  132. #endif
  133. /*****************************************************************************
  134.                             PROTOCOL
  135. *****************************************************************************/
  136. /*****************************************************************************
  137.                         BLAST_ReceiveProtocol()
  138. Description: This function allows to choose the correct reception protocol.
  139. *****************************************************************************/
  140. STBLAST_ProtocolParams_t   BLAST_ReceiveProtocol(int Name)
  141. {
  142.    STBLAST_ProtocolParams_t          RcProtocol;
  143.    /*-- Remote Control Name --*/
  144.    switch(Name)
  145.        {
  146.         case 0 :
  147.                  /*----------------- Sony Remote Control ------------------*/
  148.                  RcProtocol.UserDefined.Coding = STBLAST_CODING_PULSE;  
  149.                  RcProtocol.UserDefined.SubCarrierFreq = 40000;
  150.                  RcProtocol.UserDefined.NumberStartSymbols = 1;
  151.                  RcProtocol.UserDefined.NumberStopSymbols = 0;
  152.                  RcProtocol.UserDefined.HighDataSymbol.MarkPeriod = 600;
  153.                  RcProtocol.UserDefined.HighDataSymbol.SymbolPeriod = 1200;
  154.                  RcProtocol.UserDefined.LowDataSymbol.MarkPeriod = 1200;
  155.                  RcProtocol.UserDefined.LowDataSymbol.SymbolPeriod = 1800;
  156.                  RcProtocol.UserDefined.NumberPayloadBits = 12;
  157.                  RcProtocol.UserDefined.StartSymbols[0].MarkPeriod = 2400;
  158.                  RcProtocol.UserDefined.StartSymbols[0].SymbolPeriod = 3000;
  159.                  break;
  160.         case 1 :
  161.                  /*----------------- ST Remote Control --------------------*/
  162.                  RcProtocol.UserDefined.Coding = STBLAST_CODING_SPACE;
  163.                  RcProtocol.UserDefined.SubCarrierFreq = 5000;
  164.                  RcProtocol.UserDefined.NumberStartSymbols = 0;
  165.                  RcProtocol.UserDefined.NumberStopSymbols = 0;
  166.                  RcProtocol.UserDefined.HighDataSymbol.MarkPeriod = 250;
  167.                  RcProtocol.UserDefined.HighDataSymbol.SymbolPeriod = 7600;
  168.                  RcProtocol.UserDefined.LowDataSymbol.MarkPeriod = 250;
  169.                  RcProtocol.UserDefined.LowDataSymbol.SymbolPeriod = 5100;
  170.                  RcProtocol.UserDefined.NumberPayloadBits = 12;
  171.                  break;
  172.         case 2 :
  173.                  /*--------- Force Remote Control ------------*/
  174.      RcProtocol.UserDefined.Coding = STBLAST_CODING_SPACE;
  175.      RcProtocol.UserDefined.SubCarrierFreq = 38000;
  176.      RcProtocol.UserDefined.NumberStartSymbols = 10;
  177.      RcProtocol.UserDefined.NumberStopSymbols = 0;
  178.      RcProtocol.UserDefined.HighDataSymbol.MarkPeriod = 500;
  179.      RcProtocol.UserDefined.HighDataSymbol.SymbolPeriod = 2000;
  180.      RcProtocol.UserDefined.LowDataSymbol.MarkPeriod = 500;
  181.      RcProtocol.UserDefined.LowDataSymbol.SymbolPeriod = 1000;
  182.      RcProtocol.UserDefined.NumberPayloadBits = 8;
  183.                  /* Start symbol */
  184.      RcProtocol.UserDefined.StartSymbols[0].MarkPeriod = 8000;
  185.      RcProtocol.UserDefined.StartSymbols[0].SymbolPeriod = 12000;    
  186.      /* Address symbols */
  187.      RcProtocol.UserDefined.StartSymbols[1].MarkPeriod = 500;   /* 0*/
  188.      RcProtocol.UserDefined.StartSymbols[1].SymbolPeriod = 1000;
  189.      RcProtocol.UserDefined.StartSymbols[2].MarkPeriod = 500;   /* 0*/
  190.      RcProtocol.UserDefined.StartSymbols[2].SymbolPeriod = 1000;
  191.      RcProtocol.UserDefined.StartSymbols[3].MarkPeriod = 500;   /* 0*/
  192.      RcProtocol.UserDefined.StartSymbols[3].SymbolPeriod = 1000;
  193.      RcProtocol.UserDefined.StartSymbols[4].MarkPeriod = 500;   /* 1*/
  194.      RcProtocol.UserDefined.StartSymbols[4].SymbolPeriod = 2000;
  195.      RcProtocol.UserDefined.StartSymbols[5].MarkPeriod = 500;   /* 0*/
  196.      RcProtocol.UserDefined.StartSymbols[5].SymbolPeriod = 1000;
  197.      RcProtocol.UserDefined.StartSymbols[6].MarkPeriod = 500;   /* 0*/
  198.      RcProtocol.UserDefined.StartSymbols[6].SymbolPeriod = 1000;
  199.      RcProtocol.UserDefined.StartSymbols[7].MarkPeriod = 500;   /* 0*/
  200.      RcProtocol.UserDefined.StartSymbols[7].SymbolPeriod = 1000;
  201.      RcProtocol.UserDefined.StartSymbols[8].MarkPeriod = 500;   /* 0*/
  202.      RcProtocol.UserDefined.StartSymbols[8].SymbolPeriod = 1000;   
  203.      /* Padding symbol */
  204.      RcProtocol.UserDefined.StartSymbols[9].MarkPeriod = 500;
  205.      RcProtocol.UserDefined.StartSymbols[9].SymbolPeriod = 4500;
  206.                  break;
  207.         case 3 :
  208.                  /*--------- Complete for other Remote Control ------------*/
  209.                  RcProtocol.UserDefined.Coding = 0;
  210.                  RcProtocol.UserDefined.SubCarrierFreq = 0;
  211.                  RcProtocol.UserDefined.NumberStartSymbols = 1;
  212.                  RcProtocol.UserDefined.NumberStopSymbols = 1;
  213.                  RcProtocol.UserDefined.HighDataSymbol.MarkPeriod = 0;
  214.                  RcProtocol.UserDefined.HighDataSymbol.SymbolPeriod = 0;
  215.                  RcProtocol.UserDefined.LowDataSymbol.MarkPeriod = 0;
  216.                  RcProtocol.UserDefined.LowDataSymbol.SymbolPeriod = 0;
  217.                  RcProtocol.UserDefined.NumberPayloadBits = 0;
  218.                  RcProtocol.UserDefined.Delay = 0;
  219.                  RcProtocol.UserDefined.StartSymbols[0].MarkPeriod = 0;
  220.                  RcProtocol.UserDefined.StartSymbols[0].SymbolPeriod = 0;
  221.                  RcProtocol.UserDefined.StopSymbols[0].MarkPeriod = 0;
  222.                  RcProtocol.UserDefined.StopSymbols[0].SymbolPeriod = 0;
  223.                  break;
  224.        }
  225.    return RcProtocol;
  226. }
  227. static rc_navKeyStroke_t eCurKeyCode = rc_KeyInvalid; 
  228. rc_navKeyStroke_t KB_IR_GetCurKeyCode(void) 
  229.     return eCurKeyCode; 
  230. static BOOL bKeyLock = FALSE;
  231. BOOL KB_IR_GetKeyLock(void)
  232. {
  233. return bKeyLock;
  234. }
  235. void KB_IR_SetKeyLock(BOOL bLock)
  236. {
  237. bKeyLock = bLock;
  238. }
  239. /*****************************************************************************
  240. BLASTER_LoopRead()
  241. Description: This function read in RC code and decode it.
  242. *****************************************************************************/
  243. void BLASTER_LoopRead(void *ParamP_p)
  244. {
  245.      ST_ErrorCode_t ErrCode;
  246.   int iNewRemoteKeyVal, iRepeatKeyCount, iRemoteKeyBufferWriteOffset = 0;
  247. int iKey2bStored;
  248. #ifdef USE_RC5_REMOTE     /* BLOCK COMMENTED OUT by Louie on 11/1/2004 */
  249. int iCurrentKey, iPrevKey; /*iCurrentKey and iPrevKey added by ilyas 08092004*/
  250. #else
  251.      STBLAST_Symbol_t SymbolBuffer[SYMBOL_BUFFER_SIZE];
  252.      U32 SymbolsRead;
  253. int i;
  254. #endif /* USE_RC5_REMOTE */
  255. BOOL bCurToggleStatus, bPrevToggleStatus, NotRepeatedKey;
  256. #ifdef USE_RC5_REMOTE
  257. #define REMOTE_KEY_TOGGLE_BIT_MASK 0x800
  258. #define REMOTE_KEY_ADDR_MASK  0x7C0 /* based on 14 bit RC-5 code added by ilyas */
  259. #define REMOTE_KEY_DATA_MASK  0x3F /* based on 14 bit RC-5 code added by ilyas */
  260. #define REMOTE_KEY_EXTENDED_MASK 0x1000 /* based on 14 bit RC-5 code added by ilyas */
  261. #define REMOTE_KEY_EXTENDED_APPEND_BIT 0x40/* based on 14 bit RC-5 code added by ilyas */
  262. #define CUSTOMER_CODE 0x2C0 /*for this Remote the customer code is 0x80*/
  263. #else
  264. #define REMOTE_KEY_ADDR_MASK  0x1C0 /* based on he 11 bit value */
  265. #define REMOTE_KEY_DATA_MASK  0x3F /* based on the 11 bit value */
  266. #define REMOTE_KEY_TOGGLE_BIT_MASK 0x200 /* based on the 11 bit value */
  267. #define REMOTE_SLAVE_ADDRESS  0x140 /* slave address is 5 */
  268. #define REMOTE_KEY_BUFFER_SIZE  20
  269. #define REMOTE_KEY_LOGIC_0 0xFE
  270. #define REMOTE_KEY_LOGIC_1 0x01
  271. #define REMOTE_KEY_REPEATED 0x80
  272. #endif /*USE_RC5_REMOTE*/
  273. #ifdef USE_RC5_REMOTE
  274. U32 NumberRead;   /*No. of frames*/
  275. U32 CodeReceived;
  276. #endif  /*USE_RC5_REMOTE*/
  277. iRepeatKeyCount = 20;  //Lynn org=5
  278. bPrevToggleStatus = FALSE;
  279. while(1)
  280. {
  281. #ifdef USE_RC5_REMOTE
  282. ErrCode = STBLAST_Receive(BlasterHandle[BLASTER_RECEIVER], &CodeReceived, 1, &NumberRead, 200);
  283. #else
  284.      SymbolsRead = 0;
  285.          ErrCode = STBLAST_ReadRaw(BlasterHandle[BLASTER_RECEIVER],SymbolBuffer,SYMBOL_BUFFER_SIZE,&SymbolsRead,15000,100);
  286. #endif /*USE_RC5_REMOTE*/
  287.       if (ErrCode == ST_NO_ERROR)
  288.        {
  289.          /* Await result completion */
  290.          BLASTDEBUG(STTBX_Print(("Awaiting symbols...")));
  291.        /* Now wait for the semaphore from the event, either fail or succeed */
  292. #ifdef TM_BLAST  /*TMTM*/
  293.        semaphore_wait(&BlasterSemaphoreRead);
  294. #else
  295.        semaphore_wait(&BlasterSemaphore);
  296. #endif
  297.          /* Check error-code */
  298.          BLASTDEBUG(STTBX_Print(("STBLAST_ReadRaw()", LastError)));
  299.          BLASTDEBUG(STTBX_Print(("Received %i symbols: ", SymbolsRead)));
  300.        iNewRemoteKeyVal = 0;
  301.    NotRepeatedKey = TRUE;
  302. #ifdef USE_RC5_REMOTE
  303. if(NumberRead != 1) 
  304. continue;
  305. /*read in the code received according to rc5 protocol - ilyas*/
  306. if((CodeReceived & REMOTE_KEY_ADDR_MASK) == CUSTOMER_CODE)
  307. {
  308. if(CodeReceived & REMOTE_KEY_EXTENDED_MASK)
  309. iKey2bStored = CodeReceived & REMOTE_KEY_DATA_MASK;
  310. else
  311. iKey2bStored = (CodeReceived & REMOTE_KEY_DATA_MASK)| REMOTE_KEY_EXTENDED_APPEND_BIT;
  312. iCurrentKey = iKey2bStored;
  313. }
  314. else
  315. { /*not the current customer code reject it*/
  316. continue;
  317. }
  318. /* check if key is repeated by checking the toggle flag */
  319. if(CodeReceived & REMOTE_KEY_TOGGLE_BIT_MASK)
  320. bCurToggleStatus = TRUE;
  321. else
  322. bCurToggleStatus = FALSE;
  323. if((bCurToggleStatus == bPrevToggleStatus )&& (iCurrentKey == iPrevKey))
  324. {
  325. if ( ++iRepeatKeyCount <= 20 )  /*Lynn org=5  */
  326. {
  327. NotRepeatedKey = FALSE;
  328. continue;
  329. }
  330. else 
  331. {
  332. NotRepeatedKey = TRUE;
  333. iKey2bStored |= REMOTE_KEY_REPEATED;
  334. }
  335. }
  336. else
  337. {
  338. bPrevToggleStatus = bCurToggleStatus;
  339. iPrevKey = iCurrentKey;
  340. iRepeatKeyCount = 0;
  341. }
  342.     /*
  343.     * save the key value and signal the Keyboard process task
  344.  * to process this new key
  345.  */
  346. if ( iRemoteKeyBufferWriteOffset >= REMOTE_KEY_BUFFER_SIZE )
  347. iRemoteKeyBufferWriteOffset = 0;
  348. aucRemoteKeyBuffer [ iRemoteKeyBufferWriteOffset ] = ( U8 ) iKey2bStored;
  349. ++iRemoteKeyBufferWriteOffset;
  350. BLASTDEBUG(STTBX_Print(("The whole keyCode is %xn",iNewRemoteKeyVal)));
  351. semaphore_signal ( psemRemoteKeySensedSignal );
  352. #else
  353. if (SymbolsRead /*== 19*/ > 0)
  354. {
  355. #ifdef USE_FORCERC   
  356.    for (i=10; i<(SymbolsRead-1); i++) /*Check only for bits 10 to 19*/
  357.    {
  358.                  BLASTDEBUG(STTBX_Print(("{Sym, Mark}={ %d, %d }",
  359.                               SymbolBuffer[i].SymbolPeriod,
  360.                               SymbolBuffer[i].MarkPeriod)));
  361.    if ((SymbolBuffer[i].SymbolPeriod<700)||(SymbolBuffer[i].SymbolPeriod>2300))
  362.    {
  363.    BLASTDEBUG(STTBX_Print(("There is ErrCode in symbol number %dn",i)));
  364.    }
  365.    else
  366.    {
  367. iNewRemoteKeyVal <<= 1;
  368.     if ((SymbolBuffer[i].SymbolPeriod>1500)&&(SymbolBuffer[i].SymbolPeriod<2300))
  369.    {
  370. iNewRemoteKeyVal |= REMOTE_KEY_LOGIC_1;
  371.     BLASTDEBUG(STTBX_Print(("1 "))); 
  372.    }
  373.    else
  374.    {
  375.     /*iNewRemoteKeyVal &= 0xFE;*/
  376.      BLASTDEBUG(STTBX_Print(("0 ")));
  377.    }
  378. }
  379. }
  380. #else
  381. #ifdef USE_STDEMORC
  382.    for (i=0; i<(SymbolsRead-1); i++) /*Check only for bits 0 to 9*/
  383.    {
  384.                  BLASTDEBUG(STTBX_Print(("{Sym, Mark}={ %d,%d }",
  385.                              SymbolBuffer[i].SymbolPeriod,
  386.                               SymbolBuffer[i].MarkPeriod)));
  387.        if ((SymbolBuffer[i].SymbolPeriod<4000)||(SymbolBuffer[i].SymbolPeriod>10000))
  388.    {
  389.    BLASTDEBUG(STTBX_Print(("There is ErrCode in symbol number %dn",i)));
  390.    }
  391.    else
  392.    {
  393. iNewRemoteKeyVal <<= 1;
  394.     if ((SymbolBuffer[i].SymbolPeriod>7000)&&(SymbolBuffer[i].SymbolPeriod<10000))
  395.    {
  396. iNewRemoteKeyVal |= REMOTE_KEY_LOGIC_1;
  397.     BLASTDEBUG(STTBX_Print(("1 "))); 
  398.    }
  399.    else
  400.    {
  401.     /*iNewRemoteKeyVal &= 0xFE;*/
  402.      BLASTDEBUG(STTBX_Print(("0 ")));
  403.    }
  404. }
  405. }
  406. #endif /*USE_STDEMORC*/
  407. #endif /*USE_FORCERC*/
  408. #ifdef USE_STDEMORC   
  409. if ( ( iNewRemoteKeyVal & REMOTE_KEY_ADDR_MASK ) == REMOTE_SLAVE_ADDRESS )
  410. #endif /*USE_STDEMORC*/
  411. {
  412. /*
  413.   * if address read is ok, save the key read into the remote
  414.   * keyboard buffer
  415.   */
  416. #ifdef USE_STDEMORC
  417. iKey2bStored = iNewRemoteKeyVal & REMOTE_KEY_DATA_MASK;
  418. BLASTDEBUG(STTBX_Print(("The whole keyCode is %xn",iKey2bStored)));
  419. if ( iNewRemoteKeyVal & REMOTE_KEY_TOGGLE_BIT_MASK )
  420. bCurToggleStatus = TRUE;
  421. else
  422. bCurToggleStatus = FALSE;
  423. if ( bCurToggleStatus == bPrevToggleStatus )
  424. {
  425. if ( ++iRepeatKeyCount <= 20 )  /*Lynn org=5 */
  426. NotRepeatedKey = FALSE;
  427. else 
  428. {
  429. NotRepeatedKey = TRUE;
  430. iKey2bStored |= REMOTE_KEY_REPEATED;
  431. }
  432. }
  433. #else
  434. iKey2bStored = iNewRemoteKeyVal; /*& REMOTE_KEY_DATA_MASK; TM Force*/
  435. BLASTDEBUG(STTBX_Print(("The whole keyCode is %xn",iKey2bStored)));
  436. if ( ++iRepeatKeyCount <= 20 ) /*Lynn org=5 */
  437. NotRepeatedKey = FALSE;
  438. else 
  439. NotRepeatedKey = TRUE;
  440. #endif /*USE_STDEMORC*/
  441. if (NotRepeatedKey)
  442. {
  443. bPrevToggleStatus = bCurToggleStatus;
  444. iRepeatKeyCount = 0;
  445. /*
  446.   * Adjust WRITE offset 
  447.   */
  448. if ( iRemoteKeyBufferWriteOffset >= REMOTE_KEY_BUFFER_SIZE )
  449. iRemoteKeyBufferWriteOffset = 0;
  450.     /*
  451.   * save the key value and signal the Keyboard process task
  452.   * to process this new key
  453.   */
  454. aucRemoteKeyBuffer [ iRemoteKeyBufferWriteOffset ] = ( U8 ) iKey2bStored;
  455. ++iRemoteKeyBufferWriteOffset;
  456. BLASTDEBUG(STTBX_Print(("The whole keyCode is %xn",iNewRemoteKeyVal)));
  457. semaphore_signal ( psemRemoteKeySensedSignal );
  458. }
  459. }
  460.        }
  461. #endif /* USE_RC5_REMOTE */
  462. }
  463.        else
  464.        {
  465.        BLASTDEBUG(STTBX_Print(("Error result: %s, ", /*BLAST_ErrorString*/(ErrCode))));
  466.        }
  467.     }
  468. }
  469. /*****************************************************************************
  470. BlastEvtHandler()
  471. Description: This function allows to wake up the read and write event
  472. ****************************************************************************/
  473. #ifdef TM_BLAST
  474. static void BlastEvtHandler(STEVT_CallReason_t Reason,
  475.                        STEVT_EventConstant_t Event,
  476.                        const void *EventData)
  477. {
  478.   switch (Event)
  479.        {
  480.          case STBLAST_READ_DONE_EVT:
  481.              semaphore_signal(&BlasterSemaphoreRead);
  482.              break;
  483.          case STBLAST_WRITE_DONE_EVT:
  484.              semaphore_signal(&BlasterSemaphoreWrite);
  485.              break;
  486.          default:
  487.              break;
  488.        }
  489.  }
  490. #endif
  491. /*-------------------------------------------------------------------------------------------- */
  492. /*
  493.  * CODE : keyboard_process
  494.  * TYPE : process, low_priority (KEYBOARD_PROCESS_PRIORITY)
  495.  * PROTOTYPE :  
  496.  * static void keyboard_process ( void );
  497.  * STACK : KEYBOARD_PROCESS_WORKSPACE 
  498.  * INPUT : nothing
  499.  * OUTPUT :  nothing
  500.  *
  501.  * GLOBAL VARIABLES USED :
  502.  * a. psemRemoteKeySensedSignal Semaphore ( R )
  503.  * b. aucRemoteKeyBuffer array of char ( W )
  504.  * c. iRemoteKeyReadOffset int ( R/W )
  505.  * d. usif_msg_poolid mboxid_t ( R )
  506.  * e. usif_mboxid mboxid_t ( R )
  507.  *
  508.  * DEVICES ACCESSED : On-Board key matrix.
  509.  * FUNCTIONS CALLED :  nothing
  510.  * CALLERS :
  511.  * a. keyboard_init - resident call .
  512.  * 
  513.  * PURPOSE:
  514.  * To handle the keymatrix scanning and processing the remote key 
  515.  * sensed.
  516.  *
  517.  * ALGORITHM:
  518.  * This task wakes up every 100 mSec and scans both the rows of KEYMATRIX 
  519.  * If it finds any of the keys pressed then converts it into the exact 
  520.  * scan code and passes to the user interface routine for the further 
  521.  * action. This task also responsible to convert the remote key sensed
  522.  * into proper keyscan code.
  523.  */
  524. static void  KeyboardRC_Process ( void *pvParam )
  525. {
  526.    int iBufferBacklog;
  527. U8 iRemoteKeyBufferReadOffset = 0;
  528. U8  ucKeyRead, ucPrevKeyRead;
  529. BOOL bFirstRemoteKey;
  530. rc_navKeyStroke_t uiKeycode = 0;
  531. KB_OSPMsgNode ospMsg;
  532. #ifdef INTEGRATE_FRONT_PANEL_KEYBOARD
  533. int iKeyReadForScan0;
  534. int iKeyReadForScan1;
  535.      clock_t     timeout;
  536. device_access8_t * Keyboard_scan_p =  (device_access8_t *) KEYBOARD_SCAN1_PIO_ADDRESS;
  537. #endif
  538. /* #define  DUMMY_CODE */
  539. #ifdef   DUMMY_CODE
  540.     BOOL     bPrintDummy = FALSE;
  541. #endif
  542. bFirstRemoteKey = TRUE;
  543.    
  544. /*
  545.  * make sure the key_scan line by default is ONE
  546.  */
  547. #ifdef INTEGRATE_FRONT_PANEL_KEYBOARD
  548. *( Keyboard_scan_p + PIO_OUT_SET ) = KEYBOARD_SCAN1_BIT;
  549. #endif
  550. while ( TRUE )
  551. {
  552. /*
  553.   * wakeup after 100 mSec
  554.   */
  555. task_delay (ST_GetClocksPerSecondLow() / 10);
  556. /*
  557.  * test whether any remote control key is available in the buffer
  558.  * if it is so, convert the key value into the proper key code
  559.  */
  560. iBufferBacklog = psemRemoteKeySensedSignal -> semaphore_count;
  561. if ( iBufferBacklog )
  562. {
  563.   /*
  564.  * verify whether the buffer has overflown already, since the
  565.  * adding of new key into the keyboard circular buffer is by the
  566.  * Remote ISR
  567.  */
  568. if ( iBufferBacklog > REMOTE_KEY_BUFFER_SIZE )
  569. {
  570. /*
  571.  * skip off all the keys available in the buffer.
  572.  */
  573. KBDEBUG(STTBX_Print(( "Remote key response backlog -> %dn", iBufferBacklog )));
  574. while ( iBufferBacklog )
  575. {
  576. ++iRemoteKeyBufferReadOffset;
  577. /*
  578.  * hey watchout it is time consuming
  579.  */
  580. if ( iRemoteKeyBufferReadOffset >= REMOTE_KEY_BUFFER_SIZE )
  581. iRemoteKeyBufferReadOffset = 0;
  582. semaphore_wait ( psemRemoteKeySensedSignal );
  583. --iBufferBacklog;
  584. }
  585. /*
  586.  * instead of testing the iRemoteKeyBufferReadOffset at every
  587.  * iteration in the above said loop the following would be very
  588.  * efficient. But somehow I'm not confident ...
  589.  */
  590. /*
  591. iRemoteKeyBufferReadOffset = iRemoteKeyBufferReadOffset % REMOTE_KEY_BUFFER_SIZE;
  592. */
  593. }
  594. else
  595. {
  596. ucPrevKeyRead = ucKeyRead;
  597. ucKeyRead = aucRemoteKeyBuffer [ iRemoteKeyBufferReadOffset ];
  598. /*
  599.  * START = added by VICKY on 12.12.96
  600.  */
  601. if ( bFirstRemoteKey == TRUE )
  602. {
  603. ucPrevKeyRead = ucKeyRead; /*& ~REMOTE_KEY_REPEATED; TMTM Force*/
  604. bFirstRemoteKey = FALSE;
  605. }
  606. /*
  607.  * END = on 12.12.96
  608.  */
  609. KBDEBUG(STTBX_Print(( "Remote key sensed [%X]n", ucKeyRead  )));
  610. #ifdef USE_STDEMORC /*TMTM not Force*/
  611. if ( ( ucKeyRead & REMOTE_KEY_REPEATED ) &&
  612. ( ucKeyRead & ~REMOTE_KEY_REPEATED ) != ucPrevKeyRead )
  613. {
  614. /*
  615.  * if wrong key is sensed, due to the bit error during
  616.  * framing the key value, then skip that key
  617.  */
  618. ucKeyRead &= ~REMOTE_KEY_REPEATED;
  619. KBDEBUG(STTBX_Print(( "Wrong Remote key C[%X] P[%X]n", ucKeyRead, ucPrevKeyRead )));
  620. }
  621. else
  622. {
  623. ucKeyRead = aucRemoteKeyBuffer [ iRemoteKeyBufferReadOffset ] & ~REMOTE_KEY_REPEATED;
  624. #else
  625. {
  626. ucKeyRead = aucRemoteKeyBuffer [ iRemoteKeyBufferReadOffset ]; /* & ~REMOTE_KEY_REPEATED; TMTM Force*/
  627. #endif
  628. //STTBX_Print(( "n[Han]:ucKeyRead[0x%x]", ucKeyRead ));
  629. /*
  630.  * convert the numeric keys into ascending order
  631.  */
  632. switch ( ucKeyRead )
  633. {
  634. case KB_BUT_KEY_0:
  635. uiKeycode = rc_KeyNum0;
  636. break;
  637. case KB_BUT_KEY_1:
  638. uiKeycode = rc_KeyNum1;
  639. break;
  640. case KB_BUT_KEY_2:
  641. uiKeycode = rc_KeyNum2;
  642. break;
  643. case KB_BUT_KEY_3:
  644. uiKeycode = rc_KeyNum3;
  645. break;
  646. case KB_BUT_KEY_4:
  647. uiKeycode = rc_KeyNum4;
  648. break;
  649. case KB_BUT_KEY_5:
  650. uiKeycode = rc_KeyNum5;
  651. break;
  652. case KB_BUT_KEY_6:
  653. uiKeycode = rc_KeyNum6;
  654. break;
  655. case KB_BUT_KEY_7:
  656. uiKeycode = rc_KeyNum7;
  657. break;
  658. case KB_BUT_KEY_8:
  659. uiKeycode = rc_KeyNum8;
  660. break;
  661. case KB_BUT_KEY_9:
  662. uiKeycode = rc_KeyNum9;
  663. break;
  664. case KB_BUT_KEY_POWER:
  665. uiKeycode = rc_KeyPower;
  666. break;
  667. case KB_BUT_KEY_MUTE:
  668. uiKeycode = rc_KeyMute;
  669. break;
  670. case KB_BUT_KEY_TRACK:
  671. uiKeycode = rc_KeyTrack;
  672. break;
  673. case KB_BUT_KEY_VOLPLUS:
  674. uiKeycode = rc_KeyVolPlus;
  675. break;
  676. case KB_BUT_KEY_VOLMINUS:
  677. uiKeycode = rc_KeyVolMinus;
  678. break;
  679. case KB_BUT_KEY_RETURN:
  680. uiKeycode = rc_KeyReturn;
  681. break;
  682. case KB_BUT_KEY_SCREEN:
  683. uiKeycode = rc_KeyScreen;
  684. break;
  685. case KB_BUT_KEY_SWITCH:
  686. uiKeycode = rc_KeySwitch;
  687. break;
  688. case KB_BUT_KEY_PAGEUP:
  689. uiKeycode = rc_KeyPageUp;
  690. break;
  691. case KB_BUT_KEY_PAGEDOWN:
  692. uiKeycode = rc_KeyPageDown;
  693. break;
  694. case KB_BUT_KEY_GUIDE:
  695. uiKeycode = rc_KeyGuide;
  696. break;
  697. case KB_BUT_KEY_UP:
  698. uiKeycode = rc_KeyUp;
  699. break;
  700. case KB_BUT_KEY_DOWN:
  701. uiKeycode = rc_KeyDown;
  702. break;
  703. case KB_BUT_KEY_LEFT:
  704. uiKeycode = rc_KeyLeft;
  705. break;
  706. case KB_BUT_KEY_RIGHT:
  707. uiKeycode = rc_KeyRight;
  708. break;
  709. case KB_BUT_KEY_OK:
  710. uiKeycode = rc_KeyOK;
  711. break;
  712. case KB_BUT_KEY_MENU:
  713. uiKeycode = rc_KeyMenu;
  714. break;
  715. case KB_BUT_KEY_EXIT:
  716. uiKeycode = rc_KeyExit;
  717. break;
  718. case KB_BUT_KEY_RED:
  719. uiKeycode = rc_KeyRed;
  720. break;
  721. case KB_BUT_KEY_GREEN:
  722. uiKeycode = rc_KeyGreen;
  723. break;
  724. case KB_BUT_KEY_YELLOW:
  725. uiKeycode = rc_KeyYellow;
  726. break;
  727. case KB_BUT_KEY_BLUE:
  728. uiKeycode = rc_KeyBlue;
  729. break;
  730. case KB_BUT_KEY_FAV:
  731. uiKeycode = rc_KeyFav;
  732. break;
  733. case KB_BUT_KEY_LANGUAGE:
  734. uiKeycode = rc_KeyLan;
  735. break;
  736. case KB_BUT_KEY_COLLECTION:
  737. uiKeycode = rc_KeyColleciton;
  738. break;
  739. case KB_BUT_KEY_SET:
  740. uiKeycode = rc_KeySet;
  741. break;
  742. case KB_BUT_KEY_VIDEO:
  743. uiKeycode = rc_KeyVideo;
  744. break;
  745. case KB_BUT_KEY_AUDIO:
  746. uiKeycode = rc_KeyAudio;
  747. break;
  748. case KB_BUT_KEY_NVOD:
  749. uiKeycode = rc_KeyNVOD;
  750. break;
  751. case KB_BUT_KEY_INFOR:
  752. uiKeycode = rc_KeyInfor;
  753. break;
  754. case KB_BUT_KEY_MAIL:
  755. uiKeycode = rc_KeyMail;
  756. break;
  757. case KB_BUT_KEY_GAME:
  758. uiKeycode = rc_KeyGame;
  759. break;
  760. case KB_BUT_KEY_STOCK:
  761. uiKeycode = rc_KeyStock;
  762. break;
  763. case KB_BUT_KEY_ORDER:
  764. uiKeycode = rc_KeyOrder;
  765. break;
  766. case KB_BUT_KEY_F1:
  767. uiKeycode = rc_KeyF1;
  768. break;
  769. case KB_BUT_KEY_F2:
  770. uiKeycode = rc_KeyF2;
  771. break;
  772. case KB_BUT_KEY_F3:
  773. uiKeycode = rc_KeyF3;
  774. break;
  775. case KB_BUT_KEY_F4:
  776. uiKeycode = rc_KeyF4;
  777. break;
  778. default:
  779. uiKeycode = rc_KeyInvalid;
  780. break;
  781. }
  782. if (uiKeycode != rc_KeyInvalid)
  783. {
  784. eCurKeyCode = uiKeycode;
  785. ospMsg.Word1=MOD_KEY;
  786. ospMsg.Word3=uiKeycode;
  787. //KB_MENUTranslateMsg(&ospMsg);
  788. kb_machblue_key(uiKeycode);
  789. }
  790. }
  791. ++iRemoteKeyBufferReadOffset;
  792. if ( iRemoteKeyBufferReadOffset >= REMOTE_KEY_BUFFER_SIZE )
  793. iRemoteKeyBufferReadOffset = 0;
  794.   semaphore_wait ( psemRemoteKeySensedSignal );
  795. }
  796. }
  797.   
  798. #ifdef INTEGRATE_FRONT_PANEL_KEYBOARD
  799. /*
  800.  * scan key matrix for SCAN_LINE0 which is always '0'
  801.  */
  802.     /* KBDEBUG(STTBX_Print((severity_info, "READ_KEY_BITS = 0X%02X n",READ_KEY_BITS))); */
  803. iKeyReadForScan0 = ( ( READ_KEY_BITS ) & KEYBOARD_SENSE_MASK ) ^ KEYBOARD_SENSE_MASK;
  804. if ( iKeyReadForScan0 )
  805. {
  806. /*
  807.  * some keys pressed on SENSE_0
  808.  */
  809. task_delay ( KEYBOARD_BOUNCE_SETTLE_TIME );
  810. iKeyReadForScan1 = iKeyReadForScan0;
  811. }
  812. else
  813. {
  814. /*
  815.  * scan key matrix for SCAN_LINE1, which is always '1', by bringing
  816.  * it to logic 0 and sense the keys
  817.  */
  818. * ( Keyboard_scan_p + PIO_OUT_CLR )  = KEYBOARD_SCAN1_BIT;
  819. task_delay ( KEYBOARD_SCAN_LINE_SETTLE_TIME );
  820. iKeyReadForScan1 = ( ( READ_KEY_BITS ) & KEYBOARD_SENSE_MASK ) ^ KEYBOARD_SENSE_MASK;
  821. * ( Keyboard_scan_p + PIO_OUT_SET ) = KEYBOARD_SCAN1_BIT;
  822. iKeyReadForScan1 = iKeyReadForScan1 << NO_OF_FRONT_PANEL_KEY_SENSE_BITS;
  823. if ( iKeyReadForScan1 )
  824. {
  825. /*
  826.  * some keys pressed on SENSE_0
  827.  */
  828. task_delay ( KEYBOARD_BOUNCE_SETTLE_TIME );
  829. }
  830. }
  831. /*
  832.  * if any of those key is pressed then convert them into exact 
  833.  * scan code
  834.  */
  835. if ( iKeyReadForScan1 )
  836. {
  837. /*
  838.  * if LEFT(SW1) and RIGHT(SW2) arrow keys are pressed together
  839.  * then it means MENU_CUM_EXIT_KEY
  840.  */
  841. ucKeyRead = 0;
  842. {
  843. if ( iKeyReadForScan1 & SWITCH2_MASK )
  844. ucKeyRead = VOL_DOWN_CUM_LEFT_ARROW_KEY;
  845. if ( iKeyReadForScan1 & SWITCH4_MASK )
  846. ucKeyRead = PROG_PREV_CUM_DOWN_ARROW_KEY; /*PROG_PREV_CUM_UP_ARROW_KEY;*/
  847. if ( iKeyReadForScan1 & SWITCH6_MASK )
  848. ucKeyRead = MENU_CUM_EXIT_KEY;
  849. if ( iKeyReadForScan1 & SWITCH3_MASK )
  850. ucKeyRead = VOL_UP_CUM_RIGHT_ARROW_KEY;
  851. if ( iKeyReadForScan1 & SWITCH5_MASK )
  852. ucKeyRead = PROG_NEXT_CUM_UP_ARROW_KEY; /*PROG_NEXT_CUM_DOWN_ARROW_KEY;*/
  853. if ( iKeyReadForScan1 & SWITCH1_MASK )
  854. ucKeyRead = POWER_KEY;
  855. if ( iKeyReadForScan1 & SWITCH7_MASK )
  856. ucKeyRead = SELECT_KEY;
  857. }
  858.   if ( ucKeyRead )
  859. {
  860. /* if any key is sensed send it to USIF */
  861. timeout = WAIT_FOR_1_SEC;
  862.           
  863. }
  864. }
  865. #endif
  866. }
  867. }
  868. /*
  869.  * CODE : keyboard_init
  870.  * TYPE : subroutine 
  871.  * PROTOTYPE :  
  872.  * BOOL keyboard_init ( void );
  873.  *
  874.  * STACK : callers stack
  875.  * INPUT : nothing
  876.  * OUTPUT : 
  877.  * a. initialisation_status BOOL
  878.  * If the module is successfuly initialised then it will be FALSE else
  879.  * TRUE
  880.  *
  881.  * GLOBAL VARIABLES USED :
  882.  * a. usif_mbx  symbol type mailbox  ( R )
  883.  * b. usif_pool symbol type mailbox  ( R )
  884.  * c. usif_msg_poolid mboxid_t ( W )
  885.  * d. usif_mboxid mboxid_t ( W )
  886.  *
  887.  * DEVICES ACCESSED : nothing
  888.  * FUNCTIONS CALLED :  
  889.  * CALLERS :
  890.  *  a. main ....MAINSOURCEMAIN.C
  891.  *
  892.  * PURPOSE :
  893.  * Initialise the keyboard module
  894.  */
  895. /*{{{ DVBKeyboardInit ()*/
  896. BOOL RcKeyboardProcessSetup ( void )
  897. {
  898. int RC_Name;
  899. BOOL bError = FALSE;
  900. #ifdef INTEGRATE_FRONT_PANEL_KEYBOARD
  901.     device_access8_t * PIO_SCAN_p = (device_access8_t *) KEYBOARD_SCAN1_PIO_ADDRESS ;
  902. #endif
  903. BLASTER_Setup();
  904.    BLASTDEBUG(STTBX_Print(( "KEYBOARD Driver version [%s]n", SOFTWARE_UPDATE_ID )));
  905. #ifdef INTEGRATE_FRONT_PANEL_KEYBOARD
  906. /* Configure ScanPIO as Output Pushpull */
  907. * ( PIO_SCAN_p + PIO_C0_CLR ) = KEYBOARD_SCAN1_BIT;
  908. * ( PIO_SCAN_p + PIO_C1_SET ) = KEYBOARD_SCAN1_BIT;
  909. * ( PIO_SCAN_p + PIO_C2_CLR ) = KEYBOARD_SCAN1_BIT;
  910. #endif
  911. psemRemoteKeySensedSignal = semaphore_create_fifo ( 0 );
  912.      //semaphore_init_fifo(&psemRemoteKeySensedSignal, 0);
  913.  
  914. /*------ Setup Keyboard & RC management Process ------*/
  915.   if ( ( pKeyboardRCTask=task_create( KeyboardRC_Process,NULL,2048,5,"KeyboardTask",0 ) ) == NULL )
  916.    {
  917.    BLASTDEBUG(STTBX_Print(( "Failed to start keyboard processn" )));
  918.    bError = FALSE;
  919.    }
  920. #ifndef INTEGRATE_FRONT_PANEL_KEYBOARD
  921.    BLASTDEBUG(STTBX_Print(( "Front Panel Key sense not includednn" )));
  922. #endif
  923. task_delay(1000);
  924. /*------ Setup Blaster Receiver task ------*/
  925. #ifdef USE_STDEMORC
  926. RC_Name = 1;
  927. #elif defined (USE_FORCERC)
  928. RC_Name = 2;
  929. #endif
  930. #ifdef USE_RC5_REMOTE
  931. {
  932. memset(&RcProtocolReceive, 0, sizeof(STBLAST_ProtocolParams_t));
  933. STBLAST_SetProtocol(BlasterHandle[BLASTER_RECEIVER], STBLAST_PROTOCOL_RC5, &RcProtocolReceive);
  934. }
  935. #else
  936.      RcProtocolReceive = BLAST_ReceiveProtocol(RC_Name);
  937. {
  938. STBLAST_Protocol_t Protocol;
  939. Protocol = STBLAST_PROTOCOL_USER_DEFINED;
  940.      STBLAST_SetProtocol(BlasterHandle[BLASTER_RECEIVER], Protocol, &RcProtocolReceive);
  941. }
  942. #endif
  943.      BLASTDEBUG(STTBX_Print(("Create BLASTER taskn")));
  944.      if ( ( pBlastReadTask=task_create( BLASTER_LoopRead,0L,2048,5,"BLASTER Read task",0 ) ) == NULL )
  945.      {
  946.       BLASTDEBUG(STTBX_Print(("Unable to Create BLASTER Read taskn")));
  947.       bError = TRUE;
  948.      }
  949.      else
  950.      {
  951.       BLASTDEBUG(STTBX_Print(("Running BLASTER Read task...n")));
  952.      }
  953.   
  954. return bError;
  955. }
  956. /*eof*/