当前位置:
文档之家› 第五讲 TI嵌入式处理器的启动及uBOOT分析
第五讲 TI嵌入式处理器的启动及uBOOT分析
2012/11/16
美国德州仪器
15
基于Beagle Board嵌入式处理器的系统开发
4、头文件
头文件位于源码树下的include中,其中各种主板的配置文 件位于include/configs文件夹中,比如omap730主板的配置 文件为include/configs/omap730.h。 目录include/asm-***是一些比较底层的头文件,编译时会 根据不同的配置与include/configs/asm建立一个符号链接。
UBL函数入口点是flash_utils目录下的 Common/arch/arm926ejs/start.S。 程序首先设置了堆栈 指针寄存器,然后将 main_entry地址赋值给 r0寄存器,也就是 main的入口点赋值给 r0寄存器,然后将pc 指针指向main入口点, 程序跳到main函数执 行。
9
基于Beagle Board嵌入式处理器的系统开发
二、U-Boot源码框架内容分析
uBoot源码各个目录和代码结构。 uBoot的启动过程分析。 uBoot如何实现自定义的命令。 uBoot如何将参数传递给内核进行解析。
2012/11/16
美国德州仪器
10
基于Beagle Board嵌入式处理器的系统开发
第二类命令是“有去无回”的命令,类似于bootm 0x8000000或者go 0x8000000,这类指令最终将去启动 内核,以此系统将不再返回。
2012/11/16
美国德州仪器
25
基于Beagle Board嵌入式处理器的系统开发
网络传输代码位于目录net下面,arp.c,bootp.c,eth.c, tftp.c等都在这里,BOOTP,TFTP,以太网初始化等功能的实 现也是由这些代码完成的。
2012/11/16 美国德州仪器 22
基于Beagle Board嵌入式处理器的系统开发
在该无限循环中,首先调用readline(CFG_PROMPT)从终端获取相应 的命令。然后判断命令长度,若终端输入的仅仅是一个回车的操作符时, u-boot将把其解释成重复上次操作的命令,因此置位相应的flag位 “flag|=CMD_FLAG_REPEAT;”
3、与CPU相关的代码
cpu相关的代码位于cpu目录下,在该目录下,列出 了当前版本的u-boot所能支持的所有cpu类型。和目 标板相关的代码类似,该目录的每个子目录都对应 一种具体的cpu类型。
2012/11/16
美国德州仪器
13
基于Beagle Board嵌入式处理器的系统开发
uboot所支持的cpu类型
2012/11/16 美国德州仪器 6
基于Beagle Board嵌入式处理器的系统开发
根据不同的boot模式,执行将uboot镜像从不同存储设备拷 贝到内存的操作,此处通过NANDBOOT_copy来简单分析。
2012/11/16
美国德州仪器
7
基于Beagle Board嵌入式处理器的系统开发
2012/11/16 美国德州仪器 24
基于Beagle Board嵌入式处理器的系统开发
调用run_command()去解析执行相应的命令。对于 U-Boot而言总共有两类命令,一类命令执行后能够返 回的,对于此类命令,该处还将判断返回值,若返回 值不对,证明这是一条无效的命令,把全局变量 lastcommand置为空,因此下次若想再以回车来执行无 效命令时,就不会再去执行一遍无效命令
NANDBOOT_copy函数最后将uboot的入口点赋值给 gEntryPoint,该变量是在main函数上定义的全局变量,该 变量在main函数最后当做一个函数指针来执行,也就是跳 转到DDR的uboot起始地址处执行,至此,UBL工作完毕, 控制权交给了uboot。
2012/11/16
美国德州仪器
基于Beagle Board嵌入式处理器的系统开发
TI嵌入式处理器的启动以及 uBOOT分析
2012/11/16
美国德州仪器
1
基于Beagle Board嵌入式处理器的系统开发
一、UBL源码结构分析
二
2012/11/16
美国德州仪器
2012/11/16
美国德州仪器
5
基于Beagle Board嵌入式处理器的系统开发
LOCAL_boot中,首先判断板子启动模式,也就是板子上 的拨码开关的设置,DEVICE_bootMode通过读取SYSTEM 控制寄存器来获取拨码开关的信息。 执行DEVICE_init执行板级初始化,包括电源、时钟、 DDR、EMIF、UART、I2C、TIMER等。
环境变量文件:包括environment.c和所有以env_打头的文件, 其中environment.c是环境变量相关的入口文件。 C函数入口文件main.c:当cpu和板级初始化后,将调用 main_loop()进入一个无限循环,等待界面发出命令或者直 接执行虚设的某些命令 命令解析文件:命令解析文件包含command.c和所有以cmd_ 打头的文件,其中command.c是所有以cmd_打头的命令文 件的入口文件。
2012/11/16
美国德州仪器
26
基于Beagle Board嵌入式处理器的系统开发
三、U-Boot 启动流程简要分析
U-Boot 启动内核的过程可以分为两个阶段,两个阶段功能如下:
第一阶段的功能 Ø 硬件设备初始化 Ø 加载U-Boot第二阶段代码到RAM空间 Ø 设置栈 Ø 跳转到第二阶段代码入口 第二阶段的功能 Ø 初始化本阶段使用的硬件设备 Ø 检测系统内存映射 Ø 将内核从Flash读取到RAM中 Ø 为内核设置启动参数 Ø 调用内核 下面我们以DM365为例对启动过程进行说明:
2012/11/16 美国德州仪器 14
基于Beagle Board嵌入式处理器的系统开发
由上图可以看出,该U-boot版本已经支持多种系 列的cpu,可以看出u-boot是一种被广泛使用的 bootloader。 在具体cpu对应的目录中,一般包含以下文件: Config.mk,该文件主要包含一些编译选项,该 文件将被相同目录下的Makefile所引用。 Makefie,程序编译规则。 Start.S,启动代码,真正U-Boot映像的入口点。 其它一些cpu初始化代码。
2012/11/16
美国德州仪器
18
基于Beagle Board嵌入式处理器的系统开发
5、公共代码
该目录下的代码构成了uboot的基本框架,也是u-boot的精 髓所在,因为板级相关的代码和cpu相关的代码往往都是 由cpu厂商按u-boot的规则提供的,目的是推广目标板或芯 片,但这些公共的代码则是由Denx项目组成员开发和维护 的。其目的是提供一套不同目标板的共性,比如在引导时 与目标板的信息交互、环境变量的设置等,这样就可以省 去具体BSP包开发人员很多的工作量。而且U-Boot中这些 公共文件做的非常完善,应该能够满足大部分嵌入式系统 开发的要求,比如支持各式各样的命令,这些都是u-boot 非常突出的优点。
1、Uboot目录结构图:
• • • • • • • • • • • • • 与目标板相关的代码,对应board目录。 公共代码,对应于common目录。 与cpu相关的代码,对应于cpu目录。 磁盘驱动和磁盘分区相关的处理代码,对 应于disk目录。 说明文档,对应于doc目录。 关键的驱动程序,对应于drivers目录。 简单的应用历程,对应于example目录。 头文件,对应于include目录。 体系结构相关的代码,对应于lib_arm等目 录。 体系结构无关的代码,对应于lib_generic目 录。 网络传输代码,对应于net目录。 上电自检代码对应于post目录。 U-Boot常用工具,对应于tools目录。
2012/11/16
美国德州仪器
21
基于Beagle Board嵌入式处理器的系统开发
首先获取环境变量中有关bootdelay的定义。此参数说明了启动时预留的人工干预 时间,若在指定的时间内无人干预,那么U-Boot将执行默认的启动命令序列,即执 行环境变量中“bootcmd”中相关的设置。当然,若“bootcmd”没有定义时,系统 将打印提示符界面,等待用户输入具体的指令去干预系统的行为。 通过调用getenv(“bootcmd”)获取环境变量中“bootcmd”相关的设置,然后调用 run_command()去执行相应的启动命令序列。
2012/11/16 美国德州仪器 23
基于Beagle Board嵌入式处理器的系统开发
但并未改变全局变量lastcommand。当命令的长度不为0时,意味着用 户确实输入了相应的命令,因此将调用strcpy(lastcommad, console_buffer)把全局变量置位为当前的命令,以此实现了命令的更替。
2012/11/16
美国德州仪器
11
基于Beagle Board嵌入式处理器的系统开发
2、与目标板相关的代码
在U-Boot中,目标板相关的代码都位于board目录,在该目录下,列 出了当前版本的U-Boot所能支持的所有目标板。目前U-Boot支持大 多数比较常见的目标板,如Motorola的FADS板,TI的Omap系列等。 源码树中board目录下的每个文件夹对应一个目标板,比如 board/fads,board/omap730p2。在该版本(1.3.4)中共有250个文件夹, 说明支持250种常用的目标板。 在每个目标板对应的目录中,一般至少包含以下文件:
NANDBOOT_copy函数首先执行NAND初始化,然后从 Nand中读取页面信息,查找uboot开始位置,由magicNum 的检测可以看出,确定uboot的位置是通过maginNum来进 行的,最后将uboot拷贝到DDR中。