EBOOT开启MMU的地址问题

xingheluqi   2009-10-6 19:32 楼主
g_oalAddressTable

        DCD     0x80000000, 0x30000000,  64     ; 64 MB DRAM BANK 6
        ;DCD     0x84000000, 0x10000000,  32     ; nGCS2: PCMCIA/PCCARD
        ;DCD     0x86000000, 0x18000000,  32     ; 32 MB SROM(SRAM/ROM) BANK 3 (CS8900 netcard)
        DCD     0x84000000, 0x18000000,  32     ; BANK3
        DCD     0x86000000, 0x20000000,  32     ; BANK4
        DCD     0x88000000, 0x00000000,  96     ; 96mb NOR flash
        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     0x90F00000, 0x4F000000,   1     ; Camera Interface
        DCD     0x91000000, 0x50000000,   1     ; UART control register
        DCD     0x91100000, 0x51000000,   1     ; PWM timer register
        DCD     0x91200000, 0x52000000,   1     ; USB device register
        DCD     0x91300000, 0x53000000,   1     ; Watchdog Timer register
        DCD     0x91400000, 0x54000000,   1     ; IIC control register
        DCD     0x91500000, 0x55000000,   1     ; IIS control register
       DCD     0x91600000, 0x56000000,   1     ; I/O Port register
        DCD     0x91700000, 0x57000000,   1     ; RTC control register
        DCD     0x91800000, 0x58000000,   1     ; A/D convert register
        DCD     0x91900000, 0x59000000,   1     ; SPI register
        DCD     0x91A00000, 0x5A000000,   1     ; SD Interface register
        DCD     0x91B00000, 0x5B000000,   1     ; AC97
        ;       0x92000000, 0x00000000,  32     ; original location of 32MB of NOR flash
        DCD     0x94000000, 0x34000000, 192     ; 192 MB bank 6&7 - Extended RAM
        DCD     0x00000000, 0x00000000,   0     ; end of table




EBOOT走到这里
          mov     r1, #1
          mcr     p15, 0, r1, c3, c0, 0   ; setup access to domain 0
          mcr     p15, 0, r10, c2, c0, 0;

          mcr     p15, 0, r0, c8, c7, 0   ; flush I+D TLBs
          mov     r1, #0x0071             ; Enable: MMU
          orr     r1, r1, #0x0004         ; Enable the cache

          ldr     r0, =VirtualStart

          cmp     r0, #0                  ; make sure no stall on "mov pc,r0" below
          mcr     p15, 0, r1, c1, c0, 0
          mov     pc, r0                  ;  & jump to new virtual address
          nop

开启MMU了。

VirtualStart

        
         mov     sp, #0x80000000
         add     sp, sp, #0x65000        ; arbitrary initial super-page stack pointer     
        
        ;ldr     r0, = GPBDAT     

         mov     r0, #0x91600014
我想在这里点灯,请问地址是写0x91600014这个吗?是 mov     r0, #0x91600014这条语句吗?编译不通过

        ;ldr     r1, = 0      
        ;str     r1, [r0]   
        
        b       main



错误:
BUILD: [01:0000000024:PROGC ] Assembling .\startup.s
BUILD: [01:0000000029:ERRORE] E:\WINCE600\PLATFORM\My2440\src\bootloader\eboot\startup.s(448) : error A0092: no immediate rotate operand can be created: -1855979500
BUILD: [00:0000000031:PROGC ]                        Files  Warnings  Errors



请问那个地址要怎么写呢?

回复评论 (15)

提示: 作者被禁止或删除 内容自动屏蔽
点赞  2009-10-6 19:32
在MAIN函数中
void main(void)
{
        volatile S3C2410X_IOPORT_REG *s2410IOP = (S3C2410X_IOPORT_REG *)OALPAtoVA(S3C2410X_BASE_REG_PA_IOPORT, FALSE);
        //volatile S3C2410X_IOPORT_REG *s2410IOP = S3C2410X_BASE_REG_PA_IOPORT;
        s2410IOP->GPBCON=0x15400;
        s2410IOP->GPBDAT=0x7ff;

    // Clear LEDs.
    //   
    //OEMWriteDebugLED(0, 0xF);

    // Common boot loader (blcommon) main routine.
    //   
    BootloaderMain();

    // Should never get here.
    //
    SpinForever();
}

