5759|17

53

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教高手们,虚拟地址映射的问题(用 VirtualAlloc 和 VirtualCopy) [复制链接]

我在2440+WINCE上,使用用 VirtualAlloc 和 VirtualCopy 进行虚拟地址的映射,然后发现对该虚拟地址直接赋值时,会异常。
源代码:
#define IOP_BASE      0xB1600000 // 0x56000000
typedef struct  {
    unsigned int  rGPACON;  // 00
    unsigned int  rGPADAT;
    unsigned int  rPAD1[2];
   
    unsigned int  rGPBCON;  // 10
    unsigned int  rGPBDAT;
    unsigned int  rGPBUP;
    unsigned int  rPAD2;
   
    unsigned int  rGPCCON;  // 20
    unsigned int  rGPCDAT;
    unsigned int  rGPCUP;
    unsigned int  rPAD3;
   
    unsigned int  rGPDCON;  // 30
    unsigned int  rGPDDAT;
    unsigned int  rGPDUP;
    unsigned int  rPAD4;
   
    unsigned int  rGPECON;  // 40
    unsigned int  rGPEDAT;
    unsigned int  rGPEUP;
    unsigned int  rPAD5;
   
    unsigned int  rGPFCON;  // 50
    unsigned int  rGPFDAT;
    unsigned int  rGPFUP;
    unsigned int  rPAD6;
   
    unsigned int  rGPGCON;  // 60
    unsigned int  rGPGDAT;
    unsigned int  rGPGUP;
    unsigned int  rPAD7;
   
    unsigned int  rGPHCON;  // 70
    unsigned int  rGPHDAT;
    unsigned int  rGPHUP;
    unsigned int  rPAD8;
   
    unsigned int  rMISCCR;  // 80
    unsigned int  rDCKCON;  
    unsigned int  rEXTINT0;
    unsigned int  rEXTINT1;  
    unsigned int  rEXTINT2;  // 90
        unsigned int  rEINTFLT0;
        unsigned int  rEINTFLT1;
        unsigned int  rEINTFLT2;
        unsigned int  rEINTFLT3;  // A0
        unsigned int  rEINTMASK;
        unsigned int  rEINTPEND;
        unsigned int  rGSTATUS0;  // AC
        unsigned int  rGSTATUS1;  // B0
        unsigned int  rGSTATUS2;  // B4
        unsigned int  rGSTATUS3;  // B8
        unsigned int  rGSTATUS4;  // BC

}IOPreg;

volatile IOPreg *v_pIOPRegs;

BOOL IORemap()
{

        v_pIOPRegs = (volatile IOPreg*)VirtualAlloc(0, sizeof(IOPreg), MEM_RESERVE, PAGE_NOACCESS);

        if (v_pIOPRegs == NULL)
         {
                DEBUGMSG (1,(TEXT("v_pIOPRegs is not allocated\n\r")));
                return FALSE;
         }
        if (!VirtualCopy((PVOID)v_pIOPRegs, (PVOID)IOP_BASE, sizeof(IOPreg), PAGE_READWRITE|PAGE_NOCACHE))
        {
                DEBUGMSG (1,(TEXT("v_pIOPRegs is not mapped\n\r")));
                return TRUE;
        }
        else
        {
                return FALSE;
        }
}
BOOL IO_Configuer(void)
{
        //
        v_pIOPRegs->rGPFCON |= 0x00000055;  //config GPF0-3 / LIGHT1-4 as output
        v_pIOPRegs->rGPFUP  &= 0xF0;                //set GPF0-3 to be pullup

        v_pIOPRegs->rGPGCON |= 0x00045441;        //config GPG0.3.5.6.7.9 / MOTOR1-4 . IO3-4 as output
        v_pIOPRegs->rGPGCON &= 0xFF0FFFFF;  //config GPG10-11 / SI1.SI2 as input
        v_pIOPRegs->rGPGUP  &= 0x0D16;      //set GPG0.3.5.6.7.9 to be pullup

        v_pIOPRegs->rGPECON |= 0x04400000;        //config GPE11.13 / IO1-IO2 as output
        v_pIOPRegs->rGPEUP  &= 0xD7FF;                //set GPE11.13 to be pullup

        v_pIOPRegs->rGPBCON |= 0x00000004;        //config GPB1 / BEEP as output
        v_pIOPRegs->rGPBUP  &= 0xFFFD;      //set GPB1 to be pullup

        //
        v_pIOPRegs->rGPFDAT |= 0x0F;   //LIGHT 1-4 are High_lever
        v_pIOPRegs->rGPGDAT |= 0x02E9; //GPG0.3.5.6.7.9 / MOTOR1-4. IO3.4 are High_lever
        v_pIOPRegs->rGPEDAT |= 0x2800; //GPE11.13 / IO1.2 are High_lever

        return TRUE;
}

