📄 off.c
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
// NOTE: stubs are being used - this isn't done
#include <windows.h>
#include <oal.h>
#include <ceddk.h>
#include <s3c24A0.h>
#include <bsp.h>
extern BOOL OALTimerInit(UINT32 , UINT32 , UINT32 ) ;
//extern void CPUPowerOff(void);
extern void OEMInitDebugSerial(void);
//------------------------------------------------------------------------------
//
// Function: OEMPowerOff
//
// Description: Called when the system is to transition to it's lowest
// power mode (off)
//
void OEMPowerOff()
{
static UINT32 saveArea[56];
S3C24A0_INTR_REG *pIntr = (S3C24A0_INTR_REG*)OALPAtoVA(S3C24A0_BASE_REG_PA_INTR, FALSE);
S3C24A0_IOPORT_REG *pIOPort = (S3C24A0_IOPORT_REG*)OALPAtoVA(S3C24A0_BASE_REG_PA_IOPORT, FALSE);
S3C24A0_LCD_REG *pLCD = (S3C24A0_LCD_REG*)OALPAtoVA(S3C24A0_BASE_REG_PA_LCD, FALSE);
S3C24A0_ADC_REG *pADC = (S3C24A0_ADC_REG*)OALPAtoVA(S3C24A0_BASE_REG_PA_ADC, FALSE);
S3C24A0_RTC_REG *pRTC = (S3C24A0_RTC_REG*)OALPAtoVA(S3C24A0_BASE_REG_PA_RTC, FALSE);
S3C24A0_SROM_REG *pSROM = (S3C24A0_SROM_REG*)OALPAtoVA(S3C24A0_BASE_REG_PA_SROM, FALSE);
S3C24A0_CLKPWR_REG *pCLKPWR = (S3C24A0_CLKPWR_REG*)OALPAtoVA(S3C24A0_BASE_REG_PA_CLOCK_POWER, FALSE);
RETAILMSG(1, (TEXT("*********************** In OEMPowerOff ++ *************************\r\n")));
// First do platform specific actions
//BSPPowerOff();
// Then save system registers
saveArea[0] = INPORT32(&pIOPort->GPCON_U);
saveArea[1] = INPORT32(&pIOPort->GPCON_M);
saveArea[2] = INPORT32(&pIOPort->GPCON_L);
saveArea[3] = INPORT32(&pIOPort->GPDAT);
saveArea[4] = INPORT32(&pIOPort->GPPU);
saveArea[5] = INPORT32(&pIOPort->EXTINTC0);
saveArea[6] = INPORT32(&pIOPort->EXTINTC1);
saveArea[7] = INPORT32(&pIOPort->EXTINTC2);
saveArea[8] = INPORT32(&pIOPort->EINTFLT0);
saveArea[9] = INPORT32(&pIOPort->EINTFLT1);
saveArea[10] = INPORT32(&pIOPort->EINTMASK);
saveArea[11] = INPORT32(&pIOPort->EINTPEND);
saveArea[12] = INPORT32(&pIOPort->PERIPU);
saveArea[13] = INPORT32(&pIOPort->ALIVECON);
saveArea[14] = INPORT32(&pIOPort->GPDAT_SLEEP);
saveArea[15] = INPORT32(&pIOPort->GPOEN_SLEEP);
saveArea[16] = INPORT32(&pIOPort->GPPU_SLEEP);
saveArea[17] = INPORT32(&pIOPort->PERIDAT_SLEEP0);
saveArea[18] = INPORT32(&pIOPort->PERIDAT_SLEEP1);
saveArea[19] = INPORT32(&pIOPort->PERIOEN_SLEEP0);
saveArea[20] = INPORT32(&pIOPort->PERIOEN_SLEEP1);
saveArea[21] = INPORT32(&pIOPort->PERIPU_SLEEP);
saveArea[22] = INPORT32(&pIOPort->RSTCNT);
saveArea[23] = INPORT32(&pIntr->INTMOD);
saveArea[24] = INPORT32(&pIntr->INTMSK);
saveArea[25] = INPORT32(&pIntr->INTSUBMSK);
saveArea[26] = INPORT32(&pLCD->LCDCON1);
saveArea[27] = INPORT32(&pLCD->LCDCON2);
saveArea[28] = INPORT32(&pLCD->LCDTCON1);
saveArea[29] = INPORT32(&pLCD->LCDTCON2);
saveArea[30] = INPORT32(&pLCD->LCDTCON3);
saveArea[31] = INPORT32(&pLCD->LCDOSD1);
saveArea[32] = INPORT32(&pLCD->LCDOSD2);
saveArea[33] = INPORT32(&pLCD->LCDOSD3);
saveArea[34] = INPORT32(&pLCD->LCDSADDRB1);
saveArea[35] = INPORT32(&pLCD->LCDSADDRB2);
saveArea[36] = INPORT32(&pLCD->LCDSADDRF1);
saveArea[37] = INPORT32(&pLCD->LCDSADDRF2);
saveArea[38] = INPORT32(&pLCD->LCDEADDRB1);
saveArea[39] = INPORT32(&pLCD->LCDEADDRB2);
saveArea[40] = INPORT32(&pLCD->LCDEADDRF1);
saveArea[41] = INPORT32(&pLCD->LCDEADDRF2);
saveArea[42] = INPORT32(&pLCD->LCDVSCRB1);
saveArea[43] = INPORT32(&pLCD->LCDVSCRB2);
saveArea[44] = INPORT32(&pLCD->LCDVSCRF1);
saveArea[45] = INPORT32(&pLCD->LCDVSCRF2);
saveArea[46] = INPORT32(&pLCD->LCDINTCON);
saveArea[47] = INPORT32(&pLCD->LCDKEYCON);
saveArea[48] = INPORT32(&pLCD->LCDKEYVAL);
saveArea[49] = INPORT32(&pLCD->LCDBGCON);
saveArea[50] = INPORT32(&pLCD->LCDFGCON);
saveArea[51] = INPORT32(&pLCD->LCDDITHCON);
saveArea[52] = INPORT32(&pSROM->SROM_BW);
saveArea[53] = INPORT32(&pSROM->SROM_BC0);
saveArea[54] = INPORT32(&pSROM->SROM_BC1);
saveArea[55] = INPORT32(&pSROM->SROM_BC2);
// LCD Controller Disable
//CLRPORT32(&pIOPort->GPDAT, 1 << 4);
pLCD->LCDCON1 = 0;
pLCD->LCDCON2 = 0;
pLCD->LCDTCON1 = 0;
pLCD->LCDTCON2 = 0;
pLCD->LCDTCON3 = 0;
pLCD->LCDSADDRB1 = 0;
pLCD->LCDEADDRB1 = 0;
pLCD->LCDVSCRB1 = 0;
pLCD->LCDSADDRB2 = 0;
pLCD->LCDEADDRB2 = 0;
pLCD->LCDVSCRB2 = 0;
//CPULCDOff();
//ConfigStopGPIO
//Initialize rEXTINTC0,rEXTINTC1,rEXTINTC2
pIOPort->EINTMASK=0xfffff;
pIOPort->EXTINTC0=0x0;
pIOPort->EXTINTC1=0x100;
pIOPort->EXTINTC2=0x0;
//GPIO configuration in Sleep mode
pIOPort->GPDAT_SLEEP = (1<<30)|(1<<29);
pIOPort->GPOEN_SLEEP = ~( (1<<30)|(1<<29) );
pIOPort->GPPU_SLEEP =0x9ffc5af3;
pIOPort->PERIDAT_SLEEP0=0x82913202;
pIOPort->PERIDAT_SLEEP1=0x28;
//Enable the output during SLEEP mode
pIOPort->PERIOEN_SLEEP0=0x1f73c3;
pIOPort->PERIOEN_SLEEP1=0x300000;
//Configure pull-up during SLEEP mode
pIOPort->PERIPU_SLEEP=0x5000f00;
pIOPort->ALIVECON |= (1<<0);
pIOPort->RSTCNT= 0x10;
//ConfigMiscReg
pRTC->RTCCON=0x0; // R/W disable, 1/32768, Normal(merge), No reset
pADC->ADCCON|=(1<<2); // ADC StanbyMode
// Switch off power for KITL device
//OALKitlPowerOff();
//RETAILMSG(1, (TEXT("*********************** Before CPUPowerOff *************************\r\n")));
// Go to power off mode
//CPUPowerOff();
// Switch on power for KITL device
//OALKitlPowerOn();
// Recover Process, Load CPU Regs
OUTPORT32(&pIOPort->GPCON_U, saveArea[0]);
OUTPORT32(&pIOPort->GPCON_M, saveArea[1]);
OUTPORT32(&pIOPort->GPCON_L, saveArea[2]);
OUTPORT32(&pIOPort->GPDAT, saveArea[3]);
OUTPORT32(&pIOPort->GPPU, saveArea[4]);
OUTPORT32(&pIOPort->EXTINTC0, saveArea[5]);
OUTPORT32(&pIOPort->EXTINTC1, saveArea[6]);
OUTPORT32(&pIOPort->EXTINTC2, saveArea[7]);
OUTPORT32(&pIOPort->EINTFLT0, saveArea[8]);
OUTPORT32(&pIOPort->EINTFLT1, saveArea[9]);
OUTPORT32(&pIOPort->EINTMASK, saveArea[10]);
OUTPORT32(&pIOPort->EINTPEND, saveArea[11]);
OUTPORT32(&pIOPort->PERIPU, saveArea[12]);
OUTPORT32(&pIOPort->ALIVECON, saveArea[13]);
OUTPORT32(&pIOPort->GPDAT_SLEEP, saveArea[14]);
OUTPORT32(&pIOPort->GPOEN_SLEEP, saveArea[15]);
OUTPORT32(&pIOPort->GPPU_SLEEP, saveArea[16]);
OUTPORT32(&pIOPort->PERIDAT_SLEEP0, saveArea[17]);
OUTPORT32(&pIOPort->PERIDAT_SLEEP1, saveArea[18]);
OUTPORT32(&pIOPort->PERIOEN_SLEEP0, saveArea[19]);
OUTPORT32(&pIOPort->PERIOEN_SLEEP1, saveArea[20]);
OUTPORT32(&pIOPort->PERIPU_SLEEP, saveArea[21]);
OUTPORT32(&pIOPort->RSTCNT, saveArea[22]);
OUTPORT32(&pIntr->INTMOD, saveArea[23]);
OUTPORT32(&pIntr->INTMSK, saveArea[24]);
OUTPORT32(&pIntr->INTSUBMSK, saveArea[25]);
pLCD->LCDCON1 = saveArea[26];
pLCD->LCDCON2 = saveArea[27];
pLCD->LCDTCON1 = saveArea[28];
pLCD->LCDTCON2 = saveArea[29];
pLCD->LCDTCON3 = saveArea[30];
pLCD->LCDOSD1 = saveArea[31];
pLCD->LCDOSD2 = saveArea[32];
pLCD->LCDOSD3 = saveArea[33];
pLCD->LCDSADDRB1 = saveArea[34];
pLCD->LCDSADDRB2 = saveArea[35];
pLCD->LCDSADDRF1 = saveArea[36];
pLCD->LCDSADDRF2 = saveArea[37];
pLCD->LCDEADDRB1 = saveArea[38];
pLCD->LCDEADDRB2 = saveArea[39];
pLCD->LCDEADDRF1 = saveArea[40];
pLCD->LCDEADDRF2 = saveArea[41];
pLCD->LCDVSCRB1 = saveArea[42];
pLCD->LCDVSCRB2 = saveArea[43];
pLCD->LCDVSCRF1 = saveArea[44];
pLCD->LCDVSCRF2 = saveArea[45];
pLCD->LCDINTCON = saveArea[46];
pLCD->LCDKEYCON = saveArea[47];
pLCD->LCDKEYVAL = saveArea[48];
pLCD->LCDBGCON = saveArea[49];
pLCD->LCDFGCON = saveArea[50];
pLCD->LCDDITHCON = saveArea[51];
pSROM->SROM_BW = saveArea[52];
pSROM->SROM_BC0 = saveArea[53];
pSROM->SROM_BC1 = saveArea[54];
pSROM->SROM_BC2 = saveArea[55];
// Interrupt Clear
OUTPORT32(&pIOPort->EINTPEND, INPORT32(&pIOPort->EINTPEND));
OUTPORT32(&pIntr->SUBSRCPND, INPORT32(&pIntr->SUBSRCPND));
OUTPORT32(&pIntr->SRCPND, INPORT32(&pIntr->SRCPND));
OUTPORT32(&pIntr->INTPND, INPORT32(&pIntr->INTPND));
OEMInitDebugSerial(); //Fix for pwr management..We use retail msgs in timer init..
OALTimerInit(1, OEM_COUNT_1MS, 0);
//pLCD->LCDSRCPND = pLCD->LCDSRCPND;
//pLCD->LCDINTPND = pLCD->LCDINTPND;
// Do platform dependent power on actions
//BSPPowerOn();
RETAILMSG(1, (TEXT("*********************** In OEMPowerOff --*************************\r\n")));
}
void OEMEmergencyPowerOff(void)
{
RETAILMSG(1, (TEXT("*********************** In OEMEmergencyPowerOff *************************\r\n")));
#if 0
//TBDA change the regs
volatile IOPreg *s24A0IOP = (IOPreg *)IOP_BASE;
volatile INTreg *s24A0INT = (INTreg *)INT_BASE;
volatile LCDreg *s24A0LCD = (LCDreg *)LCD_BASE;
volatile CLKPWRreg *s24A0CLK = (CLKPWRreg *)CLKPWR_BASE;
/* Save Current Important CPU Regs... */
// CPUSaveRegs(CPUBackupRegs);
s24A0IOP->rGPDAT = ~(0x1 << 4); /* LED Off */
/* LCD Controller Disable */
CPULCDOff();
s24A0IOP->rGPDAT = ~(0x2 << 4); /* LED Off */
/* Stop all GPIO */
ConfigStopGPIO();
s24A0IOP->rGPDAT = ~(0x3 << 4); /* LED Off */
/* Set misc register for power off */
ConfigMiscReg();
s24A0IOP->rGPDAT = ~(0x4 << 4); /* LED Off */
/* Actual Power-Off Mode Entry */
//EmergencyCPUPowerOff();
//CPUPowerOff();
#endif
}
//------------------------------------------------------------------------------
//
// Function: OALIoCtlHalPresuspend
//
// Description:
//
BOOL OALIoCtlHalPresuspend(
UINT32 code, VOID* pInpBuffer, UINT32 inpSize, VOID* pOutBuffer,
UINT32 outSize, UINT32 *pOutSize
) {
RETAILMSG(1, (TEXT("*********************** In OALIoCtlHalPresuspend *************************\r\n")));
return TRUE;
}
#if 0
//------------------------------------------------------------------------------
//
// Function: OALIoCtlHalEnableWake
//
// Description:
//
BOOL OALIoCtlHalEnableWake(
UINT32 code, VOID* pInpBuffer, UINT32 inpSize, VOID* pOutBuffer,
UINT32 outSize, UINT32 *pOutSize
) {
RETAILMSG(1, (TEXT("*********************** In OALIoCtlHalEnableWake *************************\r\n")));
return TRUE;
}
//------------------------------------------------------------------------------
//
// Function: OALIoCtlHalDisableWake
//
// Description:
//
BOOL OALIoCtlHalDisableWake(
UINT32 code, VOID* pInpBuffer, UINT32 inpSize, VOID* pOutBuffer,
UINT32 outSize, UINT32 *pOutSize
) {
return TRUE;
}
//------------------------------------------------------------------------------
//
// Function: OALIoCtlHalDisableWake
//
// Description:
//
BOOL OALIoCtlHalGetWakeSource(
UINT32 code, VOID* pInpBuffer, UINT32 inpSize, VOID* pOutBuffer,
UINT32 outSize, UINT32 *pOutSize
) {
RETAILMSG(1, (TEXT("*********************** In OALIoCtlHalGetWakeSource *************************\r\n")));
return TRUE;
}
#endif //0.
//------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -