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

📄 off.c

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