📄 off.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.
//
// Copyright (c) Samsung Electronics. Co. LTD. All rights reserved.
/*++
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.
Module Name:
off.c
Abstract:
control Power Off(Suspend, Sleep)/ Power On(Resume, Wakeup)
Functions:
FMD_Init,
Notes:
--*/
#include <windows.h>
#include <pmplatform.h>
#include <oal.h>
#include <s3c6410.h>
#include "soc_cfg.h"
//#define SLEEP_AGING_TEST
// Vector Address Table Initialize Function in "\OAL\INTR\intr.c"
extern void VICTableInit(void);
// Initialization Function of SystemTimer in "\OAL\TIMER\timer.c"
extern void InitSystemTimer(UINT32 countsPerSysTick);
static UINT32 g_aSleepSave_VIC[100];
static UINT32 g_aSleepSave_GPIO[100];
static UINT32 g_aSleepSave_SysCon[100];
static UINT32 g_aSleepSave_DMACon0[100];
static UINT32 g_aSleepSave_DMACon1[100];
//static UINT32 g_LastWakeupStatus = 0;
static void OEMInitializeSystemTimer(UINT32 msecPerSysTick, UINT32 countsPerMSec, UINT32 countsMargin)
{
UINT32 countsPerSysTick;
// Validate Input parameters
countsPerSysTick = msecPerSysTick * countsPerMSec;
InitSystemTimer(countsPerSysTick);
}
static void S3C6410_SaveState_VIC(void *pVIC0, void *pVIC1, UINT32 *pBuffer)
{
volatile S3C6410_VIC_REG *pVIC0Reg;
volatile S3C6410_VIC_REG *pVIC1Reg;
pVIC0Reg = (S3C6410_VIC_REG *)pVIC0;
pVIC1Reg = (S3C6410_VIC_REG *)pVIC1;
*pBuffer++ = pVIC0Reg->VICINTSELECT;
*pBuffer++ = pVIC0Reg->VICINTENABLE;
*pBuffer++ = pVIC0Reg->VICSOFTINT;
*pBuffer++ = pVIC1Reg->VICINTSELECT;
*pBuffer++ = pVIC1Reg->VICINTENABLE;
*pBuffer++ = pVIC1Reg->VICSOFTINT;
// Do not Save VICVECTADDRXX
// Reinitialize Vector Address Table with VICTableInit()
}
static void S3C6410_RestoreState_VIC(void *pVIC0, void *pVIC1, UINT32 *pBuffer)
{
volatile S3C6410_VIC_REG *pVIC0Reg;
volatile S3C6410_VIC_REG *pVIC1Reg;
pVIC0Reg = (S3C6410_VIC_REG *)pVIC0;
pVIC1Reg = (S3C6410_VIC_REG *)pVIC1;
pVIC0Reg->VICINTSELECT = *pBuffer++;
pVIC0Reg->VICINTENABLE = *pBuffer++;
pVIC0Reg->VICSOFTINT = *pBuffer++;
pVIC1Reg->VICINTSELECT = *pBuffer++;
pVIC1Reg->VICINTENABLE = *pBuffer++;
pVIC1Reg->VICSOFTINT = *pBuffer++;
// Do not Restore VICVECTADDRXX
// Reinitialize Vector Address Table with VICTableInit()
VICTableInit();
}
static void S3C6410_SaveState_GPIO(void *pGPIO, UINT32 *pBuffer)
{
volatile S3C6410_GPIO_REG *pGPIOReg;
pGPIOReg = (S3C6410_GPIO_REG *)pGPIO;
// GPIO A
*pBuffer++ = pGPIOReg->GPACON; // 000
*pBuffer++ = pGPIOReg->GPADAT; // 004
*pBuffer++ = pGPIOReg->GPAPUD; // 008
//GPACONSLP; // 00c
//GPAPUDSLP; // 010
// GPIO B
*pBuffer++ = pGPIOReg->GPBCON; // 020
*pBuffer++ = pGPIOReg->GPBDAT; // 024
*pBuffer++ = pGPIOReg->GPBPUD; // 028
//GPBCONSLP; // 02c
//GPBPUDSLP; // 030
// GPIO C
*pBuffer++ = pGPIOReg->GPCCON; // 040
*pBuffer++ = pGPIOReg->GPCDAT; // 044
*pBuffer++ = pGPIOReg->GPCPUD; // 048
//GPCCONSLP; // 04c
//GPCPUDSLP; // 050
// GPIO D
*pBuffer++ = pGPIOReg->GPDCON; // 060
*pBuffer++ = pGPIOReg->GPDDAT; // 064
*pBuffer++ = pGPIOReg->GPDPUD; // 068
//GPDCONSLP; // 06c
//GPDPUDSLP; // 070
// GPIO E
*pBuffer++ = pGPIOReg->GPECON; // 080
*pBuffer++ = pGPIOReg->GPEDAT; // 084
*pBuffer++ = pGPIOReg->GPEPUD; // 088
//GPECONSLP; // 08c
//GPEPUDSLP; // 090
// GPIO F
*pBuffer++ = pGPIOReg->GPFCON; // 0a0
*pBuffer++ = pGPIOReg->GPFDAT; // 0a4
*pBuffer++ = pGPIOReg->GPFPUD; // 0a8
//GPFCONSLP; // 0ac
//GPFPUDSLP; // 0b0
// GPIO G
*pBuffer++ = pGPIOReg->GPGCON; // 0c0
*pBuffer++ = pGPIOReg->GPGDAT; // 0c4
*pBuffer++ = pGPIOReg->GPGPUD; // 0c8
//GPGCONSLP; // 0cc
//GPGPUDSLP; // 0d0
// GPIO H
*pBuffer++ = pGPIOReg->GPHCON0; // 0e0
*pBuffer++ = pGPIOReg->GPHCON1; // 0e4
*pBuffer++ = pGPIOReg->GPHDAT; // 0e8
*pBuffer++ = pGPIOReg->GPHPUD; // 0ec
//GPHCONSLP; // 0f0
//GPHPUDSLP; // 0f4
// GPIO I
*pBuffer++ = pGPIOReg->GPICON; // 100
*pBuffer++ = pGPIOReg->GPIDAT; // 104
*pBuffer++ = pGPIOReg->GPIPUD; // 108
//GPICONSLP; // 10c
//GPIPUDSLP; // 110
// GPIO J
*pBuffer++ = pGPIOReg->GPJCON; // 120
*pBuffer++ = pGPIOReg->GPJDAT; // 124
*pBuffer++ = pGPIOReg->GPJPUD; // 128
//GPJCONSLP; // 12c
//GPJPUDSLP; // 130
// GPIO K
*pBuffer++ = pGPIOReg->GPKCON0; // 800
*pBuffer++ = pGPIOReg->GPKCON1; // 804
*pBuffer++ = pGPIOReg->GPKDAT; // 808
*pBuffer++ = pGPIOReg->GPKPUD; // 80c
// GPIO L
*pBuffer++ = pGPIOReg->GPLCON0; // 810
*pBuffer++ = pGPIOReg->GPLCON1; // 814
*pBuffer++ = pGPIOReg->GPLDAT; // 818
*pBuffer++ = pGPIOReg->GPLPUD; // 81c
// GPIO M
*pBuffer++ = pGPIOReg->GPMCON; // 820
*pBuffer++ = pGPIOReg->GPMDAT; // 824
*pBuffer++ = pGPIOReg->GPMPUD; // 828
// GPIO N
*pBuffer++ = pGPIOReg->GPNCON; // 830
*pBuffer++ = pGPIOReg->GPNDAT; // 834
*pBuffer++ = pGPIOReg->GPNPUD; // 838
// GPIO O
*pBuffer++ = pGPIOReg->GPOCON; // 140
*pBuffer++ = pGPIOReg->GPODAT; // 144
*pBuffer++ = pGPIOReg->GPOPUD; // 148
//GPOCONSLP; // 14c
//GPOPUDSLP; // 150
// GPIO P
*pBuffer++ = pGPIOReg->GPPCON; // 160
*pBuffer++ = pGPIOReg->GPPDAT; // 164
*pBuffer++ = pGPIOReg->GPPPUD; // 168
//GPPCONSLP; // 16c
//GPPPUDSLP; // 170
// GPIO Q
*pBuffer++ = pGPIOReg->GPQCON; // 180
*pBuffer++ = pGPIOReg->GPQDAT; // 184
*pBuffer++ = pGPIOReg->GPQPUD; // 188
//GPQCONSLP; // 18c
//GPQPUDSLP; // 190
// Special Port Control
*pBuffer++ = pGPIOReg->SPCON; // 1a0
//SPCONSLP; // 880 // Configure for Sleep Mode
// Memory Port Control
*pBuffer++ = pGPIOReg->MEM0CONSTOP; // 1b0
*pBuffer++ = pGPIOReg->MEM1CONSTOP; // 1b4
*pBuffer++ = pGPIOReg->MEM0CONSLP0; // 1c0
*pBuffer++ = pGPIOReg->MEM0CONSLP1; // 1c4
*pBuffer++ = pGPIOReg->MEM1CONSLP; // 1c8
*pBuffer++ = pGPIOReg->MEM0DRVCON; // 1d0
*pBuffer++ = pGPIOReg->MEM1DRVCON; // 1d4
// External Interrupt
*pBuffer++ = pGPIOReg->EINT12CON; // 200
*pBuffer++ = pGPIOReg->EINT34CON; // 204
*pBuffer++ = pGPIOReg->EINT56CON; // 208
*pBuffer++ = pGPIOReg->EINT78CON; // 20c
*pBuffer++ = pGPIOReg->EINT9CON; // 210
*pBuffer++ = pGPIOReg->EINT12FLTCON; // 220
*pBuffer++ = pGPIOReg->EINT34FLTCON; // 224
*pBuffer++ = pGPIOReg->EINT56FLTCON; // 228
*pBuffer++ = pGPIOReg->EINT78FLTCON; // 22c
*pBuffer++ = pGPIOReg->EINT9FLTCON; // 230
*pBuffer++ = pGPIOReg->EINT12MASK; // 240
*pBuffer++ = pGPIOReg->EINT34MASK; // 244
*pBuffer++ = pGPIOReg->EINT56MASK; // 248
*pBuffer++ = pGPIOReg->EINT78MASK; // 24c
*pBuffer++ = pGPIOReg->EINT9MASK; // 250
//EINT12PEND; // 260 // Do not Save Pending Bit
//EINT34PEND; // 264
//EINT56PEND; // 268
//EINT78PEND; // 26c
//EINT9PEND; // 270
*pBuffer++ = pGPIOReg->PRIORITY; // 280
//SERVICE; // 284 // Do not Save Read Only Register (But Check before enter sleep...)
//SERVICEPEND; // 288 // Do not Save Pending Bit
// External Interrupt Group 0
*pBuffer++ = pGPIOReg->EINT0CON0; // 900
*pBuffer++ = pGPIOReg->EINT0CON1; // 904
*pBuffer++ = pGPIOReg->EINT0FLTCON0; // 910
*pBuffer++ = pGPIOReg->EINT0FLTCON1; // 914
*pBuffer++ = pGPIOReg->EINT0FLTCON2; // 918
*pBuffer++ = pGPIOReg->EINT0FLTCON3; // 91c
*pBuffer++ = pGPIOReg->EINT0MASK; // 920
//EINT0PEND; // 924 // Do not Save Pending Bit
// Sleep Mode Pad Configure Register
//SLPEN; // 930 // Configure for Sleep Mode
}
static void S3C6410_RestoreState_GPIO(void *pGPIO, UINT32 *pBuffer)
{
volatile S3C6410_GPIO_REG *pGPIOReg;
pGPIOReg = (S3C6410_GPIO_REG *)pGPIO;
// GPIO A
pGPIOReg->GPACON = *pBuffer++; // 000
pGPIOReg->GPADAT = *pBuffer++; // 004
pGPIOReg->GPAPUD = *pBuffer++; // 008
//GPACONSLP; // 00c
//GPAPUDSLP; // 010
// GPIO B
pGPIOReg->GPBCON = *pBuffer++; // 020
pGPIOReg->GPBDAT = *pBuffer++; // 024
pGPIOReg->GPBPUD = *pBuffer++; // 028
//GPBCONSLP; // 02c
//GPBPUDSLP; // 030
// GPIO C
pGPIOReg->GPCCON = *pBuffer++; // 040
pGPIOReg->GPCDAT = *pBuffer++; // 044
pGPIOReg->GPCPUD = *pBuffer++; // 048
//GPCCONSLP; // 04c
//GPCPUDSLP; // 050
// GPIO D
pGPIOReg->GPDCON = *pBuffer++; // 060
pGPIOReg->GPDDAT = *pBuffer++; // 064
pGPIOReg->GPDPUD = *pBuffer++; // 068
//GPDCONSLP; // 06c
//GPDPUDSLP; // 070
// GPIO E
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -