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

(韦东山——嵌入式Linux 应用开发完全手册)

1、U-Boot 工程简介

U-Boot ,全称为Universal Boot  loader, 即通用Bootloader。

它的名字有两重含义:可以引导多种操作系统:Linux、NetBSD、VxWorks0、QNX、RTEMS、ARTOS、Lynx等;

     支持多种架构的CPU :PowerPC、MIPS、x86、ARM、NIOS、XScale等。

具有如下特性:

TQ2440 学习笔记—— 28、移植U-Boot【U-Boot 的配置过程】_第1张图片


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 顶层目录说明

TQ2440 学习笔记—— 28、移植U-Boot【U-Boot 的配置过程】_第2张图片

TQ2440 学习笔记—— 28、移植U-Boot【U-Boot 的配置过程】_第3张图片

U-Boot 中各目录的层次结构,分法不绝对,为移植提供指导意义。

TQ2440 学习笔记—— 28、移植U-Boot【U-Boot 的配置过程】_第4张图片


3、U-Boot 的配置过程(按照韦东山老师对TQ2440进行更改)

要想了解对于某款开发板,使用哪些文件、哪个文件首先执行、可执行文件占用内存等情况,最好的方法就是阅读它的Makefile。

根据顶层Readme 文件的说明,可以知道如果要使用开发板 board / ,就先执行 “ make _config”命令进行配置,然后执行 “ make all ”。

U-Boot 的配置过程

在顶层Makefile 中可以看到如下代码



TQ2440 学习笔记—— 28、移植U-Boot【U-Boot 的配置过程】_第5张图片

上面的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,相关代码如下:

TQ2440 学习笔记—— 28、移植U-Boot【U-Boot 的配置过程】_第6张图片




对于” ./mkconfig EmbedSky  arm  arm920t   EmbedSky  NULL   s3c24x0 “命令, 其中没有”--“、”-a“、”-n“等符号,所以第11~22行没做任何事情(它的作用就是分析上面命令的参数)。第11、12  行两个变量仍维持原来的值。

执行完23 行后,BOARD_NAME 的值等于第一个参数,即EmbedSky。


(2)创建到平台/开发板相关的头文件的链接

  略过mkconfig 文件中的一些没有起作用的行,如下图所示:

TQ2440 学习笔记—— 28、移植U-Boot【U-Boot 的配置过程】_第7张图片


第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。

继续代码

TQ2440 学习笔记—— 28、移植U-Boot【U-Boot 的配置过程】_第8张图片

第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,如下图所示:

TQ2440 学习笔记—— 28、移植U-Boot【U-Boot 的配置过程】_第9张图片

对于” ./mkconfig EmbedSky  arm  arm920t   EmbedSky  NULL   s3c24x0 “命令,上面的几行代码创建的config.mk 文件内容如下:



(4)创建开发板相关的头文件 include/config.h,如下图所示:

TQ2440 学习笔记—— 28、移植U-Boot【U-Boot 的配置过程】_第10张图片

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,如下图所示:

TQ2440 学习笔记—— 28、移植U-Boot【U-Boot 的配置过程】_第11张图片

(4)创建开发板相关的头文件include/config.h,如下图所示:



从这4个结果可以知道,如果要在board 目录下新建一个开发板  的目录,则在include/config 目录下也要建立一个文件.h, 里面存放的就是开发板  的配置信息。如下是TQ2440 板子的两个文件。


配置文件可以根据已有的一些开发为模板进行更改。


U-Boot 还没有类似Linux 一样的可视化配置界面(比如使用make menuconfig 来配置),要手动 修改配置文件include/config.h 来裁剪、设置U-Boot。


配置文件中有以下两类宏:

(1)一类是选项,前缀为”CONFIG_“,它们用于选择CPU、SOC、开发板类型、设置系统时钟、选择设备驱动等。比如:

TQ2440 学习笔记—— 28、移植U-Boot【U-Boot 的配置过程】_第12张图片

(2)另一类是参数,前缀为“CFG_”,它们用于设置 malloc 缓冲池的大小、U-Boot 的提示符、U-Boot 下载文件时的默认加载地址、Flash 的起始地址等。比如:



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

你可能感兴趣的:(处理器【S3C2440】,嵌入式开发【U-Boot】)