power.c
上传用户:qiulin1960
上传日期:2013-10-16
资源大小:2844k
文件大小:21k
源码类别:

Windows CE

开发平台:

Windows_Unix

  1. /******************************************************************************
  2.  *
  3.  * System On Chip(SOC)
  4.  *
  5.  * Copyright (c) 2002 Software Center, Samsung Electronics, Inc.
  6.  * All rights reserved.
  7.  *
  8.  * This software is the confidential and proprietary information of Samsung 
  9.  * Electronics, Inc("Confidential Information"). You Shall not disclose such 
  10.  * Confidential Information and shall use it only in accordance with the terms 
  11.  * of the license agreement you entered into Samsung.
  12.  *
  13.  *-----------------------------------------------------------------------------
  14.  *
  15.  * S3C2440 BSP 
  16.  *
  17.  * power.c   :  S3C2440 Power Management(OEMPowerOff()) Routines
  18.  *
  19.  *      
  20.  ******************************************************************************
  21.  */
  22. #include "windows.h"
  23. #include "nkintr.h"
  24. #include "oalintr.h"
  25. #include "s2440.h"
  26. #include "drv_glob.h"
  27. #define PRIVATE     static
  28. #define PUBLIC      
  29. extern void   CPUPowerOff(void);
  30. //extern void   EmergencyCPUPowerOff(void);
  31. extern void   CPUPowerReset();
  32. void Watchdog_Set(void);
  33. void Burst_Refresh(void);
  34. void CLR_IF();
  35. PRIVATE DWORD CPUBackupRegs[60];
  36. void (*gpfnKitlPowerHandler)(BOOL bOff) = NULL;
  37. //============================================================
  38. // Power Mnanagement Related..
  39. #define PRIVATE     static
  40. PRIVATE DWORD CPUBackupRegs[60];
  41. PRIVATE void 
  42. CPUSaveRegs(DWORD *p)
  43. {
  44.     volatile IOPreg *s2440IOP = (IOPreg *)IOP_BASE;
  45. volatile INTreg *s2440INT = (INTreg *)INT_BASE;
  46.     volatile LCDreg *s2440LCD = (LCDreg *)LCD_BASE;    
  47.     *p++ = s2440IOP->rGPACON;
  48.     *p++ = s2440IOP->rGPADAT;
  49.     *p++ = s2440IOP->rGPBCON;
  50.     *p++ = s2440IOP->rGPBDAT;
  51.     *p++ = s2440IOP->rGPBUP;
  52.     *p++ = s2440IOP->rGPCCON;
  53.     *p++ = s2440IOP->rGPCDAT;
  54.     *p++ = s2440IOP->rGPCUP;
  55.     *p++ = s2440IOP->rGPDCON;
  56.     *p++ = s2440IOP->rGPDDAT;
  57.     *p++ = s2440IOP->rGPDUP;
  58.     *p++ = s2440IOP->rGPECON;
  59.     *p++ = s2440IOP->rGPEDAT;
  60.     *p++ = s2440IOP->rGPEUP;
  61.     *p++ = s2440IOP->rGPFCON;
  62.     *p++ = s2440IOP->rGPFDAT;
  63.     *p++ = s2440IOP->rGPFUP;
  64.     *p++ = s2440IOP->rGPGCON;
  65.     *p++ = s2440IOP->rGPGDAT;
  66.     *p++ = s2440IOP->rGPGUP;
  67.     *p++ = s2440IOP->rGPHCON;
  68.     *p++ = s2440IOP->rGPHDAT;
  69.     *p++ = s2440IOP->rGPHUP;
  70.     *p++ = s2440IOP->rMISCCR;
  71.     *p++ = s2440IOP->rDCKCON;
  72.     *p++ = s2440IOP->rEXTINT0;
  73.     *p++ = s2440IOP->rEXTINT1;
  74.     *p++ = s2440IOP->rEXTINT2;
  75.     *p++ = s2440IOP->rEINTFLT0;
  76.     *p++ = s2440IOP->rEINTFLT1;
  77.     *p++ = s2440IOP->rEINTFLT2;
  78.     *p++ = s2440IOP->rEINTFLT3;
  79.     *p++ = s2440IOP->rEINTMASK;
  80.     *p++ = s2440INT->rINTMOD;
  81.     *p++ = s2440INT->rINTMSK;
  82.     *p++ = s2440INT->rINTSUBMSK;
  83.     *p++ = s2440LCD->rTCONSEL;
  84.     *p++ = s2440LCD->rLCDINTMSK;
  85.     *p++ = s2440LCD->rTPAL;
  86.     *p++ = s2440LCD->rDITHMODE;
  87.     *p++ = s2440LCD->rBLUELUT;
  88.     *p++ = s2440LCD->rGREENLUT;
  89.     *p++ = s2440LCD->rREDLUT;
  90.     *p++ = s2440LCD->rLCDSADDR3;
  91.     *p++ = s2440LCD->rLCDSADDR2;
  92.     *p++ = s2440LCD->rLCDSADDR1;
  93.     *p++ = s2440LCD->rLCDCON5;
  94.     *p++ = s2440LCD->rLCDCON4;
  95.     *p++ = s2440LCD->rLCDCON3;
  96.     *p++ = s2440LCD->rLCDCON2;
  97.     *p++ = s2440LCD->rLCDCON1;
  98. }
  99. PRIVATE void 
  100. CPULoadRegs(DWORD *p)
  101. {
  102.     volatile IOPreg *s2440IOP = (IOPreg *)IOP_BASE;
  103. volatile INTreg *s2440INT = (INTreg *)INT_BASE;
  104.     volatile LCDreg *s2440LCD = (LCDreg *)LCD_BASE;    
  105.     s2440IOP->rGPACON    =  *p++;
  106.     s2440IOP->rGPADAT    =  *p++;
  107.     s2440IOP->rGPBCON    =  *p++;
  108.     s2440IOP->rGPBDAT    =  *p++;
  109.     s2440IOP->rGPBUP     =  *p++;
  110.     s2440IOP->rGPCCON    =  *p++;
  111.     s2440IOP->rGPCDAT    =  *p++;
  112.     s2440IOP->rGPCUP     =  *p++;
  113.     s2440IOP->rGPDCON    =  *p++;
  114.     s2440IOP->rGPDDAT    =  *p++;
  115.     s2440IOP->rGPDUP     =  *p++;
  116.     s2440IOP->rGPECON    =  *p++;
  117.     s2440IOP->rGPEDAT    =  *p++;
  118.     s2440IOP->rGPEUP     =  *p++;
  119.     s2440IOP->rGPFCON    =  *p++;
  120.     s2440IOP->rGPFDAT    =  *p++;
  121.     s2440IOP->rGPFUP     =  *p++;
  122.     s2440IOP->rGPGCON    =  *p++;
  123.     s2440IOP->rGPGDAT    =  *p++;
  124.     s2440IOP->rGPGUP     =  *p++;
  125.     s2440IOP->rGPHCON    =  *p++;
  126.     s2440IOP->rGPHDAT    =  *p++;
  127.     s2440IOP->rGPHUP     =  *p++;
  128.                                 
  129.     s2440IOP->rMISCCR    =  *p++;
  130.     s2440IOP->rDCKCON    =  *p++;
  131.     s2440IOP->rEXTINT0   =  *p++;
  132.     s2440IOP->rEXTINT1   =  *p++;
  133.     s2440IOP->rEXTINT2   =  *p++;
  134.     s2440IOP->rEINTFLT0  =  *p++;
  135.     s2440IOP->rEINTFLT1  =  *p++;
  136.     s2440IOP->rEINTFLT2  =  *p++;
  137.     s2440IOP->rEINTFLT3  =  *p++;
  138.     s2440IOP->rEINTMASK  =  *p++;
  139.     s2440INT->rINTMOD    =  *p++; 
  140.     s2440INT->rINTMSK    =  *p++; 
  141.     s2440INT->rINTSUBMSK =  *p++; 
  142.                                    
  143.     s2440LCD->rTCONSEL   =  *p++; 
  144.     s2440LCD->rLCDINTMSK =  *p++; 
  145.     s2440LCD->rTPAL      =  *p++; 
  146.     s2440LCD->rDITHMODE  =  *p++; 
  147.     s2440LCD->rBLUELUT   =  *p++; 
  148.     s2440LCD->rGREENLUT  =  *p++; 
  149.     s2440LCD->rREDLUT    =  *p++; 
  150.     s2440LCD->rLCDSADDR3 =  *p++; 
  151.     s2440LCD->rLCDSADDR2 =  *p++; 
  152.     s2440LCD->rLCDSADDR1 =  *p++; 
  153.     s2440LCD->rLCDCON5   =  *p++; 
  154.     s2440LCD->rLCDCON4   =  *p++; 
  155.     s2440LCD->rLCDCON3   =  *p++; 
  156.     s2440LCD->rLCDCON2   =  *p++; 
  157.     s2440LCD->rLCDCON1   =  *p++;
  158. }
  159. void ConfigStopGPIO(void)
  160. {
  161.     volatile IOPreg *s2440IOP = (IOPreg *)IOP_BASE;
  162.     // Check point
  163.     // 1) NC pin: input pull-up on 
  164.     // 2) If input is driver externally: input pull-up off
  165.     // 3) If a connected component draws some current: output low.
  166.     // 4) If a connected component draws no current: output high.
  167.     
  168.     //chip # = 5
  169.     //CAUTION:Follow the configuration order for setting the ports. 
  170.     // 1) setting value(GPnDAT) 
  171.     // 2) setting control register  (GPnCON)
  172.     // 3) configure pull-up resistor(GPnUP)  
  173.     //32bit data bus configuration  
  174.     //*** PORT A GROUP
  175.     //Ports  : GPA22 GPA21  GPA20 GPA19 GPA18 GPA17 GPA16 GPA15 GPA14 GPA13 GPA12  
  176.     //Signal : nFCE nRSTOUT nFRE  nFWE  ALE   CLE   nGCS5 nGCS4 nGCS3 nGCS2 nGCS1 
  177.     //Binary : 1     1      1,    1     1     1     1,    1     1     1     1,
  178.     //POFF   : 1     0      1,    1     0     0     1,    1     1     1     1,
  179.     //-------------------------------------------------------------------------------------------
  180.     //Ports  : GPA11  GPA10  GPA9   GPA8   GPA7   GPA6   GPA5   GPA4   GPA3   GPA2   GPA1   GPA0
  181.     //Signal : ADDR26 ADDR25 ADDR24 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0 
  182.     //Binary : 1      1      1      1,     1      1      1      1,     1      1      1      1         
  183.     //POFF   : 0      0      0      0,     0      0      0      0,     0      0      0      0
  184.     s2440IOP->rGPACON = 0x7fffff; 
  185.     //**** PORT B GROUP
  186.     //Ports  : GPB10   GPB9    GPB8    GPB7    GPB6    GPB5     GPB4    GPB3   GPB2   GPB1       GPB0
  187.     //Signal : nXDREQ0 nXDACK0 nXDREQ1 nXDACK1 nSS_KBD nDIS_OFF L3CLOCK L3DATA L3MODE nIrDATXDEN Keyboard
  188.     //Setting: INPUT   OUTPUT  INPUT   OUTPUT  INPUT   OUT      OUT     OUT    OUT    INPUT      INPUT 
  189.     //Binary : 00,     01      00,     01      00,     01       01,     01     01,    00         00  
  190.     //PU_OFF :  0       1       0,      1      1(ext)  1(*)     1,      1      1      1(ext)     1(ext)           
  191.     //*:nDIS_OFF:4.7K external pull-down resistor                                 
  192.     // s2440IOP->rGPBDAT=  0x0|(1<<9)|(1<<7)|(0<<5)|(1<<4)|(1<<3)|(1<<2);
  193. s2440IOP->rGPBDAT=  0x0|(0<<9)|(1<<7)|(0<<5)|(1<<4)|(1<<3)|(1<<2); // SHLIM 040116
  194.     s2440IOP->rGPBCON = 0x044550;  
  195.     s2440IOP->rGPBUP  = 0x2ff;   //0x2fd->2ff, 3uA is reduced. Why? 
  196.     //*** PORT C GROUP
  197.     //Ports  : GPC15 GPC14 GPC13 GPC12 GPC11 GPC10 GPC9 GPC8 GPC7  GPC6   GPC5   GPC4 GPC3 GPC2  GPC1 GPC0
  198.     //Signal : VD7   VD6   VD5   VD4   VD3   VD2   VD1  VD0 LCDVF2 LCDVF1 LCDVF0 VM VFRAME VLINE VCLK LEND  
  199.     //Setting: IN    IN    IN    IN    IN    IN    IN   IN   OUT   OUT    OUT    IN   IN   IN    IN   IN
  200.     //Binary : 00    00,   00    00,   00    00,   00   00,  01    01,    01     00,  00   00,   00   00
  201.     //PU_OFF :  0     0     0     0,    0     0     0    0,   1     1      1      0,   0    0     0    0
  202.     s2440IOP->rGPCDAT = 0x0;
  203.     s2440IOP->rGPCCON = 0x00005400;  //0x00000000;
  204.     s2440IOP->rGPCUP  = 0x00e0;      //0x0000;     
  205.     //LCDVFn is connected the analog circuit in LCD. So, this signal should be output L.
  206.     
  207.     //*** PORT D GROUP
  208.     //Ports  : GPD15 GPD14 GPD13 GPD12 GPD11 GPD10 GPD9 GPD8 GPD7 GPD6 GPD5 GPD4 GPD3 GPD2 GPD1 GPD0
  209.     //Signal : VD23  VD22  VD21  VD20  VD19  VD18  VD17 VD16 VD15 VD14 VD13 VD12 VD11 VD10 VD9  VD8
  210.     //Setting: IN    IN    IN    IN    IN    IN    IN   IN   IN   IN   IN   IN   IN   IN   IN   IN
  211.     //Binary : 00    00,   00    00,   00    00,   00   00,  00   00,  00   00,  00   00,  00   00
  212.     //PU_OFF :  0     0     0     0,    0     0     0    0,   0    0    0    0,   0    0    0    0
  213.     s2440IOP->rGPDDAT=  0x0;
  214.     s2440IOP->rGPDCON = 0x0;
  215.     s2440IOP->rGPDUP  = 0x0;    
  216.     //*** PORT E GROUP
  217.     //Ports  : GPE15  GPE14  GPE13   GPE12    GPE11    GPE10   GPE9    GPE8    GPE7    GPE6  GPE5  GPE4  
  218.     //Signal : IICSDA IICSCL SPICLK0 SPIMOSI0 SPIMISO0 SDDATA3 SDDATA2 SDDATA1 SDDATA0 SDCMD SDCLK I2SSDO 
  219.     //Setting: IN     IN     IN      IN       IN       IN      IN      IN      IN      IN    IN    OUT
  220.     //Binary : 00     00,    00      00,      00       00,     00      00,     00      00,   00    01,     
  221.     //PU_OFF :  1-ext  1-ext  0       0,       0        0       0       0,      0       0     0     1,
  222.     //------------------------------------------------------------------------------------------------
  223.     //Ports  : GPE3   GPE2  GPE1    GPE0    
  224.     //Signal : I2SSDI CDCLK I2SSCLK I2SLRCK     
  225.     //Setting: IN     OUT   OUT     OUT
  226.     //Binary : 00     01,   01      01
  227.     //PU_OFF :  1-ext  1     1       1
  228.     s2440IOP->rGPEDAT = 0x0|(1<<4)|(1<<2)|(1<<1)|(1<<0);
  229.     s2440IOP->rGPECON = 0x00000115;
  230.     s2440IOP->rGPEUP  = 0xc01f;     
  231.     //*** PORT F GROUP
  232.     //Ports  : GPF7   GPF6   GPF5   GPF4   GPF3        GPF2  GPF1   GPF0
  233.     //Signal : nLED_8 nLED_4 nLED_2 nLED_1 nIRQ_PCMCIA EINT2 KBDINT EINT0
  234.     //Setting: Output Output Output Output IN          IN    IN     EINT0
  235.     //Binary : 01     01,    01     01,    00          00,   00     10
  236.     //PU_OFF :  1      1      1      1,     0-ext       1-ext 1-ext  1-ext
  237.     s2440IOP->rGPFDAT = 0x0  |(0xf<<4);
  238.     s2440IOP->rGPFCON = 0x5502;
  239.     s2440IOP->rGPFUP  = 0xf7;   
  240.                             
  241.     //*** PORT G GROUP
  242.     //Ports  : GPG15 GPG14 GPG13 GPG12 GPG11  GPG10    GPG9     GPG8     GPG7      GPG6    
  243.     //Signal : nYPON YMON  nXPON XMON  EINT19 DMAMODE1 DMAMODE0 DMASTART KBDSPICLK KBDSPIMOSI
  244.     //Setting: OUT   OUT   OUT   OUT   OUT    OUT      OUT      OUT      OUT       OUT
  245.     //Binary : 01    01,   01    01,   01-dbg 01,      01       01,      01        01
  246.     //PU_OFF :  1     1     1     1,    1-ext  1        1        1,       1         1
  247.     //---------------------------------------------------------------------------------------
  248.     //Ports  : GPG5       GPG4      GPG3   GPG2    GPG1    GPG0    
  249.     //Signal : KBDSPIMISO LCD_PWREN EINT11 nSS_SPI IRQ_LAN IRQ_PCMCIA
  250.     //Setting: IN         IN        EINT11 IN      IN      IN
  251.     //Binary : 00         00,       10     00,     00      00
  252.     //PU_OFF :  0-ext      0,        1-ext  0       0       0
  253. #if 0
  254.     s2440IOP->rGPGDAT = 0x0 |(1<<11)|(1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<9)|(1<<8)|(1<<7)|(1<<6) ;
  255.     s2440IOP->rGPGCON = 0x55455080;   //GPG11=OUT  //for debug
  256.     s2440IOP->rGPGUP  = 0xfbc8;    
  257. #else // Modified for 2440
  258. s2440IOP->rGPGDAT = 0;
  259. s2440IOP->rGPGCON = 0x00000000;
  260. s2440IOP->rGPGUP = 0x0;
  261. #endif
  262.     //*** PORT H GROUP
  263.     //Ports  : GPH10   GPH9    GPH8 GPH7  GPH6  GPH5 GPH4 GPH3 GPH2 GPH1  GPH0 
  264.     //Signal : CLKOUT1 CLKOUT0 UCLK nCTS1 nRTS1 RXD1 TXD1 RXD0 TXD0 nRTS0 nCTS0
  265.     //Setting: IN      IN      IN   IN    IN    IN   OUT  RXD0 TXD0 OUT   IN
  266.     //Binary : 00,     00      00,  00    00,   00   01,  10   10,  01    00
  267.     //PU_OFF :  0       0       0,   1-ext 1-ext 1-ext 1, 1-ext 1    1     1-ext
  268. #if 1
  269.     s2440IOP->rGPHDAT = 0x0|(1<<6)|(1<<1)|(1<<4);    
  270.     s2440IOP->rGPHCON = 0x0001a4;     //0x0011a4->0x0001a4 reduces 12uA why -> MAX3232C may sink 12uA.
  271. #else
  272.     //rGPHDAT = 0x0|(1<<6)|(1<<1)|(1<<4);  
  273.     //rGPHCON = 0x0011a4; 
  274.     s2440IOP->rGPHDAT = 0x0|(0<<6)|(1<<1)|(1<<4);  //(1<<6)->(0<<6) reduces 12uA (MAX3232C may sink 12uA.)
  275.     s2440IOP->rGPHCON = 0x0011a4; 
  276. #endif    
  277.     s2440IOP->rGPHUP  = 0x0ff;    // The pull up function is disabled GPH[10:0]
  278. //PORT J GROUP
  279. //Ports :  GPJ12    GPJ11     GPJ10   GPJ9  GPJ8      GPJ7 GPJ6  GPJ5 GPJ4  GPJ3  GPJ2  GPJ1  GPJ0
  280. //Signal : CAMRESET CAMCLKOUT CAMHREF CAMVS CAMPCLKIN CAMD7 CAMD6 CAMD5 CAMD4 CAMD3 CAMD2 CAMD1 CAMD0
  281. //Setting: Out      Out       Out     Out   Out       Out   Out   Out   Out   Out   Out   Out   Out
  282. //Binary : 01     01        01      01    01        01    01    01    01    01    01    01    01
  283. //PU_OFF : 0     0    1       1     1         1     1     1 1   1     1     1     1
  284. //---------------------------------------------------------------------------------------
  285. s2440IOP->rGPJCON = 0x02aaaaaa;
  286. s2440IOP->rGPJUP  = 0x1fff;    // The pull up function is disabled GPH[10:0]
  287.     
  288.     //External interrupt will be falling edge triggered. 
  289. //    s2440IOP->rEXTINT0 = 0x22222222;    // EINT[7:0]
  290.     s2440IOP->rEXTINT0 = 0x22222224;    // EINT[7:0] // charlie. button glich
  291.     s2440IOP->rEXTINT1 = 0x22222222;    // EINT[15:8]
  292.     s2440IOP->rEXTINT2 = 0x22222022;    // EINT[23:16]
  293. }
  294. void ConfigMiscReg(void)
  295. {
  296.     volatile IOPreg *s2440IOP = (IOPreg *)IOP_BASE;
  297. volatile ADCreg *s2440ADC = (ADCreg *)ADC_BASE;
  298. volatile RTCreg *s2440RTC = (RTCreg *)RTC_BASE;
  299.     s2440RTC->rRTCCON=0x0;   // R/W disable, 1/32768, Normal(merge), No reset
  300.     s2440ADC->rADCCON|=(1<<2); // ADC StanbyMode
  301.     s2440IOP->rMISCCR|=(1<<12); //USB port0 = suspend
  302.     s2440IOP->rMISCCR|=(1<<13); //USB port1 = suspend
  303.     s2440IOP->rMISCCR|=(1<<2); //Previous state at STOP(?) mode (???)
  304.     
  305.     //D[31:0] pull-up off. The data bus will not be float by the external bus holder.
  306.     //If the pull-up resitsers are turned on,
  307.     //there will be the leakage current through the pull-up resister
  308.     s2440IOP->rMISCCR=s2440IOP->rMISCCR|(3<<0); 
  309. // In the evaluation board, Even though in sleep mode, the devices are all supplied the power.
  310. s2440IOP->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);
  311. s2440IOP->rDSC0 = (1<<31)|(3<<8)|(3<<0);
  312. s2440IOP->rDSC1 = (3<<28)|(3<<26)|(3<24)|(3<<22)|(3<<20)|(3<<18);
  313. }
  314. PRIVATE void 
  315. CPULCDOff(void)
  316. {
  317.     volatile IOPreg *s2440IOP = (IOPreg *)IOP_BASE;
  318.     volatile LCDreg *s2440LCD = (LCDreg *)LCD_BASE;    
  319.     s2440IOP->rGPGDAT &= ~(1 << 4);
  320.     s2440LCD->rLCDCON1   = 0;
  321.     s2440LCD->rLCDCON2   = 0;
  322.     s2440LCD->rLCDCON3   = 0;
  323.     s2440LCD->rLCDCON4   = 0;
  324.     s2440LCD->rLCDCON5   = 0;
  325.     s2440LCD->rLCDSADDR1 = 0;
  326.     s2440LCD->rLCDSADDR2 = 0;
  327.     s2440LCD->rLCDSADDR3 = 0;
  328.     s2440LCD->rTCONSEL   = 0;
  329.     s2440LCD->rTPAL      = 0;
  330. }
  331. PRIVATE void 
  332. CPUClearCS8900(void)
  333. {
  334.     USHORT temp;
  335. // RETAILMSG(1,(TEXT("CPUClearCS8900 Enterrn")));        
  336.     do 
  337.     {
  338.         temp = *((volatile USHORT *)(CS8900DBG_IOBASE + 8));
  339.     } while (temp != 0);
  340. // RETAILMSG(1,(TEXT("CPUClearCS8900 Outrn")));        
  341. }
  342. void NANDInit(void)
  343. {
  344. #define NFCONF_INIT                 0xF850
  345. // HCLK=133Mhz
  346. #define TACLS 0
  347. #define TWRPH0 6
  348. #define TWRPH1 0
  349. volatile NANDreg *s2440NAND = (NANDreg *)NAND_BASE;
  350. volatile CLKPWRreg *s2440CLK = (CLKPWRreg *)CLKPWR_BASE;
  351. //  Enable the clock to NAND controller
  352. s2440CLK->rCLKCON |= (1<<4);
  353. //  Now we need enable the NAND Flash controller
  354. // s2440NAND->rNFCONF = NFCONF_INIT;
  355.     s2440NAND->rNFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)|(0<<0);
  356.     s2440NAND->rNFCONT = (0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(0<<6)|(0<<5)|(1<<4)|(1<<1)|(1<<0);
  357.     s2440NAND->rNFSTAT = 0;
  358. }
  359. VOID OEMPowerOff(void)
  360. {
  361. volatile IOPreg *s2440IOP = (IOPreg *)IOP_BASE;
  362.   volatile INTreg *s2440INT = (INTreg *)INT_BASE;
  363. volatile LCDreg *s2440LCD = (LCDreg *)LCD_BASE;    
  364. volatile CLKPWRreg * s2440CLKPW = (CLKPWRreg *)CLKPWR_BASE;
  365. // RETAILMSG(1,(TEXT("++ Enter  OEMPOWER.rn")));        
  366.     //  Allow KITL to save its state
  367. // if(gpfnKitlPowerHandler) {
  368. // gpfnKitlPowerHandler(TRUE);
  369. // }
  370.     /* Save Current Important CPU Regs...   */
  371.     CPUSaveRegs(CPUBackupRegs);
  372.     /* LCD Controller Disable               */
  373.     CPULCDOff();
  374. /* Stop all GPIO */
  375. ConfigStopGPIO();
  376. /* Set misc register for power off */
  377. ConfigMiscReg();
  378. // s2440CLKPW->rCLKCON = 0xFFFF0;
  379.     /* Actual Power-Off Mode Entry          */
  380. CPUPowerOff();
  381. // while(1); // for batt_flt debugging
  382.     /* Recover Process, Load CPU Regs       */
  383.     CPULoadRegs(CPUBackupRegs);
  384.     /* Interrupt Clear                      */
  385.     s2440IOP->rEINTPEND  = s2440IOP->rEINTPEND;
  386.     s2440LCD->rLCDSRCPND = s2440LCD->rLCDSRCPND;
  387.     s2440LCD->rLCDINTPND = s2440LCD->rLCDINTPND;
  388.     s2440INT->rSUBSRCPND = s2440INT->rSUBSRCPND;
  389. //    s2440INT->rSRCPND    = s2440INT->rSRCPND;
  390. //    s2440INT->rINTPND    = s2440INT->rINTPND;
  391. NANDInit();
  392.     OEMInitDebugSerial();
  393.     CPUClearCS8900();
  394. RETAILMSG(1,(TEXT("-- Exit  OEMPOWER.rn")));
  395. RETAILMSG(1,(TEXT("s2440INT->rSRCPND = 0x%x rn"), s2440INT->rSRCPND));
  396. RETAILMSG(1,(TEXT("s2440INT->rINTPND = 0x%x rn"), s2440INT->rINTPND));
  397. RETAILMSG(1,(TEXT("s2440INT->rINTMOD = 0x%x rn"), s2440INT->rINTMOD));
  398. RETAILMSG(1,(TEXT("s2440INT->rINTMSK = 0x%x rn"), s2440INT->rINTMSK));
  399. // while(1); // for batt_flt debugging
  400.     //  Allow KITL to restore its state
  401. // if(gpfnKitlPowerHandler) {
  402. // gpfnKitlPowerHandler(FALSE);
  403. // }
  404. }
  405. PUBLIC void 
  406. OEMEmergencyPowerOff(void)
  407. {
  408.     volatile IOPreg *s2440IOP = (IOPreg *)IOP_BASE;
  409.   volatile INTreg *s2440INT = (INTreg *)INT_BASE;
  410.     volatile LCDreg *s2440LCD = (LCDreg *)LCD_BASE;    
  411.     volatile CLKPWRreg *s2440CLK = (CLKPWRreg *)CLKPWR_BASE;    
  412.     /* Save Current Important CPU Regs...   */
  413. // CPUSaveRegs(CPUBackupRegs);
  414. s2440IOP->rGPFDAT = ~(0x1 << 4);   /* LED Off */
  415.     /* LCD Controller Disable               */
  416.     CPULCDOff();
  417. s2440IOP->rGPFDAT = ~(0x2 << 4);   /* LED Off */
  418. /* Stop all GPIO */
  419. ConfigStopGPIO();
  420. s2440IOP->rGPFDAT = ~(0x3 << 4);   /* LED Off */
  421. /* Set misc register for power off */
  422. ConfigMiscReg();
  423. s2440IOP->rGPFDAT = ~(0x4 << 4);   /* LED Off */
  424.     /* Actual Power-Off Mode Entry          */
  425. EmergencyCPUPowerOff();
  426. // CPUPowerOff();
  427. }
  428. VOID OEMCPUPowerReset()
  429. {
  430. #if 0
  431. volatile WATCHreg *WTimer = (WATCHreg *) WATCH_BASE;
  432. // Burst refresh with reading all SDRAM area.
  433. Burst_Refresh();
  434. // Mask F bit, I bit.
  435. CLR_IF();
  436. // Set watch dog reset. After this function, watch-dog reset will occure after 500ms.
  437. Watchdog_Set();
  438. // WTimer->rWTCON = ((PCLK/1000000-1) << 8) | /* The prescaler value => 255 + 1 */
  439. //  (0x00 << 6) | /* Reserved */
  440. //  (0x01 << 5) | /* Timer enable or disable */
  441. //  (0x03 << 3) | /* The clock division factor => 16 */
  442. //  (0x00 << 2) | /* Disable bit of interrupt */
  443. //  (0x00 << 1) | /* Reserved */
  444. //  (0x01 << 0); /* Enable the reset function of timer */
  445. //
  446. // while(1);
  447. #endif
  448. // Set memory with self refresh and enable watchdog reset.
  449. CPUPowerReset();
  450. }
  451. #define SDRAM_STARTADDRESS 0x30000000
  452. #define SDRAM_ENDADDRESS 0x33ffffff
  453. void Burst_Refresh(void)
  454. {
  455. // int i;
  456. // for(i=SDRAM_STARTADDRESS; i<SDRAM_ENDADDRESS; i+=8192)  // Row addr is 13 bit.
  457. // *(U32 *) i;
  458. }
  459. void CLR_IF()
  460. {
  461. }
  462. //================================================
  463. // Watch-dog timer Interrupt Request Test
  464. //================================================
  465. extern volatile int isWdtInt;
  466. #define WATCHDOG_TIME (128) // [usec], Max=65535*128us.
  467. void Watchdog_Set(void)
  468. {
  469.     volatile INTreg *s2440INT = (INTreg *)INT_BASE;
  470. volatile WATCHreg *WTimer = (WATCHreg *) WATCH_BASE;
  471. //t_watchdog = 1 / (PCLK / (Prescaler value + 1 ) / Division_factor)
  472. s2440INT->rINTMSK &= ~(BIT_WDT_AC97);    //Watch dog Interrupt service is available
  473. WTimer->rWTCON = ((S2440PCLK/1000000-1) << 8) | /* The prescaler value => 255 + 1 */
  474.  (0x00 << 6) | /* Reserved */
  475.  (0x00 << 5) | /* Timer enable or disable */
  476.  (0x03 << 3) | /* The clock division factor => 16 */
  477.  (0x00 << 2) | /* Disable bit of interrupt */
  478.  (0x00 << 1) | /* Reserved */
  479.  (0x01 << 0); /* Enable the reset function of timer */
  480. WTimer->rWTDAT = 0x1;
  481. WTimer->rWTCNT = 0x1;
  482. // WTimer->rWTCON = ((PCLK/1000000-1)<<8) | (3<<3) | (1);  //Prescaler=0x31(49),Clock division 128,Reset enable
  483. // 1*128 usec.
  484. // WTimer->rWTDAT = WATCHDOG_TIME/128;
  485. // WTimer->rWTCNT = WATCHDOG_TIME/128; // (xsec/128us)
  486. }
  487. // End of Power Management 
  488. //------------------------------------------------------------------------------