关于wince 地址映射和I/0操作的问题

ygwilliam   2008-11-26 21:17 楼主
各位高手:
    在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设备?

回复评论 (11)

在config.bib里做个reserved,例如
        NANDCONTROLER        90E00000        00001000        RESERVED
点赞  2008-11-26 22:27
1. CE5.0或之前在Kernel模式下可以直接对虚拟地址进行操作,但在用户模式下直接操作是会出Data Abort的,所以LZ的有时候可以有时候不可以,是不是在不同的驱动中操作,把Image做成Fullkernelmode,就可以全部对虚拟地址直接操作
2. 你完全可以通过VirtualAlloc和VirtualCopy进行地址映射,然后再对Flash的地址进行操作
点赞  2008-11-26 23:40
引用: 引用 2 楼 hzdysymbol 的回复:
1. CE5.0或之前在Kernel模式下可以直接对虚拟地址进行操作,但在用户模式下直接操作是会出Data Abort的,所以LZ的有时候可以有时候不可以,是不是在不同的驱动中操作,把Image做成Fullkernelmode,就可以全部对虚拟地址直接操作
2. 你完全可以通过VirtualAlloc和VirtualCopy进行地址映射,然后再对Flash的地址进行操作


我是在流驱动的方式下对其进行操作的,是在多普达D600 windows mobile 5的基础上进行操作.
这样的话我还能自己定制内核吗?
我没有多普达的BSP包啊
点赞  2008-11-27 15:46
没有BSP怎么定制内核?
没有BSP哪来的流式驱动?
点赞  2008-11-27 16:02
引用: 引用 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,一定很快了解。
点赞  2008-11-27 16:14
我指的是我无法得到多普达的BSP源码..
没有源码也能修改其内核?
点赞  2008-11-27 16:35
我用的是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

可是这样的话结果好像不对.请高手指教.
点赞  2008-11-27 16:41
引用: 引用 6 楼 redeg 的回复:
我指的是我无法得到多普达的BSP源码..
没有源码也能修改其内核?


你是在应用层访问IO?

我觉得你不能修改。

你想在应用访问IO是要驱动配合的,你现在不知道驱动怎么写的,想访问不行。

除非多普达公布了一些访问的专门的接口函数。
点赞  2008-11-27 16:46
我在流驱动层访问IO,我自己编写一个流驱动来访问IO也不行吗?
点赞  2008-11-28 17:02
UP..别沉..
点赞  2008-11-29 18:32
沉了,呵呵
点赞  2009-7-11 16:20
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复