(韦东山——嵌入式Linux 应用开发完全手册)
1、U-Boot 工程简介
U-Boot ,全称为Universal Boot loader, 即通用Bootloader。
它的名字有两重含义:可以引导多种操作系统:Linux、NetBSD、VxWorks0、QNX、RTEMS、ARTOS、Lynx等;
支持多种架构的CPU :PowerPC、MIPS、x86、ARM、NIOS、XScale等。
具有如下特性:
2、U-Boot 源码结构
在 U-Boot-1.1.6 的基础上分析和移植,从sourceforge 网站下载U-Boot-1.1.6.tar.bz2 后解压即可得全部源码。
U-Boot-1.1.6 根目录下共有26个子目录,可以分为4类:
a、平台相关的或开发板相关的。
b、通用的函数。
c、通用的设别驱动程序。
d、U-Boot 工具、示例程序、文档。
U-Boot 顶层目录说明
U-Boot 中各目录的层次结构,分法不绝对,为移植提供指导意义。
3、U-Boot 的配置过程(按照韦东山老师对TQ2440进行更改)
要想了解对于某款开发板,使用哪些文件、哪个文件首先执行、可执行文件占用内存等情况,最好的方法就是阅读它的Makefile。
根据顶层Readme 文件的说明,可以知道如果要使用开发板 board /
U-Boot 的配置过程
在顶层Makefile 中可以看到如下代码
上面的smdk2410是原来的,下面是新增了一个EmbedSky 的。
假定在U-Boot-1.1.6的根目录下编译,则其中的MKCONFIG 就是根目录下的mkconfig文件。
$(@:_config=) 的结果就是将"EmbedSky_config “ 中的” _config “去掉,结果为 ”EmbedSky“;所以” make EmbedSky_config “ 实际上就是执行如下命令:
./mkconfig EmbedSky arm arm920t EmbedSky NULL s3c24x0
mkconfig 的作用,文件中有说明:
# Parameters: Target Architecture CPU Board [VENDOR] [SOC]
解释:对于S3C2440,被称为SoC, 上面除CPU 外,还集成了包括UART、USB 控制器、NAND Flash 控制器等设备(称为片上外设)。S3C2440 中的CPU 为ARM920T。
下面分析mkconfig 的作用:
(1)确定开发板名称 BOARD_NAME,相关代码如下:
对于” ./mkconfig EmbedSky arm arm920t EmbedSky NULL s3c24x0 “命令, 其中没有”--“、”-a“、”-n“等符号,所以第11~22行没做任何事情(它的作用就是分析上面命令的参数)。第11、12 行两个变量仍维持原来的值。
执行完23 行后,BOARD_NAME 的值等于第一个参数,即EmbedSky。
(2)创建到平台/开发板相关的头文件的链接
略过mkconfig 文件中的一些没有起作用的行,如下图所示:
第33行判断源代码目录和目标文件目录是否一样,可以选择在其他目录下编译U-Boot,这可以令源代码目录保持干净,可以同时使用不同的配置进行编译。
OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
如果定义了BUILD_DIR,那就讲BUILD_DIR的值赋值给OBJTREE,否则将CURDIR复制给OBJTREE。我们通过71可以看到BUILD_DIR是没有定义的。故SRCTREE和OBJTREE相等,不符合执行else 语句分支的代码。
第46~48行进入include 目录,删除 asm 文件(这是上一次配置时建立的链接文件),然后再建立asm 文件,并令它链接 向asm-$2 目录,即asm-asm。
继续代码
第51 行删除 asm-$2/arch 目录,即asm-asm/arch 目录。
对于” ./mkconfig EmbedSky arm arm920t EmbedSky NULL s3c24x0 “命令,$6 为 ”s3c24x0“,不为空,也不是“NULL”,所以第53行的条件不满足,将执行else 分支。
第56行中LNPREFIX 为空,所以这个命令实际上就是“ln -s arch-$6 asm-$2/arch”,即“ln -s arch-$6 asm-asm/arch”。
第60、61行重新建立asm-asm/proc 文件,并让它链接向proc-armv目录。
(3)创建顶层Makefile 包含的文件 include/config.mk,如下图所示:
对于” ./mkconfig EmbedSky arm arm920t EmbedSky NULL s3c24x0 “命令,上面的几行代码创建的config.mk 文件内容如下:
(4)创建开发板相关的头文件 include/config.h,如下图所示:
APPEND 维持原值 ”no“,所以config.h被重新建立,它的内容如下:
总结:配置命令”make EmbedSky_config“,实际的作用就是执行 ” ./mkconfig EmbedSky arm arm920t EmbedSky NULL s3c24x0 “命令。假设执行” ./mkconfig $1 $2 $3 $4 $5 $6 “命令,则产生如下结果。
(1)开发的名称BOARD_NAME 等于$1。
(2)创建到平台/开发板相关的头文件的链接,如下图所示:
(3)创建顶层Makefile 包含的文件include/config.mk,如下图所示:
(4)创建开发板相关的头文件include/config.h,如下图所示:
从这4个结果可以知道,如果要在board 目录下新建一个开发板
配置文件可以根据已有的一些开发为模板进行更改。
U-Boot 还没有类似Linux 一样的可视化配置界面(比如使用make menuconfig 来配置),要手动 修改配置文件include/config
配置文件中有以下两类宏:
(1)一类是选项,前缀为”CONFIG_“,它们用于选择CPU、SOC、开发板类型、设置系统时钟、选择设备驱动等。比如:
(2)另一类是参数,前缀为“CFG_”,它们用于设置 malloc 缓冲池的大小、U-Boot 的提示符、U-Boot 下载文件时的默认加载地址、Flash 的起始地址等。比如:
”CONFIG_“ 除了设置一些参数外,主要用来设置U-Boot 的功能、选择使用文件中的哪一部分;而“CFG_”用来设置更细节的参数。