3335|6

83

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于wince下地址映射的问题 [复制链接]

WINCE 在map.a文件中的一个地址映射表,
OEMAddressTable
    ;;;-------------------------------------------------------------
    ;;; Virt Addr   Phys Addr   MB
    ;;;-------------------------------------------------------------
    DCD 0x80000000, 0x02000000, 30  ; 30 MB SRAM(SRAM/ROM) BANK 0
    DCD 0x82000000, 0x08000000, 32  ; 32 MB SROM(SRAM/ROM) BANK 1
    DCD 0x84000000, 0x10000000, 32  ; 32 MB SROM(SRAM/ROM) BANK 2
    DCD 0x86000000, 0x18000000, 32  ; 32 MB SROM(SRAM/ROM) BANK 3
    DCD 0x88000000, 0x20000000, 32  ; 32 MB SROM(SRAM/ROM) BANK 4
    DCD 0x8A000000, 0x28000000, 32  ; 32 MB SROM(SRAM/ROM) BANK 5
    DCD 0x8C000000, 0x30000000, 64  ; Hanson change:64 MB DRAM B
。。。。
    DCD 0x91600000, 0x56000000,  1  ; I/O Port register

在2440.h中
   #define IOP_BASE      0xB1600000 // 0x56000000
   #define IOP_PHY_BASE 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  rGPJUP;
                unsigned int  rPAD9;
       
}IOPreg;  


   比如DCD 0x91600000, 0x56000000它将I/O Port register的物理地址映射到了0x91600000,
然后我们可以通过  VirtualAlloc()和VirtualCopy()内存也址与虚拟地址IOP_BASE邦定,访问到0x56000000.
我想问的是:
     我们定义了 volatile IOPreg  *v_pIOPRegs,可通过 v_pIOPRegs->rGPACON访问GPACON寄存器,可以通过 v_pIOPRegs->rGPADAT访问GPADAT寄存器;但是我们只定义了IOP_BASE这些寄存器的起始地址(GPACON 0x56000000),
GPADAT,rPAD1[2],rGPBCON...这些寄存器的地址并没有明确的被定义到哪个地址呀?这怎么能访问到呢?
  请教各位大侠,指点下!
   

此帖出自WindowsCE论坛

最新回复

void类型的数据不是可以给其他类型的数据赋值吗?  详情 回复 发表于 2009-9-9 12:40
点赞 关注
 

回复
举报

67

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你定义了结构体啦,地址自动往下加。rGPADAT地址=rGPACON+unsigned int长度
建议LZ看看数据存储这方面的知识 
此帖出自WindowsCE论坛
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我拿NAND FLASH这段做例子。
在2440.h中,
#define NAND_BASE                        0xB0E00000        // 0x4E000000
#define NFC_BASE                        0x90E00000        // 0x4E000000
#define NFC_BASE_PHYSICAL        0x4E000000

typedef struct {
                unsigned int  rNFCONF;                // 0x00
                unsigned int  rNFCONT;                // 0x04                new
                unsigned int  rNFCMMD;                // 0x08                update
                unsigned int  rNFADDR;                // 0x0c            
                unsigned int  rNFDATA;                // 0x10
                unsigned int  rNFMECCD0;        // 0x14
                unsigned int  rNFMECCD1;        // 0x18
                unsigned int  rNFSECCD;                // 0x1c
                unsigned int  rNFSTAT;                // 0x20
                unsigned int  rNFESTAT0;        // 0x24
                unsigned int  rNFESTAT1;        // 0x28
                unsigned int  rNFMECC0;                // 0x2c
                unsigned int  rNFMECC1;                // 0x30
                unsigned int  rNFSECC;                // 0x34
                unsigned int  rNFSBLK;                // 0x38
                unsigned int  rNFEBLK;                // 0x3c
} NANDreg;   

这当中,宏定义了NAND_BASE,也就是nand的虚拟地址,又定义了nand所用到的结构体NANDreg。
而在驱动中有这么一句:
        volatile NANDreg *s2440NAND = (NANDreg *)NAND_BASE;


楼主应该清楚了吧。。。。。。。。
此帖出自WindowsCE论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

4
 
多謝二位的指點!
此帖出自WindowsCE论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

5
 
请教:
volatile NANDreg *s2440NAND = (NANDreg *)NAND_BASE;
这个语句的意思是,1.定义一个NANDreg类型的指针变量 2.将这个指针变量初始化为地址NAND_BASE
3.由于C++要求等号两边数据一致所以要把NAND_BASE强制转化成结构体NANDreg 所指向的地址数据类型。
volatile NANDreg *s2440NAND = NAND_BASE;
这样写不可以吗?#define NAND_BASE 0xB0E00000NAND_BASE应该是一个void类型的数据吧。
此帖出自WindowsCE论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 4 楼 jiereliyi 的回复:
请教:
volatile NANDreg *s2440NAND = (NANDreg *)NAND_BASE;
这个语句的意思是,1.定义一个NANDreg类型的指针变量 2.将这个指针变量初始化为地址NAND_BASE
3.由于C++要求等号两边数据一致所以要把NAND_BASE强制转化成结构体NANDreg 所指向的地址数据类型。
volatile NANDreg *s2440NAND = NAND_BASE;
这样写不可以吗?#define NAND_BASE 0xB0E00000NAND_BASE应该是一个void类型的数据吧。



所以需要强制类型转换,你该去看看C的语法。
此帖出自WindowsCE论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

7
 
void类型的数据不是可以给其他类型的数据赋值吗?
此帖出自WindowsCE论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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