[uboot] (第五章)uboot流程 您所在的位置:网站首页 uboot开机音乐 [uboot] (第五章)uboot流程

[uboot] (第五章)uboot流程

2023-08-09 00:25| 来源: 网络整理| 查看: 265

以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为例

[uboot] uboot流程系列: [project X] tiny210(s5pv210)上电启动流程(BL0-BL2) [project X] tiny210(s5pv210)从存储设备加载代码到DDR [uboot] (第一章)uboot流程——概述 [uboot] (第二章)uboot流程——uboot-spl编译流程 [uboot] (第三章)uboot流程——uboot-spl代码流程 [uboot] (第四章)uboot流程——uboot编译流程 [uboot] (番外篇)global_data介绍 [uboot] (番外篇)uboot relocation介绍

建议先看《[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)》,根据例子了解一下上电之后的BL0\BL1\BL2阶段,以及各个阶段的运行位置,功能。 建议可以和《[uboot] (番外篇)global_data介绍》和《[uboot] (番外篇)uboot relocation介绍》结合起来看。

=================================================================================

一、uboot说明 1、uboot要做的事情

CPU初始刚上电的状态。需要小心的设置好很多状态,包括cpu状态、中断状态、MMU状态等等。其次,就是要根据硬件资源进行板级的初始化,代码重定向等等。最后,就是进入命令行状态,等待处理命令。 在armv7架构的uboot,主要需要做如下事情

arch级的初始化

关闭中断,设置svc模式 禁用MMU、TLB 关键寄存器的设置,包括时钟、看门狗的寄存器

板级的初始化

堆栈环境的设置 代码重定向之前的板级初始化,包括串口、定时器、环境变量、I2C\SPI等等的初始化 进行代码重定向 代码重定向之后的板级初始化,包括板级代码中定义的初始化操作、emmc、nand flash、网络、中断等等的初始化。 进入命令行状态,等待终端输入命令以及对命令进行处理

上述工作,也就是uboot流程的核心。

2、疑问

在前面的文章中虽然已经说明了,在spl的阶段中已经对arch级进行了初始化了,为什么uboot里面还要对arch再初始化一遍? 回答:spl对于启动uboot来说并不是必须的,在某些情况下,上电之后uboot可能在ROM上或者flash上开始执行而并没有使用spl。这些都是取决于平台的启动机制。因此uboot并不会考虑spl是否已经对arch进行了初始化操作,uboot会完整的做一遍初始化动作,以保证cpu处于所要求的状态下。

和spl在启动过程的差异在哪里? 回答:以tiny210而言,前期arch的初始化流程基本上是一致的,出现本质区别的是在board_init_f开始的。

spl的board_init_f是由board自己实现相应的功能,例如tiny210则是在board/samsung/tiny210/board.c中。其主要实现了复制uboot到ddr中,并且跳转到uboot的对应位置上。一般spl在这里就可以完成自己的工作了。 uboot的board_init_f是在common下实现的,其主要实现uboot relocate前的板级初始化以及relocate的区域规划,其还需要往下走其他初始化流程。 3、代码入口

project-X/u-boot/arch/arm/cpu/u-boot.lds

ENTRY(_start)

所以uboot-spl的代码入口函数是_start 对应于路径project-X/u-boot/arch/arm/lib/vector.S的_start,后续就是从这个函数开始分析。

二、代码整体流程 1、首先看一下主枝干的流程(包含了arch级的初始化)

在arch级初始化是和spl完全一致的 _start———–>reset————–>关闭中断 ………………………………| ………………………………———->cpu_init_cp15———–>关闭MMU,TLB ………………………………| ………………………………———->cpu_init_crit————->lowlevel_init————->关键寄存器的配置和初始化 ………………………………| ………………………………———->_main————–>进入板级初始化,具体看下面

2、板级初始化的流程

_main————–>board_init_f_alloc_reserve —————>堆栈、GD、early malloc空间的分配 …………| …………————->board_init_f_init_reserve —————>堆栈、GD、early malloc空间的初始化 …………| …………————->board_init_f —————>uboot relocate前的板级初始化以及relocate的区域规划 …………| …………————->relocate_code、relocate_vectors —————>进行uboot和异常中断向量表的重定向 …………| …………————->旧堆栈的清空 …………| …………————->board_init_r —————>uboot relocate后的板级初始化 …………| …………————->run_main_loop —————>进入命令行状态,等待终端输入命令以及对命令进行处理

三、arch级初始化代码分析 1、_start

上述已经说明了_start是整个uboot的入口,其代码如下: arch/arm/lib/vector.S

_start: #ifdef CONFIG_SYS_DV_NOR_BOOT_CFG .word CONFIG_SYS_DV_NOR_BOOT_CFG #endif b reset

会跳转到reset中。

2、reset

建议先参考



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有