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

📄 power.c

📁 windows mobile 5 下的底层驱动包
💻 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.
//
//------------------------------------------------------------------------------
//
//  File:  power.c
//
#include <bsp.h>
#include <nkintr.h>

/******************************************************************************
 *
 * 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
 *
 *      
 ******************************************************************************
 */

#define PRIVATE     static
#define PUBLIC      

extern void   CPUPowerOff(void);

//============================================================
// Power Mnanagement Related..
    PRIVATE DWORD CPUBackupRegs[60];

    PRIVATE void 
CPUSaveRegs(DWORD *p)
{
    volatile S3C2410X_IOPORT_REG *s2410IOP = (S3C2410X_IOPORT_REG *)(OALPAtoVA(S3C2410X_BASE_REG_PA_IOPORT,FALSE));
    volatile S3C2410X_INTR_REG *s2410INT = (S3C2410X_INTR_REG *)(OALPAtoVA(S3C2410X_BASE_REG_PA_INTR,FALSE));
    volatile S3C2410X_LCD_REG *s2410LCD = (S3C2410X_LCD_REG *)(OALPAtoVA(S3C2410X_BASE_REG_PA_LCD,FALSE));

    *p++ = s2410IOP->GPACON;
    *p++ = s2410IOP->GPADAT;
    *p++ = s2410IOP->GPBCON;
    *p++ = s2410IOP->GPBDAT;
    *p++ = s2410IOP->GPBUP;
    *p++ = s2410IOP->GPCCON;
    *p++ = s2410IOP->GPCDAT;
    *p++ = s2410IOP->GPCUP;
    *p++ = s2410IOP->GPDCON;
    *p++ = s2410IOP->GPDDAT;
    *p++ = s2410IOP->GPDUP;
    *p++ = s2410IOP->GPECON;
    *p++ = s2410IOP->GPEDAT;
    *p++ = s2410IOP->GPEUP;
    *p++ = s2410IOP->GPFCON;
    *p++ = s2410IOP->GPFDAT;
    *p++ = s2410IOP->GPFUP;
    *p++ = s2410IOP->GPGCON;
    *p++ = s2410IOP->GPGDAT;
    *p++ = s2410IOP->GPGUP;
    *p++ = s2410IOP->GPHCON;
    *p++ = s2410IOP->GPHDAT;
    *p++ = s2410IOP->GPHUP;

    *p++ = s2410IOP->MISCCR;
    *p++ = s2410IOP->DCLKCON;
    *p++ = s2410IOP->EXTINT0;
    *p++ = s2410IOP->EXTINT1;
    *p++ = s2410IOP->EXTINT2;
    *p++ = s2410IOP->EINTFLT0;
    *p++ = s2410IOP->EINTFLT1;
    *p++ = s2410IOP->EINTFLT2;
    *p++ = s2410IOP->EINTFLT3;
    *p++ = s2410IOP->EINTMASK;

    *p++ = s2410INT->INTMOD;
    *p++ = s2410INT->INTMSK;
    *p++ = s2410INT->INTSUBMSK;

    *p++ = s2410LCD->LPCSEL;
    *p++ = s2410LCD->LCDINTMSK;
    *p++ = s2410LCD->TPAL;
    *p++ = s2410LCD->DITHMODE;
    *p++ = s2410LCD->BLUELUT;
    *p++ = s2410LCD->GREENLUT;
    *p++ = s2410LCD->REDLUT;
    *p++ = s2410LCD->LCDSADDR3;
    *p++ = s2410LCD->LCDSADDR2;
    *p++ = s2410LCD->LCDSADDR1;
    *p++ = s2410LCD->LCDCON5;
    *p++ = s2410LCD->LCDCON4;
    *p++ = s2410LCD->LCDCON3;
    *p++ = s2410LCD->LCDCON2;
    *p++ = s2410LCD->LCDCON1;
}



    PRIVATE void 
