- 论坛徽章:
- 0
|
我手头的达芬奇平台(dm644x),ddr2地址是0x80000000,flash地址是0x02000000。在bot half 阶段,以下这段代码用于异常向量重定位:
ldr r0, =vIntTab
mov r1, #32
ldm r0, {r2, r3, r4, r5, r6, r7}
stm r1, {r2, r3, r4, r5, r6, r7} |
但是最初的向量保存在flash中(top half head.S中),所以以上这段代码根本不会起作用。因为nor flash可以按字节读出,但是却要擦出整快后写入,故把这段代码改为:
ldr r0, =vIntTab
ldr r1, DDR2_START /* DDR2_START: .word 0x819fff00*/
ldm r0, {r2, r3, r4, r5, r6, r7}
stm r1, {r2, r3, r4, r5, r6, r7} |
CONF_BH_START = 0x81a00000。相应地,top half 的head.S修改为:
#include <g-bios.h>
#include <arch/arm.h>
#include <arch/soc.h>
#include <core/kermit.h>
.global GTopHalfEntry
.global Hang
GTopHalfEntry:
ldr pc, vect_reset
b handle_undef
b handle_swi
b handle_iabort
b handle_dabort
.word (gbios_th_end - GTopHalfEntry)
b handle_irq
b handle_fiq
.word GB_MAGIC_TH
vect_reset:
.word handle_reset
/*
vect_undef:
.word handle_undef
vect_swi:
.word handle_swi
vect_iabort:
.word handle_iabort
vect_dabort:
.word handle_dabort
vect_irq:
.word handle_irq
vect_fiq:
.word handle_fiq
*/
handle_undef:
SUB sp, sp, #4
STMFD {r0}
LDR r0, =0x819fff00
LDR r0, [r0]
STR r0, [sp, #4]
LDMFD {r0, pc}
handle_swi:
SUB sp, sp, #4
STMFD {r0}
LDR r0, =0x819fff04
LDR r0, [r0]
STR r0, [sp, #4]
LDMFD {r0, pc}
handle_iabort:
SUB sp, sp, #4
STMFD {r0}
LDR r0, =0x819fff08
LDR r0, [r0]
STR r0, [sp, #4]
LDMFD {r0, pc}
handle_dabort:
SUB sp, sp, #4
STMFD {r0}
LDR r0, =0x819fff0c
LDR r0, [r0]
STR r0, [sp, #4]
LDMFD {r0, pc}
handle_irq:
SUB sp, sp, #4
STMFD {r0}
ldr r0, =0x819fff10
LDR r0, [r0]
STR r0, [sp, #4]
LDMFD {r0, pc}
handle_fiq:
SUB sp, sp, #4
STMFD {r0}
ldr r0, =0x819fff14
LDR r0, [r0]
STR r0, [sp, #4]
LDMFD {r0, pc}
handle_reset:
msr cpsr, #(ARM_MODE_SVC | ARM_INT_MASK)
mov sp, #INIT_STACK_BASE
bl init
Hang:
b Hang
|
这样一来,异常向量就可重定位到DDR2中了。其中,0x819fff00,0x819fff04等等这些向量可以放在存储池中,根据CONF_BH_START - 0x100 加上偏移量来得到。
这是我目前的解决方法,请conke兄及其他兄台指教。
[ 本帖最后由 zhiqiang0071 于 2009-1-12 20:22 编辑 ] |
|