>
首页 » 业界动态 » 基于Blackfin嵌入式系统的U-boot分析与调试

基于Blackfin嵌入式系统的U-boot分析与调试

作者:  时间:2007-09-28 09:25  来源:
引言

Boot loader代码是CPU芯片复位后进入操作系统之前执行的一段代码,主要用于完成硬件启动到操作系统启动的过渡,从而为操作系统提供基本的运行环境。Boot loader代码与CPU的内核结构、具体型号、应用系统配置及操作系统有关,其功能类似于PC机的BIOS程序。

Blackfin DSP是美国模拟器件公司与Intel联合开发的第4代DSP产品,是专为通信和互联网应用而设计的通用DSP芯片,适合处理互联网中的大量图像、声音、文本和数据流,以及汽车电子中的可视系统、宽带无线系统、消费类多媒体电子、数字摄像机、多通道VoIP、安全和监督、机顶盒和视频电话会议等。 本文对基于Blackfin 561微处理器构建的嵌入式开发板EZKIT561的U-boot第一和第二阶段的具体工作流程进行了分析,画出了各阶段的流程图,同时在U-boot第一阶段代码中加入LED指示程序来跟踪第一阶段的执行情况;而在U-boot第二阶段,则在代码的相应位置添加了向串口的打印信息,以跟踪U-boot在此阶段的执行情况。

1 Blackfin DSP简介

ADI公司推出的Blackfin处理器是专为嵌人式音频、视频、通信计算要求和功耗约束条件而设计的新型16~32位嵌入式处理器。Blackfin处理器由ADI和Intel联合开发,主要基于微信号架构(MSA)。它将一个32位RISC型指令集和双16位乘法累加(MAC)信号处理功能与通用型微控制器所具有的易用性组合在一起。这种处理特征使得Blackfin处理器在信号处理和控制处理应用中均能发挥上佳作用,因而在许多场合可免除增设单独异类处理器。

2 Boot loader及U-boot简介

2.1 Boot loader简介

Boot loader是用于初始化目标板硬件,可给嵌入式操作系统提供板上硬件资源信息,并进行装载、引导嵌人式操作系统运行的固件。最终,Boot Loader会把操作系统内核映像加载到RAM中,并将系统控制权传递给它。

大多数Boot Loader都包含两种不同的操作模式: "启动加载"模式和"下载模式"。

启动加载(Boot loading)模式也称"自主"(Autonomous)模式。即Boot Loader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行。这种模式是Boot Loader的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader显然必须工作在这种模式下。

在下载(Downloading)模式下,目标机上的Boot Loader将通过串口连接或网络连接等手段从主机(Host)下载内核映像和根文件系统映像等。从主机下载的文件通常先被Boot Loader保存到目标机的RAM,然后再被Boot Loader写到目标机的FLASH等固态存储设备中。Boot Loader的这种模式通常在第一次安装内核与根文件系统时使用;此外,以后的系统更新也会使用Boot Loader的这种模式。工作于这种模式下的Boot Loader通常都会向它的终端用户提供一个简单的命令行接口。

2.2 U-boot简介

U-Boot(全称U niversal Boot Loader)是遵循GPL条款的开放源码项目。其源码目录和编译形式与Linux内核相似。事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这一点从U-Boot源码的注释中就能体现。目前支持的目标操作系统有OpenBSD,NetBSD,FreeBSD,4.4BSD,Linux,SVR4,Esix,Solaris,Irix,VxWorks,LynxOS,pSOS,QNX,RTEMS,ARTOS;这是U-Boot中Universal的一层含义,另外一层含义是U-Boot除了支持PowerPC系列处理器外,还能支持Black-fin、MIPS、x86、ARM、NIOS、XScale等诸多处理器。上述两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌人式操作系统。U-Boot的主要目录结构如表1所列。

3 基于Blackfin DSP的U-boot运行分析

大多数Boot loader都分为stagel和stage2两大部分,U-boot也是如此。

3.1 U-boot的stagel阶段

依赖于CPU体系结构的代码(比如设备初始化代码等),通常都放在stage1中,该代码可用blackfin DSP汇编语言来实现,以达到短小精悍的目的。实际操作可在位于U-boot 1.1.3\cpu\bf533中的Start.S和Startl.S文件中实现,而且是从Start.S开始运行,此阶段的程序流程图如图1所示。


stage1的步骤以执行的先后主要包括硬件设备初始化、为加载Boot Loader的stage2准备RAM空间、拷贝Boot Loader的stage2到RAM空间、设置堆栈、跳转到stag2的C入口等。

3.2 U-boot的stage2阶段

通常stage2可用C语言来实现更复杂的功能,该代码具有更好的可读性和可移植性。Stage2实现的主要功能包括初始化本阶段要使用到的硬件设备,检测系统内存映射(memory map),将ker-nel映像和根文件系统映像从flash上读到RAM空间中,为内核设置启动参数,以及调用内核等。

而基于ADSP-BF561 EZKIT-Lite评估板的U-boot在该阶段的启动时,首先在第一阶段结束后,调用\U-boot 1.1.3\1ib_blackfin\board.c文件中的board_init_f()函数并执行。

然后再调用board.c文件中的board_init_r()函数并按先后顺序执行,其流程图如图2所示。

