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

📄 power.c

📁 6410BSP3
💻 C
📖 第 1 页 / 共 2 页
字号:
//
// 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 + -