U-BOOT的启动流程及移植

上传人:熏** 文档编号:69059234 上传时间:2022-04-05 格式:DOC 页数:55 大小:229.50KB
收藏 版权申诉 举报 下载
U-BOOT的启动流程及移植_第1页
第1页 / 共55页
U-BOOT的启动流程及移植_第2页
第2页 / 共55页
U-BOOT的启动流程及移植_第3页
第3页 / 共55页
资源描述:

《U-BOOT的启动流程及移植》由会员分享,可在线阅读,更多相关《U-BOOT的启动流程及移植(55页珍藏版)》请在装配图网上搜索。

1、U-BOOT的启动流程及移植 摘要:嵌入式系统一般没有通用的bootloader,u-boot是功能强大的bootloader开发软件,但相对也比较复杂。文中对u-boot的启动流程作了介绍,详细给出了u-boot在S3C44B0开发板上的移植方法和步骤。1 .BOOTLOADER及U-BOOT简介Bootloader 代码是芯片复位后进入操作系统之前执行的一段代码,主要用于完成由硬件启动到操作系统启动的过渡,从而为操作系统提供基本的运行环境,如初始化CPU、堆栈、存储器系统等。Bootloader 代码与CPU 芯片的内核结构、具体型号、应用系统的配置及使用的操作系统等因素有关,其功能类似于

2、PC机的BIOS程序。由于bootloader和CPU及电路板的配置情况有关,因此不可能有通用的bootloader ,开发时需要用户根据具体情况进行移植。嵌入式Linux系统中常用的bootloader有armboot、redboot、blob、u-boot等,其中u-boot是当前比较流行,功能比较强大的bootloader,可以支持多种体系结构,但相对也比较复杂。bootloader的实现依赖于CPU的体系结构,大多数bootloader都分为stage1和stage 2两大部分。Bootloader的基本原理见参考文献。u-boot是Sourceforge网站上的一个开放源代码的项目。

3、它可对 PowerPCMPC5xx、MPC8xx、MPC82xx、MPC7xx、MPC74xx、ARM(ARM7、ARM9、strongARM、XScaLe)、MIPS(4kc、5kc)、X86等处理器提供支持,支持的嵌入式操作系统有Linux、Vx-WorkS、NetBSD、QNX、RTEMS、ARTOS、LynxOS等,主要用来开发嵌入式系统初始化代码bootloader。软件的主站点是http/S u-boot。u-boot 最初是由www.denx.de的PPC-boot发展而来的,它对PowerPC系列处理器的支持最完善,对Linux 操作系统的支持最好。源代码开放的u-boot软件

4、项目经常更新,是学习硬件底层代码开发的很好样例。2 .U-BOOT系统启动流程大多数bootloader都分为stage1和stage2两大部分,u-boot也不例外。依赖于CPU体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。2.1 stage1 (start.s代码结构)u-boot的stage1代码通常放在start.s文件中,它用汇编语言写成,其主要代码部分如下:(1) 定义入口 。由于一个可执行的IMage必须有一个入口点,并且只能有一个全局入口,通常这个入口放在

