Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / U-Boot之u-boot-2009.11启动过程分析

注:本文使用的u-boot源码版本为u-boot-2009.11相关阅读:U-Boot源代码下载地址 http://www.linuxidc.com/Linux/2011-07/38897.htmu-boot同其他bootloader一样,其启动过程分为stage1和stage2两个阶段, stage1主要完成基本硬件设备初始化和为加载stage2部分的代码准备RAM空间,stage2则是为引导内核准备环境。下面分两部分来分析u-boot启动的两个阶段。一、u-boot启动第一阶段stage1u-boot的第一阶段主要由u-boot源文件目录cpuarm_cortexa8目录下的start.S和cpuarm_cortexa8omap3目录下lowlevel_init.S来完成,前者是SOC平台相关,后者是开发板相关的。1、基础硬件初始化基本硬件设备的初始化主要在start.S内完成,依次完成如下设置:将CPU的工作模式设为管理模式(svc),将中断向量表拷贝到SRAM,关闭WATCHDOG,后来就是关闭MMU,CACHE等。reset:
      /*
     * set the cpu to SVC32 mode 设置ARM处理器的工作模式为SVC模式
     */
      mrs r0, cpsr
      bic  r0, r0, #0x1f
      orr  r0, r0, #0xd3
      msr cpsr,r0
/*将中断向量表拷贝到SRAM*/
#if (CONFIG_OMAP34XX)
      /* Copy vectorsto mask ROM indirect addr */
      adr  r0, _start           @ r0<- current position of code
      add r0, r0, #4           @ skip reset vector
      mov     r2, #64               @ r2 <- size to copy
      add r2, r0, r2              @ r2 <- sourceend address
      mov     r1, #SRAM_OFFSET0  @ build vect addr
      mov     r3, #SRAM_OFFSET1
      add r1, r1, r3
      mov     r3, #SRAM_OFFSET2
      add r1, r1, r3
next:
      ldmia   r0!, {r3 - r10}              @ copy from source address [r0]
      stmia   r1!, {r3 - r10}              @ copyto target address [r1]
      cmp     r0, r2                 @until source end address [r2]
      bne next                   @loop until equal */
 
      ldr pc, _start_armboot    @ jump to C code
_start_armboot: .wordstart_armboot
cpu_init_crit:
      /*关闭MMU与CACHE */
      mov     r0, #0                 @ set up for MCR
      mcr p15, 0, r0, c8, c7, 0    @ invalidateTLBs
      mcr p15, 0, r0, c7, c5, 0    @ invalidateicache
 
      mrc p15, 0, r0, c1, c0, 0
      bic  r0, r0, #0x00002000  @ clear bits 13(--V-)
      bic  r0, r0, #0x00000007  @ clear bits 2:0 (-CAM)
      orr  r0, r0, #0x00000002  @ set bit 1 (--A-) Align
      orr  r0, r0, #0x00000800  @ set bit 12(Z---) BTB
      mcr p15, 0, r0, c1, c0, 0
      /*调用lowlevel_init用来初始化RAM*/
      mov     ip, lr                   @persevere link reg across call
      bl    lowlevel_init                @go setup pll,mux,memory
      mov     lr, ip                   @restore link
      mov     pc, lr                    @back to my caller2、为stage2准备RAM空间
 
所谓准备RAM空间,就是初始化内存控制器,使它可用。对于OMAP3这种SOC,通过在start.S中调用lowlevel_init函数来设置存储控制器,使得外接的SDRAM可用。代码在cpuarm_cortexa8omap3目录下lowlevel_init.S中。.globl lowlevel_init
lowlevel_init:
      ldr sp, SRAM_STACK
        str   ip,     [sp] /* stashold link register */
      mov     ip, lr   /*save link reg across call */
      bl      s_init          /* gosetup pll,mux,memory */
        ldr   ip,     [sp]    /* restore saveip */
      mov     lr,    ip    /*restore link reg */
      /* back toarch calling code */
      mov     pc,  lr
      /* the literalpools origin */
      .ltorg