?? power.c
字號:
/******************************************************************************
*
* 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 + -