没有合适的资源?快使用搜索试试~ 我知道了~
首页bootloader-U-Boot详细移植过程
bootloader-U-Boot详细移植过程

摘要:嵌入式系统一般没有通用的bootloader,u-boot是功能强大的bootloader开发软件,但相对也比较复杂。文中对u-boot的启动流程作了介绍,详细给出了u-boot在S3C44B0开发板上的移植方法和步骤。
资源详情
资源评论
资源推荐

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 和 stage 2 两大部分。Bootloader 的基本原理见参考文献。
u-boot 是 Sourceforge 网 站 上 的 一 个 开 放 源 代 码 的 项 目 。 它 可 对
PowerPCMPC5xx、MPC8xx、MPC82xx、MPC7xx、MPC74xx、ARM(ARM7、ARM9、strongARM、X
ScaLe) 、 MIPS(4kc 、 5kc) 、 X86 等 处 理 器 提 供 支 持 , 支 持 的 嵌 入 式 操 作 系 统 有 Linux 、 Vx-
WorkS 、 NetBSD 、 QNX 、 RTEMS 、 ARTOS 、 LynxOS 等 , 主 要 用 来 开 发 嵌 入 式 系 统 初 始 化 代 码
bootloader。软件的主站点是 http//Sourceforge.net/projectS/ u-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.1 stage1 (start.s 代码结构)
u-boot 的 stage1 代码通常放在 start.s 文件中,它用汇编语言写成,其主要代码部分如下:
(1) 定义入口 。由于一个可执行的 IMage 必须有一个入口点,并且只能有一个全局入口,通常这个入口
放在 ROM(flash)的 0x0 地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚
本来完成。
(2)设置异常向量(Exception Vector)。
1

(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)调用一系列的初始化函数。
(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 环境下通过 CVS 下载最新的文件,方法是:
$cVS-dpserVeranonymous@cvc.sourceforge. net/cVSroot/u-boot login
当要求输入匿名登录的密码时,可直接按回车键
$cVS-z6-dpserVeranonyMous@cVS.source Forge.net/cVSroot/u-boot\co.P ModuLenaMe
第二种是通过 ftp//ftp.denx.de/pub/u-boot/ 下载正式发布的压缩文件。
3.2 u-boot 文件的结构
初次下载的文件有很多,解压后存放在 u-boot 文件目录下,具体内容已在 readMe 文件中做了详细的介
绍,其中与移植相关的主要文件夹有:
(1)CPU它的每个子文件夹里都有如下文件:
makefile
config.mk
cpu.c 和处理器相关的代码
interrupts.c 中断处理代码
2

serial.c 串口初始化代码
start.s 全局开始启动代码
(2)BOARD它的每个子文件夹里都有如下文件:
makefile
config.mk
smdk2410.c 和板子相关的代码(以 smdk2410 为例)
flash.c flash 操作代码
memSetup.s 初始化 SDRAM 代码
u-boot.lds 对应的连接文件
(3)lib ARM体系结构下的相关实现代码,比如 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 目录下
# tar jxvf ARM-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/ 下
# 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/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 $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

(3)在 include/configs 目录下添加 myboard.h,在这里可放入全局的宏定义等 也不需要从头创建,可以在
include/configs 目录下寻找相似的 CPU 的头文件进行复制,这里笔者用的是 B2.h 文件来进行相关的修改。
(4) 对 u-boot 根目录下的 makefile 文件进行修改,加入
myboard_config : unconfig
@./Mkconfig $(@:_config=)ARM S3C44B0 myboard
(5) 修改 u-boot 根目录下的 makefile 文件,加入对板子的申明。然后在 makefile 中加入 myboard、LIST
ARM7=″B2 ep7312 IMpa7 myboard″。
(6)运行 make clobber,删除错误的 depend 文件。
(7)运行 make myboard config。
(8)执行到此处即表示整个软件的 makefile 已建立,这时可修改生成的 makefile 中的交叉编译选项,然后
打开 makefile 文件,并找到其中的语句:
ifeq($(ARCH),ARM)
CROSS_COMPILE=ARM-Linux-
end if
接着将其改成
ifeq($(ARCH),ARM)
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 的控制寄存器及启动各阶段程序在 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.cflash 的 驱 动 序 、 /board/myboard /myboard.c(SDRAM 的 驱 动 程 序 ) 、
/CPU/S3C44B0/serial.c(串口的驱动使能部分)等。
/include/config /myboard.h 是全局宏定义的地方,主要的修改有:
将#define CONFIG S3C44B0 CLOCK SPEED 75 改为
4

#define CONFIG S3C44B0 CLOCK SPEED 64;
将 #define PHYS SDRAM1 SI Z E 0x01000000 /*16 MB */ 改为
#define PHYS SDRAM1 SI Z E 0x00800000 /* 8 MB */;
将 #define PHYS FLASH SI Z E 0x00400000 /* 4 MB*改为
#define PHYS FLASH SI Z E 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 Vars*/改为
#define CFG ENV IS IN FLASH1
其它(如堆栈的大小等)可根据需要修改。
由于 flash、SDRAM 的容量会发生变化,故应对启动阶段程序在 flash、SDRAM 中的位置重新作出安排。
笔 者 将 flash 中 的 u-boot 代 码 放 在 0x0 开 始 的 地 方 , 而 将 复制到 SDRAM 中 的 u-boot 代 码 安 排 在
0xc700000 开始的地方。
flash 的修改不仅和容量有关,还和具体型号有关,flash 存储器的烧写和擦除一般不具有通用性,应查看
厂家的使用说明书,针对不同型号的存储器作出相应的修改。修改过程中,需要了解 flash 擦写特定寄存
器的写入地址、数据命令以及扇区的大小和位置,以便进行正确的设置。
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 代码。将得到的 u-boot.bin 通过 JTAG 口下载到目标板后,如果能从
串口输出正确的启动信息,就表明移植基本成功。实际过程中会由于考虑不周而需要多次修改。移植成
功后,也可以添加一些其它功能(如 LCD 驱动等),在此基础上添加功能相对比较容易。
5 结束语
u-boot 是一个功能强大的 bootloader 开发软件,适用的 CPU 平台及支持的嵌入式操作系统很多。本文是
笔者在实际开发过程中根据相关资料进行摸索,并在成功移植了 u-boot 的基础上总结出来的。对于不同
的 CPU 和开发板,其基本的方法和步骤是相同的,希望能对相关嵌入式系统的设计人员有所帮助。
5
剩余34页未读,继续阅读


















qiangxiaoli
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
最新资源
- Xilinx SRIO详解.pptx
- Informatica PowerCenter 10.2 for Centos7.6安装配置说明.pdf
- 现代无线系统射频电路实用设计卷II 英文版.pdf
- 电子产品可靠性设计 自己讲课用的PPT,包括设计方案的可靠性选择,元器件的选择与使用,降额设计,热设计,余度设计,参数优化设计 和 失效分析等
- MPC5744P-DEV-KIT-REVE-QSG.pdf
- 通信原理课程设计报告(ASK FSK PSK Matlab仿真--数字调制技术的仿真实现及性能研究)
- ORIGIN7.0使用说明
- 在VMware Player 3.1.3下安装Redhat Linux详尽步骤
- python学生信息管理系统实现代码
- 西门子MES手册 13 OpcenterEXCR_PortalStudio1_81RB1.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制

评论6