TQ2440 学习笔记—— 28、移植U-Boot【U-Boot 的配置过程】

2019-07-13 01:16发布

(韦东山——嵌入式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 / ,就先执行 “ make _config”命令进行配置,然后执行 “ make all ”。 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 目录下新建一个开发板  的目录,则在include/config 目录下也要建立一个文件.h, 里面存放的就是开发板  的配置信息。如下是TQ2440 板子的两个文件。
配置文件可以根据已有的一些开发为模板进行更改。
U-Boot 还没有类似Linux 一样的可视化配置界面(比如使用make menuconfig 来配置),要手动 修改配置文件include/config.h 来裁剪、设置U-Boot。
配置文件中有以下两类宏: (1)一类是选项,前缀为”CONFIG_“,它们用于选择CPU、SOC、开发板类型、设置系统时钟、选择设备驱动等。比如:
(2)另一类是参数,前缀为“CFG_”,它们用于设置 malloc 缓冲池的大小、U-Boot 的提示符、U-Boot 下载文件时的默认加载地址、Flash 的起始地址等。比如:

”CONFIG_“ 除了设置一些参数外,主要用来设置U-Boot 的功能、选择使用文件中的哪一部分;而“CFG_”用来设置更细节的参数。