各位高手:
在OEMAddressTable中如果定义了
DCD 0x80000000, 0x32000000, 32 ; 32 MB DRAM 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, 32 ; 32 MB DRAM BANK 0
DCD 0x90800000, 0x48000000, 1 ; Memory control register
DCD 0x90900000, 0x49000000, 1 ; USB Host register
DCD 0x90A00000, 0x4A000000, 1 ; Interrupt Control register
DCD 0x90B00000, 0x4B000000, 1 ; DMA control register
DCD 0x90C00000, 0x4C000000, 1 ; Clock & Power register
DCD 0x90D00000, 0x4D000000, 1 ; LCD control register
DCD 0x90E00000, 0x4E000000, 1 ; NAND flash control register
..............
如果我想操作 DCD 0x90E00000, 0x4E000000, 1 ; NAND flash control register
FLASH控制器如何操作?我用了MmMapIoSpace函数将物理地址0x4E000000映射为虚拟地址,结果好像不管用,
如果直接操作虚拟地址,比如0x90E00000又会失败,不知道该如何操作?
直接操作虚拟地址不是全部会操作,比如我操作0x90000000就不会出错,但是操作0x90E00000就会出错.
请问如何解决?如何操作上述I/O设备?
在config.bib里做个reserved,例如
NANDCONTROLER 90E00000 00001000 RESERVED
1. CE5.0或之前在Kernel模式下可以直接对虚拟地址进行操作,但在用户模式下直接操作是会出Data Abort的,所以LZ的有时候可以有时候不可以,是不是在不同的驱动中操作,把Image做成Fullkernelmode,就可以全部对虚拟地址直接操作
2. 你完全可以通过VirtualAlloc和VirtualCopy进行地址映射,然后再对Flash的地址进行操作
引用: 引用 2 楼 hzdysymbol 的回复:
1. CE5.0或之前在Kernel模式下可以直接对虚拟地址进行操作,但在用户模式下直接操作是会出Data Abort的,所以LZ的有时候可以有时候不可以,是不是在不同的驱动中操作,把Image做成Fullkernelmode,就可以全部对虚拟地址直接操作
2. 你完全可以通过VirtualAlloc和VirtualCopy进行地址映射,然后再对Flash的地址进行操作
我是在流驱动的方式下对其进行操作的,是在多普达D600 windows mobile 5的基础上进行操作.
这样的话我还能自己定制内核吗?
我没有多普达的BSP包啊
没有BSP怎么定制内核?
没有BSP哪来的流式驱动?
引用: 引用 3 楼 redeg 的回复:
引用 2 楼 hzdysymbol 的回复:
1. CE5.0或之前在Kernel模式下可以直接对虚拟地址进行操作,但在用户模式下直接操作是会出Data Abort的,所以LZ的有时候可以有时候不可以,是不是在不同的驱动中操作,把Image做成Fullkernelmode,就可以全部对虚拟地址直接操作
2. 你完全可以通过VirtualAlloc和VirtualCopy进行地址映射,然后再对Flash的地址进行操作
我是在流驱动的方式下对其进行操作的,是在多普达D600 windows mobile 5的基…
这是WM的,这个和wince是不同的,一般人很难弄到那个定制软件,只有大的OEM厂商才能弄到。
至于操作IO,可以使用VirtualAlloc和VirtualCopy,这样比较保险。
我也曾经看见过有人直接绑定虚拟地址来操作,既然也可行。
楼主多看源代码,多上eeworld,一定很快了解。
我指的是我无法得到多普达的BSP源码..
没有源码也能修改其内核?
我用的是MmMapIoSpace函数,
具体代码是
#define NANDFLASH 0x4E000000 //0x4E000000是flash控制器的物理地址,OEMAddressTable中相对应的虚拟地址是0x90E00000
char *PhysicAddr = 0;
PHYSICAL_ADDRESS pa = {0, 0};
pa.QuadPart = NANDFLASH;
PhysicAddr = (char *)MmMapIoSpace(pa, ADDRESSMAPSIZE, false); //ADDRESSMAPSIZE是一个常数,比如512
可是这样的话结果好像不对.请高手指教.
引用: 引用 6 楼 redeg 的回复:
我指的是我无法得到多普达的BSP源码..
没有源码也能修改其内核?
你是在应用层访问IO?
我觉得你不能修改。
你想在应用访问IO是要驱动配合的,你现在不知道驱动怎么写的,想访问不行。
除非多普达公布了一些访问的专门的接口函数。
我在流驱动层访问IO,我自己编写一个流驱动来访问IO也不行吗?