嵌入式Linux专题(三)——嵌入式Linux常用BootLoader——U-Boot介绍

2019-07-12 15:22发布

一、U-Boot简介

U-Boot,全称 Universal Boot Loader,是遵循GPL条款的从FADSROM、8xxROM、PPCBOOT逐步发展演化而来的开放源码项目。
在操作系统方面,U-Boot不仅支持嵌入式Linux系统的引导,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android嵌入式操作系统。目前支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS, android。
在CPU架构方面,U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、 x86、ARM、NIOS、XScale等诸多常用系列的处理器。
U-Boot项目的开发目标是支持尽可能多的嵌入式处理器和嵌入式操作系统。

二、U-Boot主要目录结构

目录 说明 board 目标板相关文件,主要包含SDRAM、FLASH驱动 common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测 cpu 与处理器相关的文件。如mpc8xx子目录下含串口、网口、LCD驱动及中断初始化等文件 driver 通用设备驱动,如CFI FLASH驱动(目前对INTEL FLASH支持较好) doc U-Boot的说明文档 examples 可在U-Boot下运行的示例程序;如hello_world.c,timer.c include U-Boot头文件;尤其configs子目录下与目标板相关的配置头文件是移植过程中经常要修改的文件 lib_xxx 处理器体系相关的文件,如lib_ppc, lib_arm目录分别包含与PowerPC、ARM体系结构相关的文件 net 与网络功能相关的文件目录,如bootp,nfs,tftp post 上电自检文件目录。尚有待于进一步完善 rtc RTC驱动程序 tools 用于创建U-Boot S-RECORD和BIN镜像文件的工具

三、U-Boot的特性

Uboot的特性:
  1. 开放源码;
  2. 支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android;
  3. 支持多个处理器系列,如PowerPC、ARM、x86、MIPS;
  4. 较高的可靠性和稳定性;
  5. 高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等;
  6. 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;
  7. 较为丰富的开发调试文档与强大的网络技术支持;

四、主要功能

U-Boot支持的主要功能:
  1. 系统引导支持NFS挂载、RAMDISK(压缩或非压缩)形式的根文件系统;
  2. 基本辅助功能强大的操作系统接口功能;可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤以Linux支持最为强劲;支持目标板环境参数多种存储方式,如FLASH、NVRAM、EEPROM;
  3. CRC32校验可校验FLASH中内核、RAMDISK镜像文件是否完好;
  4. 设备驱动串口、SDRAM、FLASH、以太网、LCD、NVRAM、EEPROM、键盘、USB、PCMCIA、PCI、RTC等驱动支持;
  5. 上电自检功能SDRAM、FLASH大小自动检测;SDRAM故障检测;CPU型号;
  6. 特殊功能XIP内核引导;

五、工作模式

U-Boot的工作模式有启动加载模式和下载模式。

1、启动加载模式

启动加载模式是Bootloader的正常工作模式,嵌入式产品发布时,Bootloader必须工作在这种模式下,Bootloader将嵌入式操作系统从FLASH中加载到SDRAM中运行,整个过程是自动的。

2、下载模式

下载模式就是Bootloader通过某些通信手段将内核映像或根文件系统映像等从PC机中下载到目标板的FLASH中。用户可以利用Bootloader提供的一些命令接口来完成自己想要的操作。开发人员可以使用各种命令,通过串口连接或网络连接等通信手段从主机(Host)下载文件(比如内核映像、文件系统映像),将它们直接放在内存运行或是烧入Flash类固态存储设备中。
板子与主机间传输文件时,可以使用串口的xmodem/ymodem/zmodem协议,还可以使用网络通过tftp、nfs协议来传输,以及USB下载等方法。
一般来说,嵌入式开发人员采用下载模式进行开发嵌入式系统。通常采用交叉网线将PC与目标开发板连接,通过TFTP服务器下载内核,用NFS服务器挂载文件系统。

六、移植前的准备

  1. 首先读读uboot自带的readme文件,了解了一个大概。
  2. 看看common.h,这个文件定义了一些基本的东西,并包含了一些必要的头文件。再看看flash.h,这个文件里面定义了 flash_info_t为一个struct。包含了flash的一些属性定义。并且定义了所有的flash的属性,其中,AMD的有:AMD_ID_LV320B,定义为“#define AMD_ID_LV320B 0x22F922F9”。
  3. 对于“./borad/at91rm9200dk/flash.c”的修改,有以下的方面:“void flash_identification(flash_info_t *info)”这个函数的目的是确认flash的型号。注意的是,这个函数里面有一些宏定义,直接读写了flash并获得ID号。
  4. 修改:”./board/at91rm9200dk/config.mk”为TEXT_BASE=0x21f80000 为TEXT_BASE=0x21f00000 (当然,你应该根据自己的板子来修改,和一级boot的定义的一致即可)。
  5. 再修改”./include/configs/at91rm9200dk.h”为修改flash和SDRAM的大小。
  6. 另外一个要修改的文件是:
    ./borad/at91rm9200dk/flash.c。这个文件修改的部分比较的多。
    a. 首先是OrgDef的定义,加上目前的flash。
    b. 接下来,修改”#define FLASH_BANK_SIZE 0x200000”为自己flash的 容量
    c. 在修改函数flash_identification(flash_info_t * info)里面的打印信息,这部分将在u-boot启动的时候显示。
    d. 然后修改函数flash_init(void)里面对一些变量的赋值。
    e. 最后修改的是函数flash_print_info(flash_info_t * info)里面实际打印的函数信息。
    f. 还有一个函数需要修改,就是:“flash_erase”,这个函数要检测先前知道的flash类型是否匹配,否则,直接就返回了。把这里给注释掉。
  7. 接下来看看SDRAM的修改。这个里面对于“SIZE”的定义都是基于字节计算的。只要修改”./include/configs/at91rm9200dk.h”里面的“#define PHYS_SDRAM_SIZE 0X200000”就可以了。注意,SIZE是以字节为单位的。
  8. 还有一个地方要注意就是按照目前的设定,一级boot把u_boot加载到了SDRAM的空间为:21F00000 -> 21F16B10,这恰好是SDRAM的高端部分。另外,BSS为21F1AE34。
  9. 编译后,可以写入flash了。
    a. 压缩这个u-boot.bin “gzip –c u-boot.bin > u-boot.gz”
    b. 接着把boot.bin和u-boot.gz烧到flash里面去。
    你可能对一下文章感兴趣:
    嵌入式Linux专题(一)——嵌入式Linux系统构成及启动流程
    嵌入式Linux专题(二)——嵌入式Linux系统启动流程详述