新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 用U-BOOT构建嵌入式系统的引导装载程序

用U-BOOT构建嵌入式系统的引导装载程序

作者:时间:2006-04-20来源:网络收藏
摘要:BootLoader()是软件开发的第一个环节,它把操作和硬件平台衔接在一起,对于的后续软件开发十分重要,在整个开发中也占有相当大的比例。是当前比较流行、功能强大的BootLoader,可以支持多种体系结构。LH7A400是Sharp公司生产的一款基于ARM922T内核的32位RISC芯片,本文详细介绍的功能、特点以及在LH7A400处理器上的移植过程。


关键词:BootLoader移植LH7A400ARM922T


引言:

  本文以U-BOOT为例,介绍了如何在ARM9开发板上移植BootLoader的过程。LH7A400学习板是旋极公司推出的一款高性能开发板,其采用的处理器LH7A400是Sharp公司生产的一款基于ARM922T内核的32位RISC芯片。该芯片集成了高性能的32位RISC处理器核ARM922T(运算速度200MHz,总线速度100MHz),能使处理速度达到每秒220百万条指令(MIPS),能耗为1.33mW/MIPS,可以在低电压状态下工作(核心1.8V,输入/输出3.3V),片内带有锁相回路(PLL)和低能耗核心。此外该芯片还包括:16KB高速缓存(Cache),存储器管理单元(MMU),80KB静态存储器(SRAM),彩色液晶显示控制器(LCD),直接存储控制器(10通道DMA),异步串行口控制器(UART),同步串行口控制器(SSP),PCMCIA控制器,AC97声音控制器,智能卡控制器,多媒体卡控制器,电池控制器,USB控制器和时钟/供电管理器。值得一提的是,LH7A400是一款宽温芯片,其工作温度范围为-40℃~+85℃(降低时钟频率),可广泛应用于无线手持设备、智能电话、PDA、家庭娱乐控制器、PocketPC及各种工控设备。
该学习板还包括如下硬件:由2片16位Flash(32MB)和2片16位的SDRAM(64M)构成32位宽的高速存储器结构;10/100M自适应网络芯片DM9000;Sharp3.5’TFTLCD彩屏;触摸屏;USBHost/Device;CF卡插槽;全功能JTAG接口等。

1U-BOOT简介

  U-BOOT是由德国的工程师WolfgangDenk从8XXROM代码发展而来的,它支持很多处理器,比如PowerPC、ARM、MIPS和x86。目前,U-BOOT源代码在sourceforge网站的社区服务器中,Internet上有一群自由开发人员对其进行维护和开发,它的项目主页是http://sourceforge.net/projects/U-BOOT。U-BOOT的最新版本源代码可以在Sourceforge的CVS服务器中匿名获得。
#cvs-d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/U-BOOTlogin
#cvs-z6-d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/U-BOOTco-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-Svmlinuxlinux.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#autoscr100000
##Executingscriptat00100000
NetworkConfiguration:
----------------------
Target:
ipaddr=10.0.0.99
hostname=arm
Server:
serverip=10.0.0.2
rootpath=/nfsroot
WT-ARM9#
◆支持WatchDog、LCDlogo和状态指示功能等。如果系统支持splashscreen,U-BOOT启动时,会把这个图像显示到LCD上,给用户更友好的感觉。
◆支持MTD和文件系统。U-BOOT作为一种强大的BootLoader,它不仅支持MTD,而且可以在MTD基础上实现多种文件系统,比如cramfs、fat和jffs2等。
◆支持中断。由于传统的BootLoader都分为stage1和stage2,所以在stage2中添加中断处理服务十分困难,比如BLOB;而U-BOOT是把两个部分放到了一起,所以添加中断服务程序就很方便。
◆详细的开发文档。由于大多数BootLoader都是开源项目,所以文档都不是很充分。U-BOOT的维护人员意识到了这个问题,充分记录了开发文档,所以它的移植要比BLOB等缺少文档的BootLoader方便。

2对U-BOOT-1.1.0的修改

  为了使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,该文件描述了ARM922T中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芯片手册。它包括如下几个函数:
