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

DVD

开发平台:

C/C++

  1. #include "stsys.h"
  2. #include "SysServReg.h"
  3. #define MODE_LOW_POWER 2
  4. #define MODE_REDUCED_POWER 4
  5. #define MODE_FULL_POWER 8
  6. #define SHUTDOWN_MODE MODE_REDUCED_POWER
  7. /* The IRBBaseAddress is: 0x2081 8000.     for 5105  & 5100 */
  8. #define IRB_RX_CLOCK_SELECT  0x20818070 /* same for 5105 */
  9. #define IRB_RX_EN  0x20818050 /* same for 5105 */
  10. #define IRB_RX_INT_EN  0x20818048 /* same for 5105 */
  11. #define IRB_RX_ON_TIME 0x20818040 /* same for 5105 */
  12. #define IRB_RX_SYM_PERIOD 0x20818044 /* same for 5105 */
  13. #define IRB_RX_STATUS  0x2081806c /* same for 5105 */
  14. #define IRB_RX_NOISE_SUPPRESS_WIDTH 0x2081805c /* same for 5105 */
  15. /* The ILCBaseAddress is: 0x2080 0000. */
  16. #define ILC_WAKEUP_ENABLE  0x20800608 /* same for 5105 */
  17. #define ILC_WAKEUP_ACTIVE_LEVEL  0x20800688 /* same for 5105 */
  18. #define ILC_STATUS 0x2080020c /* same for 5105 */
  19. #define ILC_ENABLE 0x20800400 /* kc-060112pm - 5105 datasheet */
  20. /* #define ILC_ENABLE 0x20800408  ???  */
  21. #define ILC_MODE68 0x20800A24  /*ILCBaseAddress + 0x800 + (n x 0x008) + 0x004*/
  22. #define ILC_MODE19 0x2080089c  /*ILCBaseAddress + 0x800 + (n x 0x008) + 0x004*/
  23. /* #define ILC_SET_ENABLE 0x20800508  ??? */
  24. #define ILC_SET_ENABLE_1 0x20800500  /* kc-060112pm - 5105 datasheet */
  25. #define ILC_SET_ENABLE_5105 0x2080050C 
  26. /* PIO3 is at 0x2082 3000 */ /* same for 5105 */
  27. #define PIO3_PNC0_SET 0x20823024 /* 5105 - 0x2082 3000 +  0x24 => set */
  28. #define PIO3_PNC1_SET 0x20823034
  29. #define PIO3_PNC2_SET 0x20823044
  30. #define PIO3_PNC0_CLEAR 0x20823028
  31. #define PIO3_PNC1_CLEAR 0x20823038
  32. #define PIO3_PNC2_CLEAR 0x20823048
  33. //#pragma ST_section (LPM_LowPowerMode, "lowpower_section")
  34. void LPM_LowPowerMode(void)
  35. {
  36. #if(SHUTDOWN_MODE == MODE_FULL_POWER) 
  37. /* Do nothing, just use reset default parameters */
  38. return;
  39. #elif(SHUTDOWN_MODE == MODE_LOW_POWER)
  40. UINT32 i;
  41. /*Lock registers*/
  42. /*disable watchdog and LPA*/
  43. /*set PIO for IR as input*/
  44. /*Suppress filter for IR*/
  45. /*enable IR*/
  46. /*Enable IR interrupt*/
  47. for(i=0; i<0x0ff; i++)
  48. {
  49. /* do nothing */
  50. }
  51. STSYS_WriteRegDev32LE(CKG_REGISTER_LOCK_CFG, 0x00F0);
  52. STSYS_WriteRegDev32LE(CKG_REGISTER_LOCK_CFG, 0x000F);
  53. STSYS_WriteRegDev32LE(WATCHDOG_COUNTER_CFG1, 0x0); /* disable watchdog reset */
  54. STSYS_WriteRegDev32LE(LP_MODE_COUNTER_CFG1, 0x0); /* disable LP counter */
  55. STSYS_WriteRegDev8(IRB_RX_NOISE_SUPPRESS_WIDTH, 0x00);
  56. STSYS_WriteRegDev8(IRB_RX_EN, 0x01);
  57. STSYS_WriteRegDev8(IRB_RX_INT_EN, 0x01);
  58. STSYS_WriteRegDev32LE(ILC_ENABLE, 0x10);
  59. /* STSYS_WriteRegDev32LE(ILC_SET_ENABLE_1, 0x10); */
  60. STSYS_WriteRegDev32LE(ILC_SET_ENABLE_5105, 0x10);
  61. /*Enable 27Mhz clock in IR*/
  62. STSYS_WriteRegDev32LE(ILC_MODE68, 0x03);
  63. STSYS_WriteRegDev32LE(ILC_WAKEUP_ACTIVE_LEVEL, 0x0010);
  64. STSYS_WriteRegDev32LE(ILC_WAKEUP_ENABLE, 0x0010);
  65. STSYS_WriteRegDev8(IRB_RX_CLOCK_SELECT, 0x00);
  66. /* Set Low Power Mode Registers */
  67. STSYS_WriteRegDev32LE(LP_MODE_DIS0, 0x07F7);
  68. STSYS_WriteRegDev32LE(LP_MODE_DIS1, 0x03FF);
  69. STSYS_WriteRegDev32LE(CKG_MODE_CONTROL, 0x02);
  70. /*
  71. STSYS_WriteRegDev32LE(LP_MODE_COUNTER_CFG0, 0x0020); -- 32 secs 
  72. STSYS_WriteRegDev32LE(LP_MODE_COUNTER_CFG1, 0x0010);
  73. */
  74. /* turn off LP counter for production / release */
  75. STSYS_WriteRegDev32LE(LP_MODE_COUNTER_CFG0, 0x0020);  
  76. STSYS_WriteRegDev32LE(LP_MODE_COUNTER_CFG1, 0x0000);
  77. for(i=0; i<0x1ff; i++)
  78. {
  79. /* do nothing */
  80. }
  81. while(1)
  82. {
  83. STSYS_WriteRegDev32LE(CKG_MODE_CONTROL, 0x03);
  84. if(STSYS_ReadRegDev32LE(CKG_MODE_CONTROL)==0x03)
  85. break;
  86. }
  87. for(i=0; i<0x1ff; i++)
  88. {
  89. /* wait for chip has been into standby mode */
  90. }
  91. STSYS_WriteRegDev32LE(CKG_MODE_CONTROL, 0x00);
  92. while(STSYS_ReadRegDev32LE(CKG_MODE_CONTROL) != 0x00)
  93. {
  94. for(i=0; i<0x1ff; i++)
  95. {
  96. /*do nothing, just wait*/
  97. }
  98. if(STSYS_ReadRegDev32LE(CKG_MODE_CONTROL) == 0x01)
  99. break;
  100. }
  101. for(i=0; i<0x1ff; i++)
  102. {
  103. /* wait for chip has been out of standby mode */
  104. }
  105. /*wake up*/ /*This section of code is important if not the board will not reset!!*/
  106. STSYS_WriteRegDev32LE(CKG_REGISTER_LOCK_CFG, 0x00F0);
  107. STSYS_WriteRegDev32LE(CKG_REGISTER_LOCK_CFG, 0x000F);
  108. STSYS_WriteRegDev32LE(WATCHDOG_COUNTER_CFG1, 0x0);  /* disable watchdog reset */
  109. STSYS_WriteRegDev32LE(LP_MODE_COUNTER_CFG1, 0x0); /* disable LP counter */
  110. for(i=0; i<0x1ff; i++)
  111. {
  112. /* wait for chip has been out of standby mode */
  113. }
  114. STSYS_WriteRegDev32LE(CKG_MODE_CONTROL, 0x02);
  115. /*Enable the watchdog reset*/
  116. STSYS_WriteRegDev32LE(CKG_RESET_STATUS, 0x0180);
  117. STSYS_WriteRegDev32LE(WATCHDOG_COUNTER_CFG0, 0x02);
  118. STSYS_WriteRegDev32LE(WATCHDOG_COUNTER_CFG1, 0x10);
  119. return;
  120. #elif(SHUTDOWN_MODE == MODE_REDUCED_POWER)
  121. UINT16 dat, dat2;
  122. volatile UINT32 NumberRead;   /*No. of frames*/
  123. //STSYS_WriteRegDev8(PIO3_PNC0_CLEAR, 0x40);
  124. //STSYS_WriteRegDev8(PIO3_PNC1_CLEAR, 0x40);
  125. //STSYS_WriteRegDev8(PIO3_PNC2_CLEAR, 0x40);
  126. //STSYS_WriteRegDev8(IRB_RX_NOISE_SUPPRESS_WIDTH, 200);
  127. //STSYS_WriteRegDev8(IRB_RX_EN, 0x01);
  128. //STSYS_WriteRegDev8(IRB_RX_INT_EN, 0x01);
  129. STSYS_WriteRegDev32LE(CKG_REGISTER_LOCK_CFG, 0x00F0);
  130. STSYS_WriteRegDev32LE(CKG_REGISTER_LOCK_CFG, 0x000F);
  131. //STSYS_WriteRegDev32LE(ILC_SET_ENABLE_1, 0x80000);
  132. //STSYS_WriteRegDev32LE(ILC_MODE19, 0x03);
  133. //STSYS_WriteRegDev8(IRB_RX_CLOCK_SELECT, 0x01);
  134. /*go into reduced power mode*/
  135. /*STSYS_WriteRegDev32LE(REDUCED_POWER_CONTROL, 0x144);*/
  136. #if 1     /* BLOCK COMMENTED OUT by ilyas fakrudeen on 11/22/2005 */
  137. STSYS_WriteRegDev32LE(REDUCED_POWER_CTRL, 0x1Dc);
  138. //STSYS_WriteRegDev32LE(REDUCED_POWER_CTRL, 0x000);
  139. #else
  140. STSYS_WriteRegDev32LE(REDUCED_POWER_CTRL, 0x1FE);
  141. #endif /* BLOCK COMMENT */
  142. /*
  143. while (1)
  144. {
  145. while(STSYS_ReadRegDev16LE(IRB_RX_STATUS) & 0x700)
  146. {
  147. dat = STSYS_ReadRegDev16LE(IRB_RX_SYM_PERIOD);
  148. dat = STSYS_ReadRegDev16LE(IRB_RX_ON_TIME);
  149. }
  150. for(NumberRead = 0; NumberRead < 0xFFFFF; NumberRead++);
  151. dat = STSYS_ReadRegDev16LE(IRB_RX_STATUS);
  152. dat = dat & 0x700;
  153. if (dat == 0x700)
  154. {
  155. NumberRead = 0;
  156. while(STSYS_ReadRegDev16LE(IRB_RX_STATUS) & 0x700)
  157. {
  158. dat = STSYS_ReadRegDev16LE(IRB_RX_SYM_PERIOD);
  159. dat2 = STSYS_ReadRegDev16LE(IRB_RX_ON_TIME);
  160. NumberRead++;
  161. }
  162. if(NumberRead > 0) break;
  163. }
  164. }
  165. */
  166. /*wake up*/
  167. STSYS_WriteRegDev32LE(CKG_REGISTER_LOCK_CFG, 0x00F0);
  168. STSYS_WriteRegDev32LE(CKG_REGISTER_LOCK_CFG, 0x000F);
  169. STSYS_WriteRegDev32LE(CKG_MODE_CONTROL, 0x02);
  170. STSYS_WriteRegDev32LE(CKG_RESET_STATUS, 0x0180);
  171. STSYS_WriteRegDev32LE(WATCHDOG_COUNTER_CFG0, 0x02);
  172. STSYS_WriteRegDev32LE(WATCHDOG_COUNTER_CFG1, 0x10);
  173. return;
  174. #endif
  175. }
  176. /* EOF */