`
saybody
  • 浏览: 904369 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

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

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

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

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

<wbr></wbr><wbr></wbr><wbr></wbr> mrc p15, 0, r1, c1, c0, 0
<wbr></wbr>orr r1, r1, #0xc0000000
<wbr></wbr>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:

分享到:
评论

相关推荐

    U-Boot启动过程完全分析

    ### U-Boot启动过程完全分析 #### U-Boot启动内核的过程 U-Boot的启动内核过程可以被划分为两个主要阶段,每个阶段都承担着特定的任务。 ##### 第一阶段的功能 第一阶段的主要任务包括: 1. **硬件设备初始化**...

    u-boot2017.01启动过程分析.pdf

    通过分析源码,本分析报告详细阐述了U-Boot启动过程中函数调用的流程,帮助读者深入理解U-Boot从初始化到加载操作系统内核的整个过程。 U-Boot启动过程可以分为以下几个主要阶段: 1. **SPL(Secondary Program ...

    u-boot 启动过程的详细分析

    #### 三、U-Boot启动过程详解 ##### 3.1 硬件初始化 U-Boot启动的第一步是对硬件进行初始化。这一步骤非常重要,因为它涉及到处理器及其外设的配置。这些初始化工作可能包括但不限于: - 设置时钟频率。 - 初始化...

    U-boot的启动流程

    U-boot的启动流程可以分为两个阶段,Stage1和Stage2。 Stage1主要负责硬件的初始化工作,包括CPU、内存以及外设。这一阶段的任务是为Stage2的运行做准备,保证硬件环境符合后续阶段的要求。在此阶段,U-boot会检查...

    U-BOOT的启动流程及移植

    U-BOOT启动流程一般分为两个阶段:Stage 1和Stage 2。 - **Stage 1(start.s代码结构)** - 入口点定义:Bootloader通常从ROM(通常是Flash)的0x0地址开始执行。 - 异常向量设置:配置异常处理机制。 - CPU配置...

    u-boot 启动流程分析

    《U-Boot启动流程分析——深入理解ARM启动》 在嵌入式系统的世界里,U-Boot作为一款广泛应用的引导加载程序,对于系统的初始化和启动起着至关重要的作用。本文将详细探讨U-Boot在ARM架构下的启动流程,旨在帮助读者...

    U-Boot启动过程完全分析.pdf

    ### U-Boot启动过程完全分析 #### U-Boot的工作过程概览 U-Boot(Universal Boot Loader)是一种广泛应用于嵌入式系统的引导加载程序。它能够支持多种处理器架构,并具备高度可配置性与灵活性,使其成为开发嵌入式...

    U-boot启动流程分析

    U-Boot启动流程分析: U-Boot是一种非常流行的开源Bootloader,广泛应用于嵌入式系统中,负责初始化硬件设备,建立内存空间的映射图,从而为操作系统的运行创造条件。U-Boot启动流程分为两个主要阶段:第一阶段和第...

    u-boot-1.1.6.tar.bz & u-boot-1.1.6_jz2440.patch

    《深入解析u-boot-1.1.6与JZ2440平台的集成实践》 ...通过这个过程,不仅可以学习到u-boot的基本工作原理,还能深入了解硬件平台的特性以及操作系统启动的整个流程,这对于提升嵌入式开发能力有着极大的帮助。

    U-BOOT启动流程详解

    《U-Boot启动流程详解》 U-Boot是一款广泛应用的开放源码的引导加载程序,主要负责嵌入式系统的初始化工作,包括硬件设备的初始化、操作系统内核的加载等任务。深入理解U-Boot的启动流程对于开发和调试嵌入式系统至...

    U-Boot启动过程--详细版的完全分析

    ### U-Boot启动过程完全分析 #### 一、引言 U-Boot作为一种广泛应用于嵌入式系统的Bootloader,其启动过程是理解整个系统启动机制的关键。本文将深入剖析U-Boot的启动流程,旨在为读者提供一份详尽的技术指南。 #...

    U-Boot启动过程

    总的来说,U-Boot启动过程涉及到CPU的初始化、代码重定位、系统资源的配置以及操作系统的加载。每个步骤都是为了确保嵌入式系统能够顺利启动并运行。理解这个过程对于开发者调试和优化系统性能至关重要。

    u-boot代码详细分析

    ### U-Boot代码详细分析 #### 1. U-Boot简介 ##### 1.1 U-Boot的来源 U-Boot(Universal Boot Loader)是一种开源的Bootloader项目,旨在为不同架构的处理器提供通用的引导加载支持。U-Boot最初是由DENX软件工程...

    基于PXA255的U-Boot启动分析及移植

    基于PXA255的U-Boot启动分析及移植...U-Boot的启动分析和移植是嵌入式系统开发中的重要步骤,需要对U-Boot的启动流程和移植过程有深入的了解,以便正确地配置和修改U-Boot的代码,确保U-Boot能够稳定地运行在目标板上。

    U-Boot 源码分析(u-boot-2009.03)

    整体来看,这部分源码分析涉及到U-Boot的启动流程、异常处理机制、内存管理、硬件抽象层以及特定硬件平台的配置细节。对于开发者来说,这些分析能够帮助他们理解U-Boot是如何在硬件上进行初始化操作,并为后续的操作...

    windows下编译u-boot代码

    本文详细介绍了如何在Windows环境下利用MSYS、MinGW和Eclipse Helios编译和调试U-Boot代码的过程。通过上述步骤,开发者可以在Windows操作系统上高效地进行U-Boot的开发工作,这对于不熟悉Unix类操作系统的开发者来...

    u-boot-xlnx-xilinx-v2017.4.tar.gz

    《Xilinx Zynq7000系列U-Boot源码详解及编译指南》 在嵌入式系统开发中,U-Boot是一款至关重要的引导加载程序,它为系统提供了...理解U-Boot的功能和Petalinux的工作流程,对于进行Zynq平台的嵌入式系统开发至关重要。

Global site tag (gtag.js) - Google Analytics