⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 power.c

📁 基于WinCE操作系统、SMDK2410硬件开发平台下的电源管理程序——主要完成系统的 睡眠、唤醒
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************
 *
 * System On Chip(SOC)
 *
 * Copyright (c) 2002 Software Center, Samsung Electronics, Inc.
 * All rights reserved.
 *
 * This software is the confidential and proprietary information of Samsung 
 * Electronics, Inc("Confidential Information"). You Shall not disclose such 
 * Confidential Information and shall use it only in accordance with the terms 
 * of the license agreement you entered into Samsung.
 *
 *-----------------------------------------------------------------------------
 *
 *	S3C2410 BSP 
 *
 * power.c   :  S3C2410 Power Management(OEMPowerOff()) Routines
 *
 *      
 ******************************************************************************
 */

#include "windows.h"
#include "nkintr.h"
#include "oalintr.h"
#include "s2410.h"
#include "drv_glob.h"

#define PRIVATE     static
#define PUBLIC      

extern void   CPUPowerOff(void);
extern void   EmergencyCPUPowerOff(void);
extern void   CPUPowerWDReset();
extern void   CPUPowerReset();

extern int    InitLcd();
extern void   InitPort();

extern void   WriteDsp(unsigned char *szBuffer, int);
extern void   ReadDsp(unsigned char *szBuffer, int);

void          FMD_PowerUp(void);

void   Watchdog_Set(void);
void   Burst_Refresh(void);
void   CLR_IF();
void   Delay();
PRIVATE DWORD CPUBackupRegs[60];



//============================================================
// Power Mnanagement Related..
#define PRIVATE     static

PRIVATE DWORD CPUBackupRegs[60];

unsigned char szDspBfr1[8][64];
unsigned char szDspBfr2[8][64];
unsigned char szDspBfr3[8][64];

void LoadDspInfo()
{
	ReadDsp(szDspBfr1, 1);
	ReadDsp(szDspBfr2, 2);
	ReadDsp(szDspBfr3, 3);
}

void ReDrawDsp()
{
	WriteDsp(szDspBfr1, 1);
	WriteDsp(szDspBfr2, 2);
	WriteDsp(szDspBfr3, 3);
}

void FMD_PowerUp()
{
	volatile NANDreg *s2410NFD = (NANDreg *)NAND_BASE;
	volatile CLKPWRreg *s2410PWR = (CLKPWRreg *)CLKPWR_BASE;
	
	s2410PWR->rCLKCON |= (1<<4);
	s2410NFD->rNFCONF = 0xF850;
	
	//RETAILMSG(1, (TEXT("\r\n FMD:: PowerUp OK \r\n")));
	
	
	
}
	
	
PRIVATE void 
CPUSaveRegs(DWORD *p)
{
    volatile IOPreg *s2410IOP = (IOPreg *)IOP_BASE;
		volatile INTreg *s2410INT = (INTreg *)INT_BASE;
    volatile LCDreg *s2410LCD = (LCDreg *)LCD_BASE;    

    
    *p++ = s2410IOP->rGPACON;
    *p++ = s2410IOP->rGPADAT;
    *p++ = s2410IOP->rGPBCON;
    *p++ = s2410IOP->rGPBDAT;
    *p++ = s2410IOP->rGPBUP;
    *p++ = s2410IOP->rGPCCON;
    *p++ = (s2410IOP->rGPCDAT)&(0xfffe);
    *p++ = s2410IOP->rGPCUP;
    *p++ = s2410IOP->rGPDCON;
    *p++ = s2410IOP->rGPDDAT;
    *p++ = s2410IOP->rGPDUP;
    *p++ = s2410IOP->rGPECON;
    *p++ = s2410IOP->rGPEDAT;
    *p++ = s2410IOP->rGPEUP;
    *p++ = s2410IOP->rGPFCON;
    *p++ = s2410IOP->rGPFDAT;
    *p++ = s2410IOP->rGPFUP;
    *p++ = s2410IOP->rGPGCON;
    *p++ = s2410IOP->rGPGDAT;
    *p++ = s2410IOP->rGPGUP;
    *p++ = s2410IOP->rGPHCON;
    *p++ = s2410IOP->rGPHDAT;
    *p++ = s2410IOP->rGPHUP;

    *p++ = s2410IOP->rMISCCR;
    *p++ = s2410IOP->rDCKCON;
    *p++ = s2410IOP->rEXTINT0;
    *p++ = s2410IOP->rEXTINT1;
    *p++ = s2410IOP->rEXTINT2;
    *p++ = s2410IOP->rEINTFLT0;
    *p++ = s2410IOP->rEINTFLT1;
    *p++ = s2410IOP->rEINTFLT2;
    *p++ = s2410IOP->rEINTFLT3;
    *p++ = s2410IOP->rEINTMASK;

    *p++ = s2410INT->rINTMOD;
    *p++ = s2410INT->rINTMSK;
    *p++ = s2410INT->rINTSUBMSK;

    *p++ = s2410LCD->rLPCSEL;
    *p++ = s2410LCD->rLCDINTMSK;
    *p++ = s2410LCD->rTPAL;
    *p++ = s2410LCD->rDITHMODE;
    *p++ = s2410LCD->rBLUELUT;
    *p++ = s2410LCD->rGREENLUT;
    *p++ = s2410LCD->rREDLUT;
    //*p++ = s2410LCD->rLCDSADDR3;
    //*p++ = s2410LCD->rLCDSADDR2;
    //*p++ = s2410LCD->rLCDSADDR1;
    //*p++ = s2410LCD->rLCDCON5;
    //*p++ = s2410LCD->rLCDCON4;
    //*p++ = s2410LCD->rLCDCON3;
    //*p++ = s2410LCD->rLCDCON2;
    //*p++ = s2410LCD->rLCDCON1;
    
    
    
    //s2410IOP->rGPFDAT |= 0x80;
}



