分享

嵌入式系统中U-Boot基本特点及其移植方法

 Amor 2008-02-23

引 言
Bootloader(引导装载器)是用于初始化目标板硬件,
给嵌入式操作系统提供板上硬件资源信息,并进一步装
载、引导嵌入式操作系统运行的固件。在嵌入式系统开
发过程中,很多情况都会涉及底层Bootloader的移植问
题, 即使在有些已有Bootloader的参考开发板上也存在
这种可能。概括来说, 如下情况会考虑进行Bootloader
的移植工作。
① 在自主设计的目标板上,用于引导嵌入式操作系
统及其应用。
② 在厂家未提供Bootloader源码的参考板上,遇有
如下情形之一:
a.在实际应用中需要添加或修改一些功能;
b.为了给自行设计主板移植BOotlOade r提供参考,先在参考板上进行移植以积累经验。
    另外,从嵌入式系统实际开发角度讲, 嵌入式操作系统的引导、配置甚至应用程序的运行状况都和bootloader有一定的关联,可以说,掌握Bootloader移植是顺利进行嵌入式系统开发的重要利器。
    与常见的嵌入式操作系统板级支持包B S P相比,Boot loader与底层硬件更为相关, 即每个不同配置的目标板基本都有不同的Bootloader。因为Bootloader往往更依据量体裁衣、定身制作的原则, 以满足要求的最小化代码存放在启动ROM 或Flash中。
    虽然,自行编写Bootloader未尝不可,但从可利用的资源和实际项目开发考虑,采用移植已有的Bootloader源码来解决这一问题更符合大多数项目的开发要求。

1 U-Boot简介
    U—Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目,从FADSROM、8xxROM 、PPCBOOT逐步发展演化而来,其源码目录、编译形式与Linux内核很相似。事实上,不少U—Boot源码就是相应Linux内核源程序的简化, 尤其是一些设备的驱动程序, 从U-Boot源码的注释中能体现这一点。但是U-Boot不仅仅支持嵌入式Linux系统的引导, 当前,它还支持NetBSD。VxWorks、QNX、RTEMS、ARTOS、LynxOS嵌入式操作系统。其目前要支持的目标操作系统包括0P enB S D 、NetBSD、FreeBSD、4 4BSD 、Linux、SVR4、Esix、Solaris、Irix、SCO、Dell、NCR、VxWorks、LynxOS、pSOS、QNX、RTEMS和ARTOS。这是u-Boot中Universal的一层含义。另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM 、Nios、XScale等诸多常用系列的处理器。这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,U-Boot对PowerPC系列处理器支持最为丰富, 对Linux的支持最完善。其它系列的处理器和操作系统基本是在2002年1 1月PPCBOOT改名为U-Boot 后逐步扩充的。从PPCBOOT向U—Boot的顺利过渡,很大程度上归功于U-Boot的维护人,德国DENX软件工程中心的Wolfgang Denk(以下简称w.D)本人精湛的专业水平和持着不懈的努力。当前,u-BOOt项目在他的领军下,众多有志于开放源码Boot loader移植工作的嵌入式开发人员, 正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入, 以支持更多嵌入式操作系统的装载与引导。

2 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镜像文件的工具。

3 U-Boot支持的主要功能
U—Boot可支持的主要功能如表1所列。

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

4 U-Boot移植过程
① 获得发布的最新版本U—Boot源码,与Linux内核源码类似,也是bzip2的压缩格式。可从U.Boot的官方网站http://sourceforge.net/projects/U-Boot上获得。

② 阅读相关文档,主要是U.Boot源码根目录下的README文档和U—Boot官方网站的DULG(The DENX U—
Boot and Linux Guide)文档(http:llwww.denx.de/twiki/bin/view/DULG/Manua1)。尤其是DULG文档,对如何安装建立交叉开发环境和解决U-Boot移植中常见问题,都一一给出了详尽说明。