之后,再在board_init_r函数的最后调用\U-boot 1.1.3\common\main.c中的main_loop()函数。在执行过程中,系统会首先对自动启动内核进行倒计时,倒计时的时间由环境变量bootdelay的设定值决定。由于先前已经对串口进行了初始化,所以会在windows超级终端打印"ezkit:>",这样,mainloop()函数的执行将产生两条分支:一是等待u-boot的自启动命令执行,即执行bootcmd环境变量所设定的自动运行的命令(比如setenvbootcmd bootm 0x2000 0000),引导flash特定地址中的嵌入式操作系统;二是在u-boot的自启动命令执行前按下任意键,以进入u-boot的命令行。在此状态下可以查看和修改环境变量、下载更新U-boot和内核镜像文件、对flash进行擦写操作或通过命令启动操作系统(如bootm 0x2000 0000);

4 基于评估板的U-boot启动跟踪调试

4.1 第一阶段跟踪调试

由于U-boot的启动过程分为两个阶段,第一阶段在串口初始化之前无法获得字符串提示信息。这样,第一阶段的运行过程似乎就没办法掌握.但是,EZKIT561开发板提供16个用户可编程的LED,所以就可以通过这16个LED来了解u-boot在第一阶段的具体执行过程,即在U-boot第一阶段的几个不同的代码处添加LED指示程序。

ADSP-BF561有48个双向通用可编程I/O引脚。这些可编程引脚具有实现SPI接口的特殊功能。每一个可编程引脚均能通过操作一系列的标志控制寄存器、标志状态寄存器和标志中断寄存器来进行独立控制。由于一共有48个通用可编程I/O引脚,所以可将以上寄存器分成三组,每组可对16个通用可编程I/O引脚进行操作。

通过参考EZKIT56 1原理图可知,LED 5~20与PF 32~47 pins相连,可以跟踪堆栈配置。设计时可使用以下寄存器进行控制。

(1)FIO2_DIR寄存器

这是一个16位寄存器,若将其中的某一位设置为1,那么相应的PF引脚就可作为输出;反之,则为输入。其相关设置代码如下:

(2)FIO2_FLAG_D

这也是一个16位寄存器,对其写操作时,可指定相应的PF引脚状态;而当进行读操作时,则返回相应的PF引脚的值。它的每一位都控制着一个LED灯。其相关设置代码如下:

w [p0]=r0;
ssync;

添加的跟踪堆栈配置程序的流程图如图3所示。修改代码后即可在U-boot文件夹路径下依次输入以下命令:make clean、make mrproper、make ezkit561 config和make,然后再利用bfin-u.clinux-objcopy将生成的U-boot.bin转换为U-boot.hex,最后通过VDSP++开发环境中TOOL下的flashprogrammer将u-boot.hex烧写到flash中,同时进行复位操作以观察LED的变化。

本设计希望在堆栈配置前使LED 13、LED 14亮,其它LED灭,持续时间为1 s;而在堆栈分配之后使LED 11、LED 12亮,其它LED灭,持续时间为1 s。其实际的观察结果是,在复位之后,LED 13、LED 14持续亮1 s,接着LED 11、LED 12持续亮1秒,可见其完全达到了预期目标。

4.2 第二阶段跟踪调试

第二阶段是在进人C函数之后,就进行串口的初始化。之后,便可通过向串口打印信息来实时跟踪所启动的执行流程,以了解程序目前执行的具体部分或运行到哪一个阶段出现了问题。

下面以打印串口初始化完成信息为例。首先在U-boot第二阶段找到串口初始化的代码,即U-boot/lib-blackfin/board.c文件的serial.init()函数,然后在此函数之后添加printf("serial initializationis ok!\n")以实现打印。其程序代码如下:

修改代码后的编译和下载步骤如前所示,调试时使用的串行通信软件是windows自带的"超级终端"程序,所选择的"每秒位数" (即波特率)为57600,传输文件使用的通信协议为Kermit协议。配置好超级终端后,按下开发板上的复位键.终端便可显示出系统启动过程的相关信息。系统复位后,第一行显示的是"serial initializa-tion is ok!"。这便是自行添加的打印语句,其主要功能是提示串口初始化已完成。

由于第二阶段可以通过串口打印信息,且在相关的每一阶段均可添加相关的printf句来实现打印提示信息,所以跟踪及调试都比较容易。

5 结束语

通过分析基于Blackfin 561微处理器构建的嵌入式开发板EZKIT561的U-boot代码,以期对Boot Loader的启动过程有一个比较深入的理解,文章还通过一些调试方法对其运行阶段进行跟踪,以便对将来在开发板上的ucLinux移植和进一步的视频编解码工作进行准备。

相关推荐

ADI沉痛缅怀首席执行官Jerry Fishman的突然离世

ADI  模拟  2013-04-02

ADI新数字模拟前端助力医疗影像领域

ADI  X 射线  ADAS  2012-12-11

ADI推出高速模数转换器简化FPGA应用设计

ADI  FPGA  2012-10-21

嵌入式视觉联盟会员已20家,并增加了白金会员

嵌入式视觉联盟  ADI  TI  2012-05-11

ADI 公司宣布收购 MULTIGIG

ADI  数据转换  2012-04-18

ADI公司表彰出色战略供应商

ADI  信号处理  2012-04-16
在线研讨会
焦点