PRIVATE void 
CPULoadRegs(DWORD *p)
{
    int i;
    volatile IOPreg *s2410IOP = (IOPreg *)IOP_BASE;
    volatile INTreg *s2410INT = (INTreg *)INT_BASE;
    volatile LCDreg *s2410LCD = (LCDreg *)LCD_BASE;    
    
    //s2410IOP->rGPGDAT |=  (0x1 << 11);
    s2410IOP->rGPACON    =  *p++;
    s2410IOP->rGPADAT    =  *p++;
    s2410IOP->rGPBCON    =  *p++;
    s2410IOP->rGPBDAT    =  *p++;
    s2410IOP->rGPBUP     =  *p++;
    s2410IOP->rGPCCON    =  *p++;
    s2410IOP->rGPCDAT    =  *p++;
    s2410IOP->rGPCUP     =  *p++;
    s2410IOP->rGPDCON    =  *p++;
    s2410IOP->rGPDDAT    =  *p++;
    s2410IOP->rGPDUP     =  *p++;
    s2410IOP->rGPECON    =  *p++;
    s2410IOP->rGPEDAT    =  *p++;
    s2410IOP->rGPEUP     =  *p++;
    s2410IOP->rGPFCON    =  *p++;
    //s2410IOP->rGPFDAT    =  *p++;
    p++;
    s2410IOP->rGPFUP     =  *p++;
    s2410IOP->rGPGCON    =  *p++;
    s2410IOP->rGPGDAT    =  *p++;
    s2410IOP->rGPGUP     =  *p++;
    s2410IOP->rGPHCON    =  *p++;
    s2410IOP->rGPHDAT    =  *p++;
    s2410IOP->rGPHUP     =  *p++;
                                
    s2410IOP->rMISCCR    =  *p++;
    s2410IOP->rDCKCON    =  *p++;
    s2410IOP->rEXTINT0   =  *p++;
    s2410IOP->rEXTINT1   =  *p++;
    s2410IOP->rEXTINT2   =  *p++;
    s2410IOP->rEINTFLT0  =  *p++;
    s2410IOP->rEINTFLT1  =  *p++;
    s2410IOP->rEINTFLT2  =  *p++;
    s2410IOP->rEINTFLT3  =  *p++;
    s2410IOP->rEINTMASK  =  *p++;

    s2410INT->rINTMOD    =  *p++; 
    s2410INT->rINTMSK    =  *p++; 
    s2410INT->rINTSUBMSK =  *p++; 
                                   
    s2410LCD->rLPCSEL    =  *p++; 
    s2410LCD->rLCDINTMSK =  *p++; 
    s2410LCD->rTPAL      =  *p++; 
    s2410LCD->rDITHMODE  =  *p++; 
    s2410LCD->rBLUELUT   =  *p++; 
    s2410LCD->rGREENLUT  =  *p++; 
    s2410LCD->rREDLUT    =  *p++; 
    //s2410LCD->rLCDSADDR3 =  *p++; 
    //s2410LCD->rLCDSADDR2 =  *p++; 
    //s2410LCD->rLCDSADDR1 =  *p++; 
    //s2410LCD->rLCDCON5   =  *p++; 
    //s2410LCD->rLCDCON4   =  *p++; 
    //s2410LCD->rLCDCON3   =  *p++; 
    //s2410LCD->rLCDCON2   =  *p++; 
    //s2410LCD->rLCDCON1   =  *p++;

    for(i=0;i<10000;i++) 
    {
    	;
    }
    
    s2410IOP->rGPCDAT   |= (0x1 << 11);
    s2410IOP->rGPCDAT &= 0xfffe;
}

