UBOOT1.3.4 学习笔记(三) uboot配置过程

/mkconfig文件分析:

mkconfig脚本的6个重要参数:
在主makefile文件中配置:

x210_sd_config :	unconfig
#$(@:_config=)表示目标的_config用“  ”代替,即得到x210_sd
	@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
	#输出TEXT_BASE变量值到 ../x210/config.mk
	@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk
  1. 上述代码确定了mkconfig脚本的6个参数
    $1: x210_sd
    $2: arm
    $3: s5pc11x
    $4: x210
    $5: samsumg
    $6: s5pc110

所以$#: s5pc110

接下来以注释的形式分析mkconfig文件:

11—21行:

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

while [ $# -gt 0 ] ; do   # $#=6,方括号内为真
	case "$1" in          # $1为x21_sd
	--) shift ; break ;;
	-a) shift ; APPEND=yes ;;
	-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
	*)  break ;;          #跳出while
	esac
done                      #所以什么都没做

23—28行:

[ "${BOARD_NAME}" ] || BOARD_NAME="$1"       #BOARD_NAME为空,前面不成立,所以给BOARD_NAME赋值为x21_sd

[ $# -lt 4 ] && exit 1          #如果$#小于4,退出
[ $# -gt 6 ] && exit 1          #如果$#大于6,退出

echo "Configuring for ${BOARD_NAME} board..."   #打印这个,我们执行make x210_sd_config的时候就是打印这句话

33—118行:

都是在创建符号链接:

33—57行:

if [ "$SRCTREE" != "$OBJTREE" ] ; then        #这是使用第二种方法编译,源文件和目标文件不一样,会创建一些文件夹和清理一些文件
	mkdir -p ${OBJTREE}/include
	mkdir -p ${OBJTREE}/include2
	cd ${OBJTREE}/include2
	rm -f asm
	ln -s ${SRCTREE}/include/asm-$2 asm
	LNPREFIX="../../include2/asm/"
	cd ../include
	rm -rf asm-$2
	rm -f asm
	mkdir asm-$2
	ln -s asm-$2 asm
else                                        #这是第一种方法(默认)编译,
	cd ./include                            #跳转到./include目录下,以下都是在这个目录下进行操作,下面的..都代表include
	rm -f asm                               #删除asm
	ln -s asm-$2 asm                        #创建符号链接asm文件指向 asm-arm       1.第一个符号链接
fi
rm -f asm-$2/arch                           #删除asm-arm下的arch文件(夹)
if [ -z "$6" -o "$6" = "NULL" ] ; then      #$6为空或$6="NULL"条件不成立
	ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
	ln -s ${LNPREFIX}arch-$6 asm-$2/arch    #创建链接文件../asm-arm/arch 指向../asm-arm/arch-s5pc110,
fi											#这个文件还要被删的,可能被打补丁了  2.第2个符号链接

83—89行:找到对应的SOC部分即可,其他行被条件编译忽略:

# create link for s5pc11x SoC         #找到对应的SOC,其他的都被条件编译去掉了
if [ "$3" = "s5pc11x" ] ; then        
        rm -f regs.h                  #移除regs.h
        ln -s $6.h regs.h             #创建符号链接regs.h指向../s5pc110.h   3.第3个符号链接
        rm -f asm-$2/arch			  #删掉第二个符号链接
        ln -s arch-$3 asm-$2/arch     #重新在inlcude/asm-arm下创建一个arch文件,指向include/asm-arm/arch-s5pc11x  2.重新创建第2个符号链接
fi

107—110行:

if [ "$2" = "arm" ] ; then                 #条件成立
	rm -f asm-$2/proc                      #移除../asm-arm/proc
	ln -s ${LNPREFIX}proc-armv asm-$2/proc #在inlcude/asm-arm下创建一个proc文件,指向include/asm-arm/proc-armv  4.第4个符号链接
fi

小结:

  1. 第一个:在include目录下创建asm文件,指向asm-arm。(46-48行)

  2. 第二个:在inlcude/asm-arm下创建一个arch文件,指向include/asm-arm/arch-s5pc110

  3. 第三个:在include目录下创建regs.h文件,指向include/s5pc110.h
    删除第二个。

  4. 第四个:在inlcude/asm-arm下创建一个arch文件,指向include/asm-arm/arch-s5pc11x
    第五个:在include/asm-arm下创建一个proc文件,指向include/asm-arm/proc-armv

  5. 一共创建了4个符号链接。这4个符号链接将来在写代码过程中,头文件包含时非常有用。如一个头文件包含可能是:#include <asm/xx.h>,即代表asm-arm/xx.h

121—143行:

# Create include file for Make          
#
echo "ARCH   = $2" >  config.mk         #创建include/config.mk文件,输出ARCH   = arm
echo "CPU    = $3" >> config.mk         #追加输出CPU= s5pc11x
echo "BOARD  = $4" >> config.mk         #追加输出BOARD = x210

[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk #追加输出VENDOR= samsumg

[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk #追加输出SOC = s5pc110  这五个参数用来指导编译

#
# Create board specific header file                  #创建开发板的头文件
#
if [ "$APPEND" = "yes" ]	# Append to existing config file
then
	echo >> config.h
else
	> config.h		# Create new config file       #创建config.h
fi
echo "/* Automatically generated - do not edit */" >>config.h  #追加输出这两句话
echo "#include <configs/$1.h>" >>config.h

exit 0

小结:

  1. 创建include/config.mk文件
    /include/ config.mk内容如下:
ARCH   = arm
CPU    = s5pc11x
BOARD  = x210
VENDOR = samsung
SOC    = s5pc110
  1. 创建include/config.mk文件是为了让主Makefile在第133行去包含的
  2. uboot的配置和编译过程的配合。编译的时候需要ARCH=arm、CPU=xx等这些变量来指导编译,配置的时候就是为编译阶段提供这些变量
  3. 创建(默认方式)/追加(第二种编译方式时)include/config.h文件,文件内容如下:
/* Automatically generated - do not edit */
#include <configs/x210_sd.h>

1). 这个文件里面的内容就一行#include<configs/x210_sd.h>,这个头文件是我们移植x210开发板时,对开发板的宏定义配置文件。这个文件是我们移植x210时最主要的文件
2). x210_sd.h文件会被用来生成一个autoconfig.mk文件,这个文件会被主Makefile引入,指导整个编译过程。这里面的这些宏定义会影响我们对uboot中大部分.c文件中一些条件编译的选择。从而实现最终的可移植性

注意事项:

  1. uboot的整个配置过程,很多文件之间是有关联的(有时候这个文件是在那个文件中创建出来的;有时候这个文件被那个文件包含进去;有时候这个文件是由那个文件的内容生成的决定的)
  2. uboot中配置和编译过程,所有的文件或者全局变量都是字符串形式的(不是指的C语言字符串的概念,指的是都是字符组成的序列)。这意味着我们整个uboot的配置过程都是字符串匹配的,所以一定要细节,注意大小写,要注意不要输错字符,一旦出错,很难排查。

UBOOT的链接脚本:

/board/samsung/x210/u-boot.lds

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)   #指定程序入口地址
SECTIONS
{
	. = 0x00000000;  #链接地址

	. = ALIGN(4);  #4字节对齐
	.text      :  #代码段
	{
	  cpu/s5pc11x/start.o	(.text)           #代码段排序
	  cpu/s5pc11x/s5pc110/cpu_init.o	(.text)
	  board/samsung/x210/lowlevel_init.o	(.text)
          cpu/s5pc11x/onenand_cp.o      (.text)                 
          cpu/s5pc11x/nand_cp.o (.text)                     
          cpu/s5pc11x/movi.o (.text) 
          common/secure_boot.o (.text) 
	  common/ace_sha1.o (.text)
	  cpu/s5pc11x/pmic.o (.text)
	  *(.text)                 #剩下的随便放
	}

	. = ALIGN(4);
	.rodata : { *(.rodata) }    #只读数据段

	. = ALIGN(4);
	.data : { *(.data) }        #数据段

	. = ALIGN(4);
	.got : { *(.got) }          #自定义段

	__u_boot_cmd_start = .;
	.u_boot_cmd : { *(.u_boot_cmd) }            #自定义段
	__u_boot_cmd_end = .;

	. = ALIGN(4);
	.mmudata : { *(.mmudata) }            #自定义段

	. = ALIGN(4);
	__bss_start = .;
	.bss : { *(.bss) }             #bss段
	_end = .;
}

  1. ENTRY(_start)用来指定整个程序的入口地址。所谓入口地址就是整个程序的开头地址,可以认为就是整个程序的第一句指令。有点像C语言中的main。
  2. 指定程序的链接地址有2种方法:一种是在Makefile中ld的flags用-Ttext 0x20000000来指定;第二种是在链接脚本的SECTIONS开头用.=0x20000000来指定。两种都可以实现相同效果。其实,这两种技巧是可以共同配合使用的,也就是说既在链接脚本中指定也在ld flags中用-Ttext来指定。两个都指定以后以-Ttext指定的为准。
  3. uboot的最终链接起始地址就是在Makefile中用-Ttext 来指定的,注意TEXT_BASE变量。最终来源是Makefile中配置对应的命令中,在make xxx_config时得到的。
  4. 在代码段中注意文件排列的顺序。指定必须放在前面部分的那些文件就是那些必须安排在前16KB内的文件,这些文件中的函数在前16KB会被调用。在后面第二部分(16KB之后)中调用的程序,前后顺序就无所谓了。
  5. 链接脚本中除了.text .data .rodata .bss段等编译工具自带的段之外,编译工具还允许我们自定义段。譬如uboot总的.u_boot_cmd段就是自定义段。自定义段很重要,后面再分析。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值