社区导航

 

搜索
查看: 2471|回复: 6

关于wince下地址映射的问题

[复制链接]

112

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-8 20:03 | 显示全部楼层 |阅读模式
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论坛

100

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-8 20:54 | 显示全部楼层
你定义了结构体啦,地址自动往下加。rGPADAT地址=rGPACON+unsigned int长度
建议LZ看看数据存储这方面的知识 

回复

使用道具 举报

89

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-9 00:04 | 显示全部楼层
我拿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;


楼主应该清楚了吧。。。。。。。。

回复

使用道具 举报

110

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-9 08:37 | 显示全部楼层
多謝二位的指點!

回复

使用道具 举报

105

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-9 08:48 | 显示全部楼层
请教:
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类型的数据吧。

回复

使用道具 举报

104

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-9 12:06 | 显示全部楼层
引用 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的语法。

回复

使用道具 举报

94

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-9 12:40 | 显示全部楼层
void类型的数据不是可以给其他类型的数据赋值吗?

回复

使用道具 举报

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

关闭

站长推荐上一条 1/7 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

词云| Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-7-10 08:06 , Processed in 0.248200 second(s), 27 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表