Bootloader设计

U-boot包括自主模式开发模式

 

 异常向量表 Exceptions

由于处理器内部或者外部的一些事件,导致处理器停下正在处理的工作,转而去处理发生的异常事件。

 当一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址,去执行异常处理程序,而这个固定地址,就称之为异常向量

;;异常向量表

_start:
    b    reset
    ldr  pc,  _undefined_instruction
    ldr  pc,  _software_interrupt
    ldr  pc,  _prefectch_abort
    ldr  pc,  _data_abort
    ldr  pc,  _not_used        ; 占用一个指令地址
    ldr  pc,  _irq
    ldr  pc,  _fiq

start.S

.text
.global _start
_start:
    b reset
    ldr pc, _undefined_instruction
    ldr pc, _software_interrupt
    ldr pc, _prefectch_abort
    ldr pc, _data_abort
    ldr pc, _not_used
    ldr pc, _irq
    ldr pc, _fiq
    ldr pc, _reset

_undefined_instruction: .word undefined_instruction
_software_interrupt   : .word software_interrupt
_prefectch_abort: .word prefectch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq
_reset: .word reset

undefined_instruction:
    nop

software_interrupt:
    nop

prefectch_abort:
    nop

data_abort:
    nop

not_used:
    nop

irq:
    nop

fiq:
    nop

reset:
    nop

boot.lds

OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS{
. = 0x20008000

. = ALIGN(4);
.text:
{
start.o(.text)
*(.text)
}

. = ALIGN(4);
.data:
{
*(.data)
}

. = ALIGN(4);
bss_start=.;
.bss:
{
*(.bss)
}
bss_end=.;

}

Makefile

有些芯片的bootloader写完后,需要加上header字段,包含checksum, BL1长度等

处理器模式  Processor Mode

 

 

.text
.global _start
_start:
    b reset
    ldr pc, _undefined_instruction
    ldr pc, _software_interrupt
    ldr pc, _prefectch_abort
    ldr pc, _data_abort
    ldr pc, _not_used
    ldr pc, _irq
    ldr pc, _fiq
    ldr pc, _reset


_undefined_instruction: .word undefined_instruction
_software_interrupt   : .word software_interrupt
_prefectch_abort: .word prefectch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq
_reset: .word reset

undefined_instruction:
    nop

software_interrupt:
    nop

prefectch_abort:
    nop

data_abort:
    nop

not_used:
    nop

irq:
    nop

fiq:
    nop

reset:
    bl set_svc_irq_firq

set_svc_irq_firq:
    mrs r0, cprs        ;将cprs内容复制到r0
    bic r0, r0, #0x1f    ;将r0中的掩码0x1f的5位置0
    orr r0, r0, #0xd3    ;将掩码0xd3标注位置1,也就是关闭IRQ,FIRQ,置处理器为SVC模式
    msr cprs, r0        ;将r0内容写回CPRS
    mov pc, lc           ; 返回地址赋值给PC

关闭看门狗 disable WatchDog

reset:
    bl diable_watchdog

#define pWTCON 0x53000000
disable_watchdog:
    ldr r0, =pWTCON
    mov r1, #0x0
    str r1, [r0]
    mov pc, lc
    

 屏蔽中断  disable interrupt

reset:
    bl diable_interrupt


disable_interrupt:
    ldr r0, =0x4a000008
    mvn r1, #0x0
    str r1, [r0]
    mov pc, lc
    

关闭MMU,CACHE

MMU,cache都是由CP15协处理器来控制

cache分为 I-cache和D-cache

1,使i-cache和d-cache失效

2,关闭D-cache和MMU, 主要是关闭D-CACHE, I-CACHE可以不做处理

disable_mmu_cache:
    mcr p15,0,r0,c7,c7,0
    mrc p15,0,r0,c1,c0,0
    bic r0, r0, #0x00000007
    mcr p15,0,r0,c1,c0,0
    mov pc, lc

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值