免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2050 | 回复: 0

g-bios异常向量重定位问题 [复制链接]

论坛徽章:
0
发表于 2009-01-12 20:20 |显示全部楼层
我手头的达芬奇平台(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 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP