uboot的启动流程及移植.docx

上传人:b****5 文档编号:7246593 上传时间:2023-01-22 格式:DOCX 页数:43 大小:58.25KB
下载 相关 举报
uboot的启动流程及移植.docx_第1页
第1页 / 共43页
uboot的启动流程及移植.docx_第2页
第2页 / 共43页
uboot的启动流程及移植.docx_第3页
第3页 / 共43页
uboot的启动流程及移植.docx_第4页
第4页 / 共43页
uboot的启动流程及移植.docx_第5页
第5页 / 共43页
点击查看更多>>
下载资源
资源描述

uboot的启动流程及移植.docx

《uboot的启动流程及移植.docx》由会员分享,可在线阅读,更多相关《uboot的启动流程及移植.docx(43页珍藏版)》请在冰豆网上搜索。

uboot的启动流程及移植.docx

uboot的启动流程及移植

u-boot的启动流程及移植

摘要:

嵌入式系统一般没有通用的bootloader,u-boot是功能强大的bootloader开发软件,但相对也比较复杂。

文中对u-boot的启动流程作了介绍,详细给出了u-boot在S3C44B0开发板上的移植方法和步骤。

1.Bootloader及u-boot简介

Bootloader代码是芯片复位后进入操作系统之前执行的一段代码,主要用于完成由硬件启动到操作系统启动的过渡,从而为操作系统提供基本的运行环境,如初始化CPU、堆栈、存储器系统等。

Bootloader代码与CPU芯片的内核结构、具体型号、应用系统的配置及使用的操作系统等因素有关,其功能类似于PC机的BIOS程序。

由于bootloader和CPU及电路板的配置情况有关,因此不可能有通用的bootloader,开发时需要用户根据具体情况进行移植。

嵌入式Linux系统中常用的bootloader有armboot、redboot、blob、u-boot等,其中u-boot是当前比较流行,功能比较强大的bootloader,可以支持多种体系结构,但相对也比较复杂。

bootloader的实现依赖于CPU的体系结构,大多数bootloader都分为stage1和stage2两大部分。

Bootloader的基本原理见参考文献。

u-boot是Sourceforge网站上的一个开放源代码的项目。

它可对PowerPCMPC5xx、MPC8xx、MPC82xx、MPC7xx、MPC74xx、ARM(ARM7、ARM9、strongARM、XScaLe)、MIPS(4kc、5kc)、X86等处理器提供支持,支持的嵌入式操作系统有Linux、Vx-WorkS、NetBSD、QNX、RTEMS、ARTOS、LynxOS等,主要用来开发嵌入式系统初始化代码bootloader。

软件的主站点是http//Su-boot。

u-boot最初是由www.denx.de的PPC-boot发展而来的,它对PowerPC系列处理器的支持最完善,对Linux操作系统的支持最好。

源代码开放的u-boot软件项目经常更新,是学习硬件底层代码开发的很好样例。

2.u-boot系统启动流程

大多数bootloader都分为stage1和stage2两大部分,u-boot也不例外。

依赖于CPU体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。

2.1stage1(start.s代码结构)

u-boot的stage1代码通常放在start.s文件中,它用汇编语言写成,其主要代码部分如下:

(1)定义入口。

由于一个可执行的IMage必须有一个入口点,并且只能有一个全局入口,通常这个入口放在ROM(flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。

(2)设置异常向量(ExceptionVector)。

(3)设置CPU的速度、时钟频率及中断控制寄存器。

(4)初始化内存控制器。

(5)将ROM中的程序复制到RAM中。

(6)初始化堆栈。

(7)转到RAM中执行,该工作可使用指令LdrPC来完成。

2.2stage2C语言代码部分

LibARM/board.c中的startarmboot是C语言开始的函数,也是整个启动代码中C语言的主函数,同时还是整个u-boot(armboot)的主函数,该函数主要完成如下操作:

(1)调用一系列的初始化函数。

(2)初始化Flash设备。

(3)初始化系统内存分配函数。

(4)如果目标系统拥有NAND设备,则初始化NAND设备。

(5)如果目标系统有显示设备,则初始化该类设备。

(6)初始化相关网络设备,填写IP、MAC地址等。

(7)进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。

3.移植实例

本系统开发板主要由S3C44B0X嵌入式微处理器、2MB的Flash(SST39VF160)、8MB的SDRAM(HY57V641620)、4个LED以及ARMJTAG接口组成。

3.1u-boot文件下载

u-boot文件的下载有两种方法,第一种是在Linux环境下通过CVS下载最新的文件,方法是:

$cVS-dpserVeranonymous@cvc.sourceforge.net/cVSroot/u-bootlogin

当要求输入匿名登录的密码时,可直接按回车键

$cVS-z6-dpserVeranonyMous@cVS.sourceF/cVSroot/u-boot\co.PModuLenaMe

第二种是通过ftp//ftp.denx.de/pub/u-boot/下载正式发布的压缩文件。

3.2u-boot文件的结构

初次下载的文件有很多,解压后存放在u-boot文件目录下,具体内容已在readMe文件中做了详细的介绍,其中与移植相关的主要文件夹有:

(1)CPU它的每个子文件夹里都有如下文件:

makefile

config.mk

cpu.c和处理器相关的代码

interrupts.c中断处理代码

serial.c串口初始化代码

start.s全局开始启动代码

(2)BOARD它的每个子文件夹里都有如下文件:

makefile

config.mk

smdk2410.c和板子相关的代码(以smdk2410为例)

flash.cflash操作代码

memSetup.s初始化SDRAM代码

u-boot.lds对应的连接文件

(3)libARM体系结构下的相关实现代码,比如memcpy等的汇编语言的优化实现。

3.3交叉编译环境的建立

要得到下载到目标板的u-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目录下

#tarjxvfARM-Linux-gcc-3.3.2.tar.bz2

(3)在http//handhelds.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/下

#tarzxVFARM-Linux-tooLchaIn-post-2.2.13.tar.gz

(5)拷贝头文件到/root/usr/3.3.2/ARM-Linux/下然后删除/skiff

#cp-dr/skiff/local/ARM-Linux/include/root/usr/3.3.2/ARM-Linux

#rm-Fr/skiff

这样就建立了ARMLinux交叉编译环境。

(6)增加/root/usr/local/ARM/3.3.2/bin到路径环境变量

path=$path:

/root/usr/local/ARM/3.3.2/bin可以检查路径变量是否设置正确。

#echo$path

3.4移植的预先编译

移植u-boot到新的开发板上仅需要修改与硬件相关的部分即可。

主要包括两个层面的移植,第一层是针对CPU的移植,第二层是针对BOARD的移植。

由于u-boot1.1.1里面已经包含S3C44B0的移植,所以笔者对板子myboard的移植主要是针对BOARD的移植。

移植之前需要仔细阅读u-boot目录下的readMe文件,其中对如何移植做了简要的介绍。

为了减少移植的工作量,可以在include/config目录下选一个和要移植的硬件相似的开发板,笔者选的是b2开发板。

具体步骤如下:

(1)u-boot1.1.1下的CPU文件夹里已经包括了S3C44B0的目录,其下已经有start.sinterrupts.c以及cpu.cserial.c几个文件,因而不需要建立与CPU相关的目录。

(2)在board目录下创建myboard目录以及my-board.c、flash.c、memSetup.s和u-boot.lds等文件。

不需要从零开始创建,只需选择一个相似的目录直接复制过来,然后修改文件名及内容即可。

笔者在移植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=)ARMS3C44B0myboard

(5)修改u-boot根目录下的makefile文件,加入对板子的申明。

然后在makefile中加入myboard、LISTARM7=″B2ep7312IMpa7myboard″。

(6)运行makeclobber,删除错误的depend文件。

(7)运行makemyboardconfig。

(8)执行到此处即表示整个软件的makefile已建立,这时可修改生成的makefile中的交叉编译选项,然后打开makefile文件,并找到其中的语句:

ifeq($(ARCH),ARM)

CROSS_COMPILE=ARM-Linux-

endif

接着将其改成

ifeq($(ARCH),ARM)

CROSSCOMPILE=/root/usr/local/3.3.2/bin/ARM-Linux-

endif

这一步和上面的设置环境变量只要有一个就可以了。

执行make,报告有一个错误,修改myboard/flash.c中的#include″../common/flash.c"为"u-boot/board/dave/common/flash.c″,重新编译即可通过。

4.移植时的具体修改要点

若预先编译没有错误就可以开始硬件相关代码的移植,首先必须要对移植的硬件有清楚地了解,如CPU、CPU的控制寄存器及启动各阶段程序在flashSDRAM中的布局等。

笔者在移植过程中先修改/include/config/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/myboard.h(大部分的宏定义都在这里设置)、/board/myboard/flash.cflash的驱动序、/board/myboard/myboard.c(SDRAM的驱动程序)、/CPU/S3C44B0/serial.c(串口的驱动使能部分)等。

/include/config/myboard.h是全局宏定义的地方,主要的修改有:

将#defineCONFIGS3C44B0CLOCKSPEED75改为

#defineCONFIGS3C44B0CLOCKSPEED64;

将#definePHYSSDRAM1SIZE0x01000000/*16MB*/改为

#definePHYSSDRAM1SIZE0x00800000/*8MB*/;

将#definePHYSFLASHSIZE0x00400000/*4MB*改为

#definePHYSFLASHSIZE0x00200000/*2MB*/;

将#defineCFGMAXFLASHSECT256/*MaxnumberofSectorsononechip*/改为

#defineCFGMAXFLASHSECT35;

将#defineCFGENVISINEEPROM1/*useEEPROMForenvironmentVars*/改为

#defineCFGENVISINFLASH1

其它(如堆栈的大小等)可根据需要修改。

由于flash、SDRAM的容量会发生变化,故应对启动阶段程序在flash、SDRAM中的位置重新作出安排。

笔者将flash中的u-boot代码放在0x0开始的地方,而将复制到SDRAM中的u-boot代码安排在0xc700000开始的地方。

flash的修改不仅和容量有关,还和具体型号有关,flash存储器的烧写和擦除一般不具有通用性,应查看厂家的使用说明书,针对不同型号的存储器作出相应的修改。

修改过程中,需要了解flash擦写特定寄存器的写入地址、数据命令以及扇区的大小和位置,以便进行正确的设置。

SDRAM要修改的地方主要是初始化内存控制器部分,由start.s文件中的cpuInItcrIt完成CPUcache的设置,并由board/myboard/memSetup.s中的memSetup完成初始化SDRAM。

S3C44B0提供有SDRAM控制器,与一些CPU需要UPM表编程相比,它只需进行相关寄存器的设置修改即可,因而降低了开发的难度。

串口波特率不需要修改(都是115200bit/S),直接用B2板的串口驱动即可。

串口的设置主要包括初始化串口部分,值得注意的是:

串口的波特率与时钟MCLK有很大关系,详见CPU用户手册。

配置好以后,便可以重新编译u-boot代码。

将得到的u-boot.bin通过JTAG口下载到目标板后,如果能从串口输出正确的启动信息,就表明移植基本成功。

实际过程中会由于考虑不周而需要多次修改。

移植成功后,也可以添加一些其它功能(如LCD驱动等),在此基础上添加功能相对比较容易。

5结束语

u-boot是一个功能强大的bootloader开发软件,适用的CPU平台及支持的嵌入式操作系统很多。

本文是笔者在实际开发过程中根据相关资料进行摸索,并在成功移植了u-boot的基础上总结出来的。

对于不同的CPU和开发板,其基本的方法和步骤是相同的,希望能对相关嵌入式系统的设计人员有所帮助。

u-boot(bootloader)程序的特点功能

