<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[全志lichee的pack命令]]></title><description><![CDATA[<p dir="auto">全志lichee目录打包命令流程 pack</p>
<p dir="auto">将打包命令传进去build.sh脚本里面。查看buildsh里面的脚本命令。</p>
<p dir="auto">其实里面的脚本还是较为简单地的，仅仅是作为一个过渡，然后就跑进去buildroot/scripts目录下的mkcommon.sh脚本里面。 那么需要转到这个脚本里面做了什么事情。</p>
<p dir="auto"><strong>一、脚本源码分析</strong></p>
<pre><code>#!/bin/bash				
BR_SCRIPTS_DIR=`dirname $0`			// $0就是这个文件名字
# source shflags						
. ${BR_SCRIPTS_DIR}/shflags/shflags		//标志
. ${BR_SCRIPTS_DIR}/mkcmd.sh			//这个脚本有大量的命令函数

[ -f .buildconfig ] &amp;&amp; . .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
</code></pre>
<p dir="auto">在这里单独讲解pack这个参数，其他的参数可以参考我以前的博客。可以看到一旦pack这个参数成立之后就会执行一下两行脚本：</p>
<pre><code>init_defconf
	mkpack
	exit $?
</code></pre>
<p dir="auto">init_defconf函数命令：</p>
<p dir="auto">首先说明这个命令函数是在同目录下mkcmd.sh文件里面。也就是上面提及的加载这个脚本进来，就可以调用里面的脚本函数，会频繁提起这个脚本。可以观察到无论上面脚本在哪里成立都会执行这个函数命令。也就是说这个是一个通用的函数命令。里面的东西不外乎通用参数和环境参数等等通用的东西</p>
<pre><code>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 &amp;&amp; \
    	./pack -c ${LICHEE_CHIP} -p ${LICHEE_PLATFORM} -b ${LICHEE_BOARD} $@)
}
</code></pre>
<p dir="auto">一下才是pack命令里面的重点。：</p>
<pre><code>(cd ${LICHEE_TOOLS_DIR}/pack &amp;&amp; \
  ./pack -c ${LICHEE_CHIP} -p ${LICHEE_PLATFORM} -b ${LICHEE_BOARD} $@)
</code></pre>
<p dir="auto">首先以下这句话就是在重点cd /tools/pack 目录下。</p>
<pre><code>cd ${LICHEE_TOOLS_DIR}/pack       （有关pack目录下的内容）
</code></pre>
<p dir="auto">然后下半段命令：</p>
<pre><code>./pack   -c  ${LICHEE_CHIP}   -p  ${LICHEE_PLATFORM}    -b  ${LICHEE_BOARD} $@)
LICHEE_CHIP       =  （全志版本）
LICHEE_PLATFORM  =  （这个是编译的平台）
LICHEE_BOARD     =   (厂家配置)
</code></pre>
<p dir="auto">以上三个配置就是在在执行 /build.sh config 选择全志版本，平台，具体产家配置。</p>
<p dir="auto">那么置换回来就可以得到以下命令：<br />
这个命令就是说判断</p>
<pre><code>/*
sun8iw5p1是否存在并且是字特殊文件则为真
linux是否存在并且是一个名字管道
vstar是否存在并且是一个块特殊文件则为真 */

./pack   -c   sun8iw5p1    -p  linxu     -b  vstar  $@
</code></pre>
<p dir="auto">转而分析到这个pack脚本，这个脚本在（tools/pack）</p>
<p dir="auto">①执行：. …/…/buildroot/scripts/shflags/shflags<br />
（执行这个脚本里面内容做了以下的处理，拿到对应的版本号等操作，定义一些大 判断或者识别的函数）<br />
主线程里面到LICHEE_OUT（lichee/out/sun8iw5p1/dragonboard/common<br />
）目录下</p>
<p dir="auto">配置对应的环境：</p>
<pre><code>export PATH=${TOOLS_DIR}/mod_update:${TOOLS_DIR}/eDragonEx:${TOOLS_DIR}/fsbuild200:${TOOLS_DIR}/android:$PATH
</code></pre>
<p dir="auto">最后查看PACK脚本保存大量的函数命令，直接可以执行到以下脚本的操作</p>
<p dir="auto"><img src="/assets/uploads/files/1686883665470-d9b68bc3-fe52-43fa-87db-99e4735cbbb9.png" alt="D9B68BC3-FE52-43fa-87DB-99E4735CBBB9.png" class=" img-responsive img-markdown" width="629" height="227" /></p>
<p dir="auto">然后执行这个函数：</p>
<pre><code>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&gt; /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&gt; /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 &gt; out/a.fex
	rm out/sys_config.fex
	mv out/a.fex out/sys_config.fex
	echo "uart -&gt; 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 &gt; 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 -&gt; 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" &gt;&gt; out/image.cfg
echo "" &gt;&gt; out/image.cfg
</code></pre>
<p dir="auto">当执行do_prepare函数执行完，执行到以下这个do_common。</p>
<pre><code>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 &gt; /dev/null	#批量处理脚本命令
	script sys_partition.fex &gt; /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 &gt; /dev/null
	cp test_config.bin boot-resource/
fi

#update_boot0  也是全志闭源命令
	update_boot0 boot0_nand.fex		sys_config.bin NAND &gt; /dev/null  
	update_boot0 boot0_sdcard.fex	sys_config.bin SDMMC_CARD &gt; /dev/null

#update_boot0  也是全志闭源命令
	update_uboot u-boot.fex  		sys_config.bin &gt; /dev/null
	update_fes1  fes1.fex			sys_config.bin &gt; /dev/null
	update_mbr sys_partition.bin 4 &gt; /dev/null

#fsbuild   也是全志闭源命令
		fsbuild boot-resource.ini split_xxxx.fex &gt; /dev/null

	if [ "x${PACK_FUNC}" = "xprvt" ] ; then
		u_boot_env_gen env_burn.cfg env.fex &gt; /dev/null
	else
		u_boot_env_gen env.cfg env.fex &gt; /dev/null
	fi

	ln -s $LICHEE_OUT/arisc arisc.fex
</code></pre>
<p dir="auto">#判断实现的那个版本的系统</p>
<pre><code>if [ "x${PACK_MODE}" = "xdump" ] ; then
	do_pack_dump
elif [ "x${PACK_FUNC}" = "xprvt" ] ; then
	do_pack_prvt
else   							
	do_pack_${PACK_PLATFORM}
Fi
</code></pre>
<p dir="auto">这里选择的是dragonboard。</p>
<pre><code>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  这个也是全志闭源的脚本，没办法查看里面的操作
</code></pre>
<p dir="auto">最后一个函数就是打印一下和修改一下IMG包<br />
函数到现在的时候已经将 sun8iw5p1_dragonboard_vstar.img生成成功.上面的函数没有什么提示生成IMG文件<br />
因为都是闭源脚本，没有办法探讨更加深刻一步。</p>
<pre><code>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"
}
</code></pre>
<p dir="auto">最后也就分析到这个镜像固件生成了，里面的一些听说是闭源的脚本命令都存在这个目录下。（/lichee/tools/pack/pctools/linux）。这里只能期望大神帮忙分析了</p>
]]></description><link>https://bbs.aw-ol.com/topic/3706/全志lichee的pack命令</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Apr 2026 15:09:02 GMT</lastBuildDate><atom:link href="https://bbs.aw-ol.com/topic/3706.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 16 Jun 2023 02:49:34 GMT</pubDate><ttl>60</ttl></channel></rss>