微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > uboot移植详解

uboot移植详解

时间:11-13 来源:互联网 点击:
参考:

嵌入式Linux应用开发完全手册》 韦东山编著 第15章 移植 U-boot

http://xgc94418297.blog.163.com/blog/static/112966040200952971543686/

uboot是一段小程序,它在系统上电是开始执行,初始化硬件设备;准备好软件环境;最后调用操作系统内核。

这里主要分析移植过程。

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

要想使用哪款开发板就需首先执行“make _config”命令进行配置,然后执行“make all”就可生成三个文件,分别是:

U-Boot.bin:二进制可执行文件,可直接烧入ROM、NORFLASH

U-Boot.elf

U-Boot.srec:Motorola S-Record格式的可执行文件

U-Boot编译命令

对于TX2440开发板,编译U-Boot需要执行如下的命令:

$makeTX2440_config

$makeall

使用上面的命令编译U-Boot,编译生成的所有文件都保存在源代码目录中。为了保持源代码目录的干净,可以使用如下命令将编译生成的文件输出到一个外部目录,而不是在源代码目录中,下面的2种方法都将编译生成的文件输出到/tmp/build目录:

$exportBUILD_DIR=/tmp/build

$makeTX2440_config

$makeall

$makeO=/tmp/buildTX2440_config(注意是字母O,而不是数字0)

$makeall

makeTX2440_config命令执行过程

下面分析命令“makeTX2440_config”执行过程,为了简化分析过程这里主要分析将编译目标输出到源代码目录的情况。

TX2410_config:unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t TX2410 NULL s3c24x0

其中的依赖“unconfig”定义如下:

unconfig:

@rm-f$(obj)include/config.h$(obj)include/config.mk\

$(obj)board/*/config.tmp$(obj)board/*/*/config.tmp\

$(obj)include/autoconf.mk$(obj)include/autoconf.mk.dep

其中“@”的作用是执行该命令时不在shell显示。“obj”变量就是编译输出的目录,因此“unconfig”的作用就是清除上次执行make*_config命令生成的配置文件(如include/config.h,include/config.mk等)。

$(MKCONFIG)在上面指定为“$(SRCTREE)/mkconfig”。$(@:_config=)为将传进来的所有参数中的_config替换为空(其中“@”指规则的目标文件名,在这里就是“TX2440_config”。$(text:patternA=patternB),这样的语法表示把text变量每一个元素中结尾的patternA的文本替换为patternB,然后输出)。因此$(@:_config=)的作用就是将TX2440_config中的_config去掉,得到TX2440。

因此@$(MKCONFIG) $(@:_config=) arm arm920t TX2440 NULL s3c24x0”实际上就是执行了如下命令:

./mkconfigTX2440arm arm920t TX2410 NULL s3c24x0

即将“TX2440arm arm920t TX2440 NULL s3c24x0”作为参数传递给当前目录下的mkconfig脚本执行。

在mkconfig脚本中给出了mkconfig的用法:

#Parameters:TargetArchitectureCPUBoard[VENDOR][SOC]

因此传递给mkconfig的参数的意义分别是:

TX2440:Target(目标板型号)

arm:Architecture(目标板的CPU架构)

arm920t:CPU(具体使用的CPU型号)

TX2440:Board

NULL:VENDOR(生产厂家名)

s3c24x0:SOC

下面分步分析mkconfig的作用:

(1)确定开发板的名称BOARD_NAME

APPEND=no #no表示创建新的配置文件,yes表示追加到配置文件中

BOARD_NAME="" #Nametoprintinmakeoutput

TARGETS=""

while[$#-gt0];do

case"$1"in

--)shift;break;;

-a)shift;APPEND=yes;;

-n)shift;BOARD_NAME="${1%%_config}";shift;;

-t)shift;TARGETS="`echo$1|seds:_::g`${TARGETS}";shift;;

*)break;;

esac

done

["${BOARD_NAME}"]||BOARD_NAME="$1"

环境变量$#表示传递给脚本的参数个数,这里的命令有6个参数,因此$#是6。shift的作用是使$1=$2,$2=$3,$3=$4….,而原来的$1将丢失。因此while循环的作用是,依次处理传递给mkconfig脚本的选项。由于我们并没有传递给mkconfig任何的选项,因此while循环中的代码不起作用。

最后将BOARD_NAME的值设置为$1的值,在这里就是“TX2440”。

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

33 if["$SRCTREE"!="$OBJTREE"];then/******判断源代码目录和目标文件目录是否一样,可以选择在其他目录下编译U-boot这可令代码目录保持干净。我们使用的是直接在源代码目录下编译的,第33行不满足,跳到else分支的代码******/

45 else

46 cd./include

47 rm-fasm

48 ln-sasm-$2asm

49 fi

50

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top