uboot的make config操作
来源:互联网 发布:什么是注解java 编辑:程序博客网 时间:2024/05/16 14:21
一种是在boards.cfg里面配置
另外一种是直接写到makefile里面
直接写在MakeFile里面的那种提示需要移植。。所以还是建议使用写在boards.cfg里面的
在boards.cfg里面配置
1 在boards.cfg里面配置新的开发板的数据。主要有
# Target ARCH CPU Board name Vendor SoC Options
rpi_b arm arm1176 rpi_b raspberry bcm2835
2 执行make ARCH=arm CROSS_COMPILE=XXX/XXX/arm-linux-gnu-eabihf- rpi_b_config
产生配置文件
过程是。
执行 rpi_b_config目标的时候
匹配到
%_config:: unconfig
@$(MKCONFIG) -A $(@:_config=)
unconfig主要是删除前一次配置的config.mk和config.h等文件
然后调用当前目录下的mkconfig脚本来实现配置
$(@:_config=)意思是将_config用等号后面的代替,这里等号后为空。所以就是去掉_config。
make rpi_b_config--->mkconfig -A rpi_b
另外一种是直接在MakeFile里面编辑xxx_config后面跟这个脚本
比如
@$(MKCONFIG) smdk6400 arm arm1176 smdk6400 samsung s3c64xx
这样直接传递这几个变量。
继续看mkconfig做的操作
//默认创建新的文件
APPEND=no # Default: Create new config file
//板子的名字
BOARD_NAME="" # Name to print in make output
//
TARGETS=""
arch=""
cpu=""
board=""
vendor=""
soc=""
options=""
$#表示参数个数。 mkconfig -A rpi_b
这里的意思是如果参数个数为2 并且第一个参数为-A
if [ \( $# -eq 2 \) -a \( "$1" = "-A" \) ] ; then
# Automatic mode
那么去borads.cfg里面根据${2}也就是 rpi_b 寻找匹配的配置行。
如果没有找到。显示错误
line=`egrep -i "^[[:space:]]*${2}[[:space:]]" boards.cfg` || {
echo "make: *** No rule to make target \`$2_config'. Stop." >&2
exit 1
}
解析出来Line为6为那一行的数据个数,一般是6个,有些是7个。分别是
# Target ARCH CPU Board name Vendor SoC Options
通过set {}line}以后 设置了6个参数。原来的参数就没了。
set ${line}
参数已经变成6个了
# add default board name if needed
#设置以后。如果参数是三个的话(这里是6个参数。所以不会执行后面的 set ${line} ${1})。
[ $# = 3 ] && set ${line} ${1}
elif [ "${MAKEFLAGS+set}${MAKELEVEL+set}" = "setset" ] ; then
# only warn when using a config target in the Makefile
cat <<-EOF
如果是从从MakeFile操作得到的配置参数。那么提醒移植到boards.cfg里面。
后续估计会全部使用boards.cfg来操作
warning: Please migrate to boards.cfg. Failure to do so will
mean removal of your board in the next release.
EOF
sleep 5
fi
参数1-6分别是rpi_b arm arm1176 rpi_b raspberrypi bcm2835
参数0是脚本自己的名字
while [ $# -gt 0 ] ; do
如果参数1是 -- -a -n -t 分别执行对应的赋值操作,否则直接break。shift就是把参数移一位,原来的参数2变成参数1,参数1就不要了。
由于这里第一个参数是rpi_b。所以执行最后的* break操作
case "$1" in
--) shift ; break ;;
-a) shift ; APPEND=yes ;;
-n) shift ; BOARD_NAME="${1%_config}" ; shift ;;
-t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;;
*) break ;;
esac
done
如果参数小于4个,或者参数大于7个。退出
[ $# -lt 4 ] && exit 1
[ $# -gt 7 ] && exit 1
# Strip all options and/or _config suffixes
将xxx_config的xxx赋值给CONFIG_NAME,那么这里CONFIG_NAME=rpi_b
CONFIG_NAME="${1%_config}"
如果"${BOARD_NAME}"为NULL那么BOARD_NAME=rpi_b.跟前面的一样
[ "${BOARD_NAME}" ] || BOARD_NAME="${1%_config}"
架构arch=参数2.这里就是arm
arch="$2"
如果有其他的CPU那么cpu=前一个。spl_cpu=后一个
比如 armv7:arm623el中间用冒号分割
cpu=`echo $3 | awk 'BEGIN {FS = ":"} ; {print $1}'`
spl_cpu=`echo $3 | awk 'BEGIN {FS = ":"} ; {print $2}'`
这里只有
cpu=arm1176
spl_cpu=空
if [ "$4" = "-" ] ; then
board=${BOARD_NAME}
else
board="$4"
fi
如果参数4是-那么 board=$BOARD_NAME=rpi_b,否则board=参数4=还是rpi_b
[ $# -gt 4 ] && [ "$5" != "-" ] && vendor="$5"
[ $# -gt 5 ] && [ "$6" != "-" ] && soc="$6"
如果参数5 和6 不为空并且不为- 那么分别赋值vendor=$5 soc=$6 这里vendor=raspberrypi soc=bcm2835
如果还有第七个参数并且不为- 这里没有第七个参数。那么就不看了。到时候需要再分析
[ $# -gt 6 ] && [ "$7" != "-" ] && {
# check if we have a board config name in the options field
# the options field mave have a board config name and a list
# of options, both separated by a colon (':'); the options are
# separated by commas (',').
#
# Check for board name
tmp="${7%:*}"
if [ "$tmp" ] ; then
CONFIG_NAME="$tmp"
fi
# Check if we only have a colon...
if [ "${tmp}" != "$7" ] ; then
options=${7#*:}
TARGETS="`echo ${options} | sed 's:,: :g'` ${TARGETS}"
fi
}
如果make ARCH=xxx 这里的xxx和前面赋值的arch不匹配,错误退出。我们make的时候ARCH=arm。$arch也是arm,这样才正确。
if [ "${ARCH}" -a "${ARCH}" != "${arch}" ]; then
echo "Failed: \$ARCH=${ARCH}, should be '${arch}' for ${BOARD_NAME}" 1>&2
exit 1
fi
这里没有第7个参数options,所以输出 Configuring for rpi_b borad...
if [ "$options" ] ; then
echo "Configuring for ${BOARD_NAME} - Board: ${CONFIG_NAME}, Options: ${options}"
else
echo "Configuring for ${BOARD_NAME} board..."
fi
#
# Create link to architecture specific headers
#
如果源码树和构建树不在同一个目录。我们的源码树和构建目录是在同一个目录的。所以进入else部分
if [ "$SRCTREE" != "$OBJTREE" ] ; then
mkdir -p ${OBJTREE}/include
mkdir -p ${OBJTREE}/include2
cd ${OBJTREE}/include2
rm -f asm
ln -s ${SRCTREE}/arch/${arch}/include/asm asm
LNPREFIX=${SRCTREE}/arch/${arch}/include/asm/
cd ../include
mkdir -p asm
else
进入include目录
cd ./include
删除asm链接
rm -f asm
将../arch/$arch/include/asm 链接到asm。
这里就是./include目录里面的asm指向 arch/arm/include/asm
ln -s ../arch/${arch}/include/asm asm
fi
这里前面已经进入了include目录,后续的操作都是在include目录里面
删除 asm下面的arch(也是一个软链接)
rm -f asm/arch
如果存在soc。那么链接 arch-$soc到asm/arch
否则链接 arch-$cpu 到asm/arch
这里我们soc是bcm2835
所以链接arch-bcm2835到asm/arch
if [ -z "${soc}" ] ; then
ln -s ${LNPREFIX}arch-${cpu} asm/arch
else
ln -s ${LNPREFIX}arch-${soc} asm/arch
fi
如果架构是arm。删除asm/proc。将proc-armv链接到 asm/proc
if [ "${arch}" = "arm" ] ; then
rm -f asm/proc
ln -s ${LNPREFIX}proc-armv asm/proc
fi
CONFIG_SPL_BUILD是另一个配置。(没有splcpu的话就不会有下面的。我们这里是没有的。但是还是标记稍微解释一下)
uboot分为
BL0, BL1, BL2
BL0是romcode
BL1是spl 通过CONFIG_SPL_BUILD来确定。
BL2是狭义uboot
这里先标记。后续再看怎么解释
#
# Create include file for Make
#
( echo "ARCH = ${arch}"
if [ ! -z "$spl_cpu" ] ; then
echo 'ifeq ($(CONFIG_SPL_BUILD),y)'
echo "CPU = ${spl_cpu}"
echo "else"
echo "CPU = ${cpu}"
echo "endif"
else
echo "CPU = ${cpu}"
fi
echo "BOARD = ${board}"
[ "${vendor}" ] && echo "VENDOR = ${vendor}"
[ "${soc}" ] && echo "SOC = ${soc}"
exit 0 ) > config.mk
将ARCH=arm
CPU=arm1176
BOARD=rpi_b
VENDOR="raspberrypi"
SOC=bcm2835
写入config.mk
# Assign board directory to BOARDIR variable
if [ -z "${vendor}" ] ; then
BOARDDIR=${board}
else
BOARDDIR=${vendor}/${board}
fi
在uboot源码的board目录下
如果有厂商名字。那么BOARDDIR=${vendor}/${board}。这里就是raspberrypi/rpi_b
如果没有的话那么就直接是 ${board}
#
# Create board specific header file
#
创建板子指定的头文件
如果是append,那么就append到config.h里面
由于我们不是append。所以就是创建一个config.h
if [ "$APPEND" = "yes" ] # Append to existing config file
then
echo >> config.h
else
> config.h # Create new config file
fi
echo "/* Automatically generated - do not edit */" >>config.h
由于targets为NULL。所以循环不执行
for i in ${TARGETS} ; do
i="`echo ${i} | sed '/=/ {s/=//;q; } ; { s/$/1/; }'`"
echo "#define CONFIG_${i}" >>config.h ;
done
将这些定义变量写入config.h
echo "#define CONFIG_SYS_ARCH \"${arch}\"" >> config.h
echo "#define CONFIG_SYS_CPU \"${cpu}\"" >> config.h
echo "#define CONFIG_SYS_BOARD \"${board}\"" >> config.h
如果厂商和soc都存在的话。也写入
[ "${vendor}" ] && echo "#define CONFIG_SYS_VENDOR \"${vendor}\"" >> config.h
[ "${soc}" ] && echo "#define CONFIG_SYS_SOC \"${soc}\"" >> config.h
追加以下内容
cat << EOF >> config.h
这里board/$BOARDDIR 是board/raspberry/rpi
#define CONFIG_BOARDDIR board/$BOARDDIR
#include <config_cmd_defaults.h>
#include <config_defaults.h>
//这里 configs/${CONFIG_NAME}.h 是configs/rpi_b.h
#include <configs/${CONFIG_NAME}.h>
#include <asm/config.h>
#include <config_fallbacks.h>
#include <config_uncmd_spl.h>
EOF
退出。
exit 0
主要是
1 写入了config.mk
ARCH = arm
CPU = arm1176
BOARD = rpi_b
VENDOR = raspberrypi
SOC = bcm2835
2 写入了config.h
/* Automatically generated - do not edit */
#define CONFIG_SYS_ARCH "arm"
#define CONFIG_SYS_CPU "arm1176"
#define CONFIG_SYS_BOARD "rpi_b"
#define CONFIG_SYS_VENDOR "raspberrypi"
#define CONFIG_SYS_SOC "bcm2835"
#define CONFIG_BOARDDIR board/raspberrypi/rpi_b
#include <config_cmd_defaults.h>
#include <config_defaults.h>
#include <configs/rpi_b.h>
#include <asm/config.h>
#include <config_fallbacks.h>
#include <config_uncmd_spl.h>
2 建立了一些软链接
/arch/arm/include/asm-->include/asm
/arch/arm/include/asm/arch-bcm2835--->include/include/asm/arch
/arch/arm/include/asm/proc-armv--->include/include/asm/proc
- uboot的make config操作
- Uboot make config
- uboot 中的 config ,make config是怎么来的。
- 几个make config的作用
- 几个make config的作用
- make config,make menuconfig,make oldconfig,make xconfig,make defconfig,make gconfig 的简单介绍
- make config
- make config
- make *config
- make config
- 关于uboot的makefile 和 make zImage
- uboot的.boards.depend和make rpi_b
- uboot下make xxx_config的由来
- 编译uboot错误--make clean 和 make distclean的区别
- uboot中makefile的config的生成
- uboot移植:uboot下的config.mk解析
- config, make , make install
- config,make,make install
- 我不是一个能坚持做一件事情的人?
- android staticlayout使用讲解
- Hibernate(二) Hibernate基本查询
- jquery 获取easyui combobox选中的值
- spark算子系列文章
- uboot的make config操作
- PDF转换成jpg格式应该怎么转
- 客户端重要的的javascript技术 七
- NLP第一课--语言模型
- SSH登录:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
- 使用nodejs读取简体语言json文件并生成繁体语言json文件
- django 实战教程一 -- 初探
- iOS10适配教程
- css3边框 圆角 阴影