uboot的官网可以通过谷歌搜索得到,显示结果第一个链接就是。
官网::
http://www.denx.de/wiki/U-Boot
ftp下载:
ftp://ftp.denx.de/pub/u-boot/
本文以uboot 2014.07为例,一般第一步总是类似这样:
make smdkc100_config
然后执行make
先看Makefile第481 行
%_config:: outputmakefile
@$(MKCONFIG) -A $(@:_config=)
当输入make smdkc100_config时,就会匹配到%_config目标,%是通配符,即输入XXX_config格式的目标就会匹配到%_config。
MKCONFIG的定义在前面:
MKCONFIG := $(srctree)/mkconfig
export MKCONFIG
srctree的定义:
srctree := $(if $(KBUILD_SRC),$(KBUILD_SRC),$(CURDIR))//if KBUILD_SRC被定义,则srctree=KBUILD_SRC,else = CURDIR,
KBUILD_SRC的定义:
ifeq ($(KBUILD_SRC),)
# OK, Make called in directory where kernel src resides
# Do we want to locate output files in a separate directory?
#O就是output目录变量,使用方法:make O= XXXDIR
ifeq ("$(origin O)", "command line")
#如果O变量来自命令行(origin返回变量的来源)
KBUILD_OUTPUT := $(O)
endif
事实上我没用O去定义KBUILD_SRC变量,所以srctree=当前目录,也就是uboot的目录
objtree := $(CURDIR)
src := $(srctree)
以上语句可翻译为:
smdkc100_config:: outputmakefile
./mkconfig -A $(@:_config=)
这里的规则用了双冒号 ::
1. 双冒号规则中,当依赖文件比目标更新时。规则将会被执行。对于一个没有依赖而只有命令行的双冒号规则,当引用此目标时,规则的命令将会被无条件执行。而普通规则,当规则的目标文件存在时,此规则的命令永远不会被执行(目标文件永远是最新的)。
$(@:_config=):请看Gnu Make中文手册5.3.1 变量的替换引用。
$(@)代表目标smdkc100_config,$(@:_config=):表示用等号后面的内容替代掉:和=之间的内容,=后面为空,那么_config就等于被删去了,$(@:_config=)就代表smdkc100
./mkconfig -A $(@:_config=)
现在可以看mkconfig文件了。mkconfig没有目标,从第一句开始执行:
第一个if段:
if [ \( $# -eq 2 \) -a \( "$1" = "-A" \) ] ; then
# Automatic mode
line=`awk '($0 !~ /^#/ && $7 ~ /^'"$2"'$/) { print $1, $2, $3, $4, $5, $6, $7, $8 }' $srctree/boards.cfg`
if [ -z "$line" ] ; then
echo "make: *** No rule to make target \`$2_config'. Stop." >&2
exit 1
fi
set ${line}
# add default board name if needed
[ $# = 3 ] && set ${line} ${1}
fi
###### $#表示传入参数个数,由上可知$# = 2,符合条件。 -a表示逻辑与。$1表示第一个参数,等于-A,符合条件,所以then后面的语句被执行。
这段代码符号比较多,看起来比较复杂,请百度shell 符号,你会有所收获。
line=`awk**************`
用倒引号``把命令的输出作为字串,如果是"",则里面的内容不被当做命令执行,而是当做纯粹的字符串,但可引用变量
' '单引号内的内容作为字串,但变量$符号不会起作用(忽略任何引用),
单括号()内可以的内容可以执行命令,也就是说,()内先执行,再用''把()的输出当做纯字串,大括号同理。
//斜杠表示里面的内容是正则表达式。
($0 !~ /^#/ && $7 ~ /^'"$2"'$/)
在awk命令里,$不是shell变量符号,而是域标记。但是也有例外:双引号""中的$可以引用变量(参见《LINUX与UNIX
SHELL编程指南》67页,9.2.2节,“域和记录”和第15章,引号),所以这里的$7
为boards.cfg里的域7,而$2则表示mkconfig的第二个参数,没错,就是smdkc100,/^'"$2"'$/表示只包含变量$2的行,依然是smdkc100。
$0表示所有域,$0 !~ /^#/ 意思是,awk排除以#开头的行,这句话用来排除那些以#开头的注释内容。$7 ~ /^'"$2"'$/表示记录的域7必须为smdkc100。
boards.cfg只有下面这行符合条件:
Active arm armv7 s5pc1xx samsung smdkc100 smdkc100
然后执行{ print $1, $2, $3, $4, $5, $6, $7, $8 }
这样line就等于Active arm armv7 s5pc1xx samsung smdkc100 smdkc100
接下来:
set ${line}
# add default board name if needed
[ $# = 3 ] && set ${line} ${1}
set命令
参见《高级bash脚本编程指南》202页
set 命令用来修改内部脚本变量的值.一个作用就是触发选项标志位来帮助决定脚本的行
为.另一个应用就是以一个命令的结果(set `command`)来重新设置脚本的位置参数.脚本
将会从命令的输出中重新分析出位置参数。
所以mkconfig 的位置参数被重新定义为$(line)的内容,即:
$1=Active $2=arm $3=armv7 $4=s5pc1xx
$5=samsung $6=smdkc100 $7=smdkc100
$8=-(注意是短破折号,不是空格)
补充一下,以上排列为:
# Status, Arch, CPU:SPLCPU, SoC, Vendor, Board name, Target, Options
对于[ $# = 3 ] && set ${line} ${1}:
&&的说明参见《LINUX与UNIX SHELL编程指南》6.1 使用&&
这里先判断$# 是否等于 3(明显不等),相等则执行&&右边的命令。那么,直接跳过吧。
1 |
while [ $# -gt 0 ] ; do |
4 |
-a) shift ; APPEND=yes ;; |
5 |
-n) shift ; BOARD_NAME="${7%_config}" ; shift ;; |
6 |
-t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;; |
其实上面的参数都不会匹配到。(没有指定-a -n -t选项)
这里只说一下${7%_config},结果等于smdkc100 ,请百度shell 截取 变量。
%号截取,删除右边字符,保留左边字符
echo ${var%/*}
%/* 表示从右边开始,删除第一个 / 号及右边的字符
实际上$7本身等于smdkc100了,那么${7%_config}依然是smdkc100。
后面的代码比较简单了,实现如下功能:
变量arch="arm"
建立软连接:
arch\arm\include\asm\arch-s5pc1xx 生成链接符号 arch\arm\include\asm\arch
进入include目录
01 |
# Create include file for Make |
03 |
( echo "ARCH = ${arch}" |
04 |
if [ ! -z "$spl_cpu" ] ; then |
05 |
echo 'ifeq ($(CONFIG_SPL_BUILD),y)' |
06 |
echo "CPU = ${spl_cpu}" |
13 |
echo "BOARD = ${board}" |
15 |
[ "${vendor}" ] && echo "VENDOR = ${vendor}" |
16 |
[ "${soc}" ] && echo "SOC = ${soc}" |
include目录下生成config.mk,内容为:
ARCH = arm
CPU = armv7
BOARD = smdkc100
VENDOR = samsung
SOC = s5pc1xx
include目录下创建config.h
for i in ${TARGETS} ; do
i="`echo ${i} | sed '/=/ {s/=/ /;q; } ; { s/$/ 1/; }'`"
echo "#define CONFIG_${i}" >>config.h ;
done
${TARGETS} 为空,所以以上for循环不会被执行。
01 |
echo "#define CONFIG_SYS_ARCH \"${arch}\"" >> config.h |
02 |
echo "#define CONFIG_SYS_CPU \"${cpu}\"" >> config.h |
03 |
echo "#define CONFIG_SYS_BOARD \"${board}\"" >> config.h |
05 |
[ "${vendor}" ] && echo "#define CONFIG_SYS_VENDOR \"${vendor}\"" >> config.h |
07 |
[ "${soc}" ] && echo "#define CONFIG_SYS_SOC \"${soc}\"" >> config.h |
09 |
[ "${board}" ] && echo "#define CONFIG_BOARDDIR board/$BOARDDIR" >> config.h |
10 |
cat << EOF >> config.h |
11 |
#include <config_cmd_defaults.h> |
12 |
#include <config_defaults.h> |
13 |
#include <configs/${CONFIG_NAME}.h> |
14 |
#include <asm/config.h> |
15 |
#include <config_fallbacks.h> |
16 |
#include <config_uncmd_spl.h> |
1 |
cat << EOF >> config.h表示以下内容追加到config.h中,直到出现EOF标记为止。 |
最终config.h内容为:
01 |
/* Automatically generated - do not edit */ |
02 |
#define CONFIG_SYS_ARCH "arm" |
03 |
#define CONFIG_SYS_CPU "armv7" |
04 |
#define CONFIG_SYS_BOARD "smdkc100" |
05 |
#define CONFIG_SYS_VENDOR "samsung" |
06 |
#define CONFIG_SYS_SOC "s5pc1xx" |
07 |
#define CONFIG_BOARDDIR board/samsung/smdkc100 |
08 |
#include <config_cmd_defaults.h> |
09 |
#include <config_defaults.h> |
10 |
#include <configs/smdkc100.h> |
11 |
#include <asm/config.h> |
12 |
#include <config_fallbacks.h> |
13 |
#include <config_uncmd_spl.h> |
- 待续:s5p6818移植 uboot 2014.07 移植
前言: 之前半年一直在嵌入式Linux移植中挣扎,不知道该从哪个方面开始入手,也失败了很多次,苦思了很久最终决定先从uboot开始. uboot版本的不同会导致添加板子的时候的配置方法会不一样.由于手 ...
- u-boot子目录Makefile分析
一.概述 u-boot的子目录Makefile是整个Makefile体系的重要组成部分,决定了对应子目录的编译过程. 二.分析 以cpu/arm920t/Makefile为例进行说明 (1)首先,调用 ...
- uboot主Makefile分析(t配置和编译过程详解)
1.编译uboot前需要三次make make distcleanmake x210_sd_configmake -j4 make distclean为清楚dist文件. make x210_sd_c ...
- uboot主Makefile分析
VERSION = 1 PATCHLEVEL = 3 SUBLEVEL = 4 EXTRAVERSION = U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(S ...
- u-boot剖析(一)----Makefile分析
由于u-boot比较庞大,所以我们分开来分析,对于一个大型的项目我们想快速的了解其代码架构和内容,最方便的方法就是分析Makefile,所以我们今天以三星的s3c2440来分析Makefile.我们今 ...
- u-boot顶层Makefile分析
1.u-boot制作命令 make forlinx_nand_ram256_config: make all; 2.顶层mkconfig分析,参考 U-BOOT顶层目录mkconfig分析 mkcon ...
- uboot 主Makefile分析
一. Makefile 配置 1.1. make xxx_config 1.1.1. 笔者实验时是make x210_sd_config a. x210_sd_config是Makefile下的一个目 ...
- UBoot配置编译及Makefile分析
一. UBoot配置编译初步分析 1. UBoot源码结构 (1)UBoot工程项目中的文件可以分为3类 ① 第1类目录:与处理器体系结构或开发板硬件直接相关 ② 第2类目录:一些通用的函数或驱动程序 ...
- U-Boot启动过程完全分析
U-Boot启动过程完全分析 1.1 U-Boot工作过程 U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下: (1)第一阶段的功能 硬件设备初始化 加载U-Boot第二阶段 ...
随机推荐
- 从零开始学ios开发(五):IOS控件(2),Slider
下面继续学习ios的其他控件,这次会使用到的控件有Slider,当然还有一些之前已经使用过的控件Label. 这次我们不新建一个project了,当然如果你愿意重新创建一个新的项目也完全可以,我们还是 ...
- iOS网络编程同步GET方法请求编程
iOS SDK为HTTP请求提供了同步和异步请求两种不同的API,而且可以使用GET或POST等请求方法.我们先了解其中最为简单的同步GET方法请求. 首先实现查询业务,查询业务请求可以在主视图控制器 ...
- POJ 2315 最小费用最大流
从1走到N然后从N走回来的最短路程是多少? 转换为费用流来建模. 1: /** 2: 因为e ==0 所以 pe[v] pe[v]^1 是两条相对应的边 3: E[pe[v]].c -= aug; E ...
- 20145120 《Java程序设计》第3周学习总结
20145120 <Java程序设计>第3周学习总结 教材学习内容总结 基本类型与类类型的概念 在java里使用数组和字符串 封装的概念 在java定义函数 重载的概念 static的概念 ...
- 特征值分解,奇异值分解(SVD)
特征值分解和奇异值分解在机器学习领域都是属于满地可见的方法.两者有着很紧密的关系,我在接下来会谈到,特征值分解和奇异值分解的目的都是一样,就是提取出一个矩阵最重要的特征. 1. 特征值: 如果说一个向 ...
- GitHub error “Failed to get HEAD”
cd /要提交的文件的文件夹下 比如要提交一个名为 demo的 程序, 那么先进入demo 的文件夹里面 然后 进行以下两步 git init (有时这个是不必要的,因为xcode 自 ...
- z-index兼容问题:关于ie6/7下的z-index
z-index这个属性其实在挺多地方都会用到,在百度上搜索也有大量关于z-index的篇幅去阐述这个属性,特别是在ie6下的z-index处理有更多的相关文章,本文就不再围绕z-index这一属性的基 ...
- WinForm点击按钮在对应的panel里画图
panel在form1里,button在form1上方,panel在下面. 主要是在button1的click时间获取panel的画笔. 下面的不行,在panel里获取画笔,然后传到button1,根 ...
- eclipse svn 修改了类名之后提交
win下面的文件名不区分大小写,所以不能只是把小写类名改成大写. 正确的做法有如下两种:1,先删除类a,提交,此操作会删除服务器上的文件.再添加类A,提交.2,重命名a为aa,提交,此操作会删除服务器 ...
- 2012 Asia Hangzhou Regional Contest
Friend Chains http://acm.hdu.edu.cn/showproblem.php?pid=4460 图的最远两点距离,任意选个点bfs,如果有不能到的点直接-1.然后对于所有距离 ...