基于AT91RM9200的U-Boot启动分析和移植

  • 格式:pdf
  • 大小:274.14 KB
  • 文档页数:7

下载文档原格式

  / 7
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于AT91RM9200的U-Boot启动分析和移植

周庆松,史小军

东南大学电子科学与工程学院,南京 (210096)

E-mail:zhouqsong@

摘要:本文采用U-Boot构建嵌入式系统的引导加载程序,在对U-Boot的启动工作机理进行了简略分析后,针对基于AT91RM9200的目标板对U-Boot作了具体的修改和移植。应用结果表明,移植后的U-Boot在目标板上运行良好,可成功引导Linux内核。

关键词:U-Boot;移植;内核;AT91RM9200;嵌入式系统

1.引言

Bootloader代码是芯片复位后进入操作系统之前执行的一段代码,主要用于完成由硬件启动到操作系统启动的过渡[1]。一般,Bootloader基于特定硬件平台实现,不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置,因此需要修改源码来适合具体的嵌入式板级设备。

本文基于AT91RM9200的嵌入式目标板和U-Boot源码资源,分析了U-Boot的启动过程,介绍了U-Boot的移植方法和具体操作,最后讲述如何引导内核启动。

2.U-Boot简介

U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。他支持PowerPC、ARM、X86、MIPS等体系结构的上百种开发板;并且支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;具有较高的可靠性和稳定性,已经成为功能最多、灵活性最强并且开发最积极的开放源码Bootloader。作为通用的BootLoader,U-Boot 可以方便的移植到其他硬件平台上[2]。

U-Boot移植一般都是针对嵌入式目标板的硬件资源,主要是CPU、FLASH 和SDRAM等情况,以尽可能一致的原则,在U-Boot源码中,找到一个与目标板为同一个或同一系列处理器的目标板模板,在此基础上再针对具体开发板对程序作相应的修改,比如不同型号存储芯片的初始化等。这里笔者选用U-Boot 1.1.2版本,该版本支持基于at91rm9200的处理器配置,并提供了一个目标板模板,即U-Boot源码下的board/at91rm9200dk模板。

3.U-Boot启动分析

在具体移植之前,先来了解一下U-Boot启动过程。U-Boot启动过程可以分成3个阶段[3]。

(1) 在Flash中运行汇编程序,进行基本硬件初始化,并将Flash中的启动代码复制到SDRAM中,

同时创造环境准备运行C程序;

汇编程序start.s是U-Boot启动后执行的第一个程序,它位于cpu/at91rm9200中,链接脚本board/at91rm920dk/u-boot.lds决定U-Boot的入口函数位于该程序中。上电后,处理器首先执行该程序,具体工作流程如图1所示。

(2) 跳转到SDRAM中执行,对硬件进行初始化,并向显示终端输出启动信息;

start_armboot是U-Boot执行的第一个C语言函数,它位于lib_arm/board.c中,主要完成系统初始化工作,进入主循环,处理用户输入的命令。具体工作流程如图2所示。

全局变量结构体gd主要用来保存开发板信息、终端存在标志位、环境变量结构体起始地

址、环境变量校验标志位、frame buffer 基地址等。它是指向gd_t结构体的指针,gd_t结构体定义在include\asm-asm\global_data.h中。

硬件初始化中执行函数及各函数作用如下所示:

board_init:基本的板级相关配置,主要包括:设置处理器类型和启动参数地址;

interrupt_init:中断处理初始化,主要对TC控制器作相应设置。

env_init:设置环境变量,初始化环境;

init_baudrate:指定串口的波特率;

serial_init:串口初始化设置;选择通讯端口,设置串口波特率和工作方式;

console_init_f:设置gd->have_console=1,表示可以使用串口通讯控制台;

display_banner:在控制台输出 U-Boot信息;

dram_init:设置SDRAM的起始地址和大小;

display_dram_config:在控制台输出 SDRAM信息;

flash_init:设置FLASH芯片ID号、每个扇区起始地址等信息,将信息送到相应的结构体中;对FLASH中U-BOOT和环境变量存储扇区做软件写保护;

display_flash_config (size):在上位机终端输出FLASH大小。

图1 start.s函数执行流程图2 start_armboot函数执行流程

(3) 将内核映像和根文件系统映像从flash拷贝到SDRAM中,为内核设置启动参数,进入内

核的入口函数。

U-Boot作为Bootloader,具备多种引导内核启动的方式。常用bootm命令引导内核映像启动。使用bootm命令时,需要首先使用U-Boot自带的mkimage命令,将内核映像文件转换成U-Boot格式映像。即在内核的前头加上64byte的信息帧头,供建立tag之用。

bootm命令调用do_bootm函数。这个函数专门用来引导各种操作系统映像,可以支持引导Linux、vxWorks、QNX等操作系统。具体完成的工作有:

①保存内核引导地址;

②分析内核帧头;

③复制内核映像到SDRAM中;

④调用do_bootm_linux()函数。

do_bootm_linux()函数是专门引导Linux映像的函数,它还可以处理ramdisk文件系统的映像。具体完成的工作有:

①检查是否有根文件系统映像文件。我们这里只用bootm命令引导内核映像;

②将要传递给Linux的参数存放到标记列表中。内核将会从此处接收参数,完成参数传递;

③调用 Linux 内核。系统采用下列代码来进入内核函数:

theKernel = (void (*)(int, int))ntohl(hdr->ih_ep);

theKernel (0, bd->bi_arch_number, bd->bi_boot_params);

hdr是image_header_t类型的结构体,结构体定义位于include/image.h中;hdr->ih_ep指向内核的第一条指令地址。第一行代码将theKernel函数指向内核首地址处;第二行代码调用theKernel()函数,并通过r0、r1、r2将机器编号和参数链表物理地址传递给内核。

4.U-Boot修改与移植

4.1 嵌入式目标板介绍

本目标板以at91rm9200作为微处理器,板上存储系统包括NOR Flash、NAND Flash、SDRAM等;外围支持设备有JTAG、串口、USB接口、网络接口、SD Card 接口及显示接口等。目标板硬件架构如图3所示;主要硬件资源如表1所示。

图3 嵌入式目标板硬件架构图

表1 嵌入式目标板主要硬件资源

硬件型号描述

CPU At91rm9200

主频180MHz

NOR Flash SST39VF6401B8M Byte

NAND Flash K9F5608U0D 32M Byte

SDRAM HY57V56162064M Byte(2片)

网络芯片DM9161E