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

📄 off.c

📁 S3C24A0的完整BSP包,对开发此芯片的开发者很有用.
💻 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 + -