(三)u-boot2013.01.01 for s5pv210:《mkconfig分析》

来源:互联网 发布:网络直播受众范围 编辑:程序博客网 时间:2024/06/01 11:20

转载地址:http://blog.csdn.net/zsy2020314/article/details/9312147


[cpp] view plaincopy
  1. /* 和分析makefile一样,分析mkconfig同样注重句法分析 */  
  2. #####################################################################  
  3. #!/bin/sh -e  
  4. # 上面这句指定执行该脚本所使用的解释器, -e相当于使用/bin/bash  
  5. # Script to create header files and links to configure  
  6. # U-Boot for a specific board.  
  7. # Parameters:  Target  Architecture  CPU  Board [VENDOR] [SOC]  
  8. # (C) 2002-2010 DENX Software Engineering, Wolfgang Denk <wd@denx.de>  
  9. #  
  10. #####################################################################  
  11. # mkconfig脚本文件存在的理由:因为uboot是一个多CPU多架构的统一bootloader,为了完成针  
  12. # 对特定目标单板,目标架构的编译,需要给Makefile指明,哪些文件需要编译,相当与从整体上控制  
  13. # 需要编译的cpu,单板等。  
  14. # 当执行make xxx_config U-boot时就会调用这个mkconfig文件。mkconfig会处理单板信息  
  15. # (在boards.cfg文件中定义有各种单板信息,smdkc100_config只是其中一个)并生成单板信息到  
  16. # U-boot源码顶层目录/include/config.mk这个文件中(会自动创建)。  
  17. # 以make smdkc100_config为例,执行成功后,mkconfig会产生5个变量分别为:  
  18. #   ARCH   CPU    BOARD    VENDOR   SOC  
  19. #   arm   armv7  smdkc100  samsung s5pc1xx  
  20. # (ARCH=目标板的CPU架构   CPU=具体使用的CPU型号   BOARD = 目标板名称  SOC = 芯片名称)  
  21.   
  22. APPEND=no       # 默认创建一个新的配置文件  
  23. BOARD_NAME=""   # make 执行xxx_config的时候打印输出单板名  
  24. TARGETS=""  
  25.   
  26. arch=""  
  27. cpu=""  
  28. board=""  
  29. vendor=""  
  30. soc=""  
  31. options=""  
  32. #####################################################################  
  33. # SHELL常用内部参数:    
  34. # $# ----传递给程序的总的参数数目  
  35. # $? ----上一个代码或者shell程序在shell中退出的情况,如果正常退出则返回0,反之为非0值。  
  36. # $* ----传递给程序的所有参数组成的字符串。  
  37. # $n ----表示第几个参数,$1 表示第一个参数,$2 表示第二个参数 ...   
  38. # $0 ----当前程序的名称  
  39. # $@ ----以"参数1" "参数2" ... 形式保存所有参数  
  40. # $$ ----本程序的(进程ID号)PID  
  41. # $! ----上一个命令的PID   
  42. # 下面对$?多做些说明,当补充shell知识吧  
  43. # 切记:$?永远表示shell命令最后一次执行后的退出状态,当函数执行完毕后,如果又执行了其它命  
  44. # 令,则$?不再表示函数执行后的状态,而表示其它命令的退出状态.  
  45. #-a  表示(and)两个条件同时成立  
  46. # -eq 表示两数值相等  
  47. # -gt 表示n1大于n2,即前面大于后面  
  48. # -lt 表示n1小于n2,即前面小于后面  
  49. # "\("  "\)"是对圆括号的转义,转成普通圆括号"()"来包裹条件表达式  
  50. # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  
  51. # !!!!注意!!!:从下面开始我们做个约定$0,$1,$2,...我们称$0为第0个变量,$1为第1个变量!!!!  
  52. # !!!!!这样排号从描述上比较便!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  
  53. # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  
  54. # if[...]中的表达式意思为:如果传递给mkconfig的参数个数($#)等于2个并且第1个变量为  
  55. # "-A"($1),则执行出错提示.那么$0,$1,$2,...是什么呢?我们看Makefile中是怎么执行make   
  56. # xxx_config这个伪目标的.  
  57. # Makefile中是这么写的:  
  58. # %_config::    unconfig  
  59. # @$(MKCONFIG) -A $(@:_config=)  
  60. # MKCONFIG的值为mkconfig(这是在Makefile里有定义的,自己搜索一下就可以到),$(MKCONFIG)  
  61. # 就是执行mkconfig脚本,则传入的参数 $0=U-boot源码顶层目录/mkconfig  $1 = -A   $2 =   
  62. # $(@:_config),当我们输入的是make smdkc100_config时$(@:_config) = smdkc100,所以# 这个表达式意思是把输入的参数中的字符串"_config"去掉然后返回剩下的部分,  
  63. # smdkc100_config去掉"_config"后当然就剩下"smdkc100",所以$(@:_config) = smdkc100,  
  64. # 进而$2 = $(@:_config) = smdkc100。所以很明显,执行@$(MKCONFIG) -A $(@:_config=)  
  65. # 后,传入给mkconfig的参数的确是有两个并且第1个变量$1=-A,所以if表达式为真然后会执行then  
  66. # 后面的脚本语句!!  
  67. if [ \( $# -eq 2 \) -a \( "$1" = "-A" \) ] ; then  
  68.     ########################################################################  
  69.     # egrep是grep的扩展,egrep支持扩展型的正则表达式。-i参数表示不区分大小写。  
  70.     # "^[[:space:]]*${2}[[:space:]]"。'^'表示反向选择,'*'是通配符,代表任意(0个或  
  71. # 多个)字符*${2}则表示1个以上的任意多个${2}。所以这个表达式的意思是:从boards.cfg文  
  72. # 件中搜索符合条件:非空格开头但以空格结尾的包含至少1个"smdkc100"字符串的行.如果搜索  
  73. # 不到,则说明不存在对应的单板信息,则会报错说找不到创建目标的规则并退出不再执行脚本。  
  74. # !!!说了这么多,总结起来这个if判断表达式所做的工作就是从boards.cfg文件中找到执行  
  75. # xxx_config的单板信息,找不到就无法完成单板配置,U-boot编译自然也无法完成!!!!  
  76.     line=`egrep -i "^[[:space:]]*${2}[[:space:]]" boards.cfg` || {  
  77.         echo "make: *** No rule to make target \`$2_config'.  Stop." >&2  
  78.         exit 1  
  79.     }  
  80.       
  81.   
  82.     ########################################################################  
  83.     # 了解这句的意思前先做些功课吧,看完不用我解释相信你也清楚是干嘛用的了  
  84.     # 扩展阅读:set,env和export这三个命令都可以用来显示shell变量,其区别是什么?  
  85.     # set 用来显示本地变量  
  86.     # env 用来显示环境变量  
  87.     # export 用来显示和设置环境变量  
  88.     # set 显示当前shell的变量,包括当前用户的变量  
  89.     # env 显示当前用户的变量  
  90. # export 显示当前导出成用户变量的shell变量  
  91. # 每个shell有自己特有的变量(set)显示的变量,这个和用户变量是不同的,当前用户变量和你  
  92. # 用什么shell无关,不管你用什么shell都在,比如HOME,SHELL等这些变量,但shell自己的   
  93. # 变量不同,shell是不同的,比如BASH_ARGC, BASH等,这些变量只有set才会显示,是bash  
  94. # 特有的,export不加参数的时候,显示哪些变量被导出成了用户变量,因为一个shell自己的变  
  95. # 量可以通export “导出”变成一个用户变量。set ${line}意思是设置line中的变量为本地环  
  96. # 境变量,变量的集合为line,你可以在这句的下面加上显示本地环境变量的语句echo `set`,  
  97. # 终端会打印出所有本地变量,找一下就可以发现其中有一句内容是:line = 'smdkc100 arm #   
  98. # armv7 smdkc100 sansung s5pc1xx'。要是缺少了set ${line}就等着出错吧!(上述结果  
  99. # 是基于make smdkc100_config而言的)  
  100.       
  101.     set ${line}  
  102. #echo `set`     # 删掉echo前面的'#',该语句将会被执行。2012-12-25圣诞节^_^  
  103.     #######################################################################  
  104.     # 如果boards.cfg搜索到的单板信息行的变量只有3个,如果有需要的话则把变量${1}作为默认  
  105. # 单板名称  
  106.     [ $# = 3 ] && set ${line} ${1}  
  107.       
  108. ###########################################################################  
  109. # 接上面的if表达式的分支,即如果make smdkc100_config时,即执行  
  110. # %_config::    unconfig  
  111. # @$(MKCONFIG) -A $(@:_config=)  
  112. # 后传入的参数不是2个或者第1个变量不是-A则执行elif下面的判断  
  113. # 如果${MAKEFLAGS+set}${MAKELEVEL+set} = setset则向终端打印警告信息并使用sleep 5  
  114. # 来做延时提示,延时一下信息会停留在终端一段时间然后继续往下执行,这样做只是为了让程序猿更  
  115. # 容易注意到这个这个警告条目吧,我的想法是这样的,有更好解释的可以告知我,谢谢!"cat << -EOF   
  116. # 信息  EOF"  是用来显示文本内容的,EOF就是"end of file"的意思实际上正常情况下  
  117. # "${MAKEFLAGS+set}${MAKELEVEL+set}" = "setset"是成立的,只是执行if了。所以轮不到  
  118. # elif执行!  
  119. elif [ "${MAKEFLAGS+set}${MAKELEVEL+set}" = "setset" ] ; then  
  120.     # only warn when using a config target in the Makefile  
  121.     cat <<-EOF  
  122.   
  123.     warning: Please migrate to boards.cfg.  Failure to do so will  
  124.              mean removal of your board in the next release.  
  125.   
  126.     EOF  
  127.     sleep 5  
  128. fi  
  129.   
  130. ###########################################################################  
  131. # 如果上面一切正常的话,执行了make smdkc100_config后就会有6个变量传进来,分别是:  
  132. # smdkc100 arm armv7 smdkc100 sansung s5pc1xx  
  133. # 此时$# = 6,while [ $# -gt 0 ]的意思就是当S#不为0时循环执行do ... done之间的语句  
  134. # shift的作用是使$1=$2,$2=$3,$3=$4….,而原来的$1将丢失。因此while循环的作用是,依次# 处理传递给mkconfig脚本的选项(--,-a,-n,-t,*)。由于我们并没有传递给mkconfig任何的选  
  135. # 项,因此while循环中的代码不起作用。具体的处理是比较简单了,既然没用到也就不多废话了。  
  136. while [ $# -gt 0 ] ; do  
  137.     case "$1" in  
  138.     --) shift ; break ;;  
  139.     -a) shift ; APPEND=yes ;;  
  140.     -n) shift ; BOARD_NAME="${1%_config}" ; shift ;;  
  141.     -t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;;  
  142.     *)  break ;;  
  143.     esac  
  144. done  
  145.   
  146. ###########################################################################  
  147. # 检查如果传进来的变量个数,如果小于4个则退出,若大于7个也要退出  
  148. [ $# -lt 4 ] && exit 1  
  149. [ $# -gt 7 ] && exit 1    
  150.   
  151. ###########################################################################  
  152. # 变量赋值,CONFIG_NAME = smdkc100,${1%_config}意思是将$1的字符串右边拿掉"_config"(如果有的话)  
  153. CONFIG_NAME="${1%_config}"  
  154.   
  155. ###########################################################################  
  156. # 如果BOARD_NAME(单板名称)不为空则什么都不做,如果为空则BOARD_NAME="${1%_config}  
  157. # ${1%_config}意思是将$1的字符串右边拿掉"_config"(如果有的话)  
  158. # 脚本文件开头BOARD_NAME = "",所以执行下句后BOARD_NAME = smdkc100  
  159. "${BOARD_NAME}" ] || BOARD_NAME="${1%_config}"  
  160.   
  161. ###########################################################################  
  162. # arch = arm    
  163. # 处理cpu赋值时,先用echo $3读入要处理的信息行,即armv7,armv7会被赋值到$1中,即$1=armv7  
  164. # 而$2 = 空,然后awk 'BEGIN {FS = ":"}; {print $1}'意思是以冒号为分隔符,提取出输入  
  165. # 行的第一个变量,结果是cpu = armv7。同理spl_cpu = $2,而$2为空,所以spl_cpu为空  
  166. arch="$2"  
  167. cpu=`echo $3 | awk 'BEGIN {FS = ":"} ; {print $1}'`  
  168. spl_cpu=`echo $3 | awk 'BEGIN {FS = ":"} ; {print $2}'`  
  169.   
  170. ###########################################################################  
  171. # 如果$4的值为'-',则board = ${BOARD_NAME} = "smdkc100"(正常情况下),  
  172. # 否则board="$4"="smdkc100",为什么这么做呢,其实是为了防止boards.cfg中单板信息不足的  
  173. # 情况下还能从ARCH信息中把单板名字提取出来然后复制给board变量。(PS:开发者想得真周到)  
  174. if [ "$4" = "-" ] ; then  
  175.     board=${BOARD_NAME}  
  176. else  
  177.     board="$4"  
  178. fi  
  179.   
  180. ###########################################################################  
  181. # 当传进来的变量数目大于4的时候而且第5个变量不等于"-"时vendor="$5"="samsung"  
  182. # 当传进来的变量数目大于5的时候而且第6个变量不等于"-"时soc="$6"="s5pc1xx"  
  183. # 当传进来的变量数目大于6的时候而且第7个变量不等于"-"时执行{..}中的处理  
  184. [ $# -gt 4 ] && [ "$5" != "-" ] && vendor="$5"  
  185. [ $# -gt 5 ] && [ "$6" != "-" ] && soc="$6"  
  186. [ $# -gt 6 ] && [ "$7" != "-" ] && {  
  187.     # check if we have a board config name in the options field  
  188.     # the options field mave have a board config name and a list  
  189.     # of options, both separated by a colon (':'); the options are  
  190.     # separated by commas (',').  
  191.     #  
  192.     # Check for board name  
  193.       
  194.     #############################################################  
  195.       # 检查在选项区域(Options)中是否存在一个单板配置选项,该选项区域可能含有单板名称和选项  
  196. # 表。单板名称和选项之间使用':'做分隔符,选项表成员之间则用','做分隔符  
  197.     # 举例:对于mx51_efikamx单板来说,它的Options为:  
  198.        # mx51_efikamx:MACH_TYPE=MACH_TYPE_MX51_EFIKAMX,IMX_CONFIG=board/genesi/m  
  199. # x51_efikamx/imximage_mx.cfg即  
  200. #"$7"="mx51_efikamx:MACH_TYPE=MACH_TYPE_MX51_EFIKAMX,IMX_CONFIG=board/g  
  201. # enesi/mx51_efikamx/imximage_mx.cfg"  
  202.     # ${7%:*}:从字符串"$7"右边开始删掉字符,直到遇到(从右部数起的)第一个':'  
  203.     # temp = mx51_efikamx  
  204.     tmp="${7%:*}"  
  205.     # 如果tmp不是空的则配置名称CONFIG_NAME = "$tmp" = "mx51_efikamx"  
  206.     if [ "$tmp" ] ; then  
  207.         CONFIG_NAME="$tmp"  
  208.     fi  
  209.       
  210.     #  注意!确保Options域中的内容中只有一个':'号  
  211.     #  "${tmp}" != "$7"用这句来做比较,确认上一步处理是否成功  
  212.     #  ${7#*:},这个表达式意思是从字符串"$7"左边开始删掉直到遇到第一个':'为止  
  213.        # options=${7#*:}=MACH_TYPE=MACH_TYPE_MX51_EFIKAMX,IMX_CONFIG=board/genes  
  214. # i/mx51_efikamx/imximage_mx.cfg  
  215.     #  echo ${options}这句是将options作为sed的处理源  
  216.     #  sed 's:,: :g',开头的's'代表搜索,搜索','然后把搜索到的','替换成空格' '  
  217.     #  TARGETS = MACH_TYPE=MACH_TYPE_MX51_EFIKAMX  
  218. #  IMX_CONFIG=board/genesi/mx51_efikamx/imximage_mx.cfg  
  219.     if [ "${tmp}" != "$7" ] ; then  
  220.         options=${7#*:}  
  221.         TARGETS="`echo ${options} | sed 's:,: :g'` ${TARGETS}"  
  222.     fi  
  223. }  
  224.   
  225. ###########################################################################  
  226. # 如果变量ARCH的值存在而且变量ARCH的值与变量arch的值不相等的话则配置失败,打印错误信息  
  227. # ARCH和arch必须相等!  
  228. if [ "${ARCH}" -a "${ARCH}" != "${arch}" ]; then  
  229.     echo "Failed: \$ARCH=${ARCH}, should be '${arch}' for ${BOARD_NAME}" 1>&2  
  230.     exit 1  
  231. fi  
  232. ###########################################################################  
  233. # 如果options存在则把options信息一并打印出来,否则的话就没必要打印!  
  234. # 这里就是我们执行make xxx_config后会打印到终端上的信息!  
  235. if [ "$options" ] ; then  
  236.     echo "Configuring for ${BOARD_NAME} - Board: ${CONFIG_NAME}, Options: ${options}"  
  237. else  
  238.     echo "Configuring for ${BOARD_NAME} board..."  
  239. fi  
  240.   
  241. ###########################################################################  
  242. # 如果源码顶层目录(SRCTREE)和存放编译生成文件的目录(OBJTREE)不一致的话就在  
  243. # 存放编译生成文件的目录(OBJTREE)建立两个文件include和include2  
  244. # 然后进入include2目录中,删除asm文件夹,建立一个 软链接asm,链接指向目录  
  245. # ${SRCTREE}/arch/${arch}/include/asm  
  246. # LNPREFIX多加了一个'/'作为路径,然后退到上层目录进入include文件夹,创建一个名为asm的文# 件夹  
  247. if [ "$SRCTREE" != "$OBJTREE" ] ; then  
  248.     mkdir -p ${OBJTREE}/include  
  249.     mkdir -p ${OBJTREE}/include2  
  250.     cd ${OBJTREE}/include2  
  251.     rm -f asm  
  252.     ln -s ${SRCTREE}/arch/${arch}/include/asm asm  
  253.     LNPREFIX=${SRCTREE}/arch/${arch}/include/asm/  
  254.     cd ../include  
  255.     mkdir -p asm  
  256. else  
  257.     ########################################################################  
  258.     # 如果二者目录相同的话就直接进入当前目录(此时当前目录就是U-boot源码的顶层目录)的  
  259. # include文件夹中删除 asm文件夹,直接建立一个软链接asm,链接指向目  
  260. # 录../arch/${arch}/include/asm  
  261. # 一般我们采用这个分支的方法来编译U-boot,OBJTREE目录就是U-boot源码顶层目录相当于   
  262. # ln -s ../arch/arm/include/asm asm  
  263.     cd ./include  
  264.     rm -f asm  
  265.     ln -s ../arch/${arch}/include/asm asm  
  266. fi  
  267.   
  268. ###########################################################################  
  269. # 删除 asm/arch,这个时候的asm是个软连接,实际上是对链接的目标进行操作,建立软件接的目的就# 是方便程序的编写和编译,提高效率,你写程序的时候总不想常常打一长串的路径吧  
  270. rm -f asm/arch  
  271.   
  272. ###########################################################################  
  273. # 如果soc不为空则建立软连接asm/arch,指向${LNPREFIX}arch-${cpu},由于OBJTREE目录就是  
  274. # U-boot源码顶层目录,LNPREFIX为空  
  275. # 一般soc也不为空,则相当于执行: ln -s arch-armv7 asm/arch  
  276. if [ -z "${soc}" ] ; then  
  277.     ln -s ${LNPREFIX}arch-${cpu} asm/arch  
  278. else  
  279.     ln -s ${LNPREFIX}arch-${soc} asm/arch  
  280. fi  
  281.   
  282. ###########################################################################  
  283. # 如果架构是arm架构,则删除当前目录(此时当前目录是U-boot源码顶层目录/include)下的  
  284. # asm/proc目录建立软链接ln -s proc-armv asm/proc  
  285. if [ "${arch}" = "arm" ] ; then  
  286.     rm -f asm/proc  
  287.     ln -s ${LNPREFIX}proc-armv asm/proc  
  288. fi  
  289.   
  290. ###########################################################################  
  291. # 生成make的头文件config.mk  
  292. # ARCH=arm  CPU=armv7 BOARD=smdkc100 VENDOR=samsung  SOC=s5pc1xx   
  293. # 加一个exit0(返回成功值),然后这些统统写入config.mk文件中, > config.mk是强行覆盖创建# config.mk然后把数据导入config.mk中  
  294. ( echo "ARCH   = ${arch}"  
  295.     if [ ! -z "$spl_cpu" ] ; then  
  296.     echo 'ifeq ($(CONFIG_SPL_BUILD),y)'  
  297.     echo "CPU    = ${spl_cpu}"  
  298.     echo "else"  
  299.     echo "CPU    = ${cpu}"  
  300.     echo "endif"  
  301.     else  
  302.     echo "CPU    = ${cpu}"  
  303.     fi  
  304.     echo "BOARD  = ${board}"  
  305.   
  306.     [ "${vendor}" ] && echo "VENDOR = ${vendor}"  
  307.     [ "${soc}"    ] && echo "SOC    = ${soc}"  
  308.     exit 0 ) > config.mk  
  309.   
  310. ###########################################################################  
  311. # 如果厂商名不为空则BOARDDIR = ${vendor}/${board},vendor=samsung,所以  
  312. # BOARDDIR = samsung/smdkc100  
  313. if [ -z "${vendor}" ] ; then  
  314.     BOARDDIR=${board}  
  315. else  
  316.     BOARDDIR=${vendor}/${board}  
  317. fi  
  318.   
  319. ###########################################################################  
  320. # 创建指定的配置的头文件,默认APPEND=no(本文件开头有赋值),所以执行else分支,创建  
  321. # config.h文件  
  322. if [ "$APPEND" = "yes" ]    # Append to existing config file  
  323. then  
  324.     echo >> config.h  
  325. else  
  326.     > config.h       # Create new config file  
  327. fi  
  328. ###########################################################################  
  329. # 向config.h中写入信息  
  330. echo "/* Automatically generated - do not edit */" >>config.h  
  331.   
  332. ###########################################################################  
  333. # 如果没有Options选项的话,TARGETS为空,for不执行,如果有Options选项,则i=TARGETS中变# 量的个数变量之前已经被处理成以空格符' '分隔,例如:TARGETS =   
  334. # MACH_TYPE=MACH_TYPE_MX51_EFIKAMX   
  335. # IMX_CONFIG=board/genesi/mx51_efikamx/imximage_mx.cfg,然后用echo ${i}逐条导入  
  336. # sed进行处理,sed '/=/ {s/=/    /;q; } ; { s/$/ 1/; }'的作用是搜索等号'=',然后把  
  337. # 等号替换成TAB符'    ',接着参数q意思是退出当前动作执行下一个动作,下一个动作用分号';'分隔,  
  338. # 最后加上#define CONFIG_${i}后写入config.h中。  
  339. # "MACH_TYPE=MACH_TYPE_MX51_EFIKAMX"处理成:  
  340. # "#define CONFIG_MACH_TYPE  MACH_TYPE_MX51_EFIKAMX"  
  341. # "IMX_CONFIG=board/genesi/mx51_efikamx/imximage_mx.cfg"处理成:  
  342. # "#define CONFIG_IMX_CONFIG  board/genesi/mx51_efikamx/imximage_mx.cfg"  
  343. for i in ${TARGETS} ; do  
  344.     i="`echo ${i} | sed '/=/ {s/=/  /;q; } ; { s/$/ 1/; }'`"  
  345.     echo "#define CONFIG_${i}" >>config.h ;  
  346. done  
  347.   
  348. ###########################################################################  
  349. # 如果是smdkc100,config.h中会多出以下头文件  
  350. # #define CONFIG_SYS_ARCH       "arm"  
  351. # #define CONFIG_SYS_CPU        "armv7"  
  352. # #define CONFIG_SYS_BOARD      "smdkc100"  
  353. # #define CONFIG_SYS_VENDOR "samsung"  
  354. # #define CONFIG_SYS_SOC        "s5pc1xx"    
  355.         
  356. echo "#define CONFIG_SYS_ARCH  \"${arch}\""  >> config.h  
  357. echo "#define CONFIG_SYS_CPU   \"${cpu}\""   >> config.h  
  358. echo "#define CONFIG_SYS_BOARD \"${board}\"" >> config.h  
  359.   
  360. "${vendor}" ] && echo "#define CONFIG_SYS_VENDOR \"${vendor}\"" >> config.h  
  361.   
  362. "${soc}"    ] && echo "#define CONFIG_SYS_SOC    \"${soc}\""    >> config.h  
  363.   
  364. ###########################################################################  
  365. # 添加别的头文件,利用cat << EOF >> config.h  ...内容...   EOF把信息写入config.h中  
  366. cat << EOF >> config.h  
  367. #define CONFIG_BOARDDIR board/$BOARDDIR  
  368. #include <config_cmd_defaults.h>  
  369. #include <config_defaults.h>  
  370. #include <configs/${CONFIG_NAME}.h>  
  371. #include <asm/config.h>  
  372. #include <config_fallbacks.h>  
  373. #include <config_uncmd_spl.h>  
  374. EOF  
  375.   
  376. # 返回成功状态  
  377. exit 0  
0 0
原创粉丝点击