全志lichee的pack命令

全志lichee的pack命令

全志lichee目录打包命令流程 pack

将打包命令传进去build.sh脚本里面。查看buildsh里面的脚本命令。

其实里面的脚本还是较为简单地的,仅仅是作为一个过渡,然后就跑进去buildroot/scripts目录下的mkcommon.sh脚本里面。 那么需要转到这个脚本里面做了什么事情。

一、脚本源码分析

#!/bin/bash

BR_SCRIPTS_DIR=`dirname $0` // $0就是这个文件名字

# source shflags

. ${BR_SCRIPTS_DIR}/shflags/shflags //标志

. ${BR_SCRIPTS_DIR}/mkcmd.sh //这个脚本有大量的命令函数

[ -f .buildconfig ] && . .buildconfig

//以下就是对传进来的$1进行一个判断

if [ "x$1" = "xconfig" ] ; then /*config命令*/

. ${BR_SCRIPTS_DIR}/mksetup.sh

exit $?

elif [ "x$1" = "xpack" ] ; then /*pack 命令*/

init_defconf

mkpack

exit $?

elif [ "x$1" = "xpack_debug" ] ; then /*pack_debuf命令*/

init_defconf

mkpack -d card0

exit $?

elif [ "x$1" = "xpack_dump" ] ; then /*pack_dump命令*/

init_defconf

mkpack -m dump

exit $?

elif [ "x$1" = "xpack_prvt" ] ; then /*pack_prvt命令*/

init_defconf

mkpack -f prvt

exit $?

elif [ $# -eq 0 ] ; then

init_defconf

mklichee

exit $?

fi

在这里单独讲解pack这个参数,其他的参数可以参考我以前的博客。可以看到一旦pack这个参数成立之后就会执行一下两行脚本:

init_defconf

mkpack

exit $?

init_defconf函数命令:

首先说明这个命令函数是在同目录下mkcmd.sh文件里面。也就是上面提及的加载这个脚本进来,就可以调用里面的脚本函数,会频繁提起这个脚本。可以观察到无论上面脚本在哪里成立都会执行这个函数命令。也就是说这个是一个通用的函数命令。里面的东西不外乎通用参数和环境参数等等通用的东西

function init_defconf()

{

local pattern

local defconf

local out_dir="common"

check_env

//check_env参数命令里面主要判断下面标识出来LICHEE_BOARD = 开发板型号( 0. evb 1. maple 2. redwood 3. vstar)

的路径是否存在

/*由于获取这几个封装的变量名太绕了直接给出

LICHEE_CHIP = chip

LICHEE_PLATFORM = ${platform} //这个平台是在编译 ./build.sh config 时候选择的平台 (linux /android/dragomnoard)

*/

pattern="${LICHEE_CHIP}_${LICHEE_PLATFORM}_${LICHEE_BOARD}"

defconf=`awk '$1=="'$pattern'" {print $2,$3}' buildroot/scripts/mkrule`

if [ -n "${defconf}" ] ; then

export LICHEE_BR_DEFCONF=`echo ${defconf} | awk '{print $1}'` //配置环境参数

export LICHEE_KERN_DEFCONF=`echo ${defconf} | awk '{print $2}'`//配置环境参数

out_dir="${LICHEE_BOARD}"

else

pattern="${LICHEE_CHIP}_${LICHEE_PLATFORM}"

defconf=`awk '$1=="'$pattern'" {print $2,$3}' buildroot/scripts/mkrule`//配置环境参数

if [ -n "${defconf}" ] ; then

export LICHEE_BR_DEFCONF=`echo ${defconf} | awk '{print $1}'`

export LICHEE_KERN_DEFCONF=`echo ${defconf} | awk '{print $2}'`

out_dir="common"

fi

fi

export LICHEE_PLAT_OUT="${LICHEE_OUT_DIR}/${LICHEE_CHIP}/${LICHEE_PLATFORM}/${out_dir}"

export LICHEE_BR_OUT="${LICHEE_PLAT_OUT}/buildroot"

mkdir -p ${LICHEE_BR_OUT}

}

环境设置到到这里就结束,回到主脚本体里面。

Mkpack(重点)

function mkpack()

{

mk_info "packing firmware ..." // mk_info为打印函数

check_env //判别函数,判断对应的文件路径是否存在的一个函数

(cd ${LICHEE_TOOLS_DIR}/pack && \

./pack -c ${LICHEE_CHIP} -p ${LICHEE_PLATFORM} -b ${LICHEE_BOARD} $@)

}

一下才是pack命令里面的重点。:

(cd ${LICHEE_TOOLS_DIR}/pack && \

./pack -c ${LICHEE_CHIP} -p ${LICHEE_PLATFORM} -b ${LICHEE_BOARD} $@)

首先以下这句话就是在重点cd /tools/pack 目录下。

cd ${LICHEE_TOOLS_DIR}/pack (有关pack目录下的内容)

然后下半段命令:

./pack -c ${LICHEE_CHIP} -p ${LICHEE_PLATFORM} -b ${LICHEE_BOARD} $@)

