|
上次的贴已经结了,分页给了几位提出我代码问题的,但是主要问题不知在这,所以重开一贴;
我的汇编代码:
- TEXTAREA
- IMPORT main
- .
- .
- .
- .
- .
- .
-
-
- ;------------------------------------------------------------------------------
- ; Add for Power Management ?
- BringUpWinCE ;点亮LED
-
- ldr r0, = GPFDAT
- mov r1, #0x60
- str r1, [r0]
- ;------------------------------------------------------------------------------
- ; Copy boot loader to memory
- ands r9, pc, #0xFF000000 ; see if we are in flash or in ram
- bne %f20 ; go ahead if we are already in ram
- ; This is the loop that perform copying.
- ldr r0, = 0x38000 ; offset into the RAM
- add r0, r0, #PHYBASE ; add physical base
- mov r1, r0 ; (r1) copy destination
- ldr r2, =0x0 ; (r2) flash started at physical address 0
- ldr r3, =0x10000 ; counter (0x40000/4)
- 10 ldr r4, [r2], #4
- str r4, [r1], #4
- subs r3, r3, #1
- bne %b10
- ; Restart from the RAM position after copying.
- mov pc, r0
- nop
- nop
- nop
- ; Shouldn't get here.
- b .
- INCLUDE oemaddrtab_cfg.inc
-
- ; Compute physical address of the OEMAddressTable.
- 20 add r11, pc, #g_oalAddressTable - (. + 8)
- ldr r10, =PTs ; (r10) = 1st level page table
- ; Setup 1st level page table (using section descriptor)
- ; Fill in first level page table entries to create "un-mapped" regions
- ; from the contents of the MemoryMap array.
- ;
- ; (r10) = 1st level page table
- ; (r11) = ptr to MemoryMap array
- add r10, r10, #0x2000 ; (r10) = ptr to 1st PTE for "unmapped space"
- mov r0, #0x0E ; (r0) = PTE for 0: 1MB cachable bufferable
- orr r0, r0, #0x400 ; set kernel r/w permission
- 25 mov r1, r11 ; (r1) = ptr to MemoryMap array
-
- 30 ldr r2, [r1], #4 ; (r2) = virtual address to map Bank at
- ldr r3, [r1], #4 ; (r3) = physical address to map from
- ldr r4, [r1], #4 ; (r4) = num MB to map
- cmp r4, #0 ; End of table?
- beq %f40
- ldr r5, =0x1FF00000
- and r2, r2, r5 ; VA needs 512MB, 1MB aligned.
- ldr r5, =0xFFF00000
- and r3, r3, r5 ; PA needs 4GB, 1MB aligned.
- add r2, r10, r2, LSR #18
- add r0, r0, r3 ; (r0) = PTE for next physical page
- 35 str r0, [r2], #4
- add r0, r0, #0x00100000 ; (r0) = PTE for next physical page
- sub r4, r4, #1 ; Decrement number of MB left
- cmp r4, #0
- bne %b35 ; Map next MB
- bic r0, r0, #0xF0000000 ; Clear Section Base Address Field
- bic r0, r0, #0x0FF00000 ; Clear Section Base Address Field
- b %b30 ; Get next element
-
- 40 tst r0, #8
- bic r0, r0, #0x0C ; clear cachable & bufferable bits in PTE
- add r10, r10, #0x0800 ; (r10) = ptr to 1st PTE for "unmapped uncached space"
- bne %b25 ; go setup PTEs for uncached space
- sub r10, r10, #0x3000 ; (r10) = restore address of 1st level page table
- ; Setup mmu to map (VA == 0) to (PA == 0x30000000).
- ldr r0, =PTs ; PTE entry for VA = 0
- ldr r1, =0x3000040E ; uncache/unbuffer/rw, PA base == 0x30000000
- str r1, [r0]
- ; uncached area.
- add r0, r0, #0x0800 ; PTE entry for VA = 0x0200.0000 , uncached
- ldr r1, =0x30000402 ; uncache/unbuffer/rw, base == 0x30000000
- str r1, [r0]
-
- ; Comment:
- ; The following loop is to direct map RAM VA == PA. i.e.
- ; VA == 0x30XXXXXX => PA == 0x30XXXXXX for S3C2400
- ; Fill in 8 entries to have a direct mapping for DRAM
- ;
- ldr r10, =PTs ; restore address of 1st level page table
- ldr r0, =PHYBASE
- add r10, r10, #(0x3000 / 4) ; (r10) = ptr to 1st PTE for 0x30000000
- add r0, r0, #0x1E ; 1MB cachable bufferable
- orr r0, r0, #0x400 ; set kernel r/w permission
- mov r1, #0
- mov r3, #64
- 45 mov r2, r1 ; (r2) = virtual address to map Bank at
- cmp r2, #0x20000000:SHR:BANK_SHIFT
- add r2, r10, r2, LSL #BANK_SHIFT-18
- strlo r0, [r2]
- add r0, r0, #0x00100000 ; (r0) = PTE for next physical page
- subs r3, r3, #1
- add r1, r1, #1
- bgt %b45
- ldr r10, =PTs ; (r10) = restore address of 1st level page table
- ; The page tables and exception vectors are setup.
- ; Initialize the MMU and turn it on.
- 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
- [color=#FF0000] mov pc, r0 [/color] ; & jump to new virtual addre[ss
- nop
- ; MMU & caches now enabled.
- ; (r10) = physcial address of 1st level page table
- ;
- VirtualStart
-
- mov sp, #0x8C000000
- add sp, sp, #0x30000 ; arbitrary initial super-page stack pointer
- b main
- ENTRY_END
-
- LTORG
复制代码
c代码
- void main(void)
- {
-
- OEMWriteDebugLED(0, 0xF);
- }
- void OEMWriteDebugLED(UINT16 Index, DWORD Pattern)
- {
- volatile S3C2410X_IOPORT_REG *s2410IOP = (S3C2410X_IOPORT_REG *)OALPAtoVA(S3C2410X_BASE_REG_PA_IOPORT, FALSE);
-
- s2410IOP->GPFDAT=(s2410IOP->GPFDAT & 0xf) | ((Pattern & 0xf)<<4);
- }
复制代码
我的硬件没有norflash 所以采用的是nboot +eboot
nboot执行之后,也的确把 eboot拷贝到了0x30038000处(读ram和源文件比较)
我的nboot用ads编译的,所以可以仿真,跳转到eboot后执行到mov pc, r0,地址也变成了虚拟地址(仿真器上看到的)
执行b main 后 都是dci 操作,也就是代码存储相关,但是无法执行main函数中的led函数(因为灯没有熄灭,不知道是不是可以这样理解)
最后会报undefine instruction错误,反汇编后发现是报错的语句是一条协处理器操作,找资料说协处理器操作不能是会报上名的错误
这个问题困扰我很久了,我的eboot采用的编译方法是 按帮助上说明的来的
|
|