Mini2440 之 U-boot 使用及移植详细手册
2010-4-16
简介
有很多网友基于 mini2440 移植了 U-boot,不过大都是功能比较简单,我们发现网友
Tekkaman 移植的 U-boot 集成了很多其他版本 U-boot 的优点,比如支持 SD 卡、优盘、开机
Logo、USB 下载等,这使得 U-boot 更加方便易用且实用,这和我们公司对产品设计的追求理
念是一致的。遂与其取得联系,并于 2009 年底并提供了各个版本的 mini2440 样品以供测试,
因此你现在可以在 Tekkaman 的代码仓库中下载到支持当前所有 Nand Flash 容量版本
(64M/128M/256M/1GB)的 U-boot 源代码,它完全适用于 mini2440/micro2440。
对于大部分初学者而言,仅仅会下载和编译使用别人移植好的软件或许还是不够的,因此
我们根据网友 Tekkaman 的博客文章为材料,并做了适当的整理和补充,得以形成此手册,以
便其他人学习参考,在此我们十分感谢 Tekkaman 对此付出的努力和贡献。也许有不少网友已
经浏览过他的博客,上面已经有一部分移植的说明文档,但此手册介绍的内容将会更加系统和
细致,因此十分适合打算采用 U-boot 的初学者。
其实我们公司也提供了其他开源的 bootloader,比如 vboot 和 nboot,它们都十分短小精悍
,分别适用于 Linux 和 WinCE 系统,我们认为这对于研究 bootloader 原理和实际的项目应用更
加合适。基于习惯(Linux 爱好者和 Windows 用户向来是有水火不相容的斗争意识)考虑,vboot
是基于 ARM Gcc 开发制作的,nboot 是基于 ADS 开发制作的。
本手册目前主要由友善之臂整理、审阅和发布,我们希望本手册遵循开源软件之自由和共
享的核心精神,但为了避免争议,友善之臂保留本手册的一切解释权,本公司及作者并不提供
关于该手册的任何技术支持。如果你对本手册的内容有任何疑问,可以到 arm9 之家论坛反馈
和交流讨论,我们将会在以后尽量更正,更新后的手册也将在该论坛发布。
另外,本手册是以首页的日期为版本标志的。
广州友善之臂计算机科技有限公司
网址:http://www.arm9.net
ARM9 之家论坛
网址:http://www.arm9home.net
第 1 章 BOOTLOADER的概念与功能 .................................................................................................................... 4
1.1 嵌入式LINUX软件结构与分布 ........................................................................................................................... 4
1.2 在嵌入式LINUX中BOOTLOADER的必要性............................................................................................................. 4
1.3 BOOT LOADER的功能和选择................................................................................................................................. 5
第 2 章 U‐BOOT简介 ............................................................................................................................... ............. 6
2.1 U‐BOOT的起源......................................................................................................................................................... 6
2.2 U‐BOOT的开发情况和资源..................................................................................................................................... 6
第 3 章 开发环境搭建 ......................................................................................................................................... 8
3.1 交叉编译工具链的安装 ................................................................................................................................... 8
3.2 网路服务的设置 ............................................................................................................................................... 8
3.2.1
安装配置
TFTP
服务
............................................................................................................................................ 8
3.2.2
安装配置
NFS
服务
.............................................................................................................................................. 9
3.3 串口终端程序的安装配置 ............................................................................................................................. 10
3.3.1C‐kermit
的安装配置(推荐安装)
................................................................................................................ 10
3.3.2 minicom
的安装配置
................................................................................................................................... 11
第 4 章 熟悉U‐BOOT的使用与烧写.................................................................................................................... 13
4.1 烧写U‐BOOT到MINI2440 开发板....................................................................................................................... 13
4.2 常用U‐BOOT命令详解 ...................................................................................................................................... 13
4.2.1
获取帮助
.......................................................................................................................................................... 13
4.2.2
环境变量与相关指令
...................................................................................................................................... 15
4.2.3
串口传输命令
.................................................................................................................................................. 17
4.2.4
网络命令
.......................................................................................................................................................... 19
4.2.5 NandFlash
操作指令
.................................................................................................................................. 21
4.2.6
内存
/
寄存器操作指令
............................................................................................................................... 24
4.2.7 NorFlash
指令
............................................................................................................................................. 26
4.2.8 USB
操作指令
............................................................................................................................................. 29
4.2.9 SD
卡
(MMC)
指令
......................................................................................................................................... 32
4.2.10 FA T
文件系统指令
....................................................................................................................................... 33
4.2.11
系统引导指令
................................................................................................................................................ 34
4.2.13
其他指令
................................................................................................................................................ 36
4.3 下载与烧写 ..................................................................................................................................................... 37
4.3.1
通过
SD
卡烧入
Nand
Flash
:
..................................................................................................................... 37
4.3.2
通过
U
盘烧入
N
or
Flash
:
......................................................................................................................... 37
4.3.3
通过
TFTP
服务烧入
NandFlash
:
............................................................................................................... 38
4.3.4
通过
NFS
服务烧入
NandFlash
:
................................................................................................................ 38
4.4 内核引导 ......................................................................................................................................................... 39
4.4.1
通过
SD
卡引导内核:
................................................................................................................................ 40
4.4.2
通过
TFTP
服务引导内核
............................................................................................................................. 41
4.4.3
通过
NFS
服务引导内核:
.......................................................................................................................... 41
4.4.4
通过
NandFlash
引导内核:
....................................................................................................................... 42
第 5 章 U‐BOOT源码简要分析 ........................................................................................................................... 44
5.1 U-BOOT源码整体框架 .................................................................................................................................... 44
5.2 U‐BOOT代码的大致执行流程(以S3C24X0 为例)............................................................................................. 45
第 6 章 U‐BOOT在MINI2440 上的移植............................................................................................................... 53
6.1 建立开发板文件,测试编译环境 ................................................................................................................. 53
6.1.1
修改顶层
Makefile ...................................................................................................................................... 53
6.1.2
在
/board
中建立
mini2440
目录和文件
..................................................................................................... 54
6.1.3
在
include/configs/
中建立开发板配置文件
............................................................................................... 54
6.1.4
测试编译环境
............................................................................................................................................ 55
6.2 第一阶段:探索启动代码 ................................................................................................................................ 55
6.2.1
关闭为
AT9200
写的
LED
跳转
...................................................................................................................... 56
6.2.2
修改
CPU
频率初始化设置
.......................................................................................................................... 56
6.2.3
修改
lowlevel_init.S
文件
............................................................................................................................. 57
6.2.4
修改代码重定向部分
................................................................................................................................. 58
6.2.5
增加
LED
的点亮操作
.................................................................................................................................. 66
6.3 第二阶段:修改初始化代码 ............................................................................................................................ 67
6.3.1
修改
lib_arm/board.c
文件
.......................................................................................................................... 68
6.3.2
修改
board/tekkamanninja/mini2440/mini2440.c
文件。
.......................................................................... 69
6.4 第三阶段:完善目标板外设驱动 ................................................................................................................. 73
6.4.1 NandFlash
相关代码的修改
....................................................................................................................... 73
6.4.2
添加
Yaffs(2)
镜像烧写功能
........................................................................................................................ 75
6.4.3
修改
NorFlash
写入功能的代码
................................................................................................................. 79
6.4.4
修改网络相关代码
..................................................................................................................................... 84
6.4.5
添加串口
Xmodem
传输协议(可不修改)
.............................................................................................. 85
6.4.6
添加
LCD
显示功能
...................................................................................................................................... 87
6.4.7
添加
SD
卡(
MMC
)读取功能
................................................................................................................... 92
6.5 第四阶段:修正配置文件 ........................................................................................................................... 108
6.5.1
添加
CONFIG_S3C2440
条件定义
............................................................................................................. 108
6.5.2
修改配置文件
include/configs/mini2440.h .............................................................................................. 116
6.6 重新编译并测试 ........................................................................................................................................... 121
第 7 章 下载最新的源代码 .............................................................................................................................. 121
第1章 BootLoader 的概念与功能
1.1 嵌入式 Linux 软件结构与分布
一般情况下嵌入式 Linux 系统中的软件主要分为以下几部分:
1) 引导加载程序:其中包括内部 ROM 中的固化启动代码和 BootLoader 两部分。
内部固化 ROM 是厂家在芯片生产时候固化的,作用基本上是引导 BootLoader。
有的芯片比较复杂,比如 Omap3 在 flash 中没有代码的时候有许多启动方式:
USB、UART 或以太网等等。而 S3C24x0 则很简单,只有 Norboot 和
Nandboot。
2) Linux kernel 和 drivers。
3) 文件系统。包括根文件系统和建立于 Flash 内存设备之上的文件系统(EXT4、
UBI、CRAMFS 等等)。它是提供管理系统的各种配置文件以及系统执行用户应
用程序的良好运行环境及载体。
4) 应用程序。用户自定义的应用程序,存放于文件系统之中。
在 Flash 存储器中,他们的分布一般如下:
但是以上只是大部分情况下的分布,也有一些可能根文件系统是 initramfs,被一起压缩
到了内核映像里,或者没有 Bootloader 参数区,等等。
1.2 在嵌入式 Linux 中 BootLoader 的必要性
Linux 内核的启动除了内核映像必须在主存的适当位置,CPU 还必须具备一定的条件:
1. CPU 寄存器的设置:
R0=0;
R1=Machine ID(即 Machine Type Number,定义在
linux/arch/arm/tools/mach-types);
R2=内核启动参数在 RAM 中起始基地址;
2. CPU 模式:
必须禁止中断(IRQs 和 FIQs);
CPU 必须 SVC 模式;
3. Cache 和 MMU 的设置:
MMU 必须关闭;
指令 Cache 可以打开也可以关闭;
数据 Cache 必须关闭;
但是在 CPU 刚上电启动的时候,一般连内存控制器都没有初始化过,根本无法在主存中
BootLoader
BootLoader
参数区
Linux
Kernel
根文件系统
其他文件系统……
(被挂载到根文件系统或者作为
运行程序,更不可能处在 Linux 内核启动环境中。为了初始化 CPU 及其他外设,使得 Linux
内核可以在系统主存中运行,并让系统符合 Linux 内核启动的必备条件,必须要有一个先于
内核运行的程序,他就是所谓的引导加载程序(Boot Loader)。
而 BootLoader 并不是 Linux 才需要,而是几乎所有运行操作系统的设备都需要。我们的
PC 的 BOIS 就是 Boot Loader 的一部分(只是前期引导,后面一般还有外存中的各种 Boot
Loader),对于 Linux PC 来说,Boot Loader = BIOS + GRUB/LILO。
1.3 Boot Loader 的功能和选择
综上所述:BootLoader 是在操作系统内核启动之前运行的一段小程序。通过这段程序,
我们可以初始化硬件设备,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用
操作系统内核准备好正确的环境,最后从别处(Flash、以太网、UART)载入内核映像到主
存并跳到入口地址。
由于 BootLoader 需要直接操作硬件,所以它严重依赖于硬件,而且依据所引导的操作
系统的不同,也有不同的选择。对于嵌入式世界中更是如此。就 S3C24x0 而言,如果是引导
Linux,一般选用韩国的 mizi 公司设计的 vivi 或者 DENX 软件工程中心的 Das U-boot,如果
是引导 Win CE,就选用 Eboot。如果是开发 StrongARM 构架下的 LART,就可选用由 Jan-
Derk Bakker 和 Erik Mouw 发布的 Blob(Boot Loader Object)。如果是要引导 eCos 系统,可
以选用同是 Redhat 公司开发的 Redboot。
所以在嵌入式世界中建立一个通用的 BootLoader 几乎是不可能的,而可能的是让一个
Boot Loader 代码支持多种不同的构架和操作系统,并让她有很好的可移植性。U-boot 就是
支持多平台多操作系统的一个杰出代表。这也是 U-boot 的优势所在,因为如果在开发
S3C2440 时熟悉了 U-boot,再转到别的平台的时候,就可以很快地完成这个平台下 U-boot
的移植。而且 U-boot 的代码结构越来越合理,对于新功能的添加也十分容易。
*推荐阅读:嵌入式系统 Boot Loader 技术内幕