LICHEE_CHIP = (全志版本)

LICHEE_PLATFORM = (这个是编译的平台)

LICHEE_BOARD = (厂家配置)

以上三个配置就是在在执行 /build.sh config 选择全志版本,平台,具体产家配置。

那么置换回来就可以得到以下命令:

这个命令就是说判断

/*

sun8iw5p1是否存在并且是字特殊文件则为真

linux是否存在并且是一个名字管道

vstar是否存在并且是一个块特殊文件则为真 */

./pack -c sun8iw5p1 -p linxu -b vstar $@

转而分析到这个pack脚本,这个脚本在(tools/pack)

①执行:. …/…/buildroot/scripts/shflags/shflags

(执行这个脚本里面内容做了以下的处理,拿到对应的版本号等操作,定义一些大 判断或者识别的函数)

主线程里面到LICHEE_OUT(lichee/out/sun8iw5p1/dragonboard/common

)目录下

配置对应的环境:

export PATH=${TOOLS_DIR}/mod_update:${TOOLS_DIR}/eDragonEx:${TOOLS_DIR}/fsbuild200:${TOOLS_DIR}/android:$PATH

最后查看PACK脚本保存大量的函数命令,直接可以执行到以下脚本的操作

然后执行这个函数:

do_prepare

{

#判断这个是三个参数要是任意一个为空,即为真。进入

#其中的(-o) 是或运算

if [ -z "${PACK_CHIP}" -o -z "${PACK_PLATFORM}" -o -z "${PACK_BOARD}" ] ; then

pack_error "invalid chip, platform or board." #打印错误信息

show_boards

exit 1

fi

if [ ! -d chips/${PACK_CHIP}/configs/${PACK_BOARD} ] ; then

pack_error "board dir or path do not exist."

show_boards

exit 1

fi

# cleanup

rm -rf out/ #删除清空out目录,

mkdir -p out/ #重新创建out目录

printf "copying tools file\n" #

for file in ${tools_file_list[@]} ; do #拷贝对应的

cp -f $file out/ 2> /dev/null

done

if [ "x${PACK_MODE}" = "xdump" ] ; then

cp -rf common/tools/usbtool_test.fex out/usbtool.fex #拷贝USB工具文件

fi

printf "copying configs file\n"

for file in ${configs_file_list[@]} ; do

cp -f $file out/ 2> /dev/null #拷贝file到输出目录,然后将错误输出从定向到/dev/null空设备文件里面

done

printf "copying boot resource\n" #复制启动资源

for file in ${boot_resource_list[@]} ; do

cp -rf `echo $file | awk -F: '{print $1}'` `echo $file | awk -F: '{print $2}'` #拷贝对应里面的首段信息

done

printf "copying boot file\n" #复制启动文件

for file in ${boot_file_list[@]} ; do

cp -f `echo $file | awk -F: '{print $1}'` `echo $file | awk -F: '{print $2}'`

done

# 判断平台是否为linux平台

if [ "x${PACK_PLATFORM}" = "xlinux" -a -f out/sys_partition_linux.fex \

-a "x${PACK_FUNC}" != "xprvt" -a "x${PACK_MODE}" != "xdump" ] ; then

mv out/image_linux.cfg out/image.cfg

mv out/sys_partition_linux.fex out/sys_partition.fex

elif [ "x${PACK_PLATFORM}" = "xdragonboard" -a -f out/sys_partition_dragonboard.fex ] ; then

mv out/sys_partition_dragonboard.fex out/sys_partition.fex

fi

#判断开发板是什么

if [ "x${PACK_DEBUG}" = "xcard0" -a "x${PACK_MODE}" != "xdump" \

-a "x${PACK_FUNC}" != "xprvt" ] ; then

cp $TOOLS_DIR/awk_debug_card0 out/awk_debug_card0

TX=`awk '$0~"'$PACK_CHIP'"{print $2}' pctools/linux/card_debug_pin`

RX=`awk '$0~"'$PACK_CHIP'"{print $3}' pctools/linux/card_debug_pin`

MS=`awk '$0~"'$PACK_CHIP'"{print $4}' pctools/linux/card_debug_pin`

CK=`awk '$0~"'$PACK_CHIP'"{print $5}' pctools/linux/card_debug_pin`

DO=`awk '$0~"'$PACK_CHIP'"{print $6}' pctools/linux/card_debug_pin`

DI=`awk '$0~"'$PACK_CHIP'"{print $7}' pctools/linux/card_debug_pin`

sed -i s'/jtag_ms = /jtag_ms = '$MS'/g' out/awk_debug_card0

sed -i s'/jtag_ck = /jtag_ck = '$CK'/g' out/awk_debug_card0

sed -i s'/jtag_do = /jtag_do = '$DO'/g' out/awk_debug_card0

sed -i s'/jtag_di = /jtag_di = '$DI'/g' out/awk_debug_card0

sed -i s'/uart_debug_tx =/uart_debug_tx = '$TX'/g' out/awk_debug_card0

sed -i s'/uart_debug_rx =/uart_debug_rx = '$RX'/g' out/awk_debug_card0

sed -i s'/uart_tx =/uart_tx = '$TX'/g' out/awk_debug_card0

sed -i s'/uart_rx =/uart_rx = '$RX'/g' out/awk_debug_card0

awk -f out/awk_debug_card0 out/sys_config.fex > out/a.fex

rm out/sys_config.fex

mv out/a.fex out/sys_config.fex

echo "uart -> card0"

fi

#判断平台是不是dragonboard

#support dragonboard test emmc when boot from card0, add by liujianqiang 20140704

if [ "x${PACK_PLATFORM}" = "xdragonboard" ] ; then

cp $TOOLS_DIR/awk_db_emmc out/awk_db_emmc #拷贝

awk -f out/awk_db_emmc out/sys_config.fex > out/a.fex #awk调用脚本, 然后将sys_config.fex 文件重定向到a.fex文件

rm out/sys_config.fex

mv out/a.fex out/sys_config.fex #

echo "support dragonboard test emmc when boot from card0"

echo "[mmc2_para]-sdc_used: 0 -> 1"

fi

#将\\boot-resource 替换成 (\反义符)boot-resource

sed -i 's/\\boot-resource/\/boot-resource/g' out/boot-resource.ini

sed -i 's/\\\\/\//g' out/image.cfg

sed -i 's/imagename/;imagename/g' out/image.cfg

#PACK_DEBUG = USRT0

if [ "x${PACK_DEBUG}" = "xcard0" ] ; then

if [ "x${PACK_SIG}" = "xsig" ] ; then

IMG_NAME="${PACK_CHIP}_${PACK_PLATFORM}_${PACK_BOARD}_${PACK_DEBUG}_${PACK_SIG}.img"

else

IMG_NAME="${PACK_CHIP}_${PACK_PLATFORM}_${PACK_BOARD}_${PACK_DEBUG}.img"

fi

else

if [ "x${PACK_SIG}" = "xsig" ] ; then

IMG_NAME="${PACK_CHIP}_${PACK_PLATFORM}_${PACK_BOARD}_${PACK_SIG}.img"

else

IMG_NAME="${PACK_CHIP}_${PACK_PLATFORM}_${PACK_BOARD}.img"

fi

fi

if [ "x${PACK_MODE}" = "xdump" ] ; then

IMG_NAME="${PACK_CHIP}_${PACK_PLATFORM}_${PACK_BOARD}_${PACK_MODE}.img"

fi

if [ "x${PACK_FUNC}" = "xprvt" ] ; then

IMG_NAME="${PACK_CHIP}_${PACK_FUNC}.img"

fi

echo "imagename = $IMG_NAME" >> out/image.cfg

echo "" >> out/image.cfg

当执行do_prepare函数执行完,执行到以下这个do_common。

function do_common()

{

cd out/

busybox unix2dos sys_config.fex #busybox unix2dos 两个是全志闭源二进制脚本文件 处理sys_config.fex busybox unix2dos

sys_partition.fex #busybox unix2dos 两个是全志闭源二进制脚本文件 处理 sys_partition.fex

script sys_config.fex > /dev/null #批量处理脚本命令

script sys_partition.fex > /dev/null #批量处理脚本命令

cp sys_config.bin config.fex

if [ "x${PACK_PLATFORM}" = "xdragonboard" ] ; then #判断平台是否dragonboard

busybox dos2unix test_config.fex

cp test_config.fex boot-resource/

busybox unix2dos test_config.fex

script test_config.fex > /dev/null

cp test_config.bin boot-resource/

fi

#update_boot0 也是全志闭源命令

update_boot0 boot0_nand.fex sys_config.bin NAND > /dev/null

update_boot0 boot0_sdcard.fex sys_config.bin SDMMC_CARD > /dev/null

#update_boot0 也是全志闭源命令

update_uboot u-boot.fex sys_config.bin > /dev/null

update_fes1 fes1.fex sys_config.bin > /dev/null

update_mbr sys_partition.bin 4 > /dev/null

#fsbuild 也是全志闭源命令

fsbuild boot-resource.ini split_xxxx.fex > /dev/null

if [ "x${PACK_FUNC}" = "xprvt" ] ; then

u_boot_env_gen env_burn.cfg env.fex > /dev/null

else

u_boot_env_gen env.cfg env.fex > /dev/null

fi

ln -s $LICHEE_OUT/arisc arisc.fex

#判断实现的那个版本的系统

if [ "x${PACK_MODE}" = "xdump" ] ; then

do_pack_dump

elif [ "x${PACK_FUNC}" = "xprvt" ] ; then

do_pack_prvt

else

do_pack_${PACK_PLATFORM}

Fi

这里选择的是dragonboard。

function do_pack_dragonboard()

{

printf "packing for dragonboard\n" #打印信息

#建立软连接

ln -s ${LICHEE_OUT}/boot.img boot.fex

ln -s ${LICHEE_OUT}/rootfs.ext4 rootfs.fex

dragon image.cfg sys_partition.fex #内存分区

#dragon 这个也是全志闭源的脚本,没办法查看里面的操作

最后一个函数就是打印一下和修改一下IMG包

函数到现在的时候已经将 sun8iw5p1_dragonboard_vstar.img生成成功.上面的函数没有什么提示生成IMG文件

因为都是闭源脚本,没有办法探讨更加深刻一步。

function do_finish()

{

sun8iw5p1_dragonboard_vstar.img

if [ -e ${IMG_NAME} ]; then

mv ${IMG_NAME} ../${IMG_NAME}

echo '----------image is at----------'

echo -e '\033[0;31;1m'

echo ${ROOT_DIR}/${IMG_NAME}

echo -e '\033[0m'

fi

cd ..

printf "pack finish\n"

}

最后也就分析到这个镜像固件生成了,里面的一些听说是闭源的脚本命令都存在这个目录下。(/lichee/tools/pack/pctools/linux)。这里只能期望大神帮忙分析了

相关数据

阿里巴巴为什么叫阿里巴巴?马云是这样解释的......
bt365最快线路检测

阿里巴巴为什么叫阿里巴巴?马云是这样解释的......

⌛ 08-05 👁️ 7792
胳膊起红线是怎么回事
必发365手机版下载

胳膊起红线是怎么回事

⌛ 10-13 👁️ 2168
移动更换SIM卡教程:线上线下两种方式,详细步骤讲解
bt365最快线路检测

移动更换SIM卡教程:线上线下两种方式,详细步骤讲解

⌛ 07-07 👁️ 3341