原理:在应用程序中直接把控制电源的端口置低。这个原理可以用在其他需要直接访问物理内存的地方。Wince5.0平台测试通过,其他平台没验证。
第一步:
这一步可以包含s3c2440a_ioport.h 头文件代替。
定义结构:
typedef struct {
UINT32 GPACON; // Port A - offset 0
UINT32 GPADAT; // Data
UINT32 PAD1[2];
UINT32 GPBCON; // Port B - offset 0x10
UINT32 GPBDAT; // Data
UINT32 GPBUP; // Pull-up disable
UINT32 PAD2;
UINT32 GPCCON; // Port C - offset 0x20
UINT32 GPCDAT; // Data
UINT32 GPCUP; // Pull-up disable
UINT32 PAD3;
UINT32 GPDCON; // Port D - offset 0x30
UINT32 GPDDAT; // Data
UINT32 GPDUP; // Pull-up disable
UINT32 PAD4;
UINT32 GPECON; // Port E - offset 0x40
UINT32 GPEDAT; // Data
UINT32 GPEUP; // Pull-up disable
UINT32 PAD5;
UINT32 GPFCON; // Port F - offset 0x50
UINT32 GPFDAT;
UINT32 GPFUP;
UINT32 PAD6;
UINT32 GPGCON; // Port G - offset 0x60
UINT32 GPGDAT;
UINT32 GPGUP;
UINT32 PAD7;
UINT32 GPHCON; // Port H - offset 0x70
UINT32 GPHDAT;
UINT32 GPHUP;
UINT32 PAD8;
UINT32 MISCCR; // misc control reg - offset 0x80
UINT32 DCLKCON; // DCLK0/1 control reg
UINT32 EXTINT0; // external interrupt control reg 0
UINT32 EXTINT1; // external interrupt control reg 1
UINT32 EXTINT2; // external interrupt control reg 2
UINT32 EINTFLT0; // reserved
UINT32 EINTFLT1; // reserved
UINT32 EINTFLT2; // external interrupt filter reg 2
UINT32 EINTFLT3; // external interrupt filter reg 3
UINT32 EINTMASK; // external interrupt mask reg
UINT32 EINTPEND; // external interrupt pending reg
UINT32 GSTATUS0; // external pin status
UINT32 GSTATUS1; // chip ID
UINT32 GSTATUS2; // reset status
UINT32 GSTATUS3; // inform register
UINT32 GSTATUS4; // inform register
UINT32 FLTOUT; // C0 - added by simon
UINT32 DSC0;
UINT32 DSC1;
UINT32 MSLCON;
UINT32 GPJCON; // D0
UINT32 GPJDAT;
UINT32 GPJUP;
UINT32 PDA9;
} S3C2440A_IOPORT_REG, *PS3C2440A_IOPORT_REG;
定义IO端口物理起始地址:
#define S3C2440A_BASE_REG_PA_IOPORT (0x56000000) //物理地址
第二步:
虚拟地址与物理地址动态映射。
开始动态映射:
volatile S3C2440A_IOPORT_REG *v_pIOPregs;
v_pIOPregs = (volatile S3C2440A_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2440A_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
VirtualCopy((PVOID)v_pIOPregs, (PVOID)(S3C2440A_BASE_REG_PA_IOPORT >> 8), sizeof(S3C2440A_IOPORT_REG), PAGE_PHYSICAL|PAGE_READWRITE|PAGE_NOCACHE );
使用VirtualAlloc,VirtualCopy两个函数,需要包含下面两个头文件:
#include <windows.h>
#include "Pkfuncs.h"
第三步:控制IO关机
做完上面的工作后,v_pIOPregs指针已经映射到端口的物理地址上了。直接控制其关闭系统电源。注:GPG11端口控制系统总电源。
v_pIOPregs->GPGDAT &= ~(0x1<<11);
GPG11是硬件平台电源控制端口。后来我把这个功能放在SetSystemPowerState( NULL, POWER_STATE_OFF, POWER_FORCE )函数中实现了,这样操作起来稳定安全。改天再写个blog说明SetSystemPowerState( NULL, POWER_STATE_OFF, POWER_FORCE )实现关机的方法,谢谢关注……