1.u-boot简介

  u-boot是由德国的工程师WolfgangDenk从8XXROM代码发展而来的,它支持很多处理器,比如PowerPC、ARM、MIPS和x86。

目前,u-boot源代码在Sourceforge网站的社区服务器中,Internet上有一群自由开发人员对其进行维护和开发,它的项目主页是http:

//S

#cvs-d:

pserver:

anonymous@:

/cvsroot/u-bootlogin

#cvs-z6-d:

pserver:

anonymous@:

/cvsroot/u-boot\co-Pmodulename

1.1u-boot源代码目录结构

◆board:

和一些已有开发板有关的文件,比如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启动时执行的第一个文件,它主要是设置系统堆栈和工作方式,为进入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-Record格式文件和u-bootimages的工具。

1.2u-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格式的image,对Linux引导有特别的支持。

u-boot对Linux内核进一步封装为uimage。

封装如下:

#{CROSS_COMPILE}-objcopy–Obinary-R.note-R.comment-Svmlinux\linux.bin

#gzip-9linux.bin

#tools/mkimage-Aarm-Olinux-Tkernel-Cgzip-a0xc0008000-e\

0xc0008000-n“Linux-2.4.20”-dlinux.bin.gz/tftpboot/uimage

即在Linux内核镜像vmLinux前添加了一个特殊的头,这个头在include/image.h中定义,包括目标操作系统的种类(比如Linux,VxWorkS等)、目标CPU的体系机构(比如ARM、PowerPC等)、映像文件压缩类型(比如gzip、bzip2等)、加载地址、入口地址、映像名称和映像的生成时间。

当系统引导时,u-boot会对这个文件头进行CRC校验,如果正确,才会跳到内核执行。

如下所示:

WT-ARM9#bootm0xc1000000

##Checkingimageat0xc100000...

imageName:

Linux-2.4.20

Created:

2004-07-0222:

10:

11UTC

imageType:

ARMLinuxKernelimage(gzipcompresSed)

Datasize:

550196Bytes=537kB=0MB

LoadAddresS:

0xc0008000

EntryPoint:

0xc0008000

VerifyingCheckSum...OK

UncompressingKernelimage………OK

◆单任务软件运行环境。

u-boot可以动态加载和运行独立的应用程序,这些独立的应用程序可以利用u-boot控制台的I/O函数、内存申请和中断服务等。

这些应用程序还可以在没有操作系统的情况下运行,是测试硬件系统很好的工具。

◆监控(minitor)命令集:

读写I/O,内存,寄存器、内存、外设测试功能等

◆脚本语言支持(类似BASH脚本)。

利用u-boot中的autoscr命令,可以在u-boot中运行“脚本”。

首先在文本文件中输入需要执行的命令,然后用tools/mkimage封装,然后下载到开发板上,用autoscr执行就可以了。

①编辑如下的脚本example.script。

echo

echoNetworkConfiguration:

echo----------------------

echoTarget:

printenvipaddrhostname

echo

echoServer:

printenvServeriprootpath

echo

②用tools/mkimage对脚本进行封装。

#mkimage-AARM-Olinux-TScript-Cnone-a0-e0-n"autoscrexampleScript"-dexample.script/tftpboot/example.img

imageName:

autoscrexampleScript

Created:

WesSep801:

15:

022004

imageType:

ARMLinuxScript(uncompresSed)

Datasize:

157Bytes=0.15kB=0.00MB

LoadAddresS:

0x00000000

EntryPoint:

0x00000000

ContentS:

image0:

149Bytes=0kB=0MB

③在u-boot中加载并执行这个脚本。

WT-ARM9#tftp100000/tftpboot/example.img

ARPbroadcast1

TFTPfromServer10.0.0.2;ourIPaddresSiS10.0.0.99

Filename'/tftpboot/TQM860L/example.img'.

LoadaddresS:

0x100000

Loading:

#

done

BytestranSferred=221(ddhex)

WT-ARM9#autoscr1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 研究生入学考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1