BOOL SetPinStatus(UINT uPinnum, BYTE uWrite_Byte)
{
        switch(uPinnum)
        {
                case WI_Light :   //GPF1
                        {
                                if(uWrite_Byte == 1)
                                {
                                        v_pIOPRegs->rGPFDAT |= 0x00000002;
                                        Delay_ms(1) ;
                                }
                                else
                                {
                                        v_pIOPRegs->rGPFDAT &= ~(1 << 1);
                                        Delay_ms(1) ;
                                }
                                return TRUE;
                        }

                default:
                        return FALSE;
                               
        }
}

在应用程序实际运行的时候我监视发现这个问题:程序执行语句v_pIOPRegs->rGPFDAT |= 0x00000002;时,寄存器v_pIOPRegs->rGPFDAT的值没有变,而v_pIOPRegs->rGPCDAT的值在变,而且还发现,不管我操作哪个DAT寄存器,所有的都只有端口C的v_pIOPRegs->rGPCDAT在不停变换。

最新回复

看来是解决不了啊,那就这样吧,结贴散分了  详情 回复 发表于 2009-12-22 16:17
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
小弟我整了好几天了,还没有解决阿
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
    //----- 1. Map the GPIO registers needed to enable the SDI controller -----
    vm_pIOPreg = (S3C2440A_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2440A_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
    if (vm_pIOPreg == NULL)
    {
        DEBUGMSG (1,(TEXT("GPIO registers not allocated\r\n")));
        status = SD_API_STATUS_INSUFFICIENT_RESOURCES;
        goto INIT_ERROR;
    }
    if (!VirtualCopy((PVOID)vm_pIOPreg, (PVOID)(S3C2440A_BASE_REG_PA_IOPORT >> 8), sizeof(S3C2440A_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)) {
        DEBUGMSG (1,(TEXT("GPIO registers not mapped\r\n")));
        status = SD_API_STATUS_INSUFFICIENT_RESOURCES;
        goto INIT_ERROR;
    }
    DEBUGMSG (1,(TEXT("GPIO registers mapped to %x\r\n"), vm_pIOPreg));
差别应该比较明显,LZ看出来了吧。。。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
!VirtualCopy((PVOID)v_pIOPRegs, (PVOID)IOP_BASE, sizeof(IOPreg), PAGE_READWRITE|PAGE_NOCACHE
这行代码不对
第二个值应该是(物理地址>>8),具体右移八位的原因可以看一下ce的内存管理
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
地址映射没有问题,可能GPIO有它的即定用法,查查硬件文档吧,我没有弄过三星的片子
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 
地址映射没有问题的,再仔细查查code吧
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 3 楼 guopeixin 的回复:
!VirtualCopy((PVOID)v_pIOPRegs, (PVOID)IOP_BASE, sizeof(IOPreg), PAGE_READWRITE|PAGE_NOCACHE
这行代码不对
第二个值应该是(物理地址>>8),具体右移八位的原因可以看一下ce的内存管理

guopeixin说的是对的,第二个参数应该是物理地址右移八位,即:
if (!VirtualCopy((PVOID)v_pIOPRegs, (PVOID)IOP_BASE, sizeof(IOPreg), PAGE_READWRITE|PAGE_NOCACHE))
改为:
if (!VirtualCopy((PVOID)v_pIOPRegs, (PVOID)((IOP_BASE-0x5B600000)>>8), sizeof(IOPreg), PAGE_READWRITE|PAGE_NOCACHE)),因为实际的物理地址是:0x56000000=IOP_BASE-0x5B600000
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

8
 
如果楼主用的是Wince 5.0,就按照guopeixin的做(将物理地址右移8位),如果是wince 4.2,你的做法没有问题
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

9
 
这个地方搞不大清楚,能给出更加详细的说明吗
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

10
 
我用的就是WINCE5.0, 并不需要右移,直接用IOP_BASE就可以正常工作的
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 2 楼 liuysheng 的回复:
!VirtualCopy((PVOID)vm_pIOPreg, (PVOID)(S3C2440A_BASE_REG_PA_IOPORT >> 8), sizeof(S3C2440A_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))


Paul, Chao @ Techware
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

12
 
mark。学习下。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

13
 
#define IOP_BASE      0x56000000
...
!VirtualCopy((PVOID)vm_pIOPreg, (PVOID)(IOP_BASE >> 8), sizeof(S3C2440A_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
试一下这个
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

14
 
如果定义的GPIO地址为实际物理地址,如#define IOP_BASE      0x56000000,那么 VirtualCopy((PVOID)vm_pIOPreg, (PVOID)(IOP_BASE>>), sizeof(S3C2440A_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)) 中IOP_BASE是需要右移8位,如果定义的GPIO是虚拟地址,就像楼主使用的那样,VirtualCopy中不需要右移。
如果出错,可能是其他问题造成的,可以添加打印信息,查看寄存器的变化。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 13 楼 dongjinnv 的回复:
如果定义的GPIO地址为实际物理地址,如#define IOP_BASE? ? ? 0x56000000,那么 VirtualCopy((PVOID)vm_pIOPreg, (PVOID)(IOP_BASE>>), sizeof(S3C2440A_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)) 中IOP_BASE是需要右移8位,如果定义的GPIO是虚拟地址,就像楼主使用的那样,VirtualCopy中不需要右移。
如果出错,可能是其他问题造成的,可以添加打印信息,查看寄存器的变化。


“第二个参数应该是物理地址右移八位”的确是小弟的 忽略,但是我还是发现了一个问题:
我在应用程序了采用VirtualAlloc和Virtualcopy之后,
直接引用 v_pIOPRegs->rGPFDAT |= 0x00000002;
发现GPF01根本没反映

但是我把GPIO流驱动做到NK中之后, 在应用程序中调用流驱动,hFile= CreatFile(), WriteFile(hFile,)
操作结果是正常的,真的不知道为什么?
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 14 楼 sibling520 的回复:
引用 13 楼 dongjinnv 的回复:
如果定义的GPIO地址为实际物理地址,如#define IOP_BASE? ? ? 0x56000000,那么 VirtualCopy((PVOID)vm_pIOPreg, (PVOID)(IOP_BASE>>), sizeof(S3C2440A_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)) 中IOP_BASE是需要右移8位,如果定义的GPIO是虚拟地址,就像楼主使用的那样,VirtualCopy中不需要右移。
  如果出错,可能是其他问题造成的,可以添加打印信息,查看寄存器的变化。


“第二个参数应该是物理地址右移八位”的确是小弟的 忽略,但是我还是发现了一个问题:
我在应用程序了采用VirtualAlloc和Virtualcopy之后,
直接引用 v_pIOPRegs->rGPFDAT |= 0x00000002;
发现GPF01根本没反映

但是我把GPIO流驱动做到NK中之后, 在应用程序中调用流驱动,hFile= CreatFile(), WriteFile(hFile,)
操作结果是正常的,真的不知道为什么?


不知道你在 v_pIOPRegs->rGPFDAT |= 0x00000002; 之前有没有初始化GPIO呢,也就是设置输出
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

17
 
初始化了,
应该是没有什么问题的
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

18
 
看来是解决不了啊,那就这样吧,结贴散分了
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表