以上s2410IOP->GPBCON=0x15400;
        s2410IOP->GPBDAT=0x7ff;
这两条语句执行后,灯没有变化,是不是在开启MMU后就死了???
目前是UBOOT下载EBOOT到30021000中,GO 30022000运行。
点赞  2009-10-6 19:33
没人回答,自己顶上。
点赞  2009-10-7 07:18
你这个地址,那是没有问题的,就算你1st-level page table建的有问题,也不该编译的时候出错误。你这个错误就在这句赋值本身。老实说我也不知道为啥是rotate operand, 不过你改成ldr r0, =0x91600000试试看

这句的编译错误,谁能帮解释一下,我学学
点赞  2009-10-7 08:32
建义楼主先看看ARM的基础知识,就是立即数问题
立即数可以分解成一个8-bit的二进制数循环右移偶数位,那么这个立即数是有效的,反之无效。
点赞  2009-10-7 12:15
我试了下,以下都可以

mov r0, #0x91000000
orr r0, r0, #0x600000
orr r0, r0, #0x14
ldr r1, =0x91600014

受教,多谢
点赞  2009-10-7 15:37
引用: 引用 5 楼 wlc311 的回复:
建义楼主先看看ARM的基础知识,就是立即数问题
立即数可以分解成一个8-bit的二进制数循环右移偶数位,那么这个立即数是有效的,反之无效。


不太懂,能否详细说明下,谢谢了。
点赞  2009-10-7 16:24
能否详细点,那我要mov r0, #0x91000000
orr r0, r0, #0x600000
orr r0, r0, #0x14
这样写地址是吗?
点赞  2009-10-7 18:55
Mov 是把立即数赋给一个寄存器,但对立即数的范围有要求。只能是由8bit连续有效位通过偶数次移位能得到的数。如果立即数超出这个范围,就没办法用一条MOV指令给寄存器赋值。
而LDR是伪指令,没有立即数范围的限制,所以上面说的两种方法都是等同的,呵呵.
点赞  2009-10-7 21:35
此贴要学习。
点赞  2009-10-8 08:17
不太明白这个“由8bit连续有效位通过偶数次移位能得到的数”,有效位指什么意思?立即数不都是32位的嘛?32位不都可以被8整除嘛?整除不就是偶数次移位了嘛?
不太明白这个#0x91600014 和 #0x91600000有什么区别,wlc311先生可以再稍稍详细的给我讲解下嘛?谢谢
点赞  2009-10-8 08:20
8bit就是八位的二进制码呀,91000000=10010001(0省略)B,91为八位可通过循环右移8位得到91000000,
而0x91600000和0x91600014 你可以亲自算一下,是不可通过一个八位二进制数循环右移偶数位得到的。很好理解。
点赞  2009-10-8 09:00
恩。学会了。明白了。结贴。多谢。
点赞  2009-10-8 09:08
引用: 引用 2 楼 windxiang520 的回复:
在MAIN函数中
void main(void)
{
volatile S3C2410X_IOPORT_REG *s2410IOP = (S3C2410X_IOPORT_REG *)OALPAtoVA(S3C2410X_BASE_REG_PA_IOPORT, FALSE);
//volatile S3C2410X_IOPORT_REG *s2410IOP = S3C2410X_BASE_REG_PA_IOPORT;
s2410IOP->GPBCON=0x15400;
s2410IOP->GPBDAT=0x7ff;

? ? // Clear LEDs.
? ? //?
? ? //OEMWriteDebugLED(0, 0xF);

? ? // Common boot loader (blcommon) main routine.
? ? //? ?
? ? BootloaderMain();

? ? // Should never get here.
? ? //
? ? SpinForever();
}

以上s2410IOP->GPBCON=0x15400;
s2410IOP->GPBDAT=0x7ff;
这两条语句执行后,灯没有变化,是不是在开启MMU后就死了???
目前是UBOOT下载EBOOT到30021000中,GO 30022000运行。


"这两条语句执行后,灯没有变化,是不是在开启MMU后就死了???"

最近移改写CE6的BSP也遇到这个问题,就是在MMU后似乎不能点灯了,请问兄弟解决了吗?
点赞  2009-11-16 22:27
提示: 作者被禁止或删除 内容自动屏蔽
点赞  2010-6-23 12:24
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复