u-boot总的启动流程代码分析

u-boot总的启动流程如下
->reset
-> 设置CPU模式
-> 关闭看门狗/中断
-> 设置处理器时钟/片上总线
-> 初始化调试串口
-> MMU/外部总线/SDRAM等初始化
-> rom代码/数据搬移到ram
-> 初始化函数调用栈
-> 初始化外围设备/参数
-> 启动完毕,进入main_loop循环

u-boot主要提供以下功能:

设置目标板硬件参数并初始化;
为操作系统传递必要信息;
执行交互式的底层操作;
智能化装载操作系统;
引导和运行的固件程序;
支持大容量存储和USB接口

s3c2410复位之后,pc指针会指向0x0地址。在u-boot代码中,该0x0地址是一个向量表,
第一条指令跳转branch到复位代码start_code。 位于cpu/arm920t/start.S汇编语言文件第53行:

.globl _start  _start:  b start_code 
    ldr pc, _undefined_instruction
    ldr pc, _software_interrupt
    ldr pc, _prefetch_abort
    ldr pc, _data_abort
    ldr pc, _not_used
    ldr pc, _irq
    ldr pc, _fiq
复位指令跳转之后来到第154行,开始执行arm920t处理器的基本初始化。
首先修改当前程序状态寄存器CPSR,使处理器进入Supervisor|32 bit ARM模式,
并关闭ARM9TDMI中断和快速中断,这是通过设置CPSR相应掩码实现的:

start_code:    
      mrs r0,cpsr
   bic r0,r0,#0x1f
   orr r0,r0,#0xd3
   msr cpsr,r0 
紧接着,将S3C2410特有的WTCON寄存器清零,此举仅为关闭看门狗,代码位置是234行:

    ldr r0, =pWTCON
 mov r1, #0x0
 str r1, [r0]
然后在241行,将S3C2410中断控制器INTMSK寄存器置为全1,
INTSUBMSK置为0x7ff,禁止全部中断源。S3C2410手册358页起对此有详细描述:

    mov r1, #0xffffffff
 ldr r0, =INTMSK
 str r1, [r0]
 # if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440) || defined(CONFIG_S3C2442) || /    defined(CONFIG_S3C2443)
 ldr r1, =INTSUBMSK_val
 ldr r0, =INTSUBMSK
 str r1, [r0]
 # endif
接下来在259行,访问arm920t控制寄存器CP15,并置位最高两位[31,30]。
此两位置为0b11后,处理器时钟被设置为异步模式,允许处理器异步访问总线:

    mrc p15, 0, r1, c1, c0, 0
 orr r1, r1, #0xc0000000
 mcr p15, 0, r1, c1, c0, 0
至此arm920t相关的配置完成。

根据不同的编译时选项和运行时参数,代码会在360行进入相应的分支,分别是

从nand启动,代码执行lowlevel_init,主要是清除cpu cache,以及关闭mmu和i-cache,
并且根据板极硬件配置初始化外部存储器总线和GPIO,最后把代码从nand flash中拷贝到ram中并继续执行。
通过操作CP15完成flush处理器arm920t的cache和tlb,并关闭mmu和i-cache:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值