全志编译系统分析

一、前言     
     刚开始用全志的编译脚本还不太习惯,虽然很方便,但是编译出问题的时候却不知道从哪里入手解决.

二、初步接触全志编译脚本工具
第一个接触的脚本是build.sh

litin@linuxService:~/Android/allwinner/cqa64_android_v5.1/lichee$ cat build.sh 
#!/bin/bash
set -e
buildroot/scripts/mkcommon.sh $@
从脚本内容可知,它只是间接调用其他脚本“buildroot/scripts/mkcommon.sh”
litin@linuxService:~/Android/allwinner/cqa64_android_v5.1/lichee$ cat buildroot/scripts/mkcommon.sh
#!/bin/bash
 
BR_SCRIPTS_DIR=`dirname $0`
 
# source shflags
. ${BR_SCRIPTS_DIR}/shflags/shflags
[ -f .buildconfig ] && . .buildconfig     
. ${BR_SCRIPTS_DIR}/mkcmd.sh             ####把一些常用的命令导出,方便直接调用
 
[ -f .buildconfig ] && . .buildconfig
 
if [ "x$1" = "xconfig" ] ; then          ####输入build.sh config 则执行mksetup.sh脚本
    . ${BR_SCRIPTS_DIR}/mksetup.sh
    exit $?
elif [ "x$1" = "xpack" ] ; then          ###输入build.sh pack, 则执行命令init_defconf和mkpack -d card0
    if [  "x$2" = "x-d" ] ; then
        init_defconf
        mkpack -d card0
        exit $?
    else
        init_defconf
        mkpack
        exit $?
    fi
elif [ "x$1" = "xpack_debug" ] ; then     
    init_defconf
    mkpack -d card0
    exit $?
elif [ "x$1" = "xpack_dump" ] ; then       ###输入build.sh 则执行命令初始化配置 和 mkpack -m dump
    init_defconf
    mkpack -m dump
    exit $?
elif [ "x$1" = "xpack_secure" ] ; then     ###输入build.sh pack_secure,加密式的打包
    init_defconf
    mkpack -s secure -d $2
    exit $?
elif [ "x$1" = "xpack_prev_refurbish" ] ; then
        init_defconf
        mkpack -s secure -f prev_refurbish
        exit $?
elif [ "x$1" = "xpack_prvt" ] ; then
    init_defconf
    mkpack -f prvt
    exit $?
elif [ "x$1" = "xpack_nor" ] ;then
    init_defconf
    if [ "x$2" = "xdebug" ] ; then
        mkpack -f spinor -d card0
    else
        mkpack -f spinor
    fi
    exit $?
elif [ "x$1" = "xpack_erase" ] ; then
    init_defconf
    mkpack -f erase
    exit $?
