U-Boot的配置、编译、连接过程

来源:互联网 发布:淘宝处罚通知 编辑:程序博客网 时间:2024/04/30 05:16

1.U-Boot初体验

在顶层Readme文件中有uboot配置说明Configuration Options(269行)。

2.U-Boot的配置过程

板子的配置被移出了Makefile,放到了一个叫做boards.cfg的文件中,文件格式如下: 

Target(目标)

ARCH(平台)

CPU(芯片)

Board name(板子名字)

Vendor(生产商)

SoCCPU类型)

Options(功能)

am335x_evm

arm

armv7

am335x

ti

ti81xx


和以前的老版本比,配置更加规范化了,其实这些就是相关文件分类的一个文件夹的描述。

在顶层Makefile中可以看到如下代码(592行):

/*******************************************************************************/

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

%_config:: unconfig
 @$(MKCONFIG) -A $(@:_config=)

sinclude $(obj).boards.depend
$(obj).boards.depend: boards.cfg
 awk '(NF && $$1 !~ /^#/) { print $$1 ": " $$1 "_config; $$(MAKE)" }' $< > $@

/*********************************************************************************/

MKCONFIG :=$(SRCTREE)/mkconfig

下面分步骤分析顶层mkconfig的作用

1.确定开发板名称BOARD_NAME,相关代码如下:

APPEND=no # Default: Create new config file
BOARD_NAME="" # Name to print in make output
TARGETS=""

arch=""
cpu=""
board=""
vendor=""
soc=""
options=""

if [ \( $# -eq 2 \) -a \( "$1" = "-A" \) ] ; then
 # Automatic mode
 line=`egrep -i "^[[:space:]]*${2}[[:space:]]" boards.cfg` || {
  echo "make: *** No rule to make target \`$2_config'.  Stop." >&2
  exit 1
 }

 set ${line}
 # add default board name if needed
 [ $# = 3 ] && set ${line} ${1}
fi

while [ $# -gt 0 ] ; do
 case "$1" in
 --) shift ; break ;;
 -a) shift ; APPEND=yes ;;
 -n) shift ; BOARD_NAME="${1%_config}" ; shift ;;
 -t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;;
 *)  break ;;
 esac
done

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

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

/********************************************/

#
# Create link to architecture specific headers
#
if [ "$SRCTREE" != "$OBJTREE" ] ; then
.....

else
 cd ./include
 rm -f asm
 ln -s ../arch/${arch}/include/asm asm
fi

rm -f asm/arch

if [ -z "${soc}" ] ; then
 ln -s ${LNPREFIX}arch-${cpu} asm/arch
else
 ln -s ${LNPREFIX}arch-${soc} asm/arch
fi

if [ "${arch}" = "arm" ] ; then
 rm -f asm/proc
 ln -s ${LNPREFIX}proc-armv asm/proc
fi

 /*******************************************/

3.创建顶层Makefile包含的文件include/config.mk,如下所示:

/********************************************************/

#
# Create include file for Make
#
echo "ARCH   = ${arch}"  >  config.mk
echo "CPU    = ${cpu}"   >> config.mk
echo "BOARD  = ${board}" >> config.mk

[ "${vendor}" ] && echo "VENDOR = ${vendor}" >> config.mk

[ "${soc}"    ] && echo "SOC    = ${soc}"    >> config.mk

/*******************************************************************/

4.创建开发板相关的头文件 include/config.h

/*****************************************************************/

#
# Create board specific header file
#
if [ "$APPEND" = "yes" ] # Append to existing config file
then
 echo >> config.h
else
 > config.h  # Create new config file
fi
echo "/* Automatically generated - do not edit */" >>config.h

for i in ${TARGETS} ; do
 i="`echo ${i} | sed '/=/ {s/=/ /;q; } ; { s/$/ 1/; }'`"
 echo "#define CONFIG_${i}" >>config.h ;
done

/**************************************************************/

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

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

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

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

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

 3.U-Boot的编译、连接过程

从Makefile中可以了解U-Boot使用了哪些文件、哪个文件首先执行、可执行文件占用内存的情况。

先确定用到哪些文件,下面所示为Makefile中与ARM相关的部分。

/*****************************************************************/

155:# load ARCH, BOARD, and CPU configuration
include $(obj)include/config.mk
export ARCH CPU BOARD VENDOR SOC

# set default to nothing for native builds
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE ?=
endif

# load other configuration
include $(TOPDIR)/config.mk

原创粉丝点击