5、ROM(flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。(2)设置异常向量(Exception Vector)。(3)设置CPU的速度、时钟频率及中断控制寄存器。(4)初始化内存控制器 。(5)将ROM中的程序复制到RAM中。(6)初始化堆栈 。(7)转到RAM中执行,该工作可使用指令Ldr PC来完成。2.2 stage2C语言代码部分Lib ARM/board.c中的start armboot是C语言开始的函数,也是整个启动代码中C语言的主函数,同时还是整个u-boot(armboot)的主函数,该函数主要完成如下操作:(1)调用一系列的

6、初始化函数。(2)初始化Flash设备。(3)初始化系统内存分配函数。(4)如果目标系统拥有NAND设备,则初始化NAND设备。(5)如果目标系统有显示设备,则初始化该类设备。(6)初始化相关网络设备,填写IP、MAC地址等。(7)进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。3 .移植实例本系统开发板主要由S3C44B0X嵌入式微处理器、2MB的Flash (SST39VF160)、8MB的SDRAM(HY57V641620)、4个LED以及ARM JTAG接口组成。3.1 u-boot文件下载u-boot文件的下载有两种方法,第一种是在Linux环

7、境下通过CVS下载最新的文件,方法是:$cVS-dpserVeranonymouscvc.sourceforge. net/cVSroot/u-boot login当要求输入匿名登录的密码时,可直接按回车键$cVS-z6-dpserVeranonyMouscVS.source F/cVSroot/u-bootco.P ModuLenaMe第二种是通过ftp/ftp.denx.de/pub/u-boot/ 下载正式发布的压缩文件。3.2 u-boot文件的结构初次下载的文件有很多,解压后存放在u-boot文件目录下,具体内容已在readMe文件中做了详细的介绍,其中与移植相关的主要文件夹有:(1

8、)CPU它的每个子文件夹里都有如下文件:makefileconfig.mkcpu.c 和处理器相关的代码interrupts.c 中断处理代码serial.c 串口初始化代码start.s 全局开始启动代码(2)BOARD它的每个子文件夹里都有如下文件:makefileconfig.mksmdk2410.c 和板子相关的代码(以smdk2410为例)flash.c flash操作代码memSetup.s 初始化SDRAM代码u-boot.lds 对应的连接文件(3)lib ARM体系结构下的相关实现代码,比如memcpy等的汇编语言的优化实现。3.3 交叉编译环境的建立要得到下载到目标板的u-

9、boot二进制启动代码,还需要对下载的u-boot1.1.1进行编译。u-boot的编译一般在Linux系统下进行,可用ARM-LIN-UX-GCC进行编译。一步一步建立交叉编译环境通常比较复杂,最简单的方法是使用别人编译好的交叉编译工具,方法如下:(1)在http/handhelds.org/downLoad/tooLchaIn下载 ARM-Linux-gcc-3.3.2.tar.bz2(2)以用户名root登录,将ARM-Linux-gcc-3.3.2.tar.bz2 解压到 /root目录下# tar jxvf ARM-Linux-gcc-3.3.2.tar.bz2(3)在http/ha

10、ndhelds.org/downLoad/tooLchaIn下载 ARM-Linux-tooLchaIn-post-2.2.13.tar.gz 只是用了它的头文件而已,主要来自内核/Linux-x.x/include下(4)将ARM-Linux-tooLchaIn-post-2.2.13.tar.gz 解压到 /skiff/local/ 下# tar zxVF ARM-Linux-tooLchaIn-post-2.2.13.tar.gz(5)拷贝头文件到/root/usr/3.3.2/ARM-Linux/ 下然后删除 /skiff# cp -dr /skiff/local/ARM-Linux/

11、include /root/usr/3.3.2/ARM-Linux# rm -Fr /skiff这样就建立了ARM Linux 交叉编译环境。(6)增加/root/usr/local/ARM/3.3.2/bin到路径环境变量path$path:/root/usr/local/ARM/3.3.2/bin 可以检查路径变量是否设置正确。# echo $path3.4 移植的预先编译移植u-boot到新的开发板上仅需要修改与硬件相关的部分即可。主要包括两个层面的移植,第一层是针对CPU的移植,第二层是针对BOARD的移植。由于u-boot1.1.1里面已经包含S3C44B0的移植,所以笔者对板子my

12、board的移植主要是针对BOARD的移植。移植之前需要仔细阅读u-boot目录下的readMe文件,其中对如何移植做了简要的介绍。为了减少移植的工作量,可以在include/config目录下选一个和要移植的硬件相似的开发板,笔者选的是b2开发板。具体步骤如下:(1)u-boot1.1.1 下的CPU文件夹里已经包括了S3C44B0的目录,其下已经有start.sinterrupts.c以及 cpu.cserial.c几个文件,因而不需要建立与CPU相关的目录。(2)在board目录下创建myboard目录以及my-board.c、flash.c、memSetup.s和u-boot.lds

13、等文件。不需要从零开始创建,只需选择一个相似的目录直接复制过来,然后修改文件名及内容即可。笔者在移植u-boot过程中选择的是u-boot1.1.1/board/dave/b2目录。(3)在include/configs目录下添加myboard.h,在这里可放入全局的宏定义等也不需要从头创建,可以在include/configs目录下寻找相似的CPU的头文件进行复制,这里笔者用的是B2.h文件来进行相关的修改。(4) 对u-boot根目录下的makefile文件进行修改,加入myboard_config : unconfig./Mkconfig $(:_config)ARM S3C44B0 m

14、yboard(5) 修改u-boot根目录下的makefile文件,加入对板子的申明。然后在makefile 中加入myboard、LIST ARM7B2 ep7312 IMpa7 myboard。(6)运行make clobber,删除错误的depend文件。(7)运行make myboard config。(8)执行到此处即表示整个软件的makefile已建立,这时可修改生成的makefile中的交叉编译选项,然后打开makefile 文件,并找到其中的语句:ifeq($(ARCH),ARM)CROSS_COMPILEARM-Linux-end if接着将其改成ifeq($(ARCH),A

15、RM)CROSS COMPILE/root/usr/local/3.3.2/bin/ARM-Linux-end if这一步和上面的设置环境变量只要有一个就可以了。执行make,报告有一个错误,修改myboard/flash.c中的#include ./common/flash.c为u-boot/board/dave/common/flash.c,重新编译即可通过。4 .移植时的具体修改要点若预先编译没有错误就可以开始硬件相关代码的移植,首先必须要对移植的硬件有清楚地了解,如CPU、CPU的控制寄存器及启动各阶段程序在flashSDRAM中的布局等。笔者在移植过程中先修改/include/con

16、fig /my-board.h头文件中的大部分参数(大部分的宏定义都在这里设置),然后按照u-boot的启动流程逐步修改。修改时应熟悉ARM汇编语言和C语言,同时也应对u-boot启动流程代码有深入的了解。B2板的CPU频率为75MHz、flash为4Mbit、SDRAM为16Mbit、串口波特率为115200bit/S、环境变量放在EEPROM中。根据两个开发板的不同,需要修改的有:CPU的频率、flash和SDRAM容量的大小、环境变量的位置等。由于参考板已经有了大部分的代码,因此只需要针对myboard进行相应的修改就可以了。与之相关的文件有/include/config /myboar

17、d.h(大部分的宏定义都在这里设置)、/board/myboard/flash.cflash的驱动序、/board/myboard /myboard.c(SDRAM的驱动程序)、/CPU/S3C44B0/serial.c(串口的驱动使能部分)等。/include/config /myboard.h是全局宏定义的地方,主要的修改有:将#define CONFIG S3C44B0 CLOCK SPEED 75改为#define CONFIG S3C44B0 CLOCK SPEED 64;将 #define PHYS SDRAM1 SIE 0x01000000 /*16 MB */ 改为#defin

18、e PHYS SDRAM1 SIE 0x00800000 /* 8 MB */;将 #define PHYS FLASH SIE 0x00400000 /* 4 MB*改为#define PHYS FLASH SIE 0x00200000 /* 2 MB */;将 #define CFG MAX FLASH SECT 256 /* Max number of Sectors on one chip */改为#define CFG MAX FLASH SECT 35 ;将 #define CFG ENV IS IN EEPROM1 /* use EEPROM For environment Va

19、rs*/改为#define CFG ENV IS IN FLASH1其它(如堆栈的大小等)可根据需要修改。由于flash、SDRAM的容量会发生变化,故应对启动阶段程序在flash、SDRAM中的位置重新作出安排。笔者将flash中的u-boot代码放在0x0开始的地方,而将复制到SDRAM中的u-boot代码安排在0xc700000开始的地方。flash的修改不仅和容量有关,还和具体型号有关,flash存储器的烧写和擦除一般不具有通用性,应查看厂家的使用说明书,针对不同型号的存储器作出相应的修改。修改过程中,需要了解flash擦写特定寄存器的写入地址、数据命令以及扇区的大小和位置,以便进行正

20、确的设置。SDRAM要修改的地方主要是初始化内存控制器部分,由start.s文件中的 cpu InIt crIt完成CPU cache的设置,并由 board/myboard/memSetup.s中的memSetup完成初始化SDRAM。S3C44B0提供有SDRAM控制器,与一些CPU需要UPM表编程相比,它只需进行相关寄存器的设置修改即可,因而降低了开发的难度。串口波特率不需要修改(都是115200bit/S),直接用B2板的串口驱动即可。串口的设置主要包括初始化串口部分,值得注意的是:串口的波特率与时钟MCLK有很大关系,详见CPU用户手册。配置好以后,便可以重新编译u-boot代码。将

21、得到的u-boot.bin通过JTAG口下载到目标板后,如果能从串口输出正确的启动信息,就表明移植基本成功。实际过程中会由于考虑不周而需要多次修改。移植成功后,也可以添加一些其它功能(如LCD驱动等),在此基础上添加功能相对比较容易。5 结束语u-boot是一个功能强大的bootloader开发软件,适用的CPU平台及支持的嵌入式操作系统很多。本文是笔者在实际开发过程中根据相关资料进行摸索,并在成功移植了u-boot的基础上总结出来的。对于不同的CPU和开发板,其基本的方法和步骤是相同的,希望能对相关嵌入式系统的设计人员有所帮助。 U-BOOT(BOOTLOADER)程序的特点功能1 .U-B

22、OOT简介 u-boot是由德国的工程师Wolfgang Denk从8XXROM代码发展而来的,它支持很多处理器,比如PowerPC、ARM、MIPS和x86。目前,u-boot源代码在 Sourceforge网站的社区服务器中,Internet上有一群自由开发人员对其进行维护和开发,它的项目主页是http: /S #cvs -d:pserver:anonymous:/cvsroot/u-boot login #cvs -z6 -d:pserver:anonymous:/cvsroot/u-boot co -Pmodulename 1.1 u-boot源代码目录结构 board:和一些已有开发

23、板有关的文件,比如makefile和u-boot.ldS等都和具体开发板的硬件和地址分配有关。 common:与体系结构无关的文件,实现各种命令的C文件。 cpu:CPU相关文件,其中的子目录都是以u-boot所支持的CPU为名,比如有子目录arm926ejS、mips、mpc8260和nios等,每个特定的子目录中都包括cpu.c和interrupt.c,start.s。其中cpu.c初始化CPU、设置指令cache和数据cache等; interrupt.c设置系统的各种中断和异常,比如快速中断、开关中断、时钟中断、软件中断、预取中止和未定义指令等;start.s是u-boot 启动时执行

24、的第一个文件,它主要是设置系统堆栈和工作方式,为进入C程序奠定基础。 diSk:diSk驱动的分区处理代码。 doc:文档。 drivers:通用设备驱动程序,比如各种网卡、支持CFI的Flash、串口和USB总线等。 fs:支持文件系统的文件,u-boot现在支持cramfs、fat、fdos、jffs2和registerfs。 include:头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。 net:与网络有关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统的实现。 lib_arm:与ARM体系结构相关的代码。 tools:创建S-Reco

25、rd格式文件 和u-boot images的工具。 1.2 u-boot的特点 u-boot支持SCC/FEC以太网、OOTP/TFTP引导、IP和MAC的预置功能,这一点和其它BootLoader(如BLOB和RedBoot等)类似。但u-boot还具有一些特有的功能。 在线读写Flash、DOC、IDE、IIC、EEROM、RTC,其它的BootLoader根本不支持IDE和DOC的在线读写。 支持串行口kermit和S-record下载代码,u-boot本身的工具可以把ELF32格式的可执行文件转换成为 S-record格式,直接从串口下载并执行。 识别二进制、ELF32、uimage格

26、式的image,对Linux引导有特别的支持。u-boot对Linux 内核进一步封装为uimage。封装如下: #CROSS_COMPILE-objcopy O binary -R.note -R.comment -S vmlinux linux.bin #gzip -9 linux.bin #tools/mkimage -A arm -O linux -T kernel -C gzip -a 0xc0008000 -e 0xc0008000 -n “Linux-2.4.20” -d linux.bin.gz /tftpboot/uimage 即在Linux内核镜像vmLinux前添加了一个

27、特殊的头,这个头在include/image.h中定义,包括目标操作系统的种类(比如Linux, VxWorkS等)、目标CPU的体系机构(比如ARM、PowerPC等)、映像文件压缩类型(比如gzip、bzip2等)、加载地址、入口地址、映像名称和映像的生成时间。当系统引导时,u-boot会对这个文件头进行CRC校验,如果正确,才会跳到内核执行。如下所示: WT-ARM9# bootm 0xc1000000 # Checking image at 0xc100000 . image Name: Linux-2.4.20 Created: 2004-07-02 22:10:11 UTC ima

28、ge Type: ARM Linux Kernel image (gzip compresSed) Data size: 550196 Bytes = 537 kB = 0 MB Load AddresS: 0xc0008000 Entry Point: 0xc0008000 Verifying CheckSum . OK Uncompressing Kernel image OK 单任务软件运行环境。u-boot可以动态加载和运行独立的应用程序,这些独立的应用程序可以利用u-boot控制台的I/O函数、内存申请和中断服务等。这些应用程序还可以在没有操作系统的情况下运行,是测试硬件系统很好的工

29、具。 监控(minitor)命令集:读写I/O,内存,寄存器、内存、外设测试功能等 脚本语言支持(类似BASH脚本)。利用u-boot中的autoscr命令,可以在u-boot中运行“脚本”。首先在文本文件中输入需要执行的命令,然后用tools/mkimage封装,然后下载到开发板上,用autoscr执行就可以了。 编辑如下的脚本example.script。 echo echo Network Configuration: echo -echo Target: printenv ipaddr hostname echo echo Server: printenv Serverip rootp

30、ath echo 用tools/mkimage对脚本进行封装。 # mkimage -A ARM -O linux -T Script -C none -a 0 -e 0 -n autoscr example Script -d example.script /tftpboot/example.img image Name: autoscr example Script Created: Wes Sep 8 01:15:02 2004 image Type: ARM Linux Script (uncompresSed) Data size:157 Bytes = 0.15 kB = 0.00

31、 MB Load AddresS: 0x00000000 Entry Point: 0x00000000 ContentS: image 0:149 Bytes = 0 kB = 0 MB 在u-boot中加载并执行这个脚本。 WT-ARM9# tftp100000 /tftpboot/example.img ARP broadcast1 TFTP from Server10.0.0.2; our IP addresS iS10.0.0.99 Filename /tftpboot/TQM860L/example.img. Load addresS: 0x100000 Loading: # do

32、ne Bytes tranSferred = 221 (dd hex) WT-ARM9# autoscr100000 # Executing Script at 00100000 Network Configuration: -Target: ipaddr=10.0.0.99 hostname=arm Server: Serverip=10.0.0.2 rootpath=/nfsroot WT-ARM9# 支持WatchDog、LCD logo和状态指示功能等。如果系统支持Splash Screen,u-boot启动时,会把这个图像显示到LCD上,给用户更友好的感觉。 支持MTD和文件系统。u

33、-boot作为一种强大的BootLoader,它不仅支持MTD,而且可以在MTD基础上实现多种文件系统,比如cramfs、fat和jffs2等。 支持中断。由于传统的BootLoader都分为stage1和stage2,所以在stage2中添加中断处理服务十分困难,比如BLOB;而u-boot是把两个部分放到了一起,所以添加中断服务程序就很方便。 详细的开发文档。由于大多数BootLoader都是开源项目,所以文档都不是很充分。u-boot的维护人员意识到了这个问题,充分记录了开发文档,所以它的移植要比BLOB等缺少文档的BootLoader方便。 MPC8XX的U-BOOT移植体会BOOT

34、LOADER(引导装载器),是用于初始化目标板硬件,给嵌入式操作系统提供板上硬件资源信息,并进一步装载、引导嵌入式操作系统运行的固件。在嵌入式系统开发过程中,很多情况都会涉及底层BOOT LOADER的移植问题,即使在有些已有BOOT LOADER的参考开发板上也存在这种可能。 BOOT LOADER(引导装载器),是用于初始化目标板硬件,给嵌入式操作系统提供板上硬件资源信息,并进一步装载、引导嵌入式操作系统运行的固件。在嵌入式系统开发过程中,很多情况都会涉及底层BOOT LOADER的移植问题,即使在有些已有BOOT LOADER的参考开发板上也存在这种可能。概括来说,如下情况会考虑进行BO

35、OT LOADER的移植工作: A. 在自主设计的目标板上,用于引导嵌入式操作系统及其应用; B. 在厂家未提供BOOT LOADER源码的参考板上,遇有如下情形之一: a. 在实际应用中需要添加或修改一些功能; b. 为了给自行设计主板移植BOOT LOADER提供参考,先在参考板上进行移植以积累经验; 另外,从嵌入式系统实际开发角度讲,嵌入式操作系统的引导、配置甚至应用程序的运行状况都和BOOT LOADER有一定的关联,可以说,掌握BOOT LOADER移植是顺利进行嵌入式系统开发的重要利器。 与常见的嵌入式操作系统板级支持包BSP相比,BOOT LOADER与底层硬件更为相关,即每个不

36、同配置的目标板基本都有不同的BOOT LOADER。因为BOOT LOADER往往更依据量体裁衣、定身制作的原则,以满足要求的最小化代码存放在启动ROM或FLASH中。 诚然,自行编写BOOT LOADER未尝不可,但从可利用的资源和实际项目开发考虑,采用移植已有的BOOT LOADER源码来解决这一问题更符合大多数项目开发的要求。 1 u-boot简介 u-boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少u-boot源码就是相应的L

37、inux内核源程序的简化,尤其是一些设备的驱动程序,这从u-boot源码的注释中能体现这一点。但是u-boot不仅仅支持嵌入式linux系统的引导,当前,它还支持NetBSD, VxWorkS, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, SolariS, Irix, SCO, Dell, NCR, VxWorkS, LynxOS, psOS, QNX, RTEMS, ARTOS。这是u-boot中Universal的一层含义,另外一层含义则

38、是u-boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。这两个特点正是u-boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,u-boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。其它系列的处理器和操作系统基本是在2002年11月PPCBOOT改名为u-boot后逐步扩充的。从PPCBOOT向u-boot的顺利过渡,很大程度上归功于u-boot的维护人德国DENX软件工程中心Wolfgang Denk以下简称W.D本人精湛专业水平和持着不懈的努力。当前,u-boot

39、项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。 选择u-boot的理由: 开放源码; 支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorkS, QNX, RTEMS, ARTOS, LynxOS; 支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale; 较高的可靠性和稳定性; 较高的可靠性和稳定性; 高度灵活的功能设置,适合u-boot调试、操作系统不同引导要求、产品发布等; 丰富的设备驱动源码,如串口、以太网

40、、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等; 较为丰富的开发调试文档与强大的网络技术支持; 2 u-boot主要目录结构 -board 目标板相关文件,主要包含SDRAM、FLASH驱动; -common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测; -cpu 与处理器相关的文件。如mpc8xx子目录下含串口、网口、LCD驱动及中断初始化等文件; -driver 通用设备驱动,如CFI FLASH驱动(目前对INTEL FLASH支持较好) -doc u-boot的说明文档; -examples可在u-boot下运行的示例程序;如hello_wor

41、ld.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可支持的主要功能列表 系统引导 支持NFS挂载、

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

43、AM故障检测;CPU型号; 特殊功能 XIP内核引导; 4 u-boot移植过程 获得发布的最新版本u-boot源码,与Linux内核源码类似,也是 bzip2的压缩格式。可从u-boot的官方网站http:/S 阅读相关文档,主要是u-boot源码根目录下的README文档和u-boot官方网站的DULG(The DENX u-boot and Linux Guide)文档http:/www.denx.de/twiki/bin/view/DULG/Manual。尤其是DULG文档,从如何安装建立交叉开发环境和解决u-boot移植中常见问题都一一给出详尽的说明; 订阅u-boot用户邮件列表h

44、ttp:/listS 在建立的开发环境下进行移植工作。绝大多数的开发环境是交叉开发环境。在这方面,DENX 和MontaVista均提供了完整的开发工具集; 在目标板与开发主机间接入硬件调试器。这是进行u-boot移植应当具备且非常关键的调试工具。因为在整个u-boot的移植工作中,尤其是初始阶段,硬件调试器是我们了解目标板真实运行状态的唯一途径。在这方面,W.D本人和众多嵌入式开发人员倾向于使用BDI2000。一方面,其价格不如ICE调试器昂贵,同时其可靠性高,功能强大,完全能胜任移植和调试u-boot。另外,网上也有不少关于BDI2000调试方面的参考文档。 如果在参考开发板上移植u-bo

45、ot,可能需要移除目标板上已有的BOOT LOADER。可以根据板上BOOT LOADER的说明文档,先着手解决在移除当前BOOT LOADER的情况下,如何进行恢复。以便今后在需要场合能重新装入原先的BOOT LOADER。 5 u-boot移植方法 当前,对于u-boot的移植方法,大致分为两种。一种是先用BDI2000创建目标板初始运行环境,将u-boot镜像文件u-boot.bin下载到目标板RAM中的指定位置,然后,用BDI2000进行跟踪调试。其好处是不用将u-boot镜像文件烧写到FLASH中去。但弊端在于对移植开发人员的移植调试技能要求较高,BDI2000的配置文件较为复杂。另

46、外一种方法是用BDI2000先将 u-boot镜像文件烧写到FLASH中去,然后利用GDB和BDI2000进行调试。这种方法所用BDI2000的配置文件较为简单,调试过程与u-boot移植后运行过程相吻合,即u-boot先从FLASH中运行,再重载至RAM中相应位置,并从那里正式投入运行。唯一感到有些麻烦的就是需要不断烧写FLASH。但考虑到FLASH常规擦写次数基本为10万次左右,作为移植u-boot,不会占用太多的次数,应该不会为FLASH烧写有什么担忧。同时,W. D本人也极力推荐使用后一种方法。笔者建议,除非u-boot移植资深人士或有强有力的技术支持,建议采用第二种移植方法。 6 u

47、-boot移植主要修改的文件 从移植u-boot最小要求-u-boot能正常启动的角度出发,主要考虑修改如下文件: .h头文件,如include/configs/RPXlite.h。可以是u-boot源码中已有的目标板头文件,也可以是新命名的配置头文件;大多数的寄存器参数都是在这一文件中设置完成的; .c文件,如board/RPXlite/RPXlite.c。它是SDRAM的驱动程序,主要完成SDRAM的UPM表设置,上电初始化。 FLASH的驱动程序,如board/RPXlite/flash.c,或common/cfi_flash.c。可在参考已有FLASH驱动的基础上,结合目标板FLASH

48、数据手册,进行适当修改; 串口驱动,如修改cpu/mpc8xx/Serial.c串口收发器芯片使能部分。 7 u-boot移植要点 BDI2000的配置文件。如果采用第二种移植方法,即先烧入FLASH的方法,配置项只需很少几个,就可以进行u-boot的烧写与调试了。对PPC 8xx系列的主板,可参考DULG文档中TQM8xx的配置文件进行相应的修改。下面,笔者以美国Embedded Planet公司的RPXlite DW板为例,给出在嵌入式linux交叉开发环境下的BDI2000参考配置文件以作参考: ; bdiGDB configuration file for RPXlite DW or

49、LITE_DW ; -INIT ; init core register WSPR149 0x2002000F ;DER : Set debug enable register ; WSPR149 0x2006000F ;DER : enable SYSIE for BDI flash program WSPR 638 0xFA200000 ;immR : internal memory at 0xFA200000 WM32 0xFA200004 0xFFFFFF89 ;SYPCR TARGET CPUCLOCK 40000000 ;the CPU clock rate after proce

50、ssing the init list BDIMODE AGENT ;the BDI working mode (LOADONLY | AGENT) BREAKMODE HARD ;SOFT or HARD, HARD uses PPC hardware breakpointS HOST IP173.60.120.5 FILE uimage.litedw FORMAT BIN LOAD MANUAL ;load code MANUAL or AUTO after reset DEBUGPORT 2001 START 0x0100 FLASH CHIPTYPE AM29BX8 ;Flash ty

51、pe (AM29F | AM29BX8 | AM29BX16 | I28BX8 | I28BX16) CHIPSIZE 0x400000 ;The size of one flash chip in bytes BUSWIDTH 32 ;The width of the flash memory bus in bitS (8 |16 | 32) WORKSPACE 0xFA202000 ; RAM buffer for fast flash programming FILE u-boot.bin ;The file to program FORMAT BIN 0x00000000 ERASE

52、0x00000000 BLOCK ERASE 0x00008000 BLOCK ERASE 0x00010000 BLOCK ERASE 0x00018000 BLOCK REGS Dmm1 0xFA200000 FILE reg823.def u-boot移植参考板。这是进行u-boot移植首先要明确的。可以根据目标板上CPU、FLASH、SDRAM的情况,以尽可能相一致为原则,先找出一个与所移植目标板为同一个或同一系列处理器的u-boot支持板为移植参考板。如RPXlite DW板可选择u-boot源码中RPXlite板作为u-boot移植参考板。对u-boot移植新手,建议依照循序渐进的

53、原则,目标板文件名暂时先用移植参考板的名称,在逐步熟悉u-boot移植基础上,再考虑给目标板重新命名。在实际移植过程中,可用Linux命令查找移植参考板的特定代码,如 grep r RPXlite ./ 可确定出在u-boot中与RPXlite板有关的代码,依此对照目标板实际进行屏蔽或修改。同时应不局限于移植参考板中的代码,要广泛借鉴u-boot 中已有的代码更好地实现一些具体的功能。 u-boot烧写地址。不同目标板,对u-boot在FLASH中存放地址要求不尽相同。事实上,这是由处理器中断复位向量来决定的,与主板硬件相关,对 MPC8xx主板来讲,就是由硬件配置字(HRCW)决定的。也就是

54、说,u-boot烧写具体位置是由硬件决定的,而不是程序设计来选择的。程序中相应U -Boot起始地址必须与硬件所确定的硬件复位向量相吻合;如RPXlite DW板的中断复位向量设置为0x00000100。因此, u-boot 的BIN镜像文件必须烧写到FLASH的起始位置。事实上,大多数的PPC系列的处理器中断复位向量是0x00000100和0xfff00100。这也是一般所说的高位启动和低位启动的BOOT LOADER所在位置。可通过修改u-boot源码.h头文件中CFG_MONITOR_BASE 和board/config.mk中的TEXT_BASE的设置来与硬件配置相对应。 CPU寄存器

55、参数设置。根据处理器系列、类型不同,寄存器名称与作用有一定差别。必须根据目标板的实际,进行合理配置。一个较为可行和有效的方法,就是借鉴参考移植板的配置,再根据目标板实际,进行合理修改。这是一个较费功夫和考验耐力的过程,需要仔细对照处理器各寄存器定义、参考设置、目标板实际作出选择并不断测试。MPC8xx处理器较为关键的寄存器设置为SIUMCR、PLPRCR、SCCR、BRx、ORx。 串口调试。能从串口输出信息,即使是乱码,也可以说u-boot移植取得了实质性突破。依据笔者调试经历,串口是否有输出,除了与串口驱动相关外,还与 FLASH相关的寄存器设置有关。因为u-boot是从FLASH中被引导

56、启动的,如果FLASH设置不正确,u-boot代码读取和执行就会出现一些问题。因此,还需要就FLASH的相关寄存器设置进行一些参数调试。同时,要注意串口收发芯片相关引脚工作波形。依据笔者调试情况,如果串口无输出或出现乱码,一种可能就是该芯片损坏或工作不正常。 与启动 FLASH相关的寄存器BR0、OR0的参数设置。应根据目标板FLASH的数据手册与BR0和OR0的相关位含义进行合理设置。这不仅关系到FLASH能否正常工作,而且与串口调试有直接的关联。 关于CPLD电路。目标板上是否有CPLD电路丝毫不会影响u-boot的移植与嵌入式操作系统的正常运行。事实上,CPLD电路是一个集中将板上电路的

57、一些逻辑关系可编程设置的一种实现方法。其本身所起的作用就是实现一些目标板所需的脉冲信号和电路逻辑,其功能完全可以用一些逻辑电路与CPU口线来实现。 SDRAM的驱动。串口能输出以后,u-boot移植是否顺利基本取决于SDRAM的驱动是否正确。与串口调试相比,这部分工作更为核心,难度更大。 MPC8xx目标板SDRAM驱动涉及三部分。一是相关寄存器的设置;二是UPM表;三是SDRAM上电初始化过程。任何一部分有问题,都会影响u-boot、嵌入式操作系统甚至应用程序的稳定、可靠运行。所以说,SDRAM的驱动不仅关系到u-boot本身能否正常运行,而且还与后续部分相关,是相当关键的部分。 补充功能的

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

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

60、改为了使u-boot-1.1.0支持新的开发板,一种简便的做法是在u-boot已经支持的开发板中选择一种接近的进行修改。由于u-boot-1.10不支持ARM-922T内核,所以选择基于ARM-920T内核的Smdk2400为模板。相关的源代码在board/Smdk2400/下。2.1 支持ARM-922T内核的代码修改修改以下代码,使u-boot支持arm-922t内核。 在include/目录下新建文件arm922t.h,内容如下:#ifndef _ARM922T_H_#define _ARM922T_H_#endif 在include/目录下新建文件wt-arm9.h,该文件描述了ARM

61、922T中Timer、UART等寄存器的结构及若干宏定义。具体内容要参考相关处理器手册。 在cpu/目录下新建目录arm922t,将目录arm920t下的内容复制后,参考手册分别修改cpu.c、interruptS.c和Serial.c,其它文件不修改。2.2 开发板的支持建立自己开发板的目录和相关文件。 在include/configs目录中添加头文件lh7a400.h。这个文件是lh7a400开发板的配置文件,它包括开发板的CPU、系统时钟、RAM、Flash系统及其它相关的配置信息。其格式可参考include/configs/Smdk2400.h。 在board/目录下新建wt-arm9目录,创建如下文件:flash.c、lhmemSetup.c、wt-arm9.c、makefile和u-boot.ldS。 flash.c。u-boot 读、写和删除Flash设备的源代码文件。由于不同开发板中Flash存储器的种类各不相同,所以,修改flash.c时需参考相应的Flash芯片手册。它包括如下几个函数:unsigned long flash_init (void ),Flash初始化;void flash_print_inf

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!