void ConfigStopGPIO(void)
{
    int i;
    volatile IOPreg *s2410IOP = (IOPreg *)IOP_BASE;
    
    s2410IOP->rGPCDAT &= !(0x1<<11);
    s2410IOP->rGPCDAT |= 0x1;
    for(i=0;i<10000;i++) 
    {
    	;
    }
    
    // Check point
    // 1) NC pin: input pull-up on 
    // 2) If input is driver externally: input pull-up off
    // 3) If a connected component draws some current: output low.
    // 4) If a connected component draws no current: output high.
    
    //chip # = 5

    //CAUTION:Follow the configuration order for setting the ports. 
    // 1) setting value(GPnDAT) 
    // 2) setting control register  (GPnCON)
    // 3) configure pull-up resistor(GPnUP)  

    //32bit data bus configuration  
    //*** PORT A GROUP
    //Ports  : GPA22 GPA21  GPA20 GPA19 GPA18 GPA17 GPA16 GPA15 GPA14 GPA13 GPA12  
    //Signal : nFCE nRSTOUT nFRE  nFWE  ALE   CLE   nGCS5 nGCS4 nGCS3 nGCS2 nGCS1 
    //Binary : 1     1      1,    1     1     1     1,    1     1     1     1,
    //POFF   : 1     0      1,    1     0     0     1,    1     1     1     1,
    //-------------------------------------------------------------------------------------------
    //Ports  : GPA11  GPA10  GPA9   GPA8   GPA7   GPA6   GPA5   GPA4   GPA3   GPA2   GPA1   GPA0
    //Signal : ADDR26 ADDR25 ADDR24 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0 
    //Binary : 1      1      1      1,     1      1      1      1,     1      1      1      1         
    //POFF   : 0      0      0      0,     0      0      0      0,     0      0      0      0
    s2410IOP->rGPACON = 0x5e0eef;//0x7fffff; 
    s2410IOP->rGPADAT = 0x7fffff;
    //**** PORT B GROUP
    //Ports  : GPB10   GPB9    GPB8    GPB7    GPB6    GPB5     GPB4    GPB3   GPB2   GPB1       GPB0
    //Signal : nXDREQ0 nXDACK0 nXDREQ1 nXDACK1 nSS_KBD nDIS_OFF L3CLOCK L3DATA L3MODE nIrDATXDEN Keyboard
    //Setting: INPUT   OUTPUT  INPUT   OUTPUT  INPUT   OUT      OUT     OUT    OUT    INPUT      INPUT 
    //Binary : 00,     01      00,     01      00,     01       01,     01     01,    00         00  
    //PU_OFF :  0       1       0,      1      1(ext)  1(*)     1,      1      1      1(ext)     1(ext)           
    //*:nDIS_OFF:4.7K external pull-down resistor                                 
    s2410IOP->rGPBDAT = 0x000;   //s2410IOP->rGPBCON = 0x044550;  
    s2410IOP->rGPBCON = 0x155515;//s2410IOP->rGPBDAT=  0x0|(1<<9)|(1<<7)|(0<<5)|(1<<4)|(1<<3)|(1<<2);
    s2410IOP->rGPBUP = 0x7ff;    //s2410IOP->rGPBUP  = 0x2ff;   //0x2fd->2ff, 3uA is reduced. Why? 

    //*** PORT C GROUP
    //Ports  : GPC15 GPC14 GPC13 GPC12 GPC11 GPC10 GPC9 GPC8 GPC7  GPC6   GPC5   GPC4 GPC3 GPC2  GPC1 GPC0
    //Signal : VD7   VD6   VD5   VD4   VD3   VD2   VD1  VD0 LCDVF2 LCDVF1 LCDVF0 VM VFRAME VLINE VCLK LEND  
    //Setting: IN    IN    IN    IN    IN    IN    IN   IN   OUT   OUT    OUT    IN   IN   IN    IN   IN
    //Binary : 00    00,   00    00,   00    00,   00   00,  01    01,    01     00,  00   00,   00   00
    //PU_OFF :  0     0     0     0,    0     0     0    0,   1     1      1      0,   0    0     0    0
    s2410IOP->rGPCDAT = 0x0801;    //s2410IOP->rGPCCON = 0x5555; //0x00005400;  //0x00000000;
    s2410IOP->rGPCCON = 0x55555555;//s2410IOP->rGPCDAT = 0x0;
    s2410IOP->rGPCUP  = 0xf7fe;    //s2410IOP->rGPCUP  = 0x0; //0x00e0;      //0x0000;     
    //LCDVFn is connected the analog circuit in LCD. So, this signal should be output L.
    
    //*** PORT D GROUP
    //Ports  : GPD15 GPD14 GPD13 GPD12 GPD11 GPD10 GPD9 GPD8 GPD7 GPD6 GPD5 GPD4 GPD3 GPD2 GPD1 GPD0
    //Signal : VD23  VD22  VD21  VD20  VD19  VD18  VD17 VD16 VD15 VD14 VD13 VD12 VD11 VD10 VD9  VD8
    //Setting: IN    IN    IN    IN    IN    IN    IN   IN   IN   IN   IN   IN   IN   IN   IN   IN
    //Binary : 00    00,   00    00,   00    00,   00   00,  00   00,  00   00,  00   00,  00   00
    //PU_OFF :  0     0     0     0,    0     0     0    0,   0    0    0    0,   0    0    0    0
    //s2410IOP->rGPDDAT=  0x0;
    //s2410IOP->rGPDCON = 0x0;	
    //s2410IOP->rGPDUP  = 0x0;   
    s2410IOP->rGPDDAT = 0x0000;    //s2410IOP->rGPDDAT  = 0x0430;
    s2410IOP->rGPDCON = 0x55555555;//s2410IOP->rGPDCON  = 0x00155544;//0x00151544;
    s2410IOP->rGPDUP =  0xffff;    //s2410IOP->rGPDDAT |= (0x1 << 7);///////////////////////////////////////////////
    //s2410IOP->rGPDUP   = 0x877A;
    
     

    //*** PORT E GROUP
    //Ports  : GPE15  GPE14  GPE13   GPE12    GPE11    GPE10   GPE9    GPE8    GPE7    GPE6  GPE5  GPE4  
    //Signal : IICSDA IICSCL SPICLK0 SPIMOSI0 SPIMISO0 SDDATA3 SDDATA2 SDDATA1 SDDATA0 SDCMD SDCLK I2SSDO 
    //Setting: IN     IN     IN      IN       IN       IN      IN      IN      IN      IN    IN    OUT
    //Binary : 00     00,    00      00,      00       00,     00      00,     00      00,   00    01,     
    //PU_OFF :  1-ext  1-ext  0       0,       0        0       0       0,      0       0     0     1,
    //------------------------------------------------------------------------------------------------
    //Ports  : GPE3   GPE2  GPE1    GPE0    
    //Signal : I2SSDI CDCLK I2SSCLK I2SLRCK     
    //Setting: IN     OUT   OUT     OUT
    //Binary : 00     01,   01      01
    //PU_OFF :  1-ext  1     1       1
   // s2410IOP->rGPEDAT = 0x0|(1<<4)|(1<<2)|(1<<1)|(1<<0);
   // s2410IOP->rGPECON = 0x00000115;	
   // s2410IOP->rGPEUP  = 0xc01f;     
    s2410IOP->rGPEDAT = 0x0000;//s2410IOP->rGPEUP  = 0xf7ff;       // GPE11 is NC
    s2410IOP->rGPECON = 0x55555555;    //s2410IOP->rGPECON = 0x55555555;//0xaa2aaaaa;       

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -