一块ISA的卡,IO范围是 0x2C0 -- 0x2C7
插在PC104的ISA槽里
系统是WinCE5.0
现在想在应用层用读写物理内存的方式操作IO
用VirtualAlloc和VirtualCopy这两个API把物理内存映射到虚拟内存
那这个IO范围对应的物理内存地址是多少?是怎么计算的?
敬请指点
这两个函数的帮助看了很多遍了
不是函数不会用,是不知道应该映射到什么物理地址
主板是Arm的,寄存器应该采用的是内存映射方式
那到底映射到哪块内存了?怎么算的?
看内存映射表,算一下就知道了,名字记不太清了,map什么的文件。
能说的详细点么,哪个文件,大概怎么算?
这块我比较陌生,拜托了
类似oemaddrtab_cfg.inc这样的头文件,里面好似类似于
ALIGN
g_oalAddressTable
DCD 0x80000000, 0xA0000000, 64 ; MAINSTONEII: SDRAM (64MB).
DCD 0x84000000, 0x5C000000, 1 ; BULVERDE: Internal SRAM (64KB bank 0).
DCD 0x84100000, 0x58000000, 1 ; BULVERDE: Internal memory PM registers.
DCD 0x84200000, 0x4C000000, 1 ; BULVERDE: USB host controller.
DCD 0x84300000, 0x48000000, 1 ; BULVERDE: Memory controller.
DCD 0x84400000, 0x44000000, 1 ; BULVERDE: LCD controller.
DCD 0x84500000, 0x40000000, 32 ; BULVERDE: Memory-mapped registers (peripherals).
DCD 0x86500000, 0x3C000000, 64 ; BULVERDE: PCMCIA S1 common memory space.
DCD 0x8A500000, 0x38000000, 64 ; BULVERDE: PCMCIA S1 attribute memory space.
DCD 0x8E500000, 0x30000000, 32 ; BULVERDE: PCMCIA S1 I/O space.
DCD 0x90500000, 0x2C000000, 64 ; BULVERDE: PCMCIA S0 common memory space.
DCD 0x94500000, 0x28000000, 64 ; BULVERDE: PCMCIA S0 attribute memory space.
DCD 0x98500000, 0x20000000, 32 ; BULVERDE: PCMCIA S0 I/O space.
DCD 0x9A500000, 0xE0000000, 1 ; MAINSTONEII: Zero-bank (in reserved slot - no physical memory required).
DCD 0x9A600000, 0x14000000, 1 ; MAINSTONEII: nCS5: eXpansion board header.
DCD 0x9A700000, 0x10000000, 1 ; MAINSTONEII: nCS4: SMSC 91C111 Ethernet controller.
DCD 0x9A800000, 0x0A000000, 1 ; MAINSTONEII: nCS2 (upper half): 2MB SRAM.
的定义。
我这个是粘的mianstone的,2c0对应的905
呃,发现我在这块真的知识贫乏 :(
基本上看不懂,只好再问
类似这样的文件在哪里找?CE的哪个系统目录里?还是硬件的SDK里?
文件格式的每一块是什么意思?
DCD 0x90500000, 0x2C000000, 64 ; BULVERDE: PCMCIA S0 common memory space.
0x90500000这个是内存地址?
0x2C000000这个是什么?
64 这个是什么?
我要找的物理内存地址对应哪个值?
每次启动后映射到的地址不会变吧?
麻烦你再辛苦解答一下,谢谢!
这个就是虚拟地址和物理地址的内存映射表,静态映射是不会变的,一般在BSP的inc文件夹下,实在不行,你在PB里面搜索一下关键字也能找到。
好的,硬件在家里,回去找找看,非常感谢。
再问几个细的问题
1. 主板是买周立功的,系统都是做好了的,我没用PB,也没有BSP。那CE的Platform目录里会有这些Inc文件是么?
2. 你看看文件里的格式我理解的对不对
DCD 0x90500000, 0x2C000000, 64 ; BULVERDE: PCMCIA S0 common memory space.
0x90500000这个是物理内存地址?
0x2C000000这个是IO基地址?
64 这个是长度?
我要找的物理内存地址就是0x90500000?
3. 插在ISA上的板子是我老师自己做的,没有驱动,在Inc文件里应该不会出现吧?那应该找哪一项?
引用: 引用 8 楼 dahua 的回复:
好的,硬件在家里,回去找找看,非常感谢。
再问几个细的问题
1. 主板是买周立功的,系统都是做好了的,我没用PB,也没有BSP。那CE的Platform目录里会有这些Inc文件是么?
2. 你看看文件里的格式我理解的对不对
DCD 0x90500000, 0x2C000000, 64 ; BULVERDE: PCMCIA S0 common memory space.
0x905……
0x90500000是虚拟地址起始地址(物理起始地址映射后的虚拟地址);
0x2C000000物理地址的起始地址;
64就是物理地址0x2C000000开始的64M内存大小
BOOL VirtualCopy(
LPVOID lpvDest,
LPVOID lpvSrc,
DWORD cbSize,
DWORD fdwProtect
);
那我用VirtualCopy操作物理内存的话,第2个参数lpvSrc应该填哪个值?
引用: 引用 10 楼 dahua 的回复:
BOOL VirtualCopy(
LPVOID lpvDest,
LPVOID lpvSrc,
DWORD cbSize,
DWORD fdwProtect
);
那我用VirtualCopy操作物理内存的话,第2个参数lpvSrc应该填哪个值?
(0x2C000000>>8),fdwProtect加上PAGE_PHYSICAL。
大侠们这样指点了我一圈还是有点不清楚,再仔细描述下我的问题
主板是周立功的epc8000,ARM体系,有一个ISA槽,系统是WinCE5.0
我老师做了一个板子,插在ISA口,板子的IO范围是 0x2C0 -- 0x2C7
我现在想在用户层读写这个板子的IO,目前的想法是用VirtualCopy函数映射到某个物理内存地址进行操作
现在想知道物理内存地址应该是多少?如何找出来?
seu_dust大侠告诉我找inc文件,可是找哪个inc文件?
inc文件是跟着板子走的吗?我老师自己做的板子没有这个啊
还有如果找到这个映射表了,我是不是可以直接操作那个虚拟内存地址了?还用自己VirtualCopy吗?
找到那个映射表,就可以直接在应用中操作了,
是在找不到,也可以先VirtualCopy下,再打印出来就知道地址了,以后直接定义一个指针就可以操作了!
你要看你芯片的datasheet或者bsp的OEMAddressTable
, ISA口对应的起始地址是多少,你说的0x2C0 -- 0x2C7应该是offset。要加baseaddr上去得到Paddr。
这就是你的物理地址,
首先virtualalloc一块虚拟内存(7个字节)Vaddr
然后调用virtualcopy(Vaddr,Paddr,flag)
你就可以直接用Vaddr来用物理地址了
应该可以直接申请的吧,
ps:epc8000有bsp包吗?周立功的板子如何啊?