📄 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.
//
//------------------------------------------------------------------------------
//
// 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 + -