第1阶段——u-boot分析之make 100ask24x0_config指令(1)
本文学习目标:
掌握"make 100ask24x0_config"指令在Makefile和mkconfig文件中是怎么实现配置芯片选型
1.执行make 100ask24x0_config用来配置芯片选型,它执行以下一段,该段在Makefile中定义。
首先打开u-boot-1.1.6/Makefile文件:
87 SRCTREE := $(CURDIR) *CURDIR是make的内嵌变量, 为当前目录
92 MKCONFIG := $(SRCTREE)/mkconfig
1886 100ask24x0_config : unconfig
1887 @$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0
在第82行中,$(SRCTREE)等于$(CURDIR),也就是当前目录u-boot-1.1.6_OpenJTAG,所以MKCONFIG=./mkconfig
在第1886~1887行中,$(@:_config=)的结果就是将 “100ask24x0_config” 中的 “_config” 去掉, 结果为 “100ask24x0” 。
实际执行:
mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0
$0 $1 $2 $3 $4 $5 $6
2.打开mkconfig文件 (用的linux_shell语法,可以参考《精通linux_shell编程教程pdf完整版》以及Linux应用开发手册第264页U-Boot配置过程)
06 # Parameters: Target Architecture CPU Board [VENDOR] [SOC]
在第6行中给出了mkconfig的用法,刚好对应mkconfig(参数) 100ask24x0(目标) arm(架构) arm920t(cpu) 100ask24x0(开发板选型) NULL(供应商) s3c24x0(片上系统/芯片) 。
11 APPEND=no # Default: Create new config file
12 BOARD_NAME="" # Name to print in make output
13
14 while [ $# -gt 0 ] ; do
15 case "$1" in
16 --) shift ; break ;;
17 -a) shift ; APPEND=yes ;;
18 -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
19 *) break ;;
20 esac
21 done
22
23 [ "${BOARD_NAME}" ] || BOARD_NAME="$1"
24
对于“./mkconfig 100ask24x0 arm arm920t smdk2410 NULL s3c24x0”命令,其中没有“--” 、“-a” 、 “-n”等符号,所以第 14~22行没做任何事情。第11、12 行两个变量仍维持原来的值。
执行23行时,||表示左边命令为假时,则执行BOARD_NAME="$1",由于BOARD_NAME一直为空所以执行BOARD_NAME 的值等于第 1个参数,即“100ask24x0” 。
同样 mkconfig="$0",
s3c24x0="$6"
25 [ $# -lt 4 ] && exit 1
26 [ $# -gt 6 ] && exit 1
第25,26行中,其中$#表示总参数个数,-lt为小于(less than),-gt为大于(greater than),&&表示左边命令为真则执行"exit 1",跳出执行。
由于总参数个数为6,所以不满足25,26行条件,所以不跳出继续执行。
31 echo "Configuring for ${BOARD_NAME} board..." *打印Configuring for ${BOARD_NAME} board...
注释,在makefile中
71 BUILD_DIR := $(O)
86 OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR)) * 若$(BUILD_DIR)大于0为真OBJTREE=$(BUILD_DIR),
87 SRCTREE := $(CURDIR) * CURDIR是make的内嵌变量, 为当前目录
在第71行中$(CURDIR)等于0,所以OBJTREE=$(CURDIR),在第87行中SRCTREE := $(CURDIR) ,所以$SRCTREE" == "$OBJTREE.
33 if [ "$SRCTREE" != "$OBJTREE" ] ; then *判断SRCTREE的字符是否不等于OBJTREE,若等于执行else
34~44 ... ... *SRCTREE和OBJTREE是相等的,所以这里不执行
45 else *等于执行else
46 cd ./include *打开子目录include/
47 rm -f asm *删除之前连接名为asm的文件
48 ln -s asm-$2 asm *重新建立一个asm连接文件,指向asm-arm文件(表示选择使用arm架构文件)
49 fi 51 rm -f asm-$2/arch *rm -f asm-arm/arch
53 if [ -z "$6" -o "$6" = "NULL" ] ; then *判断为假,执行ELSE语句
54 ln -s ${LNPREFIX}arch-$3 asm-$2/arch
55 else
56 ln -s ${LNPREFIX}arch-$6 asm-$2/arch *ln -s arch-s3c24x0 asm-arm/arch
57 fi
59 if [ "$2" = "arm" ] ; then *判断为真,$2="arm"
60 rm -f asm-$2/proc *rm -f asm-arm/proc
61 ln -s ${LNPREFIX}proc-armv asm-$2/proc *ln -s proc-armv asm-arm/proc
62 fi 67 echo "ARCH = $2" > config.mk *">":新建config.mk文件,里面内容为ARCH = arm
68 echo "CPU = $3" >> config.mk *">>":追加内容
69 echo "BOARD = $4" >> config.mk
71 [ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk *判断$5存在且不等于NULL
72
73 [ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk *判断$6存在且不等于NULL
第67~73行执行完后,config.mk内容为:
ARCH = arm
CPU = arm920t
BOARD = 100ask24x0
SOC = s3c24x0
如下图所示:

78 if [ "$APPEND" = "yes" ] *在mkconfig第11行中,APPEND=no,所以执行else语句创建config.h
79 then
80 echo >> config.h
81 else
82 > config.h # Create new config file
83 fi
84 echo "/* Automatically generated - do not edit */" >>config.h *追加内容
85 echo "#include <configs/$1.h>" >>config.h *追加内容
87 exit 0 *退出
*第84~85行执行完后,config.mk内容为:
* /* Automatically generated - do not edit */
* #include <configs/100ask24x0.h>
如下图所示:

第1阶段——u-boot分析之make 100ask24x0_config指令(1)的更多相关文章
- 第3阶段——内核启动分析之prepare_namespace()如何挂载根文件系统和mtd分区介绍(6)
内核启动并初始化后,最终目的是像Windows一样能启动应用程序,在windows中每个应用程序都存在C盘.D盘等,而linux中每个应用程序是存放在根文件系统里面,那么挂载根文件系统在哪里,怎么实现 ...
- 第3阶段——内核启动分析之start_kernel初始化函数(5)
内核启动分析之start_kernel初始化函数(init/main.c) stext函数启动内核后,就开始进入start_kernel初始化各个函数, 下面只是浅尝辄止的描述一下函数的功能,很多函数 ...
- 第3阶段——内核启动分析之创建si工程和分析stext启动内核函数(4)
目标: (1)创建Source Insight 工程,方便后面分析如何启动内核的 (2)分析uboot传递参数,链接脚本如何进入stext的 (3) 分析stext函数如何启动内核: (3.1) ...
- 第3阶段——内核启动分析之make uImage编译内核(3)
目标: 通过分析makefile,明白make uImage如何编译内核 把整个内核的makefile分成三类(makefile资料文档在linux-2.6.22.6/Documentation/bu ...
- 团队作业7——alpha阶段之事后诸葛亮分析
事后诸葛亮分析 1. 设想和目标 1.1 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 解决查询物流信息步骤繁琐的问题.定义还算清楚.典型用户主要针对一些不熟悉淘 ...
- STM32F103 ucLinux开发之一(BOOT分析及源码)
STM32F103 ucLinux开发BOOT STM3210E-EVAL官方开发板主芯片STM32F103ZET6: 片内512K Flash,地址0x0800 0000 ~ 0x0807 FFFF ...
- 第3阶段——内核启动分析之make menuconfig内核配置(2)
目标: 分析make menuconfig内核配置过程 在上1小结中(内核编译试验)讲到了3种不同的配置: (1)通过make menuconfig 直接从头到尾配置.config文件 (2) 通过m ...
- uboot第一阶段关键位置分析
/* * the actual reset code */ reset: /* * set the cpu to SVC32 mode */ mrs r0,cpsr bic r0,r0,#0x1f o ...
- Alpha阶段事后诸葛分析
一.设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件主要是解决在宿舍中购买商品的软件,不同于淘宝等软件,本软件主要是用于学生开设的店铺及宿 ...
随机推荐
- 移动玩具[HAOI2008]
题目描述 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩 ...
- CSS3新增文本属性实现图片点击切换效果
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- TASKCTL敏捷调度理念的诠释
功能完整是基本,简单易用才是王道,这就是TASKCTL对敏捷的朴素定义.功能少,怎么复杂也会简单:而功能体系完整,怎么简单也会复杂.因此,简单与复杂是相对的,而TASKCTL正是追求那种在功能完整不可 ...
- 关于Spring事务<tx:annotation-driven/>的理解(Controller可以使用@Transactional)
在使用SpringMvc的时候,配置文件中我们经常看到 annotation-driven 这样的注解,其含义就是支持注解,一般根据前缀 tx.mvc 等也能很直白的理解出来分别的作用.<tx: ...
- Git异常情况汇总
本篇博客总结下Git使用情况中遇到的异常情况并给出解决方案,关于Git的常用命令请移步我的另一篇博客<Git常用命令> 异常情况如下: 1.git远程删除分支后,本地git branch ...
- java编写双色球源代码。-----系统作为彩票双色球生成器,模拟机选一注双色球的彩票号码
package demo2; import java.util.Arrays; import java.util.Random; /** * 系统作为彩票双色球生成器,模拟机选一注双色球的彩票号码: ...
- 【转】WEB网站常见受攻击方式及解决办法
一个网站建立以后,如果不注意安全方面的问题,很容易被人攻击,下面就讨论一下几种漏洞情况和防止攻击的办法. 一.跨站脚本攻击(XSS) 跨站脚本攻击(XSS,Cross-site scripting)是 ...
- Linux学习(1)-常用快捷键、文件管理和查询
有话要说 为什么要用Linux?要用Linux的原因太多,想说说不完啊. 如果你说用Linux只是为了装逼,那证明你真的还很菜.不排除有装逼了因素,那也只占非常少的比例,可以忽略不计. 我们反问一下, ...
- Hadoop-2.8.0 开发环境搭建(Mac)
Hadoop是一个由Apache基金会开发的分布式系统架构,简称HDFS,具有高容错性.可伸缩性等特点,并且可以部署在低配置的硬件上:同时,提供了高吞吐量的数据访问性能,适用于超大数据集的应用程序,以 ...
- 多态性(C#)
在面向对象编程中继承性和多态性是重要机制,前面我为大家分享了我对“类的继承”的理解,哪么今天我就跟大家分享下我对“多态性(C#)”的理解. 首先我们先来看看多态的定义,同一操作作用于不同的对象,可以有 ...