您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

用U-BOOT构建嵌入式体系的引导装载步伐

发布日期:2011-04-21

   摘 要:BootLoader(引导装载步伐)是嵌入式体系软件开辟的第一个关键,它把操纵体系和硬件平台衔接在一起,对付嵌入式体系的后续软件开辟非常紧张,在整个开辟中也占据相称大的比例。U-BOOT是当前比较盛行、成果强大的BootLoader,可以支持多种体系布局。LH7A400是Sharp公司生产的一款基于ARM922T内核的32位RISC芯片,本文细致先容U-BOOT的成果、特点以及在LH7A400处理惩罚器上的移植进程。


   关键词:BootLoader U-BOOT移植 LH7A400 ARM922T


引 言:

  本文以U-BOOT为例,先容了如安在ARM9开辟板上移植BootLoader的进程。LH7A400学习板是旋极公司推出的一款高性能嵌入式开辟板,其采取的处理惩罚器LH7A400是Sharp公司生产的一款基于ARM922T内核的32位RISC芯片。该芯片集成了高性能的32位RISC处理惩罚器核ARM922T(运算速率200MHz,总线速率100MHz) ,能使处理惩罚速率到达每秒220百万条指令(MIPS),能耗为1.33mW/MIPS,可以在低电压状态下事变(内核1.8V,输入/输出3.3 V),片内带有锁相回路(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;Sharp 3.5’TFT LCD彩屏;触摸屏;USB Host/Device;CF卡插槽;全成果JTAG接口等。

1 U-BOOT简介

  U-BOOT是由德国的工程师Wolfgang Denk从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-BOOT login
#cvs -z6 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/U-BOOT \ co -P modulename

1.1 U-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-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格局的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前添加了一个特别的头,这个头在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
Image 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函数、内存申请和停止办事等。这些应用步伐还可以在没有操纵体系的环境下运行,是测试硬件体系很好的东西。
◆ 监控(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 rootpath
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 MB
Load Address: 0x00000000
Entry Point: 0x00000000
Contents:
Image 0: 149 Bytes = 0 kB = 0 MB
③ 在U-BOOT中加载并实行这个脚本。
WT-ARM9# tftp 100000 /tftpboot/example.img
ARP broadcast 1
TFTP from server 10.0.0.2; our IP address is 10.0.0.99
Filename ’/tftpboot/TQM860L/example.img’.
Load address: 0x100000
Loading: #
done
Bytes transferred = 221 (dd hex)
WT-ARM9# autoscr 100000
## 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-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芯片手册。它包括如下几个函数:
unsigned long flash_init (void ),Flash初始化;
void flash_print_info (flash_info_t *info),打印Flash信息;
int flash_erase (flash_info_t *info, int s_first, int s_last),Flash擦除;
volatile static int write_dword (flash_info_t *info, ulong dest, ulong data),Flash写入;
int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt),从内存复制数据。
◆ lhmemsetup.c。初始化时钟、SMC控制器和SDRAM控制器。
◆ wt-arm9.c。设置种种总线时钟,打开数据Cache和指令Cache,并设置相干内存参数。
◆ Makefile。直接拷贝board/smdk2400/Makefile,作如下修改:
OBJS := wt-arm9.o flash.o lhmemsetup.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 重要包括以下函数:
int eth_init (bd_t *bd),初始化网络配置;
void eth_halt (void),封闭网络配置;
int eth_send (volatile void *packet,int len),发送数据包;
int eth_rx (void) 吸取数据包。
用停止方法处理惩罚数据包的收发,因此还定义了别的两个函数:
void InitInterrupt (void) ,停止初始化;
void dm9000_irq (void) ,停止处理惩罚。
以上两个函数在cpu/arm922t/interrupts.c中被调用,末了在drivers/Makefile中参加dm9000.o。

2.4 修改Makefile

  在u-boot-1.1.0/Makefile中参加
lh7a400_config : unconfig
@./mkconfig $(@:_config=) arm arm922t wt-arm9
此中“arm”是CPU的种类, arm922t 是ARM CPU映射的代码目次,wt-arm9是本身开辟板映射的目次。
交错编译器安置在/opt/arm/3.3/bin/目次下,以是把CROSS_COMPILE设置成相应的路径:
export CROSS_COMPILE = /opt/arm/3.3/bin/arm-elf-

2.5 天生目标文件

   先运行make clean,
[zeng@localhost u-boot-1.1.0]$make clean
然后运行make lh7a400_config,
[zeng@localhost u-boot-1.1.0]$ make lh7a400_config
Configuring for lh7a400 board...
再运行make,
[zeng@localhost u-boot-1.1.0]$make
之后会天生三个文件:
u-boot——ELF格局的文件,可以被大多数Debug步伐辨认;
u-boot.bin——二进制bin文件,纯粹的U-BOOT二进制实行代码,不生存ELF格局和调试信息。这个文件一样平常用于烧录到用户开辟板中;
u-boot.srec——Motorola S-Record格局,可以通过串行口下载到开辟板中。

2.6 测 试

  通过JTAG口将u-boot.bin烧写到Flash的零地点,复位后实行u-boot。若运行正常,会从串口返回如下信息:
U-Boot 1.1.0 (Aug 21 2004 ?18:44:37)
U-BooT code: C3F80000 -> C3FA51A0 BSS: -> C3FA96EC
IRQ Stack: c3f1ff7c
FIQ Stack: c3f1ef7c
RAM Configuration:
Bank #0: c0000000 8 MB
Bank #1: c1000000 8 MB
……
Flash: 32 MB
In: serial
Out: serial
Err: serial
WT-ARM9 #

  输入help得到全部下令列表,help command 列出该下令的成果。紧接着测试Flash和网卡,要是都正常事变的话,表明移植U-BOOT的事变根本完成,可以接着调试内核和文件体系。

结 语

  BootLoader是操纵体系和硬件的关键,它为操纵体系内核的启动提供了须要的条件和参数。在移植进程中,开辟职员除了要掌握BootLoader的结会商事变流程外,还要对相干硬件有肯定的相识。如今,笔者移植的U-BOOT已经可以或许稳固地运行在开辟板上,并且可以通过Flash和网络加载内核和文件体系,为后续开辟,分外是驱动步伐的开辟奠定了精良的底子。