📄 power.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.
//
// -----------------------------------------------------------------------------
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// -----------------------------------------------------------------------------
#include <windows.h>
#include <bsp.h>
#include <pmplatform.h>
#ifdef _IROM_SDMMC_
#include <DrvLib.h>
#endif
#define OEM_IMPLEMENT (FALSE)
static UINT32 g_LastWakeupStatus = 0;
extern INT32 NAND_Init(VOID);
static void BSPConfigGPIOforPowerOff(void);
static void S3C6410_WakeUpSource_Configure(void);
static void S3C6410_WakeUpSource_Detect(void);
VOID BSPPowerOff()
{
volatile S3C6410_GPIO_REG *pGPIOReg;
volatile S3C6410_ADC_REG *pADCReg;
volatile S3C6410_RTC_REG *pRTCReg;
volatile S3C6410_SYSCON_REG *pSysConReg;
OALMSG(OAL_FUNC, (TEXT("++BSPPowerOff()\n")));
pGPIOReg = (S3C6410_GPIO_REG*)OALPAtoVA(S3C6410_BASE_REG_PA_GPIO, FALSE);
pADCReg = (S3C6410_ADC_REG*)OALPAtoVA(S3C6410_BASE_REG_PA_ADC, FALSE);
pRTCReg = (S3C6410_RTC_REG*)OALPAtoVA(S3C6410_BASE_REG_PA_RTC, FALSE);
pSysConReg = (S3C6410_SYSCON_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_SYSCON, FALSE);
//-----------------------------
// Wait till NAND Erase/Write operation is finished
//-----------------------------
VFL_Sync();
//-----------------------------
// Disable DVS and Set to Full Speed
//-----------------------------
ChangeDVSLevel(SYS_L0);
// RTC Control Disable
pRTCReg->RTCCON = 0x0; // Subclk 32768 Hz, No Reset, Merged BCD counter, XTAL 2^-15, Control Disable
//-------------------------------
// GPIO Configuration for Sleep State
//-------------------------------
BSPConfigGPIOforPowerOff();
//
//CLRPORT32(&pIOPort->GPGDAT, 1 << 4);
//----------------------------
// Wake Up Source Configuration
//----------------------------
S3C6410_WakeUpSource_Configure();
OALMSG(OAL_FUNC, (TEXT("--BSPPowerOff()\n")));
}
VOID BSPPowerOn()
{
OALMSG(OAL_FUNC, (TEXT("++BSPPowerOn()\n")));
// The OEM can add BSP specific procedure here when system power up
//----------------------------
// Wake Up Source Determine
//----------------------------
S3C6410_WakeUpSource_Detect();
#ifdef _IROM_SDMMC_
if (!BootDeviceInit())
{
OALMSG(OAL_ERROR, (TEXT("[OAL:ERR] BootDeviceInit() returned FALSE\r\n")));
}
#endif
// NAND Controller Initialize
NAND_Init();
OALMSG(OAL_FUNC, (TEXT("--BSPPowerOn()\n")));
}
static void S3C6410_WakeUpSource_Configure(void)
{
volatile S3C6410_SYSCON_REG *pSysConReg;
volatile S3C6410_GPIO_REG *pGPIOReg;
#ifdef SLEEP_AGING_TEST
volatile S3C6410_RTC_REG *pRTCReg;
#endif
pSysConReg = (S3C6410_SYSCON_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_SYSCON, FALSE);
pGPIOReg = (S3C6410_GPIO_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_GPIO, FALSE);
#ifdef SLEEP_AGING_TEST
pRTCReg = (S3C6410_RTC_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_RTC, FALSE);
#endif
// Wake Up Source Mask
pSysConReg->PWR_CFG = (pSysConReg->PWR_CFG & ~(0x1FF80))
|(1<<16) // MMC2 (Disabled, Only for Stop)
|(1<<15) // MMC1 (Disabled, Only for Stop)
|(1<<14) // MMC0 (Disabled, Only for Stop)
|(1<<13) // HSI (Disabled)
|(1<<12) // Touch (Disabled, Only for Stop)
#ifdef SLEEP_AGING_TEST
|(0<<11) // RTC Tick (Enabled)
#else
|(1<<11) // RTC Tick (Disabled)
#endif
|(0<<10) // RTC ALARM (Enabled)
|(1<<9) // MSM (Disabled)
#ifdef REMOVE_KBD_WAKEUP_SRC // Remove Keypad I/F from wake up source. if keyboard driver is not loaded
|(1<<8) // Keypad (Disabled)
#else
|(0<<8) // Keypad (Enabled)
#endif
|(1<<7); // Battery Fault (Disabled)
//-----------------
// External Interrupt
//-----------------
// Power Button EINT[11] (GPN[11] is Retention Port)
pGPIOReg->GPNCON = (pGPIOReg->GPNCON & ~(0x3<<22)) | (0x2<<22); // GPN[11] as EINT[11]
pSysConReg->EINT_MASK = 0x0FFFFFFF; // Mask All EINT Wake Up Source at Sleep
pSysConReg->EINT_MASK &= ~(1<<11); // Enable EINT[11] as Wake Up Source at Sleep
//-----------------
// RTC Tick
//-----------------
#ifdef SLEEP_AGING_TEST
pRTCReg->TICCNT = 0x4000; // 0.5 sec @ 32.768KHz
pRTCReg->RTCCON |= (1<<8); // Tick Timer Enable
#endif
// Clear All Wake Up Status bits
pSysConReg->WAKEUP_STAT = 0xfff;
}
static void S3C6410_WakeUpSource_Detect(void)
{
volatile S3C6410_SYSCON_REG *pSysConReg;
volatile S3C6410_GPIO_REG *pGPIOReg;
#ifdef SLEEP_AGING_TEST
volatile S3C6410_RTC_REG *pRTCReg;
#endif
pSysConReg = (S3C6410_SYSCON_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_SYSCON, FALSE);
pGPIOReg = (S3C6410_GPIO_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_GPIO, FALSE);
#ifdef SLEEP_AGING_TEST
pRTCReg = (S3C6410_RTC_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_RTC, FALSE);
#endif
g_LastWakeupStatus = pSysConReg->WAKEUP_STAT;
switch(g_LastWakeupStatus)
{
case 0x1: // External Interrupt
if (pGPIOReg->EINT0PEND&(1<<11)) // Power Button : EINT[11]
{
g_oalWakeSource = SYSWAKE_POWER_BUTTON; // OEMWAKE_EINT11;
pGPIOReg->EINT0PEND = (1<<11); // Clear Pending (Power Button Driver No Need to Handle Wake Up Interrupt)
}
else
{
// The else case here will not happen because all other external interrupts were
// maksed off in Configure function.
// This is can be expended for other external interrupt by device maker
g_oalWakeSource = SYSWAKE_UNKNOWN;
}
break;
case 0x2: // RTC Alarm
g_oalWakeSource = OEMWAKE_RTC_ALARM;
break;
case 0x4: // RTC Tick
g_oalWakeSource = OEMWAKE_RTC_TICK;
#ifdef SLEEP_AGING_TEST
pRTCReg->RTCCON &= ~(1<<8); // Tick Timer Disable
pRTCReg->INTP = 0x1; // Clear RTC Tick Interrupt Pending
#endif
break;
case 0x10: // Keypad
g_oalWakeSource = OEMWAKE_KEYPAD;
break;
case 0x20: // MSM
g_oalWakeSource = OEMWAKE_MSM;
break;
case 0x40: // BATFLT
g_oalWakeSource = OEMWAKE_BATTERY_FAULT;
break;
case 0x80: // WRESET
g_oalWakeSource = OEMWAKE_WARM_RESET;
break;
case 0x100: // HSI
g_oalWakeSource = OEMWAKE_HSI;
break;
default: // Unknown or Multiple Wakeup Source ???
g_oalWakeSource = SYSWAKE_UNKNOWN;
OALMSG(OAL_ERROR, (L"[OEM:ERR] OEMPowerOff() : SYSWAKE_UNKNOWN , WAKEUP_STAT = 0x%08x", g_LastWakeupStatus));
break;
}
// Clear All Wake Up Status bits
pSysConReg->WAKEUP_STAT = 0xfff;
// EINT_MASK in SysCon Also Effective in Normal State
// Unmask all bit for External Interrupt at Normal Mode
pSysConReg->EINT_MASK = 0x0;
}
static void BSPConfigGPIOforPowerOff(void)
{
#if OEM_IMPLEMENT
volatile S3C6410_GPIO_REG *pGPIOReg;
#endif
OALMSG(OAL_FUNC, (TEXT("++BSPConfigGPIOforPowerOff()\n")));
// The OEM can implement this function to cut GPIO when system falls into sleep mode.
#if OEM_IMPLEMENT
pGPIOReg = (S3C6410_GPIO_REG*)OALPAtoVA(S3C6410_BASE_REG_PA_GPIO, FALSE);
///////////////////////////////////////////////////////////////////////////////////////////
// VDD_OP1 IO
// GPF[7:0], GPG[7:0], GPE[15:14], GPE[4:0]
//GPF
pIOPort->GPFCON &=~(0xffff<<0);
pIOPort->GPFCON |= ((0x1<<14)|(0x1<<12)|(0x1<<10)|(0x1<<8)|(0x0<<6)|(0x0<<4)|(0x0<<2)|(0x2<<0));
#ifdef EVT1
pIOPort->EXTINT0 = (READEXTINT0(pIOPort->EXTINT0) & ~((1<<31) | (1<<27) | (1<<23) | (1<<19) | (1<<15) | (1<<11) | (1<<7) | (1<<3) ));
pIOPort->EXTINT0 = (READEXTINT0(pIOPort->EXTINT0) | ((1<<31) | (1<<27) | (1<<23) | (1<<19) | (0<<15) | (1<<11) | (1<<7) | (1<<3) )); //rEXTINT0[11] = PD_dis(Because of VBUS_DET)
#else
pIOPort->GPFUDP &=~(0xffff<<0);
pIOPort->GPFUDP |= ((0x2<<14)|(0x2<<12)|(0x2<<10)|(0x2<<8)|(0x1<<6)|(0x1<<4)|(0x2<<2)|(0x1<<0));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -