sleep.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:28k
源码类别:

uCOS

开发平台:

C/C++

  1. /***************************************************************
  2.   NAME: sleep.c
  3.   DESC: Sleep mode test
  4.   HISTORY:
  5.   08.24.2002:purnnamu
  6. LCDVFn is connected the analog circuit in LCD. 
  7. So, this signal should be output L.
  8.   05.xx.2003:DonGo modifid for 2440X, Power-off -> Sleep. naming change.
  9.  ****************************************************************/
  10.  
  11. #include "def.h"
  12. #include "option.h"
  13. #include "2440lib.h"
  14. #include "2440slib.h" 
  15. #include "2440addr.h"
  16. #include "lcdlib.h"
  17. #include "sleep.h"
  18. #define TESTYEAR    (0x00)
  19. #define TESTMONTH   (0x12)
  20. #define TESTDATE    (0x31)
  21. #define TESTDAY     (0x06)  // SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7   
  22. #define TESTHOUR    (0x23)
  23. #define TESTMIN     (0x59)
  24. #define TESTSEC     (0x59)
  25. #define TESTYEAR2   (0x01)
  26. #define TESTMONTH2  (0x01)
  27. #define TESTDATE2   (0x01)
  28. #define TESTDAY2    (0x07)  // SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7   
  29. #define TESTHOUR2   (0x00)
  30. #define TESTMIN2    (0x00)
  31. #define TESTSEC2    (0x00)
  32. #define CHECK_SDRAM_SELFREFRESH (1)
  33. #define EXTERNAL_BUS_HOLDER (1)  
  34. //The SMDK2440X board has external databus buffer with bus hold function.
  35. #define CHOOSE_EINT_TYPE (1)
  36. #define ALARM_WAKEUP (1)
  37. void SelectEintType(void);
  38. #define SLEEP_COUNT (*(volatile unsigned int *)0x32000000)
  39. void Batt_Sleep(void);
  40. extern void Manual_Register_Set(void);
  41. //===========================================================================
  42. static void __irq Eint0Int(void)
  43. {
  44. ClearPending(BIT_EINT0);
  45. Uart_Printf("[WU]EINT0 interrupt is occurred for Sleep mode wake-up.n");
  46. }
  47. //===========================================================================
  48. static void __irq Eint8_23Int(void)
  49. {
  50. rEINTPEND=(1<<11); //EINT11 sub-pending bit.
  51. ClearPending(BIT_EINT8_23);
  52. Uart_Printf("[WU]EINT8_23 interrupt is occurred for Sleep mode wake-up.n");
  53. }
  54. //===========================================================================
  55. static void __irq Eint8_23Int_100Hz(void)
  56. {
  57. rEINTPEND=(1<<11); //EINT11 sub-pending bit.
  58. ClearPending(BIT_EINT8_23);
  59. Uart_Printf("wuin");
  60. }
  61. //===========================================================================
  62. static void __irq AlarmInt(void)
  63. {
  64. Uart_Printf("INTPND:%x, SRCPND:%x n", rINTPND, rSRCPND);
  65. ClearPending(BIT_RTC);
  66. Uart_Printf("[WU]ALARM interrupt is occurred for Sleep mode wake-up.n");
  67. }
  68. //===========================================================================
  69. void Test_InitSDRAM(void)
  70. //Initialize SDRAM for SDRAM self-refresh test.
  71. {
  72. int i;
  73. Uart_Printf("[SDRAM Initialization]n");
  74. Uart_Printf("Fill SDRAM for self-refresh test.n");
  75. for(i=_NONCACHE_STARTADDRESS;i<(_NONCACHE_STARTADDRESS+0x400000);i+=4)
  76. *((U32 *)i)=i^0x55555555;
  77. Uart_Printf("Filling SDRAM is completed.n");
  78. *((volatile U32 *)0x33e00000)=0x0;  //for Initialize the counter in Check_SleepWakeUp_100Hz(). 
  79. }
  80. //===========================================================================
  81. void SelectEintType(void)
  82. {
  83. int extintMode;
  84. Uart_Printf("1.L-level  2.H-level  3.F-edge  4.R-edge  5.B-edgen");
  85. Uart_Printf("Select the EINT0 trigger type:");
  86. extintMode=Uart_Getch();
  87. rGPFCON=rGPFCON & ~(3<<0)|(2<<0); //PF0=EINT0
  88. switch(extintMode)
  89. {
  90. case '1':
  91. rEXTINT0=rEXTINT0&~(7<<0)|(0x0<<0); //EINT0=low level triggered
  92. Uart_Printf("L-leveln");
  93. break;
  94. case '2':
  95. rEXTINT0=rEXTINT0&~(7<<0)|(0x1<<0); //EINT0=high level triggered
  96. Uart_Printf("H-leveln");
  97. break;
  98. case '3':
  99. rEXTINT0=rEXTINT0&~(7<<0)|(0x2<<0);  //EINT0=falling edge triggered
  100. Uart_Printf("F-edgen");
  101. break;
  102. case '4':
  103. rEXTINT0=rEXTINT0&~(7<<0)|(0x4<<0); //EINT0=rising edge triggered
  104. Uart_Printf("R-edgen");
  105. break;
  106. case '5':
  107. rEXTINT0=rEXTINT0&~(7<<0)|(0x6<<0); //EINT0=both edge triggered
  108. Uart_Printf("B-edgen");
  109. break;
  110. default:
  111. break;
  112. }
  113. }
  114. //===========================================================================
  115. void ConfigSleepGPIO(void)
  116. {
  117. // Check point
  118. // 1) NC pin: input pull-up on 
  119. // 2) If input is driver externally: input pull-up off
  120. // 3) If a connected component draws some current: output low.
  121. // 4) If a connected component draws no current: output high.
  122. // Follow the configuration order for setting the ports. 
  123. // 1) setting value(GPnDAT) 
  124. // 2) setting control register  (GPnCON)
  125. // 3) configure pull-up resistor(GPnUP)  
  126. //CAUTION: Below configurations are only for SMDK2440 eva. board
  127. //*** PORT A GROUP
  128. // [22:nFCE] [21:nRSTOUT] [20:nFRE] [19:nFWE] [18:ALE] [17:CLE] [16:nGCS5]
  129. // [15:nGCS4] [14:nGCS3] [13:nGCS2] [12:nGCS1] [11:ADR26] [10:ADR25] [9:ADR24] [8:ADR23]  
  130. // [7:ADR22] [6:ADR21] [5:ADR20] [4:ADR19] [3:ADR18] [2:ADR17] [1:ADR16] [0:ADR0]
  131. rGPADAT = 0x200000;
  132. //rGPADAT = 0x0;
  133. rGPACON = 0x5effff;
  134. Uart_Printf("nrGPACON=%x rGPADAT=%xn", rGPACON, rGPADAT);
  135. //*** PORT B GROUP
  136. // [10:74LV00 Input] [9:nXDACK0] [8:74LVC573_LE] 
  137. // [7:74LVC573_d5] [6:nSS_KBD] [5:nDIS_OFF] [4:L3CLOCK] [3:L3DATA] [2:L3MODE] [1:nIrDATXDEN] [0:Keyboard]
  138. // * nXDREQ0/1:ext.pD, nSS_KBD:ext.pU, nDIS_OFF:ext.pD, nIrDATXDEN:ext.pU, Keyboard:ext.pU  
  139. //rGPBDAT = 0x0;
  140. rGPBDAT = 0x29f;
  141. rGPBCON = 0x0;  //all input  
  142. rGPBUP  = (1<<10)+(1<<8)+(1<<6)+(1<<5)+(1<<1)+(1<<0);//0x563;
  143. //rGPBUP  = (1<<10)+(1<<8)+(1<<5);//0x562;
  144. Uart_Printf("rGPBCON=%x rGPBDAT=%x rGPBUP=%xn", rGPBCON, rGPBDAT, rGPBUP);
  145. //modified for Voltage regulator /OE signal(GPB10), GPB10=output high.
  146. //rGPBCON = (1<<20)|(1<<16) | 0x0;  // GPB10=output  
  147. //rGPBUP  = (0<<10)+(0<<8)+(1<<6)+(1<<5)+(1<<1)+(1<<0);//0x563;
  148. //*** PORT C GROUP
  149. // [15:VD7] [14:VD6] [13:VD5] [12:VD4] [11:VD3] [10:VD2] [9:VD1] [8:VD0] 
  150. // [7:LCD_LPCREVB] [6:LCD_LPCREV] [5:LCD_LPCOE] [4:VM] [3:VFRAME] [2:VLINE] [1:VCLK] [0:LEND]
  151. // * LCD_LPCREV and LCD_LPCREVB are connected the analog circuit in LCD or board. So, this signal should be output L.
  152. //rGPCDAT = 0x0;
  153. rGPCDAT = 0xff3f;
  154. rGPCCON = (1<<14)+(1<<12);//0x5000;
  155. rGPCUP  = (1<<7)+(1<<6);//0xc0;  
  156. Uart_Printf("rGPCCON=%x rGPCDAT=%x rGPCUP=%xn", rGPCCON, rGPCDAT, rGPCUP);
  157. //*** PORT D GROUP
  158. // [15:VD23] [14:VD22] [13:VD21] [12:VD20] [11:VD19] [10:VD18] [9:VD17] [8:VD16] 
  159. // [7:VD15] [6:VD14] [5:VD13] [4:VD12] [3:VD11] [2:VD10] [1:VD9] [0:VD8]
  160. // * 5V tol. pad(GPD[10:8]) should be output L 
  161. // * The input of Maxim IC may have current sink, so the port should have configured output 'H'(GPD0)
  162. // * The output of Maxim IC drives 'H', so disable the pull-up(GPD1)
  163. //rGPDDAT = (1<<0);//0x1;
  164. rGPDDAT = 0xf8fd;
  165. rGPDCON = (1<<20)+(1<<18)+(1<<16)+(1<<0);//0x150001;
  166. rGPDUP  = (1<<10)+(1<<9)+(1<<8)+(1<<1);//0x702;
  167. Uart_Printf("rGPDCON=%x rGPDDAT=%x rGPDUP=%xn", rGPDCON, rGPDDAT, rGPDUP);
  168. //*** PORT E GROUP
  169. // [15:IICSDA] [14:IICSCL] [13:SPICLK] [12:SPIMOSI] [11:SPIMISO] [10:SDATA3] [9:SDDATA2] [8:SDDATA1] 
  170. // [7:SDDATA0] [6:SDCMD] [5:SDCLK] [4:I2SSDO] [3:I2SSDI] [2:CDCLK] [1:I2SSCLK] [0:I2SLRCK]
  171. // * 5V tol. pad(GPE[13:11]) should be output L 
  172. // * The output of CODEC IC drives 'H', so disable the pull-up
  173. // * IICSDA/IICSCL:ext pU, SDDAT[3:0]/SDCMD:ext pU 
  174. // rGPEDAT = 0x0;
  175. rGPEDAT = 0xc7f7;
  176. rGPECON = (1<<26)+(1<<24)+(1<<22);//0x5400000;
  177. rGPEUP  = (0xf<<12)+(0xf<<8)+(0x3<<6)+(1<<3);//0xffc8;
  178. //rGPEUP  = (1<<13)+(1<<12)+(1<<11)+(1<<3);
  179. Uart_Printf("rGPECON=%x rGPEDAT=%x rGPEUP=%xn", rGPECON, rGPEDAT, rGPEUP);
  180. //*** PORT F GROUP
  181. // [7:nLED_8] [6:nLED_4] [5:nLED_2] [4:nLED_1] [3:nIRQ_PCMCIA] [2:EINT2] [1:KBDINT] [0:EINT0]
  182. // * GPF[7:4] are connected to 'H' through LED, so make output 'H'
  183. // * nIRQ_PCMCIA=Hi-Z Before initialize
  184. // * EINT0 is the wake-up source
  185. // * EINT2/0:ext pU, KBDINT:Keyboard controller drives high 
  186. //rGPFDAT = (0xf<<4);//0xf0;
  187. rGPFDAT = 0xfe;
  188. rGPFCON = (0x5<<12)+(0x5<<8)+2;//0x5502;
  189. //rGPFCON = 0x5500;
  190. //rGPFUP  = (0xf<<4)+7;//0xf7;
  191. rGPFUP  = 0xf5;//0xf5;
  192. //rGPFUP  = 0xf1;//0xf1;
  193. Uart_Printf("rGPFCON=%x rGPFDAT=%x rGPFUP=%xn", rGPFCON, rGPFDAT, rGPFUP);
  194. #if 1 // If CPU Board is rev0.19, The EINT20 is used for USB control signal(Changed to output low, pu-disable)
  195. //*** PORT G GROUP
  196. // [15:EINT23] [14:EINT22] [13:EINT21] [12:GPIO out] [11:EINT19] [10:nCD_SD] [9:DMAMODE] [8:DMASTART]
  197. // [7:KBDSPICLK] [6:KBDSPIMOSI] [5:KBDSPIMISO] [4:LCD_PWREN] [3:EINT11] [2:nSS_SPI] [1:IRQ_LAN] [0:IRQ_PCMCIA]
  198. // * 5V tol. pad(GPG[13:11]) should be output L
  199. // * GPG[15:13]:NAND boot config, EINT19:ext pU, nCD_SD:ext pU, EINT11:ext pU
  200. // * The input of Maxim IC may have current sink, so the port should have configured output 'H'(GPG9)
  201. // * The output of Maxim IC drives 'H', so disable the pull-up(GPG10)
  202. rGPGDAT = 0x0f1f;
  203. rGPGCON = (1<<24) +(1<<18)+(1<<14)+(1<<12)+(1<<10);//0x1045400;
  204. rGPGUP  = (1<<12)+(0xe<<12)+(0xa<<8)+(0xe<<4)+(1<<3);//0xfae8;
  205. Uart_Printf("rGPGCON=%x rGPGDAT=%x rGPGUP=%xn", rGPGCON, rGPGDAT, rGPGUP);
  206. #else // If CPU Board is rev0.18
  207. //*** PORT G GROUP
  208. // [15:EINT23] [14:EINT22] [13:EINT21] [12:EINT20] [11:EINT19] [10:nCD_SD] [9:DMAMODE] [8:DMASTART]
  209. // [7:KBDSPICLK] [6:KBDSPIMOSI] [5:KBDSPIMISO] [4:LCD_PWREN] [3:EINT11] [2:nSS_SPI] [1:IRQ_LAN] [0:IRQ_PCMCIA]
  210. // * 5V tol. pad(GPG[13:11]) should be output L
  211. // * GPG[15:13]:NAND boot config, EINT19:ext pU, nCD_SD:ext pU, EINT11:ext pU
  212. // * The input of Maxim IC may have current sink, so the port should have configured output 'H'(GPG9)
  213. // * The output of Maxim IC drives 'H', so disable the pull-up(GPG10)
  214. //rGPGDAT = (1<<9);//0x200;
  215. rGPGDAT = 0x1f1f;
  216. rGPGCON = (1<<18)+(1<<14)+(1<<12)+(1<<10);//0x45400;
  217. //rGPGCON = 0x245400; //0x45400;
  218. //rGPGUP  = (0xe<<12)+(0xe<<8)+(0xe<<4)+(1<<3);//0xeee8;
  219. rGPGUP  = (0xe<<12)+(0xa<<8)+(0xe<<4)+(1<<3);//0xeae8;
  220. //rGPGUP  = 0xe2e0;
  221. //rGPGUP  = (0xf<<12)+(0xe<<8)+(0xe<<4)+(1<<3);//0xeee8;
  222. Uart_Printf("rGPGCON=%x rGPGDAT=%x rGPGUP=%xn", rGPGCON, rGPGDAT, rGPGUP);
  223. #endif
  224. //*** PORT H GROUP
  225. // [10:CLKOUT1] [9:CLKOUT0] [8:UCLK]
  226. // [7:nCTS1] [6:nRTS1] [5:RXD1] [4:TXD1] [3:RXD0] [2:TXD0] [1:nRTS0] [0:nCTS0] 
  227. // * WP_SP:ext pU
  228. // * The input of Maxim IC may have current sink, so the port should have configured output 'H'(GPH4/2/1)
  229. // * The output of Maxim IC drives 'H', so disable the pull-up(GPH5/3/0)
  230. //rGPHDAT = (1<<4)+(1<<2)+(1<<1);  
  231. rGPHDAT = 0x7d6;
  232. rGPHCON = (1<<8)+(1<<4)+(1<<2);//0x114; 
  233. rGPHUP  = (1<<8)+(1<<5)+(1<<3)+1;//0x129;
  234. //rGPHUP  = (1<<5)+(1<<3)+1;//0x29;
  235. //rGPHUP  = (1<<8);//0x100;
  236. //rGPHCON = (1<<20)+(1<<18)+(1<<8)+(1<<4)+(1<<2); 
  237. //rGPHUP  = (1<<10)+(1<<9)+(1<<8)+(1<<5)+(1<<3)+1;
  238. Uart_Printf("rGPHCON=%x rGPHDAT=%x rGPHUP=%xn", rGPHCON, rGPHDAT, rGPHUP);
  239. //*** PORT J GROUP
  240. // [12:CAMRESET] [11:CAMCLKOUT] [10:CAMHREF] [9:CAMVS] [8:CAMPCLKIN] 
  241. // [7:CAMD7] [6:CAMD6] [5:CAMD5] [4:CAMD4] [3:CAMD3] [2:CAMD2] [1:CAMD1] [0:CAMD0]
  242. // * The output of buffer IC drives 'H', so disable the pull-up(GPJ[10:0])
  243. //rGPJDAT = 0x0;  
  244. rGPJDAT = 0x1800;
  245. rGPJCON = 0x0;  // all input
  246. rGPJUP  = 0x7ff;
  247. Uart_Printf("rGPJCON=%x rGPJDAT=%x rGPJUP=%xnn", rGPJCON, rGPJDAT, rGPJUP);
  248.   //*3
  249.   /*
  250. rGPBUP = 0x0ffffffff;
  251. rGPCUP = 0x0ffffffff;
  252. rGPDUP = 0x0ffffffff;
  253. rGPEUP = 0x0ffffffff;
  254. rGPFUP = 0x0ffffffff;
  255. rGPGUP = 0x0ffffffff;
  256. rGPHUP = 0x0ffffffff;
  257. rGPJUP = 0x0ffffffff;
  258. */
  259. //External interrupt will be falling edge triggered. 
  260. rEXTINT0 = 0x22222222; // EINT[7:0]
  261. rEXTINT1 = 0x22222222; // EINT[15:8]
  262. rEXTINT2 = 0x22222222; // EINT[23:16]
  263. }
  264. //================================================================================
  265. void SetAlarmWakeUp(void)
  266. {
  267. rRTCCON = 0x1; // R/W enable, 1/32768, Normal(merge), No reset
  268. rBCDYEAR = TESTYEAR;
  269. rBCDMON  = TESTMONTH;
  270. rBCDDAY  = TESTDAY; // SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
  271. rBCDDATE = TESTDATE;
  272. rBCDHOUR = TESTHOUR;
  273. rBCDMIN  = TESTMIN;
  274. rBCDSEC  = TESTSEC;
  275. rALMYEAR=TESTYEAR2 ;
  276. rALMMON =TESTMONTH2;
  277. rALMDATE=TESTDATE2  ;
  278. rALMHOUR=TESTHOUR2 ;
  279. rALMMIN =TESTMIN2  ;
  280. rALMSEC =TESTSEC2+3;
  281. rRTCALM=0x7f;
  282. rRTCCON=0x0;   // R/W disable, 1/32768, Normal(merge), No reset
  283. }
  284. //================================================================================
  285. U32 dsc0_bak, dsc1_bak, mslcon_bak;
  286. void ConfigMiscIO(void)
  287. {
  288. // memory data/control signal pin status definition when sleep.
  289. mslcon_bak = rMSLCON;
  290. // In the evaluation board, Even though in sleep mode, the devices are all supplied the power.
  291. //rMSLCON = (0<<11)|(0<<10)|(0<<9)|(0<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<3)|(0<<2)|(0<<1)|(0<<0);
  292. rMSLCON = (1<<11)|(0<<10)|(0<<9)|(1<<8)|(1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0);
  293. //rMSLCON = (0<<11)|(0<<10)|(0<<9)|(1<<8)|(1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0);
  294. // Memory interface signal definition when sleep mode.
  295. //PSC_DATA [11] DATA status, 0:output "0" ( All 32-bit data Low drive ), 1:Hi-Z
  296. //PSC_WAIT [10] nWAIT status, 0:output "0", 1: input
  297. //PSC_RnB [9] RnB status, 0:output "0", 1: input
  298. //PSC_NF [8] NAND Flash I/O status, 0:inactive  nFCE,nFRE,nFWE,ALE,CLE = 11100, 1: Hi-Z
  299. //PSC_SDR [7] nSRAS, nSCAS  status, 0:inactive( "11"), 1: Hi-Z
  300. //PSC_DQM [6] DQM[3:0]/nWE[3:0]  status, 0:inactive( "0000"), 1:Hi-Z
  301. //PSC_OE [5] nOE status, 0:inactive( "1"), 1:Hi-Z
  302. //PSC_WE [4] nWE status, 0:inactive( "1"), 1:Hi-Z
  303. //PSC_GCS0 [3] nGCS[0] status, 0:inactive( "1"), 1:Hi-Z
  304. //PSC_GCS[5:1][2] nGCS[5:1] status, 0:inactive( "1"),  1:Hi-Z
  305. //PSC_GCS6 [1] nGCS[6] status, 0:inactive( "1"), 1:Hi-Z
  306. //PSC_GCS7 [0] nGCS[7] status, 0:inactive( "1"), 1:Hi-Z
  307. #if 1 // 0:*1, 1:*2.
  308. //Uart_Printf("Drive strength control(*2).n");
  309. dsc0_bak = rDSC0;
  310. dsc1_bak = rDSC1;
  311. rDSC0 = 0x7fffffff;
  312. rDSC0 &= ~(1<<31); //enable
  313. // nEN_DSC [31] Enable Drive strength control, 0:enable
  314. // DSC_ADR [9:8] Address bus drive strength. 0:10mA, 1:8mA, 2:6mA, 3:4mA
  315. // DSC_DATA [7:0] Data bus drive strength, 0:12mA, 1:10mA, 2:8mA, 3:6mA
  316. //rDSC1 = (3<<28)|(3<<26)|(3<24)|(3<<22)|(3<<20)|(3<<18);
  317. rDSC1 = 0x7fffffff;
  318. // 0:16mA, 1:12mA, 2:8mA, 3:6mA
  319. //DSC_SCK1 [29:28] SCLK1
  320. //DSC_SCK0 [27:26] SCLK0
  321. //DSC_SCKE [25:24] SCKE
  322. //DSC_SDR [23:22] nSRAS/nSCAS
  323. //DSC_NFC [21:20] Nand Flash(nFCWE, nFRE, nFWE,CLE,ALE) Control
  324. //DSC_BE [19:18] nBE[3:0]
  325. //DSC_WOE [17:16] nWE/nOE
  326. //DSC_CS7 [15:14] nGCS7
  327. //DSC_CS6 [13:12] nGCS6
  328. //DSC_CS5 [11:10] nGCS5
  329. //DSC_CS4 [9:8] nGCS4
  330. //DSC_CS3 [7:6] nGCS3
  331. //DSC_CS2 [5:4] nGCS2
  332. //DSC_CS1 [3:2] nGCS1
  333. //DSC_CS0 [1:0] nGCS0
  334. #else
  335. //Uart_Printf("Drive strength control(*1).n");
  336. rDSC0 |= (1<<31); //disable
  337. rDSC0 = (1<<31)|(3<<8)|(3<<0);
  338. // nEN_DSC [31] Enable Drive strength control, 1:enable
  339. // DSC_ADR [9:8] Address bus drive strength. 0:10mA, 1:8mA, 2:6mA, 3:4mA
  340. // DSC_DATA [7:0] Data bus drive strength, 0:12mA, 1:10mA, 2:8mA, 3:6mA
  341. rDSC1 = (3<<28)|(3<<26)|(3<24)|(3<<22)|(3<<20)|(3<<18);
  342. #endif
  343. }
  344. //================================================================================
  345. void Check_SleepWakeUp(void)
  346. {
  347. Uart_Printf("[Sleep related registers]n");
  348. Uart_Printf("GSTATUS2: PWRST=%d OFFRST=%d WDTRST=%dn", 
  349. (rGSTATUS2&(1<<0))!=0,
  350. (rGSTATUS2&(1<<1))!=0,
  351. (rGSTATUS2&(1<<2))!=0);
  352. Uart_Printf("GSTATUS2:%x, GSTATUS2n");
  353. Uart_Printf("GSTATUS3:%x(0x0,0x%x), GSTATUS4=%x(0x0,0xaaaaaaaa)n",
  354. rGSTATUS3,(U32)StartPointAfterSleepWakeUp, rGSTATUS4);
  355. if(rGSTATUS2&(1<<0))
  356. {
  357. Uart_Printf("Power On Resetnn");
  358. rGSTATUS2=(1<<0);
  359. SLEEP_COUNT=0;
  360. return;
  361. }
  362. if(rGSTATUS2&(1<<1))
  363. {
  364. Uart_Printf("Sleep Wake-upnn");
  365. rGSTATUS2=(1<<1);
  366. Uart_Printf("EINTPEND=0x%xn",rEINTPEND);
  367. Uart_Printf("SRCPND=0x%xn",rSRCPND);
  368. // Added for wake-up 100Hz.
  369. SLEEP_COUNT = SLEEP_COUNT+1;
  370. Uart_Printf("SLEEP_COUNT=%dn", SLEEP_COUNT);
  371. if(SLEEP_COUNT>1000000) 
  372. {
  373. Uart_Printf("nnSleep count is %d... any key to continuenn", SLEEP_COUNT);
  374. Uart_Getch();
  375. }
  376. Test_SleepMode();// goto sleep mode again.
  377. }
  378. if(rGSTATUS2&(1<<2))
  379. {
  380. Uart_Printf("Watchdog Resetnn");
  381. rGSTATUS2=(1<<2);
  382. return;
  383. }
  384. }
  385. //=========================================================================
  386. void Test_SleepMode(void)
  387. {
  388. int i, mode, error=0;
  389. U32 portStatus[33+3];
  390. Uart_Printf("[Sleep Mode Test]n");
  391. //Added for battery fault...
  392. #if 0
  393. Uart_Printf("nBATT_FLT pin should be tested.n");
  394. Uart_Printf("nBattery fault interrupt setting.n");
  395. Uart_Printf("Detect low-level.n");
  396. Uart_Printf("0 : Reset system during nBATT_FLT=0.n");
  397. Uart_Printf("4 : System will be wake-up from sleep mode during nBATT_FLT=0.n");
  398. Uart_Printf("6 : System will ignore Eint0 signal during nBATT_FLT=0.n");
  399. Uart_Printf("7 : Disable Battery function.n");
  400. Uart_Printf("Select battery function : ");
  401. i = Uart_GetIntNum() & 0x7;
  402. rMISCCR = (rMISCCR & ~(0x1f<<20)) | (i<<20);
  403. // [22:20]
  404. // if 0, System will be Reset during nBATT_FLT=0.
  405. // if 4, System will be wake-up from sleep mode during nBATT_FLT=0.
  406. // if 6, System will ignore nBATT_FLT signal.
  407. // if 7, Disable Battery function.
  408. Uart_Printf("rMISCCR0:%xn", rMISCCR);
  409. rMISCCR |=(0x67<<3);
  410. Uart_Printf("rMISCCR1:%xn", rMISCCR);
  411. pISR_BAT_FLT = (U32)BattFaultInt;
  412. rSRCPND = BIT_BAT_FLT;
  413. rINTPND = BIT_BAT_FLT;
  414. rINTMSK = rINTMSK & ~(BIT_BAT_FLT); // unmask.
  415. #endif
  416. //Added for battery fault... End
  417. #if 0
  418. Uart_Printf("Check SDRAM for self-refresh testn");
  419. for(i=_NONCACHE_STARTADDRESS;i<(_NONCACHE_STARTADDRESS+0x400000);i+=4)
  420. {
  421. //Uart_Printf("%x=%x(%x)n",i,*((U32 *)i),i^0x55555555);
  422. if(*((U32 *)i)!=(i^0x55555555))
  423. {
  424. Uart_Printf("Mem Error:%x=%x(%x)n",i,*((U32 *)i),i^0x55555555);
  425.  error++;
  426. }
  427. if(error>20)
  428. break;
  429. }
  430. if(error)
  431. Uart_Printf("SDRAM self-refresh test:FAILEDn"); 
  432. else 
  433. Uart_Printf("SDRAM self-refresh test:O.K.n");
  434. #endif
  435. Uart_TxEmpty(1); //Wait until UART0 Tx buffer empty.
  436.    
  437. #if 0   
  438. SelectEintType();
  439. #else
  440. rGPFCON=rGPFCON & ~(3<<0)|(2<<0); //PF0=EINT0
  441. rEXTINT0=rEXTINT0&~(7<<0)|(2<<0);  //EINT0=falling edge triggered
  442. #endif
  443. #if 1 //test whether or not the interrupt pending bit retain the wake-up source.
  444. pISR_EINT0=(U32)Eint0Int;
  445. pISR_EINT8_23=(U32)Eint8_23Int;
  446. pISR_RTC=(U32)AlarmInt;
  447. rINTMSK = ~(BIT_EINT0|BIT_EINT8_23|BIT_RTC);
  448. for(i=0;i<100;i++);
  449. rSRCPND = BIT_EINT0|BIT_EINT8_23|BIT_RTC;
  450. rINTPND = BIT_EINT0|BIT_EINT8_23|BIT_RTC;
  451. rEINTPEND=rEINTPEND;
  452. rSRCPND=rSRCPND;
  453. rINTPND=rINTPND;
  454. #endif  
  455. rEINTMASK = rEINTMASK&~(1<<11); 
  456. //SRCPND: EINT8_23 will be set by EINT11 after wake-up.
  457. rINTMSK = BIT_ALLMSK;
  458. // NOTE: 
  459. // Any interrupt can't be available in Sleep mode. 
  460. // because SDRAM enters into self-refresh mode during Sleep mode.
  461. // ISR code is on the SDRAM. 
  462. Uart_Printf("nAlarm Wake-Up (y/n)? ");
  463. if(Uart_Getch()=='y')
  464. {
  465. Uart_Printf("nS3C2440 will wake up by RTC alarm(10 sec) or EINT0 .n");
  466. SetAlarmWakeUp();
  467. }
  468. else
  469. {
  470. Uart_Printf("nPush EINT0 button for wake-up from sleep mode.n");
  471. }
  472. rRTCCON=0x0;   // R/W disable, 1/32768, Normal(merge), No reset
  473. rADCCON|=(1<<2);
  474. /* Pin Configuration in Sleep Mode */
  475. rMISCCR|=(1<<12); //USB port0 = suspend
  476. rMISCCR|=(1<<13); //USB port1 = suspend
  477. //rMISCCR|=(1<<2); //Previous state at STOP(?) mode (???)
  478. //rMISCCR &= ~(1<<2); //Previous state at STOP(?) mode (???)
  479. Uart_Printf("nrMISCCR0 = %xn", rMISCCR);
  480. //rMISCCR |=(0x67<<3);
  481. //Uart_Printf("rMISCCR1 = %xn", rMISCCR);
  482. rGSTATUS3=(U32)StartPointAfterSleepWakeUp; // mmory control part in startup code.
  483. Uart_Printf("nrGSTATUS(Restart target address after wake-up):%xn", rGSTATUS3);
  484. rGSTATUS4=0xaaaaaaaa;
  485. Uart_TxEmpty(1); //Wait until UART0 Tx buffer empty.
  486. ConfigSleepGPIO();
  487. ConfigMiscIO();
  488. //Max1718_Set(110);
  489. rMISCCR=rMISCCR|(3<<0); //Data[31:0] Pull-Up Disable
  490. Lcd_EnvidOnOff(0);  //LCD must be off before entering Sleep mode.
  491. //rMISCCR = (rMISCCR & ~(0x1f<<20)) | (6<<20); // set 6.
  492. //===================================================
  493. //  VERY IMPORTANT NOTE 
  494. //  To enter SLEEP/SLIDLE mode, MMU TLB-fill operation should be prohibited
  495. //  because MTT table is in SDRAM and SDRAM is in the self-refresh mode.
  496. //  So, we will fill TLB before entering SDRAM self-refresh 
  497. //  instead of disabling MMU.
  498.       rREFRESH;//To fill TLB for the special register used in EnterPWDN
  499.       rCLKCON;
  500. //===================================================
  501. EnterPWDN(0xffff8); //Sleep Mode
  502. //Never return here. 
  503. }
  504. int batt_flag=0;
  505. //=========================================================================
  506. static void __irq BattFaultInt(void)
  507. {
  508. rINTMSK |= (BIT_BAT_FLT); // mask.
  509. ClearPending(BIT_BAT_FLT)
  510. Uart_Printf("BATT_FLT interrupt occuredn");
  511. batt_flag=1;
  512. //Batt_Sleep();
  513. }
  514. //================================================================================
  515. void Test_BattFaultInterrupt(void)
  516. {
  517. int i;
  518. Uart_Printf("Battery fault interrupt test.n");
  519. Uart_Printf("Detect low-level.n");
  520. Uart_Printf("0 : Reset system during nBATT_FLT=0.n");
  521. Uart_Printf("4 : System will be wake-up from sleep mode during nBATT_FLT=0.n");
  522. Uart_Printf("6 : System will ignore Eint0 signal during nBATT_FLT=0.n");
  523. Uart_Printf("7 : Disable Battery function.n");
  524. Uart_Printf("Select battery function : ");
  525. i = Uart_GetIntNum() & 0x7;
  526. rMISCCR = (rMISCCR & ~(0x1f<<20)) | (i<<20);
  527. // [22:20]
  528. // if 0, System will be Reset during nBATT_FLT=0.
  529. // if 4, System will be wake-up from sleep mode during nBATT_FLT=0.
  530. // if 6, System will ignore nBATT_FLT signal.
  531. // if 7, Disable Battery function.
  532. pISR_BAT_FLT = (U32)BattFaultInt;
  533. rSRCPND = BIT_BAT_FLT;
  534. rINTPND = BIT_BAT_FLT;
  535. rINTMSK = rINTMSK & ~(BIT_BAT_FLT); // unmask.
  536. while(batt_flag==0)
  537. {
  538. if(Uart_GetKey()){
  539. break; 
  540. }
  541. }
  542. batt_flag=0;
  543. //Batt_Sleep();
  544. Uart_Printf("exit.n");
  545. }
  546. void Batt_Sleep(void)
  547. {
  548. int i;
  549. U32 portStatus[33+3];
  550. int error=0;
  551. int mode;
  552. Uart_Printf("[Sleep Mode Test]n");
  553. Uart_Printf("nBATT_FLT pin should be tested.n");
  554. Uart_Printf("S3C2440 will wake up by EINT0 .n");
  555. /////////////////////////////////////////// add for battery fault...
  556. #if 1
  557. Uart_Printf("6 : System will ignore Eint0 signal during nBATT_FLT=0.n");
  558. Uart_Printf("rMISCCR:%xn", rMISCCR);
  559. #endif
  560. /////////////////////////////////////////// add for battery fault...end
  561. Uart_TxEmpty(1); //Wait until UART0 Tx buffer empty.
  562.    
  563. #if 0   
  564. SelectEintType();
  565. #else
  566. rGPFCON=rGPFCON & ~(3<<0)|(2<<0); //PF0=EINT0
  567. rEXTINT0=rEXTINT0&~(7<<0)|(2<<0);  //EINT0=falling edge triggered
  568. #endif
  569. #if 1 //test whether or not the interrupt pending bit retain the wake-up source.
  570. pISR_EINT0=(U32)Eint0Int;
  571. pISR_EINT8_23=(U32)Eint8_23Int;
  572. pISR_RTC=(U32)AlarmInt;
  573. rINTMSK = ~(BIT_EINT0|BIT_EINT8_23|BIT_RTC);
  574. for(i=0;i<100;i++);
  575. rSRCPND = BIT_EINT0|BIT_EINT8_23|BIT_RTC;
  576. rINTPND = BIT_EINT0|BIT_EINT8_23|BIT_RTC;
  577. rEINTPEND=rEINTPEND;
  578. rSRCPND=rSRCPND;
  579. rINTPND=rINTPND;
  580. #endif  
  581. rEINTMASK = rEINTMASK&~(1<<11); //SRCPND:EINT8_23 will be set by EINT11 after wake-up.
  582. rINTMSK = BIT_ALLMSK;
  583. // NOTE: Any interrupt can't be used in Sleep mode. 
  584. //    because SDRAM is in self-refresh mode and ISR code will access SDRAM.
  585. Uart_Printf("Alarm wake-up (y/n)? ");
  586. if(Uart_Getch()=='y')
  587. {
  588. Uart_Printf("S3C2440 will wake up by RTC alarm(10 sec) or EINT0 .n");
  589. SetAlarmWakeUp();
  590. }
  591. rRTCCON=0x0;   // R/W disable, 1/32768, Normal(merge), No reset
  592. rADCCON|=(1<<2);
  593. rMISCCR|=(1<<12); //USB port0 = suspend
  594. rMISCCR|=(1<<13); //USB port1 = suspend
  595. //rMISCCR|=(1<<2); //Previous state at STOP(?) mode (???)
  596. rMISCCR &= ~(1<<2); //Previous state at STOP(?) mode (???)
  597. rGSTATUS3=(U32)StartPointAfterSleepWakeUp; // memory control part in startup code.
  598. Uart_Printf("set restart address:%xn", rGSTATUS3);
  599. rGSTATUS4=0xaaaaaaaa;
  600. Uart_TxEmpty(1); //Wait until UART0 Tx buffer empty.
  601. ConfigSleepGPIO();
  602. ConfigMiscIO();
  603. rMISCCR=rMISCCR|(3<<0); 
  604. Lcd_EnvidOnOff(0); //Before entering Sleep mode, LCD must be off
  605. rMISCCR = (rMISCCR & ~(0x7<<20)) | (6<<20); // set 6.
  606. //=================================================================
  607. //  VERY IMPORTANT NOTE 
  608. //  To enter SLEEP/SLIDLE mode, MMU TLB-fill operation should be prohibited
  609. //   because MTT table is in SDRAM and SDRAM is in the self-refresh mode.
  610. //  So, we will fill TLB before entering SDRAM self-refresh 
  611. //   instead of disabling MMU.
  612. rREFRESH;//To fill TLB for the special register used in EnterPWDN
  613. rCLKCON;
  614. //=================================================================
  615. EnterPWDN(0xffff8); //Sleep mode
  616. }
  617. /************************ Sleep Mode by 100hz test ************************/
  618. //================================================================================
  619. void Check_SleepWakeUp_100Hz(void)
  620. {
  621. }
  622. //================================================================================
  623. void Test_SleepMode_100Hz(void)
  624. {
  625. }
  626. void Test_StopMode(void)
  627. {
  628. int i;
  629. U32 portStatus[33+3]; // +3 is for 2440 GPJ port.
  630. int error=0;
  631. int mode;
  632. Uart_Printf("[STOP Mode Test]n");
  633. Uart_Printf("S3C2440 will wake up by EINT0 .n");
  634. Uart_TxEmpty(1); //Wait until UART0 Tx buffer empty.
  635. rMISCCR = (rMISCCR & ~(7<<8) & ~(7<<4)) | (3<<8) | (2<<4); // CLKSEL0=FCLK, CLKSEL1=HCLK
  636. // Save the port configurations
  637. for(i=0;i<33;i++) {
  638. portStatus[i]=*( (volatile U32 *)0x56000000 + i); // 0x5600_0000:GPACON addr.
  639. }
  640. for(i=0;i<3;i++) 
  641. portStatus[i+33]=*( (volatile U32 *)0x560000d0 + i); // 0x5600_00d0:GPJCON addr. added ffor 2440
  642. ConfigSleepGPIO();
  643. ConfigMiscIO();
  644.    
  645. //Uart_Printf("S3C2440 will wake up by EINT0 (Falling Edge Triggered).n");
  646. rGPFCON=rGPFCON & ~(3<<0)|(2<<0); //GPF0=EINT0
  647. rEXTINT0=rEXTINT0&~(7<<0)|(0x2<<0);  //EINT0=falling edge triggered
  648. //Uart_Printf("S3C2440 will wake up by EINT11 (Falling Edge Triggered).n");
  649. rGPGCON=rGPGCON & ~(3<<6)|(2<<6); //GPG3=EINT11
  650. rEXTINT1=rEXTINT1&~(7<<12)|(2<<12);  //EINT11=falling edge triggered
  651. //Uart_Printf("nNow, I am entering Stop mode.n");
  652. Uart_TxEmpty(1); //Wait until UART0 Tx buffer empty.
  653. pISR_EINT0 = (U32)Eint0Int;
  654. pISR_EINT8_23 = (U32)Eint8_23Int;
  655. pISR_RTC   = (U32)AlarmInt;
  656. rEINTPEND = (1<<11); // clear EINT11 pending bit in rEINTPEND
  657. rSRCPND = BIT_EINT0 | BIT_RTC | BIT_EINT8_23;
  658. rINTPND = BIT_EINT0 | BIT_RTC | BIT_EINT8_23;
  659. rINTMSK = BIT_ALLMSK;
  660. //rINTMSK = ~BIT_EINT0;
  661. // NOTE: Any interrupt can't be used in Sleep mode 
  662. //    because SDRAM is in self-refresh mode and ISR code will access SDRAM.
  663. rRTCCON=0x0;   // R/W disable, 1/32768, Normal(merge), No reset
  664. rADCCON|=(1<<2); // ADC stanby.
  665. rMISCCR|=(1<<12); //USB port0 = suspend
  666. rMISCCR|=(1<<13); //USB port1 = suspend
  667. //rMISCCR|=(1<<2); //Previous state at Sleep mode. 
  668. rMISCCR &= ~(1<<2); //Previous state at STOP(?) mode (???)
  669.  
  670. //For SDRAM self-refresh mode, rMISCCR[2] should be 1.
  671. rMISCCR=rMISCCR|(3<<0); 
  672. Lcd_EnvidOnOff(0); //Before entering Sleep mode, LCD must be off
  673. Delay(1);
  674. Led_Display(0x5);
  675. //rCLKSLOW=0x34;  //csh (???)debug
  676. //=====================================================
  677. //  VERY IMPORTANT NOTE 
  678. //  To enter STOP/SLIDLE mode, MMU TLB-fill operation should be prohibited
  679. //   because MTT table is in SDRAM and SDRAM is in the self-refresh mode.
  680. //  So, we will fill TLB before entering SDRAM self-refresh 
  681. //   instead of disabling MMU.
  682. rREFRESH; //To fill TLB for the special register used in EnterPWDN
  683. rCLKCON;
  684. rMISCCR;
  685. rGPFDAT;
  686. //=====================================================
  687. rGPGDAT=rGPGDAT&~(1<<11)|(0<<11); //GPG11(EINT19)=L
  688. EnterPWDN(0xffff1); //Sleep mode added for 2440 bit[19] camera.
  689. rCLKCON=0xffff0; //Clear STOP_BIT & IDLE_BIT just after exiting Sleep mode.
  690. //rCLKSLOW=0x4; //csh (???) debug
  691. Uart_Printf("wake-upn");
  692. // Restore I/O drive strength 
  693. rDSC0 = (1<<31)|(0<<8)|(0<<0);
  694. rDSC1 = (0<<28)|(0<<26)|(0<24)|(0<<22)|(0<<20)|(0<<18);
  695. //Restore the port configurations
  696. for(i=0;i<33;i++){
  697. *( (volatile U32 *)0x56000000 + i)=portStatus[i];
  698. }
  699. for(i=0;i<3;i++)  // GPJ port
  700. *( (volatile U32 *)0x560000d0 + i)=portStatus[i+33];
  701. Led_Display(0xa);
  702. Lcd_EnvidOnOff(1); 
  703. Uart_Printf("SRCPND=%x,INTPND=%xn",rSRCPND,rINTPND);
  704. rINTMSK =~(BIT_EINT0|BIT_RTC|BIT_EINT8_23);
  705. for(i=0;i<10;i++); 
  706. //The Wake-up source is indicated by rSRCPND.
  707. //The corresponding interrupt wiil be occurred here.
  708. rINTMSK =BIT_ALLMSK;
  709. Uart_Printf("Return to Normal Mode.n");
  710. }