首页 » 技术文章 » U-Boot在MPC8265平台上的移植与分析

U-Boot在MPC8265平台上的移植与分析

作者:  时间:2010-08-05 18:55  来源:EDN

  系统处理器启动时,首先执行一个预定地址处的指令,通常这个位置是只读内存,存放系统初始化或引导程序,其功能是执行CPU初始化并配置其他硬件,然后copy操作系统到RAM中。

  在嵌入式Linux系统中,这些工作由Bootloacler(引导加载程序)完成,它是在嵌入式系统CPU加电复位和进入操作系统之前运行的代码,主要用于完成由硬件启动到操作系统启动的过渡,为操作系统提供基本的运行环境,如初始化CPU、堆栈、存储器系统等,其数值必须要符合用户的硬件配置,并且按特定顺序写入。嵌入式Linux系统的引导、配置甚至应用程序的运行都与Bootloader有关。

  Bootloader源代码与CPU的内核结构和嵌入式设备的板级配置有关,必须根据具体的系统设计要求进行移植。目前,开源社团已经发展了多种引导Linux内核的bootloader,比如PowerPC体系的U-BootminiBootARM体系的blobIntel x32体系的gurbopenBIOS等。

  以MPC8265微处理器和嵌入式Linux为背景,针对性地提出U-Boot的移植方法并进行分析研究,此方法可广泛用于基于MPC282xx系列处理器的嵌入式Linux系统应用开发中。

  1 U-Boot引导加载程序

  11 U-Boot简介

  U-Boot(Universal Boot Loader)是遵循GPL条款的开放源码项目。它支持多种嵌入式处理器,如ARMPowerPCMIPS等,也支持LinuxVxWorksQNXRTEMSARTOSLynxOS等多种嵌入式操作系统。这2个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。

  U-Boot支持的主要功能如下:1)系统引导:支持NFS挂载、从Flash中引导(压缩或非压缩)系统内核;RAMDISK(压缩或非压缩)形式的根文件系统;2)强大的操作系统接口功能,可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布:3)支持目标板环境参数多种存储方式(FlashNVRAMEEPROM)4)CRC32校验,可校验Flash中内核、RAMDISK镜像文件是否完好;5)设备驱动:串口、SDRAMFlash、以太网、LCDNVRAMEEP-ROM、键盘、USBPCMCIAPCIRTC等驱动支持;6)上电自检功能:SDRAMFlash自动检测,SDRAM故障检测,CPU型号。

  12 U-Boot主要目录结构

  U-Boot源代码采用高度模块化的编程方式,便于在不同的硬件平台上移植。U-Boot源代码包含多个目录,其中与移植相关的主要有:1)board:目标板相关文件,存放U-Boot支持的所有目标板的子目录。目标板上大部分资源的初始化代码就在这个文件夹中,如SDRAMFlash驱动;2)common:独立于处理器体系结构的通用代码,实现U-Boot各种公共命令的C文件;3)cpu:存放U-Boot支持的各类型CPU的相关文件,主要是初始化执行环境,比如mpc8260子目录包含串口、网口、LCD驱动及中断初始化等文件;4)drivers:通用设备的驱动程序,如CFI flash驱动;5)fsU-Boot支持的文件系统,如ext2cramfsfatfdosjffs2registeRFs等;6)net:与网络功能有关的文件,如B00TPTFTPRARPNFS相关代码;7)include:存放头文件。子目录includeconfigs下与目标板相关的配置头文件是移植过程中经常要修改的文件,可配置目标板的各项参数(如波特率、引导启动参数等)。还有对各种硬件平台支持的汇编文件、系统的配置文件和对文件系统支持的文件。U-Boot源代码可以从DENX的网站(http://wwwdenxde)下载,本文使用的版本是U-Boot-120

  2 U-Boot的运行流程

  U-Boot的运行流程如图1所示,目标板上电,启动MPC8265存储控制器CS0有效,选中FlashCPU地址线上输出硬件复位中断向量对应的地址,此时执行第1条指令,对应\cpumpc8260startS中的_start:开始执行。完成CPU本身基本的初始化后,初始化CPU内部寄存器,设置IMMRICTRL等。然后跳转到\cpumpc8260cpu_initc的函数cpu_init_f处,进行CPU的底层初始化,主要设置watchdogSIUMCR寄存器、PIT、锁相环、系统定时器、存储控制器和CPM等。从startS中跳转到\lib_ppeboardc的函数board_init_f处,实现目标板上的第1次初始化,完成SMC初始化和一些硬件测试,尤其是RAM初始化,并分配内存空间,保存板级信息,准备在RAM中重定向U-Boot代码。完成后,跳转到startS中的函数relocate_code()处,重定向代码,将U-Boot代码搬至SDRAM工作,开始在RAM中运行。然后跳转到boardc文件的函数board_init_r()处,执行板上的第2次初始化,主要完成一些数据结构、高端模块及系统设备的相关初始化。最后,U-Boot执行board_init_r()中的函数main_loop(),根据用户从控制台的输入,完成预先设定的工作。

  3 U-Boot移植

  U-Boot在设计时已考虑到支持使用不同CPU处理器的开发板,根据具体板级硬件配置的设计要求,修改与其相关的源代码,将U-Boot移植到新的开发板上。这里开发板TDS8265外围接口主要有100 M网口、RS232串口和JTAG调试接口等。

  31 修改U-Boot源代码

  为了简化移植工作,可在U-Boot源码中选择一个与开发板接近的参考平台,然后从移植U-Boot的要求和开发板能正常启动的角度出发进行修改。

  这里以在U-Bootboard目录下为TDS8265开发板新建文件夹TDS8265为例进行说明。

  1)修改头文件TDS8265h路径是U-BootincludeconfigsTDS8265h,是开发板的主要配置元件,配置CPU、系统时钟、SDRAMFlash以及其他开发板相关信息。设置CPU寄存器参数,需仔细对照处理器datasheet中各寄存器的定义、参考设置、目标板实际情况等做出选择并测试。MPC82xx系列处理器较为关键的寄存器有SIUMCRPS-DMRSCCRBRxORx等。设置CPU寄存器基地址IMMR时,注意与硬件配置相对应。如:

  设置与Flash控制相关的寄存器BR0OR0时,根据目标板所用Flash的数据手册与BR0OR0的相关位含义合理设置,这不仅关系到Flash能否正常工作,而且与串口调试直接相关。设置FlashSDRAM,包括基址、大小、环境变量的偏移,内存刷新周期。设置环境变量,网络接口,IP地址,MAC地址,用于网络下载和启动;设置Linux内核启动参数init=sbininit

  2)编写tds8265c文件 路径是U-Bootboardtds8265tds8265.ctds8265c是目标板的SDRAM的驱动程序,涉及I0端口表、相关寄存器的设置及SDRAM上电初始化过程3个主要部分。任何一部分有问题,都会影响U-Boot、嵌入式操作系统甚至应用程序的运行,所以SDRAM的驱动不仅关系到U-Boot本身能否正常运行,而且还与后续部分相关。根据MPC8265处理器datasheet和开发板的硬件电路图,配置8265I0端口表;设置寄存器PSDMRBRl0R1;向SDRAM中写入8次以初始化SDRAM等。SDRAM的初始化是由/lib_ppcboardc中的board_init_f()调用的,入口为tds8265c的函数initdram

  3)修改configmk文件 路径是U-Bootboardtds8265configmk。修改中,对该文件中的TEXT_BASE赋值应与TDS8265h中对CF-G_FLASH_BASE的赋值保持一致。

  4)编写flashc文件 路径是U-Bootboardtds8265flashcflashcFlash的驱动程序,是U-Boot读/写、删除Flash的源代码文件,其中包括多个函数,以实现不同的操作。如:

  编写flashc文件时需参考Flash的数据手册,严格按照其中的说明实现Flash的各种操作。

  5)创建U-bootldsU-bootldsdebugmakefile文件 这些文件均在目录U-Bootboardtds8265之下。设置U-boot中各个目标文件的连接地址。

  6)修改MAKEALL文件 路径是U-BootMAKEALL。因为使用的是MPC8265,属于82xx系列,所以在“LIST_82xx”下加入目标板名称“TDS8265”

  7)修改Makefile文件 路径是U-BootMakefile。在Makefile文件中增加TDS8265开发板的配置行,指定交叉编译器的完整路径名。

  32 编译U-Boot和移植镜像文件

  在源代码修改完成后,即可进行编译。编译U-Boot需要在Linux主机上建立交叉编译环境,本文使用Montavista公司的Montavista Linux Pro 40。在Linux主机上安装Montavista交叉编译工具后,设置环境变量,将Montavista工具链路径导入到主机系统的环境变量中。如:#gedit./.bash_profile,打开文件.bash_profile,增加PATH=$PATH:/optmontavistaprodevrocketppc82xxbin,然后删除之前可能错误创建的所有目标文件,并针对目标板编译。如下所示:

  编译完成后,得到3个文件:1)u-bootELF格式的文件,可被多数Debug程序识别;2)u-bootbin:二进制bin文件,U-boot的二进制执行代码,可通过JTAG接口下载到开发板;3)u-bootsrec: MotorolaS-Record格式文件,可通过BDM接口下载到开发板。

  不同开发板对U-Boot镜像文件在Flash中的存放地址要求不同,这是由处理器中断复位向量决定的,与开发板硬件相关,源代码中U-Boot起始地址必须与硬件复位向量相符合。

  使用MPC82xx系列处理器的主板是由硬件配置字(HRCW)决定的,如RPXlite板的中断复位向量设置为Ox00000100,因此U-B00t镜像文件必须烧写到Flash的起始位置。多数的PPC系列的处理器中断复位向量是Ox00000100Oxfff00100,即高位启动和低位启动的Bootloader所在位置。U-boot镜像文件在Flash中的存放地址可通过设置U-Boot源码的<目标板>h头文件中CFG_MONITOR_BASE以及board<目标板>confi-gmk中的TEXT_BASE来与硬件配置相对应。

  U-Boot镜像文件在Flash中烧录完成后,将目标板和主机的串口连接起来,目标板上电复位,即可在主机终端窗口看到串口回显的开发板上U-Boot的启动引导信息,如图2所示。

  在终端窗口中输入help,可以列出U-Boot所有命令列表。然后测试网口和Flash读写,工作正常,则可以认为U-Boot移植工作基本完成,接下来可以添加一些其他功能,并进行Linux内核的引导和文件系统的移植。

  4 结束语

  Bootloader在嵌入式开发中是操作系统和硬件的枢纽。在U-Boot移植过程中,不仅要掌握U-Boot的结构和工作流程外还需要对硬件有一定了解。本文移植的U-Boot已稳定运行在开发板上,而且可以通过FIash和网络加载Linux内核和NFS文件系统,为后续开发奠定了良好的基础。对于不同的CPU和开发板,基本方法和步骤是相同的,本文的工作对于基于MPC82xx系列处理器的硬件平台的U-Boot移植具有借鉴意义,并对嵌入式Linux系统的开发提供了有益的技术参考。 

相关推荐

Linux将进军汽车智能系统领域

Linux  汽车智能系统  2013-07-09

Android回归Linux核心怀抱

Google  Linux  Android  2012-11-01

EXT4数据损失bug影响Linux稳定版内核

EXT4  Linux  2012-10-25

Fedora Linux 18 延期至年底

Fedora Linux 18  2012-10-17

Marvell和Tuxera推出业界最快的全功能NAS解决方案

Marvell  Linux  NAS  2012-01-19

ARM-Linux嵌入式系统的BootLoader分析与设计

嵌入式系统  Linux  2011-09-19
在线研讨会
焦点