CPULoadRegs(DWORD *p)
{
    volatile S3C2410X_IOPORT_REG *s2410IOP = (S3C2410X_IOPORT_REG *)(OALPAtoVA(S3C2410X_BASE_REG_PA_IOPORT,FALSE));
    volatile S3C2410X_INTR_REG *s2410INT = (S3C2410X_INTR_REG *)(OALPAtoVA(S3C2410X_BASE_REG_PA_INTR,FALSE));
    volatile S3C2410X_LCD_REG *s2410LCD = (S3C2410X_LCD_REG *)(OALPAtoVA(S3C2410X_BASE_REG_PA_LCD,FALSE));

    s2410IOP->GPACON    =  *p++;
    s2410IOP->GPADAT    =  *p++;
    s2410IOP->GPBCON    =  *p++;
    s2410IOP->GPBDAT    =  *p++;
    s2410IOP->GPBUP     =  *p++;
    s2410IOP->GPCCON    =  *p++;
    s2410IOP->GPCDAT    =  *p++;
    s2410IOP->GPCUP     =  *p++;
    s2410IOP->GPDCON    =  *p++;
    s2410IOP->GPDDAT    =  *p++;
    s2410IOP->GPDUP     =  *p++;
    s2410IOP->GPECON    =  *p++;
    s2410IOP->GPEDAT    =  *p++;
    s2410IOP->GPEUP     =  *p++;
    s2410IOP->GPFCON    =  *p++;
    s2410IOP->GPFDAT    =  *p++;
    s2410IOP->GPFUP     =  *p++;
    s2410IOP->GPGCON    =  *p++;
    s2410IOP->GPGDAT    =  *p++;
    s2410IOP->GPGUP     =  *p++;
    s2410IOP->GPHCON    =  *p++;
    s2410IOP->GPHDAT    =  *p++;
    s2410IOP->GPHUP     =  *p++;
                                
    s2410IOP->MISCCR    =  *p++;
    s2410IOP->DCLKCON    =  *p++;
    s2410IOP->EXTINT0   =  *p++;
    s2410IOP->EXTINT1   =  *p++;
    s2410IOP->EXTINT2   =  *p++;
    s2410IOP->EINTFLT0  =  *p++;
    s2410IOP->EINTFLT1  =  *p++;
    s2410IOP->EINTFLT2  =  *p++;
    s2410IOP->EINTFLT3  =  *p++;
    s2410IOP->EINTMASK  =  *p++;

    s2410INT->INTMOD    =  *p++; 
    s2410INT->INTMSK    =  *p++; 
    s2410INT->INTSUBMSK =  *p++; 
                                   
    s2410LCD->LPCSEL    =  *p++; 
    s2410LCD->LCDINTMSK =  *p++; 
    s2410LCD->TPAL      =  *p++; 
    s2410LCD->DITHMODE  =  *p++; 
    s2410LCD->BLUELUT   =  *p++; 
    s2410LCD->GREENLUT  =  *p++; 
    s2410LCD->REDLUT    =  *p++; 
    s2410LCD->LCDSADDR3 =  *p++; 
    s2410LCD->LCDSADDR2 =  *p++; 
    s2410LCD->LCDSADDR1 =  *p++; 
    s2410LCD->LCDCON5   =  *p++; 
    s2410LCD->LCDCON4   =  *p++; 
    s2410LCD->LCDCON3   =  *p++; 
    s2410LCD->LCDCON2   =  *p++; 
    s2410LCD->LCDCON1   =  *p++;
}





    PRIVATE void 
CPULCDOff(void)
{
    volatile S3C2410X_IOPORT_REG *s2410IOP = (S3C2410X_IOPORT_REG *)(OALPAtoVA(S3C2410X_BASE_REG_PA_IOPORT,FALSE));
    volatile S3C2410X_LCD_REG *s2410LCD = (S3C2410X_LCD_REG *)(OALPAtoVA(S3C2410X_BASE_REG_PA_LCD,FALSE));

    s2410IOP->GPGDAT &= ~(1 << 4);

    s2410LCD->LCDCON1   = 0;
    s2410LCD->LCDCON2   = 0;
    s2410LCD->LCDCON3   = 0;
    s2410LCD->LCDCON4   = 0;
    s2410LCD->LCDCON5   = 0;	
    s2410LCD->LCDSADDR1 = 0;
    s2410LCD->LCDSADDR2 = 0;
    s2410LCD->LCDSADDR3 = 0;
    s2410LCD->LPCSEL    = 0;
    s2410LCD->TPAL      = 0;
}



    PRIVATE void 
