博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uboot配置过程详解1
阅读量:5080 次
发布时间:2019-06-12

本文共 3733 字,大约阅读时间需要 12 分钟。

x210_sd_config :    unconfig    @$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110    @echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk

$@--目标文件(x210_sd_config)的_config用空格来代替(=(空)),所以第一个变量就变成x210_sd

 

Makefile有三个非常有用的变量。分别是$@,$^,$<代表的意义分别是:

$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。

 

以下为mkconfig的源码解释

APPEND=no	# Default: Create new config file进来先定义2个变量 BOARD_NAME=""	# Name to print in make outputwhile [ $# -gt 0 ] ; do	case "$1" in	--) shift ; break ;;	-a) shift ; APPEND=yes ;;	-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;	*)  break ;;	esacdone

  

// $#这里等于6 因为调用config这个配置的时候传了6个参数分别为$1= x210_sd、$2=arm、$3=s5pc11x、$4=x210、$5=samsumg、$6=s5pc110、

  $1(x210_sd)传进去用switch语句来判断是哪个case,在脚本里case 是会自动跳出的,如果加了break表示跳出while循环,且*表示任何情况。

 

 

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

  可以理解为简列的if语句,如果${BOARD_NAME}成立BOARD_NAME=“$1"就不执行,则反。其实就是看BOARD_NAME变量是否有值,如果有值就维持不变;如果无值就给他赋值为$1,实际分析结果:BOARD_NAME=x210_sd,前面刚开始定义变量就已经赋空了(BOARD_NAME="")。

 

[ $# -lt 4 ] && exit 1     //if($#<4)  return 1[ $# -gt 6 ] && exit 1    //if($#>6)  return 1echo "Configuring for ${BOARD_NAME} board..."

  传参的时候只能4、5、6个参数

 

#  创建符号链接# Create link to architecture specific headers#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 asmelse    cd ./include    rm -f asm    ln -s asm-$2 asmfirm -f asm-$2/archif [ -z "$6" -o "$6" = "NULL" ] ; then    ln -s ${LNPREFIX}arch-$3 asm-$2/archelse    ln -s ${LNPREFIX}arch-$6 asm-$2/archfi# create link for s3c24xx SoCif [ "$3" = "s3c24xx" ] ; then    rm -f regs.h    ln -s $6.h regs.h    rm -f asm-$2/arch    ln -s arch-$3 asm-$2/archfi# create link for s3c64xx SoCif [ "$3" = "s3c64xx" ] ; then    rm -f regs.h    ln -s $6.h regs.h    rm -f asm-$2/arch    ln -s arch-$3 asm-$2/archfi# create link for s5pc1xx SoCif [ "$3" = "s5pc1xx" ] ; then        rm -f regs.h        ln -s $6.h regs.h        rm -f asm-$2/arch        ln -s arch-$3 asm-$2/archfi# create link for s5pc11x SoCif [ "$3" = "s5pc11x" ] ; then        rm -f regs.h        ln -s $6.h regs.h        rm -f asm-$2/arch        ln -s arch-$3 asm-$2/archfi# create link for s5p64xx SoCif [ "$3" = "s5p64xx" ] ; then    rm -f regs.h    ln -s $6.h regs.h    rm -f asm-$2/arch    ln -s arch-$3 asm-$2/archfi# create link for s5p644x SoCif [ "$3" = "s5p644x" ] ; then    rm -f regs.h    ln -s $6.h regs.h    rm -f asm-$2/arch    ln -s arch-$3 asm-$2/archfiif [ "$2" = "arm" ] ; then    rm -f asm-$2/proc    ln -s ${LNPREFIX}proc-armv asm-$2/procfi# create link for s3c64xx-mp SoCif [ "$3" = "s3c64xx-mp" ] ; then    rm -f regs.h    ln -s $6.h regs.h    rm -f asm-$2/arch    ln -s arch-$3 asm-$2/archfi

从第33行到第118行,都是在创建符号链接。为什么要创建符号链接?这些符号链接文件的存在就是整个配置过程的核心,这些符号链接文件(文件夹)的主要作用是给头文件包含等过程提供指向性连接。根本目的是让uboot具有可移植性。

uboot可移植性的实现原理:在uboot中有很多彼此平行的代码,各自属于各自不同的架构/CPU/开发板,我们在具体到一个开发板的编译时用符号连接的方式提供一个具体的名字的文件夹供编译时使用。这样就可以在配置的过程中通过不同的配置使用不同的文件,就可以正确的包含正确的文件。

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

第二个:在inlcude/asm-arm下创建一个arch文件,指向include/asm-arm/arch-s5pc110
第三个:在include目录下创建regs.h文件,指向include/s5pc110.h
删除第二个。
第四个:在inlcude/asm-arm下创建一个arch文件,指向include/asm-arm/arch-s5pc11x
第五个:在include/asm-arm下创建一个proc文件,指向include/asm-arm/proc-armv

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

 

注意:uboot的整个配置过程,很多文件之间是有关联的(有时候这个文件是在那个文件中创建出来的;有时候这个文件被那个文件包含进去;有时候这个文件是由那个文件的内容生成的决定的)

注意:uboot中配置和编译过程,所有的文件或者全局变量都是字符串形式的(不是指的C语言字符串的概念,指的是都是字符组成的序列)。这意味着我们整个uboot的配置过程都是字符串匹配的,所以一定要细节,注意大小写,要注意不要输错字符,因为一旦错一个最后会出现一些莫名其妙的错误,很难排查,这个是uboot移植过程中新手来说最难的地方。

转载于:https://www.cnblogs.com/yygsj/p/5312979.html

你可能感兴趣的文章
windows下redis 配置文件参数说明
查看>>
Nginx缓存、压缩配置
查看>>
内网渗透笔记---msf
查看>>
小计一次linux下渗透方法
查看>>
移动开发小技巧
查看>>
linux基本命令(2)-备份压缩命令
查看>>
2.拷贝控制操作(三/五法则)
查看>>
Ubuntu11.04添加笔记本的触摸板的管理工具
查看>>
毕业论文排版
查看>>
主机多网卡负载均衡-HP-APA,sun-multipathing,linux-bond
查看>>
设计模式之命令模式
查看>>
通过ajax获取一个多位数,当容器显示在屏幕可视区时,让数字以滚动的形式显示...
查看>>
powershell玩转SQL SERVER所有版本
查看>>
java 中的多线程简单介绍
查看>>
下拉菜单被挡住了,DIV置于最底层的方法
查看>>
[转]想靠写程序赚更多钱,写到两眼通红,写得比别人都又快又好好几倍,结果又能如何?...
查看>>
验证 结构体指针与自增运算符
查看>>
实现勾选框选中之后加个勾
查看>>
VSFlexGrid控件
查看>>
Scrum Meeting---Nine(2015-11-4)
查看>>