wince动态内存映射实现访问IO端口或物理内存

本文介绍如何在WinCE5.0平台上通过直接访问物理内存来控制IO端口,实现对硬件电源的控制。主要内容包括定义IO端口结构、动态映射虚拟地址到物理地址,并给出具体关机操作的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

原理:在应用程序中直接把控制电源的端口置低。这个原理可以用在其他需要直接访问物理内存的地方。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 );

使用VirtualAllocVirtualCopy两个函数,需要包含下面两个头文件:

#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 )实现关机的方法,谢谢关注……

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值