CPUClearCS8900(void)
{

    OAL_KITL_ARGS* pArgs;
    pArgs = (OAL_KITL_ARGS*)OALArgsQuery(OAL_ARGS_QUERY_KITL);
    if(pArgs != NULL) {
        if (!CS8900AInit((UCHAR*)pArgs->devLoc.PhysicalLoc, pArgs->devLoc.LogicalLoc, pArgs->mac)) {
            OALMSGS(OAL_ERROR, (L"ERROR: KITL call to pfnInit failed\r\n"));
        } 
    }

}


//------------------------------------------------------------------------------
//
//  Function:  OEMPowerOff
//
//  Called when the system is to transition to it's lowest power mode (off)
//

VOID OEMPowerOff(void)
{
    volatile S3C2410X_IOPORT_REG *s2410IOP = (S3C2410X_IOPORT_REG *)(OALPAtoVA(S3C2410X_BASE_REG_PA_IOPORT,FALSE));
    volatile S3C2410X_INTR_REG *s2410INT = (S3C2410X_INTR_REG *)(OALPAtoVA(S3C2410X_BASE_REG_PA_INTR,FALSE));
    volatile S3C2410X_LCD_REG *s2410LCD = (S3C2410X_LCD_REG *)(OALPAtoVA(S3C2410X_BASE_REG_PA_LCD,FALSE));
    volatile S3C2410X_PWM_REG *s2410PWM = (S3C2410X_PWM_REG*)OALPAtoVA(S3C2410X_BASE_REG_PA_PWM, FALSE);
    S3C2410X_PWM_REG t2410PWM;    

    RETAILMSG(1,(TEXT("+OEMPowerOff\r\n")));

    /* Save Current Important CPU Regs...   */
    CPUSaveRegs(CPUBackupRegs);

    // save timer registers
    t2410PWM.TCFG0 = INREG32(&s2410PWM->TCFG0);
    t2410PWM.TCFG1 = INREG32(&s2410PWM->TCFG1);
    t2410PWM.TCNTB4 = INREG32(&s2410PWM->TCNTB4);
    t2410PWM.TCON = INREG32(&s2410PWM->TCON);

    /* LCD Controller Disable               */
    CPULCDOff();

    /* Actual Power-Off Mode Entry          */
    CPUPowerOff();

    // restore timer registers
    OUTREG32(&s2410PWM->TCFG0, t2410PWM.TCFG0);
    OUTREG32(&s2410PWM->TCFG1, t2410PWM.TCFG1);
    OUTREG32(&s2410PWM->TCNTB4, t2410PWM.TCNTB4);

    // restart timer in auto reload mode
    t2410PWM.TCON &= ~(0x0F << 20);
    OUTREG32(&s2410PWM->TCON, t2410PWM.TCON | (0x2 << 20) );
    OUTREG32(&s2410PWM->TCON, t2410PWM.TCON | (0x5 << 20) );

    /* Recover Process, Load CPU Regs       */
    CPULoadRegs(CPUBackupRegs);

    /* Interrupt Clear                      */
    s2410IOP->EINTPEND  = s2410IOP->EINTPEND;
    s2410LCD->LCDSRCPND = s2410LCD->LCDSRCPND;
    s2410LCD->LCDINTPND = s2410LCD->LCDINTPND;
    s2410INT->SUBSRCPND = s2410INT->SUBSRCPND;
    s2410INT->SRCPND    = s2410INT->SRCPND;
    s2410INT->INTPND    = s2410INT->INTPND;

    OEMInitDebugSerial();
    
    CPUClearCS8900();	

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -