第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>

如下图所示:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

五分钟 SQL Server 学习入门——基本篇

? 作者:My_heart_ 来源:http://blog.csdn.net/my_heart_/article/details/62425140 首先相信...

3714
来自专栏Samego开发资源

SQLite3增删改查For Android

1856
来自专栏Django Scrapy

day2 oracle相关

数据库定义有三: 1 一门计算机学科 2 代表某个软件 3 某一种数据库软件产生的集合 DDL 数据库定义语句 DML 数据库操作语句 创建一张表: ...

2999
来自专栏Python小屋

Python+SQLite开发无界面版通信录管理系统

本文重点在于演示Python对SQLite数据库的操作,以及命令行式菜单的工作原理和实现。 首先使用SQLite Database Browser创建SQLit...

36213
来自专栏Hongten

python开发_sqlite3_绝对完整_博主推荐

=========================================

704
来自专栏后端之路

有趣的mysql string和0比较返回1的问题

6月19日出现了诡异的情况 开发环境所有的移动端用户无法登陆。 移动端通过rmi来访问,为了移动端可以访问权限内的数据,因此增加了相关的权限控制RMI鉴权 那...

1779
来自专栏性能与架构

体验 Mysql 操作 JSON 文档

新版 Mysql 中加入了对 JSON Document 的支持,可以创建 JSON 类型的字段,并有一套函数支持对JSON的查询、修改等操作,下面就实际体验一...

3133
来自专栏菜鸟致敬

提供免费MySQL数据库学习

最近买了一个服务器,放着也没有什么作用,于是搭建了MySQL 提供大家学习数据使用吧,想知道数据的用户信息请在后台回复MySQL 如果大家有其他想搭建的数据库环...

3389
来自专栏10km的专栏

velocity:宏(#macro)出现中文乱码

最开始使用velocity时,输出中文乱码,我的解决办法 是在调用 mergeTemplate 方法时指定encoding为UTF-8,然后就正常了。 Velo...

1935
来自专栏java学习

oracle数据库的常用的命令操作!

Java基础 | 数据库 | Android | 学习视频 | 学习资料下载 最新通知 数据库技术是计算机科学技术的一个重要分支。从20世纪50年代中期开始,...

3017

扫码关注云+社区