u-boot启动流程分析
2011-10-11 19:18
435 查看
u-boot启动流程分析
u-boot启动流程如下:
1)reset
2)设置CPU模式
3)关闭看门狗/中断
4)设置处理器时钟/片上总线
5)初始化调试串口
5) MMU/外部总线/SDRAM等初始化
6)ROM代码/数据搬移到RAM
7)初始化外围设备/参数
8)启动完毕,进入main_loop循环
u-boot主要提供以下功能:
1)设置目标板硬件参数并初始化
2)为操作系统传递必要信息
3)执行交互式的底层操作
4)智能化装载操作系统
5)引导和运行的固定程序
6)支持大容量存储和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,禁止全部中断源。
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行进入相应的分支,分别是nor启动和nand启动。
下面就nand启动进行描述:从nand启动,代码执行lowlevel_init,主要是清楚cpu cache,以及关闭mmu和i-cache,并且根据板子硬件配置初始化外部存储器总线和GPIO,最后把代码从nand flash中拷贝到RAM中并继续执行
u-boot启动流程如下:
1)reset
2)设置CPU模式
3)关闭看门狗/中断
4)设置处理器时钟/片上总线
5)初始化调试串口
5) MMU/外部总线/SDRAM等初始化
6)ROM代码/数据搬移到RAM
7)初始化外围设备/参数
8)启动完毕,进入main_loop循环
u-boot主要提供以下功能:
1)设置目标板硬件参数并初始化
2)为操作系统传递必要信息
3)执行交互式的底层操作
4)智能化装载操作系统
5)引导和运行的固定程序
6)支持大容量存储和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,禁止全部中断源。
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行进入相应的分支,分别是nor启动和nand启动。
下面就nand启动进行描述:从nand启动,代码执行lowlevel_init,主要是清楚cpu cache,以及关闭mmu和i-cache,并且根据板子硬件配置初始化外部存储器总线和GPIO,最后把代码从nand flash中拷贝到RAM中并继续执行
s3c2410u-boot前4K搬移问题
下面详细分析一下它的最前面的启动过程.
1.在板子上电的一开始,首先自动判断是否是autoboot模式(这是由硬件设计阶段,由硬件工程师对mcu的引脚连线决定的),我所使用的s3c2410是带有nandflash的,并切被设置成autoboot,从nandflash开始启动.
2.在判断是autoboot模式后,mcu内置的nandflash控制器自动将nandflash的最前面的4k区域(这4k区域存放着 bootloader的最前面4k代码)拷贝到samsung所谓的"steppingstone"里面(实际上是一块4k大小的SRAM).
3.在拷贝完前4k代码后,nandflash控制器自动将"steppingstone"映射到arm地址空间0x00000000开始的前4k区域.
4.在映射过程完成后.nandflash控制器将pc指针直接指向arm地址空间的0x00000000位置,准备开始执行"steppingstone"上的代码.
5.而"steppingstone"上从nandflash拷贝过来的4k代码,是程序员写的bootloader的前4k代码.这个 bootloader在之前写好,并已经被烧写到nandflash的0x00000000开始的最前面区域..而这"steppingstone"上的 4k代码就是bootloader的前4k代码.
6.在pc指向arm地址空间的0x00000000后,系统就开始执行指令代码.这4k代码的任务是:初始化硬件,设置中断向量表,设置堆栈,然后一个很重要的任务是,将nandflash的最前面区域的bootloader(包含4k启动代码)拷贝到SDRAM中去,bootloader代码的大小是写好bootloader就确定的.然后只需要确定bootloader想映射到SDRAM的起始位置就ok.
7.在完成对nandflash上的bootloader搬移后,找到4k代码的搬移代码最后一个指令的下一个指令在SDRAM的bootloader的地址,然后跳转到该位置,继续执行bootloader的剩余代码(引导系统).
相关文章推荐
- 2014.4新版uboot启动流程分析
- u-boot启动流程分析(1)_平台相关部分
- Spring Boot启动流程分析
- 2014.4新版uboot启动流程分析
- 基于ar9331 mips架构AP121 uboot分析(4) 启动流程 Stage1
- U-Boot启动流程(Linux内核)的分析(写得好)
- (二)u-boot启动流程分析(汇编部分)
- coreboot学习5:启动流程跟踪之ramstage阶段主干分析
- u-boot移植启动流程详细分析(2)
- u-boot-2011.09在ST2410上启动流程分析
- Exynos4412 Uboot 移植(二)—— Uboot 启动流程分析
- Exynos4412 Uboot 移植(二)—— Uboot 启动流程分析
- (三)u-boot启动流程分析(C语言部分board_f.c)
- u-boot启动流程分析
- 深入理解uboot 2016 - 基础篇(S3C2410 与S5PV210处理器启动流程分析)
- MX51 uboot启动流程分析 - stage2
- 2014.4新版uboot启动流程分析 他的博客需要学习
- u-boot启动流程分析(2)_板级(board)部分
- QNX学习笔记-Neutrino-QNX-boot启动流程分析
- (四)u-boot启动流程分析(C语言部分board_r.c)