elif [ $# -eq 0 ] ; then           ###build.sh 后面不带参数则执行初始化配置和编译linux内核
    init_defconf
    mklichee
    exit $?
fi
 
# define option, format:
#   'long option' 'default value' 'help message' 'short option'
DEFINE_string 'platform' '' 'platform to build, e.g. sun9iw1p1' 'p'
DEFINE_string 'kernel' 'linux-3.4' 'kernel to build, e.g. 3.3' 'k'
DEFINE_string 'board' '' 'board to build, e.g. evb' 'b'
DEFINE_string 'module' '' 'module to build, e.g. buildroot, kernel, uboot, clean' 'm'
 
FLAGS_HELP="Top level build script for lichee
Examples:
1. Set the config option
    $ ./build.sh config
2. Build lichee using preset config value
    $ ./build.sh
3. Pack a linux, dragonboard image
    $ ./build.sh pack
4. Build lichee using command argument
    $ ./build.sh -p <platform>
"
 
# parse the command-line
FLAGS "$@" || exit $?
eval set -- "${FLAGS_ARGV}"
 
chip=${FLAGS_platform%%_*}
platform=${FLAGS_platform##*_}
kernel=${FLAGS_kernel}
board=${FLAGS_board}
module=${FLAGS_module}
 
if [ "${platform}" = "${chip}" ] ; then
    platform="linux"
fi
 
if [ -z "${module}" ] ; then
    module="all"
fi
 
if ! init_chips ${chip} || \
   ! init_platforms ${platform} ; then
    mk_error "invalid platform '${FLAGS_platform}'"
    exit 1
fi
 
if ! init_kern_ver ${kernel} ; then
    mk_error "invalid kernel '${FLAGS_kernel}'"
    exit 1
fi
 
if [ ${FLAGS_board} ] && \
   ! init_boards ${chip} ${board} ; then
    mk_error "invalid board '${FLAGS_board}'"
    exit 1
fi
 
# init default config
init_defconf
 
if [ ${module} = "all" ]; then
    mklichee
elif [ ${module} = "boot" ] ; then
    mkboot
elif [ ${module} = "buildroot" ] ; then
    mkbr
elif [ ${module} = "kernel" ] ; then
    mkkernel
elif [ ${module} = "clean" ] ; then
    mkclean
elif [ ${module} = "distclean" ] ; then
    mkdistclean
else
    mk_error "invalid module '${module}'"
    exit 1
fi
 
exit $?
2.全志的瑞士军刀“mkcmd.sh”

    “mkcmd.sh”这个工具位于“lichee/buildroot/scripts/mkcmd.sh”,如果想知道这命令里面包含什么功能可以输入“mkhelp”

litin@linuxService:~/Android/allwinner/cqa64_android_v5.1/lichee$ mkhelp 
 
                mkscript - lichee build script
 
<version>: 1.0.0
<author >: james
 
<command>:
    mkboot      build boot           ###暂时没啥用,只是单纯显示信息
    mkbr        build buildroot      ###生成编译链,初始化编译环境
    mkkernel    build kernel         ###编译内核
    mkrootfs    build rootfs for linux, dragonboard  ###编译生成rootfs文件系统(安卓系统不在这里生成文件系统)
    mklichee    build total lichee   ###(输入build.sh命令则)编译以上三个东西mkbr && mkkernel && mkrootfs
    
    mkclean     clean current board output  ###清除板载的输出文件
    mkdistclean clean entires output        ###清除所有编译文件
    mkpack      pack firmware for lichee    ###打包全志固件(执行pack命令)
    mkhelp      show this message           ###打印帮助信息(也就是本信息)

3.全志dtb文件的分析

dtb文件是使用pack命令来生成或者拷贝的。

===========================lichee/tools/pack/pack===============================
function do_ini_to_dts()
{
        #these args used to conver sys_config to dts
        if [ -z "`echo ${PACK_CHIP} | grep "sun5[0-9]i"`" ]; then
                local DTC_DES_ARCH=arm
                local KERN_VER=linux-3.4
                return
        else
                local DTC_DES_ARCH=arm64
                local KERN_VER=linux-3.10
        fi
        local DTC_COMPILER=${LICHEE_OUT}/../../../../$KERN_VER/scripts/dtc/dtc
{
        #these args used to conver sys_config to dts
        if [ -z "`echo ${PACK_CHIP} | grep "sun5[0-9]i"`" ]; then
                local DTC_DES_ARCH=arm
                local KERN_VER=linux-3.4
                return
        else
                local DTC_DES_ARCH=arm64
                local KERN_VER=linux-3.10
        fi
        local DTC_COMPILER=${LICHEE_OUT}/../../../../$KERN_VER/scripts/dtc/dtc
        local DTC_DEP_FILE=${LICHEE_OUT}/../../../../$KERN_VER/arch/$DTC_DES_ARCH/boot/dts/.${PACK_CHIP}-${PACK_BOARD}.dtb.d.dtc.tmp
        local DTC_SRC_PATH=${LICHEE_OUT}/../../../../$KERN_VER/arch/$DTC_DES_ARCH/boot/dts/
        local DTC_SRC_FILE=${LICHEE_OUT}/../../../../$KERN_VER/arch/$DTC_DES_ARCH/boot/dts/.${PACK_CHIP}-${PACK_BOARD}.dtb.dts
        local DTC_INI_FILE_BASE=${LICHEE_OUT}/../../../../tools/pack/out/sys_config.fex
        local DTC_INI_FILE=${LICHEE_OUT}/../../../../tools/pack/out/sys_config_fix.fex
        cp $DTC_INI_FILE_BASE $DTC_INI_FILE
        sed -i "s/\(\[dram\)_para\(\]\)/\1\2/g" $DTC_INI_FILE
        sed -i "s/\(\[nand[0-9]\)_para\(\]\)/\1\2/g" $DTC_INI_FILE
 
        if [ ! -f $DTC_COMPILER ]; then
                printf "Script_to_dts: Can not find dtc compiler.\n"
                return
        fi
        if [ ! -f $DTC_DEP_FILE ]; then
                printf "Script_to_dts: Can not find [%s-%s.dts]. Will use common dts file instead.\n" ${PACK_CHIP} ${PACK_BOARD}
                DTC_DEP_FILE=${LICHEE_OUT}/../../../../$KERN_VER/arch/$DTC_DES_ARCH/boot/dts/.${PACK_CHIP}-soc.dtb.d.dtc.tmp
                DTC_SRC_FILE=${LICHEE_OUT}/../../../../$KERN_VER/arch/$DTC_DES_ARCH/boot/dts/.${PACK_CHIP}-soc.dtb.dts
        fi
        $DTC_COMPILER -O dtb -o ${LICHEE_OUT}/sunxi.dtb \
                -b 0                    \
                -i $DTC_SRC_PATH        \
                -F $DTC_INI_FILE        \
                -d $DTC_DEP_FILE $DTC_SRC_FILE
        printf "Conver script to dts ok.\n"
        return
}

(1)sunxi.dtb的初步生成

这个dtb是直接拷贝

运行打包命令:build.sh pack 提示错误信息

Script_to_dts: Can not find [sun50iw1p1-t1.dts]. Will use common dts file instead.
可知当“sun50iw1p1-t1.dts”文件不存在的时候会取一个默认的dts文件:

DTC_SRC_FILE=${LICHEE_OUT}/../../../../$KERN_VER/arch/$DTC_DES_ARCH/boot/dts/.${PACK_CHIP}-soc.dtb.dts
也就是选取linux源码下的文件“linux-3.10/arch/arm64/boot/dts/.sun50iw1p1-soc.dtb.dts”。
(2)dtb的参数覆盖

全志的dtb设备树文件是由多个文件合并生成的

        $DTC_COMPILER -O dtb -o ${LICHEE_OUT}/sunxi.dtb \
                -b 0                    \
                -i $DTC_SRC_PATH        \
                -F $DTC_INI_FILE        \
                -d $DTC_DEP_FILE $DTC_SRC_FILE
展开上面的命令可知
/linux-3.10/scripts/dtc/dtc -O dtb 
-o /lichee/out/sun50iw1p1/android/common/sunxi.dtb    
-b  0              
-i /linux-3.10/arch/arm64/boot/dts/      
-F /lichee/tools/pack/out/sys_config_fix.fex     #sys_config.fex 和sys_config.fex其实已经合而为一了
-d /linux-3.10/arch/arm64/boot/dts/.sun50iw1p1-soc.dtb.d.dtc.tmp 
/linux-3.10/arch/arm64/boot/dts/.sun50iw1p1-soc.dtb.dts 
 
dtb文件的生成是分优先级的:sys_config.fex>sys_config_fix.fex>..sun50iw1p1-soc.dtb.dts/.sun50iw1p1-soc.dtb.d.dtc.tmp
默认情况下,sys_config.fex优先级最高,一般只需要修改它就行了。
(3)科普一下dtc命令

这个命令的源码在“linux-3.10/scripts/dtc/dtc.c”如果想知道有什么功能,可以输入查询命令

litin@linuxService:~/Android/allwinner/cqa64_android_v5.1/lichee$ ./linux-3.10/scripts/dtc/dtc -h
Usage:
    dtc [options] <input file>
 
Options:
    -h
        This help text
    -q
        Quiet: -q suppress warnings, -qq errors, -qqq all
    -I <input format>
        Input formats are:
            dts - device tree source text
            dtb - device tree blob
            fs - /proc/device-tree style directory
    -o <output file>
    -O <output format>
        Output formats are:
            dts - device tree source text
            dtb - device tree blob
            asm - assembler source
    -V <output version>
        Blob version to produce, defaults to 17 (relevant for dtb
        and asm output only)
    -d <output dependency file>
    -R <number>
        Make space for <number> reserve map entries (relevant for 
        dtb and asm output only)
    -S <bytes>
        Make the blob at least <bytes> long (extra space)
    -p <bytes>
        Add padding to the blob of <bytes> long (extra space)
    -b <number>
        Set the physical boot cpu
    -f
        Force - try to produce output even if the input tree has errors
    -i
        Add a path to search for include files
    -s
        Sort nodes and properties before outputting (only useful for
        comparing trees)
    -v
        Print DTC version and exit
    -H <phandle format>
        phandle formats are:
            legacy - "linux,phandle" properties only
            epapr - "phandle" properties only
            both - Both "linux,phandle" and "phandle" properties
    -W [no-]<checkname>
    -E [no-]<checkname>
            enable or disable warnings and errors
生成的dtb文件也可以通过dtb命令逆向
./dtc -I dtb -O dts ../../arch/arm/boot/dts/imx6q-sabresd-ldo.dtb  > ~/f.dts
--------------------- 
作者:梦幻贝壳 
来源:CSDN 
原文:https://blog.csdn.net/menghuanbeike/article/details/79127418 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值