unsignedlongflash_init(void),Flash初始化;
voidflash_print_info(flash_info_t*info),打印Flash信息;
intflash_erase(flash_info_t*info,ints_first,ints_last),Flash擦除;
volatilestaticintwrite_dword(flash_info_t*info,ulongdest,ulongdata),Flash写入;
intwrite_buff(flash_info_t*info,uchar*src,ulongaddr,ulongcnt),从内存复制数据。
◆lhmemsetup.c。初始化时钟、SMC控制器和SDRAM控制器。
◆wt-arm9.c。设置各种总线时钟,打开数据Cache和指令Cache,并设置相关内存参数。
◆Makefile。直接拷贝board/smdk2400/Makefile,作如下修改:
OBJS:=wt-arm9.oflash.olhmemsetup.o
◆u-boot.lds。设置U-BOOT中各个目标文件的连接地址,直接拷贝board/smdk2400/u-boot.lds,作如下修改:
.text
{
cpu/arm922t/start.o(.text)
*(.text)
}

2.3添加网口设备控制程序

  在drivers/目录中添加网口设备控制程序dm9000.c和dm9000.h,其中dm9000.c主要包括以下函数:
inteth_init(bd_t*bd),初始化网络设备;
voideth_halt(void),关闭网络设备;
inteth_send(volatilevoid*packet,intlen),发送数据包;
inteth_rx(void)接收数据包。
用中断方式处理数据包的收发,因此还定义了另外两个函数:
voidInitInterrupt(void),中断初始化;
voiddm9000_irq(void),中断处理。
以上两个函数在cpu/arm922t/interrupts.c中被调用,最后在drivers/Makefile中加入dm9000.o。

2.4修改Makefile

  在u-boot-1.1.0/Makefile中加入
lh7a400_config:unconfig
@./mkconfig$(@:_config=)armarm922twt-arm9
其中“arm”是CPU的种类,arm922t是ARMCPU对应的代码目录,wt-arm9是自己开发板对应的目录。
交叉编译器安装在/opt/arm/3.3/bin/目录下,所以把CROSS_COMPILE设置成相应的路径:
exportCROSS_COMPILE=/opt/arm/3.3/bin/arm-elf-

2.5生成目标文件

  先运行makeclean,
[zeng@localhostu-boot-1.1.0]$makeclean
然后运行makelh7a400_config,
[zeng@localhostu-boot-1.1.0]$makelh7a400_config
Configuringforlh7a400board...
再运行make,
[zeng@localhostu-boot-1.1.0]$make
之后会生成三个文件:
u-boot――ELF格式的文件,可以被大多数Debug程序识别;
u-boot.bin――二进制bin文件,纯粹的U-BOOT二进制执行代码,不保存ELF格式和调试信息。这个文件一般用于烧录到用户开发板中;
u-boot.srec――MotorolaS-Record格式,可以通过串行口下载到开发板中。

2.6测试

  通过JTAG口将u-boot.bin烧写到Flash的零地址,复位后执行u-boot。若运行正常,会从串口返回如下信息:
U-Boot1.1.0(Aug212004?18:44:37)
U-BooTcode:C3F80000->C3FA51A0BSS:->C3FA96EC
IRQStack:c3f1ff7c
FIQStack:c3f1ef7c
RAMConfiguration:
Bank#0:c00000008MB
Bank#1:c10000008MB
……
Flash:32MB
In:serial
Out:serial
Err:serial
WT-ARM9#

  输入help得到所有命令列表,helpcommand列出该命令的功能。紧接着测试Flash和网卡,如果都正常工作的话,表明移植U-BOOT的工作基本完成,可以接着调试内核和文件系统。

结语

  BootLoader是操作系统和硬件的枢纽,它为操作系统内核的启动提供了必要的条件和参数。在移植过程中,开发人员除了要掌握BootLoader的结构和工作流程外,还要对相关硬件有一定的了解。目前,笔者移植的U-BOOT已经能够稳定地运行在开发板上,而且可以通过Flash和网络加载内核和文件系统,为后续开发,特别是驱动程序的开发奠定了良好的基础。
linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