K~
U-Boot源码分析及在S3C2440的移植过程
Analysis⋯ofU-B—oo—tandtheProcessofTransplantto$3C2440
许伦辉齐宝岭黄艳国
XuLunhuiOiBaolingHuangYanguo
(江西理工大学机电工程学院,江西赣州341000)
(SchoolofMechanicalandElectricalEngineering,JiangxiUniversityofScienceandTechnology.
JiangxiGanzhou341000)
摘要:BootloaderU-Boot功能齐全,应用广泛,但移植到ARM微处理器$3C2440上相对比较复杂。本文介绍了U—Boot
的源码结构及U-Boot的配置、编译、连接过程,并对U-Boot的启动过程进行了源码分析,重点阐述了U—B00t移植到ARM微处
理器$3C2440的过程。
关键词:Bootloader;U-Boot;移植;嵌入式系统
中图分类号:TP311.54 文献标识码:B 文章编号:1671-4792一(2009)7—0172—03
Abstract:BootloaderU-Boot,Thefunctioniscomplete.theapplicationiswidespread。Butitisrelative-
lyquitecomplexthetransplanttoARMonmicroprocessorof$3C2440.Thisarticleintroducesthesoundcode
structureofU-Boot。theU-Bootdisposition,thetranslation,theconnectionprocess.Theanalysisonthe
soundcodetotheU-Bootstartupprocedure.elaboratedwithemphasisU-BoottransplantstoARMthemicropro-
cessor$3C2440process.
Keywords:Bootloader;U-Boot;Transplant;EmbeddedSystem
0引言
Bootloader是在操作系统内核运行之前运行的一段小
程序。通过这段小程序,我们可以初始化硬件设备,建立内存
空间的映射图,从而将系统的软硬件环境带到一个合适的状
态,以便为最终调用操作系统内核准备好正确的环境,其功
能类似于Pc机的BIOS。Bootloader的实现非常依赖于具体
硬件。在嵌入式系统中,硬件配置千差万别,不可能有一个
Bootloader支持所有的CPU、所有的电路板,所以需要进行
一些移植。嵌入式Linux系统中常用的Bootloader有
U-Boot、VIVI、BIob、RedBoot、APJ4boot等,当前比较流行的是
U-Boot,全称为UniversalBootLoader,即通用Bootload-
er。它是遵循GPL条款的开放源代码项目,可以引导多种操作
系统,如:Linux、NetBSD、VxWorks、QN)(、RTEMS、ARTOS、LynxOS
等;支持多种构架的CPU,如:PowerPC、MIPS、x86、ARM、NIOS、
XScale等:还可以烧写EXT2、JFFS2文件系统映像、支持串口
下载、网络下载。虽然使用较复杂,但是可以用来方便地调试
程序。
1 U—Boot源码结构
本文是在UIBoot-1.1.6的基础上进行分析和移植的。
从sourceforge网站下载U-Boot一1.1.6.tar.bz2,解压后即
】Z2
得到全部源代码。U-BOot的目录结构比较简单,U.Boot.1.
I.6根目录下共有26个子目录,可以分为四类:
①与平台相关的或者开发板相关;
②通用的函数:
④通用的设备驱动程序;
④U-Boot工具、示例程序、文档。
这26个子目录的功能与作用如
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
一所示。
表一26个子目录的功能与作用表
no计d 门挺饭州* 列1w币|叫^己胃frJ仆牡扳(BD仕印u}11¨)
Cpu 甲啬柑笑 x”·可:川f,Jcpu.仟Ef『l的下I]最p们叫咀避岳缃竹
Jbz386类似 簟辛句地下j皿川门之佴
lf忙ludc 砸n1的嘲教 =L上什和JI垃饭配置文竹.圩垃饭的犯置室什血
mcⅢdcun6B●
Libgenetic 堀Jfj的阼m教
通用的函诎.彩恐埘下。·E驱功胛}t'4*J避‘坫封翟
墟川的设鲁驱 恤盘挂IJ柞序
础“I陴 再生H体&蔷的峨动聊件
歙:,赳鹰州盘勰成竹芷任赙蒜的轻柚
空什最境
N4rId-jpl U.[1mot般从ROM,NORr虹h船j曲.琨程升婧盘持
址N^Nn¨a小聊动
Net 齐种叫料悱汉
口‘埔 上电n柠W卑
%州叫钟的憾础
文档 却发,佳/Ij文H
Cxnmple‘ ≈:恻材卑 。蝗嘏试开f弘.坷以使用u电∞t‘F垃后远盯
T凡 制作S-Record.U-Boot格式映像的nTH.比妞mkbmge
万方数据
2U—Boot的配置、编译、连接过程 ④设置好栈:
2.I1U-Boot配置过程 ⑤跳转到第二阶段代码的C入口点。
在顶层Makefile中可以看到如下代码: 现在,C函数的运行环境已经完全准备好了。通过如下 c
SRCTREE:=$(CURDIR) 命令直接跳转,它将调用libarm/board.c中的占
⋯⋯
.
startarmboard函数,这是第二阶段的入口点。
墨
MKCONFIG:=$(SRCTREE)/mkconfigldrpc,一start_armboot—startarmboot:.wordsta_
源
码
‘‘‘‘。。 rtarmboot 分
Smdk241O_config:unconfig 3.2stage2(c语言部分)
析
及
o$(MKCONFIG)$(。:一config=)armarm920tsmdk 第二阶段从lib_arm/board.C中的start_armboot函
在
2410NULLs3c24xO 数开始,同时也是整个启动代码C语言的主函数。该函数主 留
在U_Boot_1.1.6的根目录下编译,实际上就是执行如要完成如下操作:
8
盒
下命令: ①调用一系列初始化函数;
。
的
./mkconfigsmdk2410armarm920tsmdk2410NULL ②初始化flash设备: 移
s3c24xO ④初始化内存分配函数; 植
Mkconfig的作用如下: ④如果目标系统拥有NAND设备,初始化NAND设备;
过
程
①确定开发板名称BOARD_NAME;②创建到平台/开发④如果目标系统有显示设备,初始化显示设备;
板相关头文件的链接;④创建顶层Makefile包含的头文件 ⑥初始化相关网络设备,填写IP、MAC地址,进人命令循
include/config.mk;④创建开发板相关的头文件i旷环,接收用户从串口输入的命令,然后进行相应的工作。
clude/config.h。4U—Boot移植过程
2.22U-Boot的编译、连接过程 本系统开发板是由$3C2440嵌入式微处理器、64M的
①首先编译cpu/$(CPU)/start.S,对于不同的CPU,还NANDFlash、64}4的SDRAM、4个LED以及ARMJTAG接口组
可能编译cpu/$(cPu)下的其他文件; 成,我们将在开发板smdk2410的基础上进行移植。
②对于平台/开发板相关的每个目录、每个通用目录使 (1)新建一个开发板的相应目录和文件
用它们各自的Makefile生成相应的库; 为了不破环原来的代码,在board目录下将smdk2410
⑦将①、②步骤生成的.0,.a文件按照board/$(BOARD-复制为arm2440目录,并将board/arm2440/smdk2410.C改
DIR)/config.mk文件制定的代码起始地址、board/名为arm2440.C。还要在include/configs目录下建立一个
$(BOARDDIR)/U-Boot.1ds链接脚本进行链接:配置文件arm2440.h,可以将include/configs/smdk2410.h
④第④得到的是ELF格式的U-Boot,后面Makefile还直接复制为arm2440.h。
会将它转换为二进制格式、S-Recond格式。 还要修改两个Makefile.首先在顶层Makefile中增加
3U—Boot启动过程源码分析 如下两行:
U-Boot属于两阶段的Bootloader,即stagel和Arm2440_config:unconfig
stage2。依赖于CPU体系结构的代码(如设备初始化代码)通o$(MKCONFIG)$(o:_config=)armarm920arm2440
常都放在stagel,用汇编语言来实现。而stage2通常由CNULLs3c24xO
语言来实现,这样可以实现更复杂的功能,而且有更好的可 然后在board/arm2440/Makefile中进行如下修改:
读性和可移植性。 COBJS.-smdk2410.0flash.0
3.Istagel 改为:
第一阶段的文件为cpu/arm920t/start.S和COBJS:=arm2440.0flash.0
board/smdk2410/lowlevel—init.S。前者是平台相关的,后(2)修改SDRAM的配置
者是开发板相关。 SDRAM的初始化在U-Boot的第一阶段完成。本开发板
①硬件设备初始化,依次完成如下设置:将CPU的工作 的HCLK设为IOOM,需要根据SDRAM芯片的具体参数重新计
模式设为管理模式(SVC),关闭WATCHDOG,设置FCLK、HCLK、算REFCNT寄存器的值,代码修改如下:
PCLK的比例(即设置CLKDIVN寄存器),关闭MMU、CACHE。此舶efineREFCNT1113
部分代码在cpu/arm920t/start.S中; 改为:
④为加载BooSloader的第二阶段代码准备RAM空间。#defineREFCNTOx4f4
对于$3C2440。通过在start.S调用lowlevel—init函数来(3)增加对$3C2440的支持
设置存储控制器,是外接的SDRN.f。此代码在$3C2440是$3C2410的改进版,他们的基本操作相同。
board/smdk2410/lowlevel—init.S中; 不过在系统时钟设置、NANDFlash控制器的操作等方面有
④复制Bootloader的第二阶段代码到RAM空间中;一些小差别。需要修改board/arm2440/arm2440.C中的
173
万方数据
board.一init函数。
(4)选择NORFlash的型号
本开发板所用NORFlash型号为AM29LV800,而配置文
件include/configs/arm2440.h中的默认信号为
AM29LV400.修改如下:
#if0
#defineCONFIG..AM])..LV4001
#endif
#defineCONFIG..AMD..LV8001
现在可以使用loadb、loady等命令通过串口来下载文
件了,它们的效率比JTAG高好几倍。
(5)支持串口xmodem
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
首先在文件开头增加load_serial_xmodem函数的声
明。然后复制load_serial—ymodem函数为load_seri—
al_xmodem,稍作修改。将局部数组ymodembuf改名为
xmodembuf,并在后面使用到的地方统一修改,这只是为了与
函数名称一致,info.mode的值从xyzModemymodem改为
xyzModem_xmodem。重新编译、烧写U-Boot.bin后,就可以使
用loadx命令下载文件了.
(6)支持网卡芯片CS8900
串口传输文件的速率实在太低,现在增加对网卡芯片
CS8900的支持。
U-Boot已经支持了CS8900,它的驱动程序在
drives/cs8900.c中,只要在U-Boot的控制界面中稍加配
置就可以使用网络功能了。首先设置好开发板的IP地址、
MAC地址、服务器IP地址,例如:
Setenvipaddr192.168.1.17
Setenvethaddr08:00:3e:26:Oa:5b
Setenv$erverip192.168.1.11
Saveenv
(7)支持NANDFlash
要让U-Boot支持NANDFlash,首先在配置文件ir卜
clude/configs/arm2440.h的宏CONFIG_COMMANDS中增加
一CMI)一NAND。
#defineCONFIG__com#睛aI)S(CONFIG—CMD—DFLCFGCFG
CMI)_CA
c髓lCFG—CMD—PING[CFG—CMD—NANDI
(8)修改默认配置参数以方便使用
Linux启动参数,增加如下3个宏;
#defineCONFIG_SETUPMEMORY_TAGSl
/.向内核传递内存分布信息’/
#defineCONFIG_CMI)LINE_TAGl
/.向内核传递命令行参数‘/
/.默认命令行参数。/
#defineCONFIG_BOOTAGS。noinitrdroot=/dev/mtd-
block2init:/linux.rcconsole=ttySACO”
自动启动命令,增加如下2个宏:
/.自动启动前延时3s。/
#defineCONFIG_BOOTDELAY3
/‘自动启动的命令‘/
#defineCONFIG_BOOTCOMMAND。nboot0x320000000
0;bootm0x32000000
默认网络设置,根据具体网络环境增加、修改下面4个
宏:
舶efineCONFIG_ETIIADDR08:00:3e:26:0a:Sb
#defineCONFIG_NETMASK255。255.255。0
#defineCONFIG_IPADDR192.168.1.17
#defineCONFIG_SERVERIP192.168.1.11
5结束语
LU-Boot是一款功能强大的Bootloader软件,使用的
CPU平台及操作系统也较多。本文是笔者在开发过程中根据
相关资料进行摸索,并在成功移植U-Boot的基础上总结出
来的。对于不同的CPU和单板,其基本的方法和步骤是一样
的,希望本文对从事嵌入式开发的相关人员有所帮助。
参考文献
【1】韦东山.嵌入式Linux应用开发完全手册[M】.北京:
人民邮电出版社,2008.
【2】李亚锋,欧文盛.ARM嵌入式Linux系统开发从入门
到精通[M】.北京:清华大学出版社。2007.
【3】锐极电子科技有限公司.ARM&Linux嵌入式系统开
发详解[M】.北京:北京航天航空大学出版社,2007.
作者简介
许伦辉(1965一),男,江西南康人,博士,教授,主要研究
方向:智能控制理论及应用;
齐宝岭(1983一),男,山东济南人,硕士研究生,主要研
究方向:控制理论与控制工程。
万方数据