③ 订阅U—Boot用户邮件列表(http://lists.sourceforge.net/lists/listinfo/u—boot—users)。当在移植U-Boot过程中遇有问题,在参考相关文档和搜索u.Boot.U ser邮件档案库(httP://SOurceforge.net/mailarchive/forum.php? forum — id=l 2898)仍不能解决时,第一时间提交所遇到的问题, 众多U-Boot开发人员会迅速排查问题,而且W.D本人很有可能会直接参与指导。

④ 在建立的开发环境下进行移植工作。绝大多数的开发环境是交叉开发环境。在这方面,DENX和MontaVi sta均提供了完整的开发工具集。

⑤ 在目标板与开发主机间接入硬件调试器。这是进行U-Boot移植应当具备且非常关键的调试工具。因为在整个U—Boot的移植工作中,尤其是初始阶段,硬件调试器是我们了解目标板真实运行状态的唯一途径。在这方面, W .D 本人和众多嵌入式开发人员倾向于使用BDI2000。一方面,其价格不如ICE调试器昂贵,同时其可靠性高,功能强大, 完全能胜任移植和调试U—Boot。另外, 网上也有不少关于BDI2000调试方面的参考文档。

⑥ 如果在参考开发板上移植U—Boot,可能需要移除目标板上已有的Boot loader。可以根据板上Boot loader的说明文档,先着手解决在移除当前Boot loader的情况下,如何进行恢复,以便今后在需要场合能重新装入原先的Boot loader。

5 U-Boot移植方法
当前,对于U.Boot的移植方法,大致分为两种。一种是先用BDI2000创建目标板初始运行环境,将U-Boot镜像
文件u-boot.bin下载到目标板RAM中的指定位置,然后,用BDI2000进行跟踪调试。其好处是, 不用将Uboot镜
像文件烧写到Fla sh中去。但弊端在于, 对移植开发人员的移植调试技能要求较高,BDI2000的配置文件较为复杂。另外一种方法是用BDI2000先将U—Boot镜像文件烧写到Flash中去,然后利用GDB和BDI2000进行调试。这种方法所用的BDI2000配置文件较为简单,调试过程与U-Boot移植后运行过程相吻合。即U—Boot先从Flash中运行,再重载至RAM 中相应位置,并从那里正式投入运行。唯一感到有些麻烦的就是需要不断烧写Flash。但考虑到Flash常规擦写次数基本为l 0万次左右,作为移植U-Boot, 不会占用太多的次数,应该不会为Flash烧写有什么担忧。同时,w.D本人也极力推荐使用后一种方法。笔者建议, 除非是U-BOot移植资深人士或有强有力的技术支
持, 建议采用第二种移植方法。
 

6 U-Boot移植主要修改的文件
从移植U—Boot最小要求,U.Boot能正常启动的角度
出发, 主要考虑修改如下文件。
① <目标板>.h头文件,如include/con gs/RPxlite.h。可以是U-Boot源码中已有的目标板头文件,也可以是新命名的配置头文件;大多数的寄存器参数都是在这一文
件中设置完成的。
② <目标板>.C文件,如board/RPXlite/RPXlite.C。它是SDRAM 的驱动程序,主要完成SDRAM 的UPM 表设
置, 上电初始化。
③ Flash的驱动程序,如board/RPXlite/flash.C或
common/cfi — flash.C。可在参考已有Flash驱动的基础上, 结合目标板Flash数据手册,进行适当修改;
④ 串口驱动,如修改cpu/mpc8xx/seria1.c串口收发器芯片使能部分。

7 U-Boot移植要点
① BDI2000的配置文件。如果采用第二种移植方法,即先烧入Flash的方法,配置项只需很少几个,就可以 进行U-Boot的烧写与调试了。对PPC 8xx系列的主板,可参考DULG文档中TQM8xx的配置文件进行相应的修改。下面,笔者以美国Embedded Planet公司的RPXlite Dw 板为例,给出在嵌入式Linux交叉开发环境下的BDI2000参考配置文件以作参考。
;bdiGDB configurationfileforRPXliteDW orLITE DW
[INIT】
;init core register
WSPR       149       0x2002000F       ;DER :set debug enable
                                                               ;register
WSPR       149       0x2002000F       ;DER :enable SYSIE for BDI
                                                               ;Flash Program
WSPR       638       oxFA200000       ;IMMR :internal memory at
                                                               ;0xA200000
WM             32         oxFA200004         0xFFFFFF89 ;SYPCR
[TARGET]
CPUCLOCK                4000000         ;the CPU clock rate after processing
                                                                ;the init list
BDIMODE          AGENT :the BDI WOrking mode
(LOADONLY | AGENT)
BREAKMODE   HARD                          ;SOFT or HARD,HARD uses PPC
                                                                 ;hardware breakpoints
[HOST]
IP                                        l72.16.115.6
FILE                                   ulmage.litedw
FORMAT BIN
LOAD M ANUAL                               ;load code MANUAL or AUTO after rese
DEBUGPORT 2001
START 0x0100
[FLASH]
CHIPTYPE    AM29BX8                   ;Flash type(AM29F l AM29BX8
                                                            ;AM29BX16 f I28BX8 f 128BX16)
CHIPSIZE     0x400000                   ;The size of one flash chip in bytes
BUSWIDTH    32                              ;The width of the flash memory bus
                                                            ;inbits(8f 16f 32)
WORKSPACE   0xFA202000         ;RAM buffer for fast flash
                                                             ;programming
FILE           u-boot.bin                    ;The file to program
FORMAT      BIN     0x00000000
ERASE      0x00000000            BLOCK
ERASE      OxO0008000           BLOCK
ERASE      0x00010000            BL0CK
ERASE      0x000l8000             BLOCK
[REGS]
DMM 1      OxFA200000
FILE           reg823.def
② U-Boot移植参考板,这是进行U.Boot移植首先要明确的。可以根据目标板上CPU、Flash、SDRAM的情况, 以尽可能相一致为原则,先找出一个与所移植目标板为同一个或同一系列处理器的u.Boot支持板为移植参考板。如RPXlite DW 板可选择U.Boot源码中RPXlite板作为U-Boot移植参考板。对U.Boot移植新手, 建议依照循序渐进的原则, 目标板文件名暂时先用移植参考板的名称,在逐步熟悉U-BOOt移植基础上, 再考虑给目标板重新命名。在实际移植过程中,可用Linux命令查找移植参考板的特定代码,如grep.r RPXlite./可确定出在U-Boot中与RPXlite板有关的代码,依此对照目标板实际进行屏蔽或修改。同时, 应不局限于移植参考板中的代码, 要广泛借鉴U.BOOt中已有的代码, 更好地实现一些具体的功能。

③ U-Boot烧写地址。不同目标板,对U-Boot在Flash中存放地址的要求不尽相同。事实上,这是由处理器中断复位向量来决定的, 与主板硬件相关。对MPC8xx主板来讲,就是由硬件配置字(HRCW)决定的。也就是说,U-Boot烧写具体位置是由硬件决定的, 而不是程序设计来选择的。程序中相应U-Boot起始地址必须与硬件所确定的硬件复位向量相吻合,如RPXlite DW 板的中断复位向量设置为0x00000100。因此,U.Boot的BIN镜像文件必须烧写到Flash的起始位置。事实上, 大多数的PPC系列的处理器中断复位向量是0x00000100和0xfff00100。这也是一般所说的高位启动和低位启动的Bootloader所在位置。可通过修改u-BOot源码<目标板>.h头文件中CFG MONITOR BASE和board/<目标板>/config.mk中的TEX T — BASE的设置来与硬件配置相对应。

④ CPU寄存器参数设置。根据处理器系列、类型不同, 寄存器名称与作用有一定差别, 必须根据目标板的实际进行合理配置。一个较为可行和有效的方法是, 借鉴参考移植板的配置,再根据目标板实际,进行合理修改。这是一个较费功夫和考验耐力的过程, 需要仔细对照处理器各寄存器定义、参考设置、目标板实际作出选择并不断测试。MPC 8XX处理器较为关键的寄存器设置为SIUMCR、PLPRCR、SCCR、BRx和ORx。

⑤ 串口调试。能从串口输出信息,即使是乱码,也可以说U.Boot移植取得了实质性突破。依据笔者调试经历, 串口是否有输出,除了与串口驱动相关外,还与Flash相关的寄存器设置有关。因为U-Boot是从Flash中被引导启动的, 如果Flash设置不正确,U.BOot代码读取和执行就会出现一些问题。因此,还需要就Flash的相关寄存器设置进行一些参数调试。同时, 要注意串口收发芯片相关引脚工作波形。依据笔者调试情况,如果串口无输出或出现乱码, 一种可能就是该芯片损坏或工作不正常。

⑥ 与启动Flash相关的寄存器BR0、OR0的参数设置,应根据目标板Flash的数据手册与BR0和OR0的相关位含义进行合理设置。这不仅关系到Flash能否正常工作, 而且与串口调试有直接的关联。

⑦ 关于CPLD电路。目标板上是否有CPLD电路丝毫不会影响U-B 00t的移植与嵌入式操作系统的正常运行。事实上,CPLD电路是一个集中将板上电路的一些逻辑关系可编程设置的一种实现方法。其本身所起的作用就是实现一些目标板所需的脉冲信号和电路逻辑, 其功能完全可以用一些逻辑电路与CPU口线来实现。

⑧ SDRAM的驱动。串口能输出以后,U.Boot移植是否顺利基本取决于SDRAM 的驱动是否正确。与串口调试相比,这部分工作更为重要,难度更大。MPC8xx目标板SDRAM 驱动涉及三部分。一是相关寄存器的设置;二是UPM 表;三是SDRAM 上电初始化过程。任何一部分有问题,都会影响U-BOot、嵌入式操作系统甚至应用程序的稳定、可靠运行。所以说,SDRAM 的驱动不仅关系到U-Boot本身能否正常运行, 而且还与后续部分相关, 是相当关键的部分。

⑨ 补充功能的添加。在获得一个能工作的U-BOot后, 就可以根据目标板和实际开发需要, 添加一些其它功能支持, 如以太网、L CD 、NVRAM 等。与串口和SDRAM 调试相比,在已有基础之上,添加这些功能还是较为容易的。大多只是在参考现有源码的基础上, 进行一些修改和配置。另外, 如果是在自主设计的主板上移植U-Boot, 那
么除了考虑上述软件因素以外, 还需要排查目标板硬件可能存在的问题, 如原理设计、PCB布线、元件好坏。
在移植过程中, 敏锐判断出故障态是硬件还是软件问题, 往往是关系到项目进度甚至移植成败的关键, 相应
难度会增加许多。

结语
        完成一个目标板的移植工作后, 可考虑将移植结果以补丁的形式发送到U-Boot用户邮件列表,尤其是一些参考板的移植结果。这是使用GPL代码并遵循GPL条款的体现。可在阅读README相关补丁说明的基础上,添加适当的注释,将自己列入光荣榜(CREDITS)。如果愿意承担所移植板的后续更新工作, 可以考虑加入维护人员(MAINTAINERS)开发队伍行列。
        在实际的U-Boot移植中,无法避免地会遇到一些难以预料的问题, 甚至出现倒退, 尤其是U.BOOt移植新手, 更会平添诸多难度。但笔者相信, 在逐步熟悉U.BOOt的移植方法和过程中,随着自身经验的不断积累,加之有众多热衷于开放源码人士的鼎立相助, 坚冰终会消融。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多