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
请问那个地址要怎么写呢?
在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运行。
你这个地址,那是没有问题的,就算你1st-level page table建的有问题,也不该编译的时候出错误。你这个错误就在这句赋值本身。老实说我也不知道为啥是rotate operand, 不过你改成ldr r0, =0x91600000试试看
这句的编译错误,谁能帮解释一下,我学学
建义楼主先看看ARM的基础知识,就是立即数问题
立即数可以分解成一个8-bit的二进制数循环右移偶数位,那么这个立即数是有效的,反之无效。
我试了下,以下都可以
mov r0, #0x91000000
orr r0, r0, #0x600000
orr r0, r0, #0x14
ldr r1, =0x91600014
受教,多谢
能否详细点,那我要mov r0, #0x91000000
orr r0, r0, #0x600000
orr r0, r0, #0x14
这样写地址是吗?
Mov 是把立即数赋给一个寄存器,但对立即数的范围有要求。只能是由8bit连续有效位通过偶数次移位能得到的数。如果立即数超出这个范围,就没办法用一条MOV指令给寄存器赋值。
而LDR是伪指令,没有立即数范围的限制,所以上面说的两种方法都是等同的,呵呵.
不太明白这个“由8bit连续有效位通过偶数次移位能得到的数”,有效位指什么意思?立即数不都是32位的嘛?32位不都可以被8整除嘛?整除不就是偶数次移位了嘛?
不太明白这个#0x91600014 和 #0x91600000有什么区别,wlc311先生可以再稍稍详细的给我讲解下嘛?谢谢
8bit就是八位的二进制码呀,91000000=10010001(0省略)B,91为八位可通过循环右移8位得到91000000,
而0x91600000和0x91600014 你可以亲自算一下,是不可通过一个八位二进制数循环右移偶数位得到的。很好理解。
引用: 引用 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后似乎不能点灯了,请问兄弟解决了吗?