这步主要就是提供一些shell的function命令工具,具体可通过hmm命令查看envsetup.sh提供的所有命令:
Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment:
- lunch: lunch <product_name>-<build_variant>
- tapas: tapas [<App1> <App2> ...] [arm|x86|mips|armv5|arm64|x86_64|mips64] [eng|userdebug|user]
- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory, but not their dependencies.
- mmm: Builds all of the modules in the supplied directories, but not their dependencies.
To limit the modules being built use the syntax: mmm dir/:target1,target2.
- mma: Builds all of the modules in the current directory, and their dependencies.
- mmma: Builds all of the modules in the supplied directories, and their dependencies.
- cgrep: Greps on all local C/C++ files.
- ggrep: Greps on all local Gradle files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- mangrep: Greps on all local AndroidManifest.xml files.
- sepgrep: Greps on all local sepolicy files.
- sgrep: Greps on all local source files.
- godir: Go to the directory containing a file.
Environemnt options:
- SANITIZE_HOST: Set to ‘true’ to use ASAN for all host modules. Note that
ASAN_OPTIONS=detect_leaks=0 will be set by default until the
build is leak-check clean.
Look at the source to view more functions. The complete list is:
addcompletions add_lunch_combo cgrep check_product check_variant choosecombo chooseproduct choosetype choosevariant core coredump_enable coredump_setup cproj croot findmakefile get_abs_build_var getbugreports get_build_var getdriver getlastscreenshot get_make_command getprebuilt getscreenshotpath getsdcardpath gettargetarch gettop ggrep godir hmm is isviewserverstarted jgrep key_back key_home key_menu lunch _lunch m make mangrep mgrep mm mma mmm mmma pez pid printconfig print_lunch_menu qpid rcgrep resgrep runhat runtest sepgrep set_java_home setpaths set_sequence_number set_stuff_for_environment settitle sgrep smoketest stacks startviewserver stopviewserver systemstack tapas tracedmdump treegrep
2 lunch
//在build/envsetup.sh
function lunch()
{
local answer //声明局部变量answer
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">$1</span>"</span> ] ; <span class="hljs-keyword">then</span>
answer=<span class="hljs-variable">$1</span>
<span class="hljs-keyword">else</span> //执行lunch时没带参数时的操作
print_lunch_menu //输出可选项
<span class="hljs-built_in">echo</span> -n <span class="hljs-string">"Which would you like? [aosp_arm-eng] "</span>
<span class="hljs-built_in">read</span> answer //接收输入的数字,存放在answer. 输入的数值为<span class="hljs-number">22</span>
<span class="hljs-keyword">fi</span>
local selection= //声明局部变量answer
<span class="hljs-keyword">if</span> [ -z <span class="hljs-string">"<span class="hljs-variable">$answer</span>"</span> ] //如果输入的数字为<span class="hljs-number">0</span>时的操作
<span class="hljs-keyword">then</span>
selection=aosp_arm-eng
<span class="hljs-keyword">elif</span> (<span class="hljs-built_in">echo</span> -n <span class="hljs-variable">$answer</span> | grep -q <span class="hljs-operator">-e</span> <span class="hljs-string">"^[0-9][0-9]*$"</span>)
<span class="hljs-keyword">then</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-variable">$answer</span> -le <span class="hljs-variable">${#LUNCH_MENU_CHOICES[@]}</span> ]
<span class="hljs-keyword">then</span>
selection=<span class="hljs-variable">${LUNCH_MENU_CHOICES[$(($answer-1))]}</span>
//根据输入的数值作为字符串数组LUNCH_MENU_CHOICES的下标,把相应的字符串内容存放在selection
//selection=tulip_p1-eng
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">elif</span> (<span class="hljs-built_in">echo</span> -n <span class="hljs-variable">$answer</span> | grep -q <span class="hljs-operator">-e</span> <span class="hljs-string">"^[^\-][^\-]*-[^\-][^\-]*$"</span>)
<span class="hljs-keyword">then</span>
selection=<span class="hljs-variable">$answer</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">if</span> [ -z <span class="hljs-string">"<span class="hljs-variable">$selection</span>"</span> ] //selection变量为空则结束执行
<span class="hljs-keyword">then</span>
<span class="hljs-built_in">echo</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"Invalid lunch combo: <span class="hljs-variable">$answer</span>"</span>
<span class="hljs-keyword">return</span> <span class="hljs-number">1</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">export</span> TARGET_BUILD_APPS=
local product=$(<span class="hljs-built_in">echo</span> -n <span class="hljs-variable">$selection</span> | sed <span class="hljs-operator">-e</span> <span class="hljs-string">"s/-.*$//"</span>) //product=tulip_p1
check_product <span class="hljs-variable">$product</span>
<span class="hljs-keyword">if</span> [ $? <span class="hljs-operator">-ne</span> <span class="hljs-number">0</span> ]
<span class="hljs-keyword">then</span>
<span class="hljs-built_in">echo</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"** Don't have a product spec for: '<span class="hljs-variable">$product</span>'"</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"** Do you have the right repo manifest?"</span>
product=
<span class="hljs-keyword">fi</span>
local variant=$(<span class="hljs-built_in">echo</span> -n <span class="hljs-variable">$selection</span> | sed <span class="hljs-operator">-e</span> <span class="hljs-string">"s/^[^\-]*-//"</span>) // variant=eng
check_variant <span class="hljs-variable">$variant</span>
<span class="hljs-keyword">if</span> [ $? <span class="hljs-operator">-ne</span> <span class="hljs-number">0</span> ]
<span class="hljs-keyword">then</span>
<span class="hljs-built_in">echo</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"** Invalid variant: '<span class="hljs-variable">$variant</span>'"</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"** Must be one of <span class="hljs-variable">${VARIANT_CHOICES[@]}</span>"</span>
variant=
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">if</span> [ -z <span class="hljs-string">"<span class="hljs-variable">$product</span>"</span> -o -z <span class="hljs-string">"<span class="hljs-variable">$variant</span>"</span> ]
<span class="hljs-keyword">then</span>
<span class="hljs-built_in">echo</span>
<span class="hljs-keyword">return</span> <span class="hljs-number">1</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">export</span> TARGET_PRODUCT=<span class="hljs-variable">$product</span> //tulip_p1
<span class="hljs-keyword">export</span> TARGET_BUILD_VARIANT=<span class="hljs-variable">$variant</span> //eng
<span class="hljs-keyword">export</span> TARGET_BUILD_TYPE=release
<span class="hljs-built_in">echo</span>
<span class="hljs-keyword">set</span>_stuff_<span class="hljs-keyword">for</span>_environment //设置jdk等环境变量
printconfig //输出配置结果。 也可以直接执行此命令查看配置结果.
}
3 extract-bsp
//命令在”android/device/softwinner/common/vendorsetup.sh”文件
function extract-bsp()
{
CURDIR=$PWD
get_lichee_out_dir
//设置环境变量: LINUXOUT_DIR=lichee/out/sun50iw1p1/android/common
// LINUXOUT_MODULE_DIR=lichee/out/sun50iw1p1/android/common/lib/modules/*/*
get_device_dir
//设置环境变量: DEVICE=android/device/softwinner/tulip-p1
<span class="hljs-built_in">cd</span> <span class="hljs-variable">$DEVICE</span> //进入android/device/softwinner/tulip-p1目录
<span class="hljs-comment">#extract kernel</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-operator">-f</span> kernel ] ; <span class="hljs-keyword">then</span> //如android/device/softwinner/tulip-p1/kernel文件存在则删除
rm kernel
<span class="hljs-keyword">fi</span>
cp <span class="hljs-variable">$LINUXOUT_DIR</span>/bImage kernel //复制lichee/out/sun50iw1p1/android/common/bImage为kernel
<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$DEVICE</span>/bImage copied!"</span>
<span class="hljs-comment">#extract linux modules</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-operator">-d</span> modules ] ; <span class="hljs-keyword">then</span> //如存在android/device/softwinner/tulip-p1/modules目录则删除
rm -rf modules
<span class="hljs-keyword">fi</span>
mkdir -p modules/modules //创建目录
cp -rf <span class="hljs-variable">$LINUXOUT_MODULE_DIR</span> modules/modules //把内核编译出来的驱动模块复制到modules/modules目录里
<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$DEVICE</span>/modules copied!"</span>
chmod <span class="hljs-number">0755</span> modules/modules/*
# create modules.mk
(cat << EOF) > ./modules/modules.mk
# modules.mk generate by extract-files.sh, do not edit it.
PRODUCT_COPY_FILES += \
$(call find-copy-subdir-files,*,$(LOCAL_PATH)/modules,system/vendor/modules)
EOF
<span class="hljs-built_in">cd</span> <span class="hljs-variable">$CURDIR</span>
}
4 make //编译Android源码
//主要执行build/core/main.mk
5 pack
//命令在”android/device/softwinner/common/vendorsetup.sh”文件
function pack()
{
T=$(gettop) // T=android源码根目录
get_device_dir //设置DEVICE=android/device/softwinner/tulip-p1
export ANDROID_IMAGE_OUT=$OUT // ANDROID_IMAGE_OUT=android/out/target/product/tulip-p1
export PACKAGE=$T/../lichee/tools/pack
verity_data_init
sh <span class="hljs-variable">$DEVICE</span>/package.sh $* <span class="hljs-comment">//最后执行android/device/softwinner/tulip-p1/package.sh脚本</span>
android/device/softwinner/tulip-p1/package.sh脚本里的内容:
cd $PACKAGE //进入lichee/tools/pack目录
chip=sun50iw1p1
platform=android
board=p1
debug=uart0
sigmode=none
securemode=none
usage()
{
printf "Usage: pack [-cCHIP] [-pPLATFORM] [-bBOARD] [-d] [-s] [-v] [-h]
-c CHIP (default:
c
h
i
p
<
/
s
p
a
n
>
)
−
p
P
L
A
T
F
O
R
M
(
d
e
f
a
u
l
t
:
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
chip</span>) -p PLATFORM (default: <span class="hljs-variable">
chip</span>)−pPLATFORM(default:<spanclass="hljs−variable">platform)
-b BOARD (default: $board)
-d pack firmware with debug info output to card0
-s pack firmware with signature
-v pack firmware with secureboot
-h print this help message
"
}
while getopts “c:p🅱️dsvh” arg
do
case
a
r
g
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
k
e
y
w
o
r
d
"
>
i
n
<
/
s
p
a
n
>
c
)
c
h
i
p
=
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
arg</span> <span class="hljs-keyword">in</span> c) chip=<span class="hljs-variable">
arg</span><spanclass="hljs−keyword">in</span>c)chip=<spanclass="hljs−variable">OPTARG
;;
p)
platform=
O
P
T
A
R
G
<
/
s
p
a
n
>
;
;
b
)
b
o
a
r
d
=
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
OPTARG</span> ;; b) board=<span class="hljs-variable">
OPTARG</span>;;b)board=<spanclass="hljs−variable">OPTARG
;;
d)
debug=card0
;;
s)
sigmode=sig
;;
v)
securemode=secure
;;
h)
usage
exit 0
;;
?)
exit 1
;;
esac
done
./pack -c
c
h
i
p
<
/
s
p
a
n
>
−
p
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
chip</span> -p <span class="hljs-variable">
chip</span>−p<spanclass="hljs−variable">platform -b
b
o
a
r
d
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
o
p
e
r
a
t
o
r
"
>
−
d
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
board</span> <span class="hljs-operator">-d</span> <span class="hljs-variable">
board</span><spanclass="hljs−operator">−d</span><spanclass="hljs−variable">debug -s
s
i
g
m
o
d
e
<
/
s
p
a
n
>
−
v
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
sigmode</span> -v <span class="hljs-variable">
sigmode</span>−v<spanclass="hljs−variable">securemode
// ./pack -c sun50iw1p1 -p android -b p1 -d uart0 -s none -v none
//执行lichee/tools/pack/目录下的pack脚本
lichee/tools/pack/pack脚本里的主要操作:
do_prepare
do_ini_to_dts //生成设备树dtb文件
do_common
do_pack_${PACK_PLATFORM} // do_pack_android
do_finish //生成镜成
ROOT_DIR=<span class="hljs-built_in">pwd</span>
TOOLS_DIR=“
R
O
O
T
D
I
R
<
/
s
p
a
n
>
/
p
c
t
o
o
l
s
/
l
i
n
u
x
"
<
/
s
p
a
n
>
L
I
C
H
E
E
O
U
T
=
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
s
t
r
i
n
g
"
>
"
.
.
/
.
.
/
o
u
t
/
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{ROOT_DIR}</span>/pctools/linux"</span> LICHEE_OUT=<span class="hljs-string">"../../out/<span class="hljs-variable">
ROOTDIR</span>/pctools/linux"</span>LICHEEOUT=<spanclass="hljs−string">"../../out/<spanclass="hljs−variable">{PACK_CHIP}/${PACK_PLATFORM}/common”
// LICHEE_OUT=lichee/out/sun50iw1p1/android/common
OTA_TEST_NAME=“ota_test”
tools_file_list=(
common/tools/split_xxxx.fex
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
t
o
o
l
s
/
s
p
l
i
t
x
x
x
x
.
f
e
x
c
o
m
m
o
n
/
t
o
o
l
s
/
u
s
b
t
o
o
l
t
e
s
t
.
f
e
x
c
h
i
p
s
/
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/tools/split_xxxx.fex common/tools/usbtool_test.fex chips/<span class="hljs-variable">
PACKCHIP</span>/tools/splitxxxx.fexcommon/tools/usbtooltest.fexchips/<spanclass="hljs−variable">{PACK_CHIP}/tools/usbtool_test.fex
common/tools/cardscript.fex
common/tools/cardscript_secure.fex
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
t
o
o
l
s
/
c
a
r
d
s
c
r
i
p
t
.
f
e
x
c
h
i
p
s
/
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/tools/cardscript.fex chips/<span class="hljs-variable">
PACKCHIP</span>/tools/cardscript.fexchips/<spanclass="hljs−variable">{PACK_CHIP}/tools/cardscript_secure.fex
common/tools/cardtool.fex
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
t
o
o
l
s
/
c
a
r
d
t
o
o
l
.
f
e
x
c
o
m
m
o
n
/
t
o
o
l
s
/
u
s
b
t
o
o
l
.
f
e
x
c
h
i
p
s
/
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/tools/cardtool.fex common/tools/usbtool.fex chips/<span class="hljs-variable">
PACKCHIP</span>/tools/cardtool.fexcommon/tools/usbtool.fexchips/<spanclass="hljs−variable">{PACK_CHIP}/tools/usbtool.fex
common/tools/aultls32.fex
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
t
o
o
l
s
/
a
u
l
t
l
s
32.
f
e
x
c
o
m
m
o
n
/
t
o
o
l
s
/
a
u
l
t
o
o
l
s
.
f
e
x
c
h
i
p
s
/
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/tools/aultls32.fex common/tools/aultools.fex chips/<span class="hljs-variable">
PACKCHIP</span>/tools/aultls32.fexcommon/tools/aultools.fexchips/<spanclass="hljs−variable">{PACK_CHIP}/tools/aultools.fex
)
configs_file_list=(
common/toc/toc1.fex
common/toc/toc0.fex
common/toc/boot_package.fex
common/dtb/sunxi.fex
common/imagecfg/.cfg
common/partition/sys_partition_dump.fex
common/partition/sys_partition_private.fex
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
c
o
n
f
i
g
s
/
d
e
f
a
u
l
t
/
∗
c
h
i
p
s
/
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/configs/default/* chips/<span class="hljs-variable">
PACKCHIP</span>/configs/default/∗chips/<spanclass="hljs−variable">{PACK_CHIP}/configs/
P
A
C
K
B
O
A
R
D
<
/
s
p
a
n
>
/
∗
.
f
e
x
c
h
i
p
s
/
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_BOARD}</span>/*.fex chips/<span class="hljs-variable">
PACKBOARD</span>/∗.fexchips/<spanclass="hljs−variable">{PACK_CHIP}/configs/${PACK_BOARD}/.cfg
)
boot_resource_list=(
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
b
o
o
t
−
r
e
s
o
u
r
c
e
/
b
o
o
t
−
r
e
s
o
u
r
c
e
:
o
u
t
/
c
h
i
p
s
/
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/boot-resource/boot-resource:out/ chips/<span class="hljs-variable">
PACKCHIP</span>/boot−resource/boot−resource:out/chips/<spanclass="hljs−variable">{PACK_CHIP}/boot-resource/boot-resource.ini:out/
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
c
o
n
f
i
g
s
/
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/configs/<span class="hljs-variable">
PACKCHIP</span>/configs/<spanclass="hljs−variable">{PACK_BOARD}/*.bmp:out/boot-resource/
)
boot_file_list=(
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
b
i
n
/
b
o
o
t
0
n
a
n
d
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/bin/boot0_nand_<span class="hljs-variable">
PACKCHIP</span>/bin/boot0nand<spanclass="hljs−variable">{PACK_CHIP}.bin:out/boot0_nand.fex
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
b
i
n
/
b
o
o
t
0
s
d
c
a
r
d
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/bin/boot0_sdcard_<span class="hljs-variable">
PACKCHIP</span>/bin/boot0sdcard<spanclass="hljs−variable">{PACK_CHIP}.bin:out/boot0_sdcard.fex
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
b
i
n
/
b
o
o
t
0
s
p
i
n
o
r
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/bin/boot0_spinor_<span class="hljs-variable">
PACKCHIP</span>/bin/boot0spinor<spanclass="hljs−variable">{PACK_CHIP}.bin:out/boot0_spinor.fex
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
b
i
n
/
f
e
s
1
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/bin/fes1_<span class="hljs-variable">
PACKCHIP</span>/bin/fes1<spanclass="hljs−variable">{PACK_CHIP}.bin:out/fes1.fex
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
b
i
n
/
u
−
b
o
o
t
−
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/bin/u-boot-<span class="hljs-variable">
PACKCHIP</span>/bin/u−boot−<spanclass="hljs−variable">{PACK_CHIP}.bin:out/u-boot.fex
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
b
i
n
/
b
l
31.
b
i
n
:
o
u
t
/
m
o
n
i
t
o
r
.
f
e
x
c
h
i
p
s
/
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/bin/bl31.bin:out/monitor.fex chips/<span class="hljs-variable">
PACKCHIP</span>/bin/bl31.bin:out/monitor.fexchips/<spanclass="hljs−variable">{PACK_CHIP}/bin/scp.bin:out/scp.fex
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
b
i
n
/
u
−
b
o
o
t
−
s
p
i
n
o
r
−
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/bin/u-boot-spinor-<span class="hljs-variable">
PACKCHIP</span>/bin/u−boot−spinor−<spanclass="hljs−variable">{PACK_CHIP}.bin:out/u-boot-spinor.fex
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
b
i
n
/
b
o
o
t
0
n
a
n
d
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/bin/boot0_nand_<span class="hljs-variable">
PACKCHIP</span>/bin/boot0nand<spanclass="hljs−variable">{PACK_CHIP}-
O
T
A
T
E
S
T
N
A
M
E
<
/
s
p
a
n
>
.
b
i
n
:
o
u
t
/
b
o
o
t
0
n
a
n
d
−
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{OTA_TEST_NAME}</span>.bin:out/boot0_nand-<span class="hljs-variable">
OTATESTNAME</span>.bin:out/boot0nand−<spanclass="hljs−variable">{OTA_TEST_NAME}.fex
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
b
i
n
/
b
o
o
t
0
s
d
c
a
r
d
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/bin/boot0_sdcard_<span class="hljs-variable">
PACKCHIP</span>/bin/boot0sdcard<spanclass="hljs−variable">{PACK_CHIP}-
O
T
A
T
E
S
T
N
A
M
E
<
/
s
p
a
n
>
.
b
i
n
:
o
u
t
/
b
o
o
t
0
s
d
c
a
r
d
−
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{OTA_TEST_NAME}</span>.bin:out/boot0_sdcard-<span class="hljs-variable">
OTATESTNAME</span>.bin:out/boot0sdcard−<spanclass="hljs−variable">{OTA_TEST_NAME}.fex
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
b
i
n
/
b
o
o
t
0
s
p
i
n
o
r
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/bin/boot0_spinor_<span class="hljs-variable">
PACKCHIP</span>/bin/boot0spinor<spanclass="hljs−variable">{PACK_CHIP}-
O
T
A
T
E
S
T
N
A
M
E
<
/
s
p
a
n
>
.
b
i
n
:
o
u
t
/
b
o
o
t
0
s
p
i
n
o
r
−
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{OTA_TEST_NAME}</span>.bin:out/boot0_spinor-<span class="hljs-variable">
OTATESTNAME</span>.bin:out/boot0spinor−<spanclass="hljs−variable">{OTA_TEST_NAME}.fex
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
b
i
n
/
u
−
b
o
o
t
−
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/bin/u-boot-<span class="hljs-variable">
PACKCHIP</span>/bin/u−boot−<spanclass="hljs−variable">{PACK_CHIP}-
O
T
A
T
E
S
T
N
A
M
E
<
/
s
p
a
n
>
.
b
i
n
:
o
u
t
/
u
−
b
o
o
t
−
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{OTA_TEST_NAME}</span>.bin:out/u-boot-<span class="hljs-variable">
OTATESTNAME</span>.bin:out/u−boot−<spanclass="hljs−variable">{OTA_TEST_NAME}.fex
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
b
i
n
/
u
−
b
o
o
t
−
s
p
i
n
o
r
−
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/bin/u-boot-spinor-<span class="hljs-variable">
PACKCHIP</span>/bin/u−boot−spinor−<spanclass="hljs−variable">{PACK_CHIP}-
O
T
A
T
E
S
T
N
A
M
E
<
/
s
p
a
n
>
.
b
i
n
:
o
u
t
/
u
−
b
o
o
t
−
s
p
i
n
o
r
−
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{OTA_TEST_NAME}</span>.bin:out/u-boot-spinor-<span class="hljs-variable">
OTATESTNAME</span>.bin:out/u−boot−spinor−<spanclass="hljs−variable">{OTA_TEST_NAME}.fex
)
boot_file_secure=(
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
b
i
n
/
s
e
m
e
l
i
s
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/bin/semelis_<span class="hljs-variable">
PACKCHIP</span>/bin/semelis<spanclass="hljs−variable">{PACK_CHIP}.bin:out/semelis.bin
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
b
i
n
/
s
b
o
o
t
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/bin/sboot_<span class="hljs-variable">
PACKCHIP</span>/bin/sboot<spanclass="hljs−variable">{PACK_CHIP}.bin:out/sboot.bin
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
b
i
n
/
s
b
o
o
t
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/bin/sboot_<span class="hljs-variable">
PACKCHIP</span>/bin/sboot<spanclass="hljs−variable">{PACK_CHIP}-
O
T
A
T
E
S
T
N
A
M
E
<
/
s
p
a
n
>
.
b
i
n
:
o
u
t
/
s
b
o
o
t
−
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{OTA_TEST_NAME}</span>.bin:out/sboot-<span class="hljs-variable">
OTATESTNAME</span>.bin:out/sboot−<spanclass="hljs−variable">{OTA_TEST_NAME}.bin
)
a64_boot_file_secure=(
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
b
i
n
/
o
p
t
e
e
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/bin/optee_<span class="hljs-variable">
PACKCHIP</span>/bin/optee<spanclass="hljs−variable">{PACK_CHIP}.bin:out/optee.fex
chips/
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
/
b
i
n
/
s
b
o
o
t
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>/bin/sboot_<span class="hljs-variable">
PACKCHIP</span>/bin/sboot<spanclass="hljs−variable">{PACK_CHIP}.bin:out/sboot.bin
# chips/KaTeX parse error: Expected group after '_' at position 22: …CHIP}/bin/sboot_̲{PACK_CHIP}-
O
T
A
T
E
S
T
N
A
M
E
.
b
i
n
:
o
u
t
/
s
b
o
o
t
−
{OTA_TEST_NAME}.bin:out/sboot-
OTATESTNAME.bin:out/sboot−{OTA_TEST_NAME}.bin
)
function do_prepare()
{
//检查是否已指定好要打包的芯片型号及平台信息等
if [ -z “
P
A
C
K
C
H
I
P
<
/
s
p
a
n
>
"
<
/
s
p
a
n
>
−
o
−
z
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
s
t
r
i
n
g
"
>
"
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_CHIP}</span>"</span> -o -z <span class="hljs-string">"<span class="hljs-variable">
PACKCHIP</span>"</span>−o−z<spanclass="hljs−string">"<spanclass="hljs−variable">{PACK_PLATFORM}” -o -z “
P
A
C
K
B
O
A
R
D
<
/
s
p
a
n
>
"
<
/
s
p
a
n
>
]
;
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
k
e
y
w
o
r
d
"
>
t
h
e
n
<
/
s
p
a
n
>
p
a
c
k
e
r
r
o
r
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
s
t
r
i
n
g
"
>
"
I
n
v
a
l
i
d
p
a
r
a
m
e
t
e
r
s
C
h
i
p
:
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_BOARD}</span>"</span> ] ; <span class="hljs-keyword">then</span> pack_error <span class="hljs-string">"Invalid parameters Chip: <span class="hljs-variable">
PACKBOARD</span>"</span>];<spanclass="hljs−keyword">then</span>packerror<spanclass="hljs−string">"InvalidparametersChip:<spanclass="hljs−variable">{PACK_CHIP},
Platform:
P
A
C
K
P
L
A
T
F
O
R
M
<
/
s
p
a
n
>
,
B
o
a
r
d
:
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{PACK_PLATFORM}</span>, Board: <span class="hljs-variable">
PACKPLATFORM</span>,Board:<spanclass="hljs−variable">{PACK_BOARD}”
show_boards
exit 1
fi
<span class="hljs-keyword">if</span> [ ! <span class="hljs-operator">-d</span> chips/<span class="hljs-variable">${PACK_CHIP}</span>/configs/<span class="hljs-variable">${PACK_BOARD}</span> ] ; <span class="hljs-keyword">then</span>
pack_error <span class="hljs-string">"Board's directory \
\"chips/<span class="hljs-variable">${PACK_CHIP}</span>/configs/<span class="hljs-variable">${PACK_BOARD}</span>\" is not exist."</span>
show_boards
<span class="hljs-keyword">exit</span> <span class="hljs-number">1</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">if</span> [ -z <span class="hljs-string">"<span class="hljs-variable">${PACK_KERN}</span>"</span> ] ; <span class="hljs-keyword">then</span>
<span class="hljs-built_in">printf</span> <span class="hljs-string">"No kernel param, parse it from .buildconfig\n"</span>
PACK_KERN=`awk -F LICHEE_KERN_VER= <span class="hljs-string">'{printf $2}'</span> ../../.buildconfig`
// PACK_KERN=linux-<span class="hljs-number">3.10</span>
<span class="hljs-keyword">if</span> [ -z <span class="hljs-string">"<span class="hljs-variable">${PACK_KERN}</span>"</span> ] ; <span class="hljs-keyword">then</span>
pack_error <span class="hljs-string">"Failed to parse kernel param from .buildconfig"</span>
<span class="hljs-keyword">exit</span> <span class="hljs-number">1</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-comment"># Cleanup</span>
rm -rf out/
mkdir -p out/
<span class="hljs-built_in">printf</span> <span class="hljs-string">"copying tools file\n"</span>
//把lichee/tools/pack/目录下的common和chips子目录里的fex文件复制到lichee/tools/pack/out目录里
<span class="hljs-keyword">for</span> file <span class="hljs-keyword">in</span> <span class="hljs-variable">${tools_file_list[@]}</span> ; <span class="hljs-keyword">do</span>
cp <span class="hljs-operator">-f</span> <span class="hljs-variable">$file</span> out/ <span class="hljs-number">2</span>> /dev/null
<span class="hljs-keyword">done</span>
<span class="hljs-built_in">printf</span> <span class="hljs-string">"copying configs file\n"</span>
//把lichee/tools/pack/目录下的common和chips子目录里的fex文件复制到lichee/tools/pack/out目录里
<span class="hljs-keyword">for</span> file <span class="hljs-keyword">in</span> <span class="hljs-variable">${configs_file_list[@]}</span> ; <span class="hljs-keyword">do</span>
cp <span class="hljs-operator">-f</span> <span class="hljs-variable">$file</span> out/ <span class="hljs-number">2</span>> /dev/null
<span class="hljs-keyword">done</span>
<span class="hljs-comment"># If platform config files exist, we will cover the default files</span>
<span class="hljs-comment"># For example, mv out/image_linux.cfg out/image.cfg</span>
find ./out/* -type f <span class="hljs-operator">-a</span> \( -name <span class="hljs-string">"*.fex"</span> -o -name <span class="hljs-string">"*.cfg"</span> \) -print | \
sed <span class="hljs-string">"s#\(.*\)_<span class="hljs-variable">${PACK_PLATFORM}</span>\(\..*\)#mv -fv & \1\2#e"</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"x<span class="hljs-variable">${PACK_MODE}</span>"</span> = <span class="hljs-string">"xdump"</span> ] ; <span class="hljs-keyword">then</span> // PACK_MODE=normal
cp -vf out/sys_partition_dump.fex out/sys_partition.fex
cp -vf out/usbtool_test.fex out/usbtool.fex
<span class="hljs-keyword">elif</span> [ <span class="hljs-string">"x<span class="hljs-variable">${PACK_FUNC}</span>"</span> = <span class="hljs-string">"xprvt"</span> ] ; <span class="hljs-keyword">then</span> // PACK_FUNC=android
cp -vf out/sys_partition_private.fex out/sys_partition.fex
<span class="hljs-keyword">fi</span>
<span class="hljs-built_in">printf</span> <span class="hljs-string">"copying boot resource\n"</span> //复制boot_resource_list数组里指定的文件
<span class="hljs-keyword">for</span> file <span class="hljs-keyword">in</span> <span class="hljs-variable">${boot_resource_list[@]}</span> ; <span class="hljs-keyword">do</span>
cp -rf `<span class="hljs-built_in">echo</span> <span class="hljs-variable">$file</span> | awk -F: <span class="hljs-string">'{print $1}'</span>` \
`<span class="hljs-built_in">echo</span> <span class="hljs-variable">$file</span> | awk -F: <span class="hljs-string">'{print $2}'</span>` <span class="hljs-number">2</span>>/dev/null
<span class="hljs-keyword">done</span>
<span class="hljs-built_in">printf</span> <span class="hljs-string">"copying boot file\n"</span> //复制boot_file_list数组里指定的文件
<span class="hljs-keyword">for</span> file <span class="hljs-keyword">in</span> <span class="hljs-variable">${boot_file_list[@]}</span> ; <span class="hljs-keyword">do</span>
cp <span class="hljs-operator">-f</span> `<span class="hljs-built_in">echo</span> <span class="hljs-variable">$file</span> | awk -F: <span class="hljs-string">'{print $1}'</span>` \
`<span class="hljs-built_in">echo</span> <span class="hljs-variable">$file</span> | awk -F: <span class="hljs-string">'{print $2}'</span>` <span class="hljs-number">2</span>>/dev/null
<span class="hljs-keyword">done</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"x<span class="hljs-variable">${ARCH}</span>"</span> != <span class="hljs-string">"xarm64"</span> ] ; <span class="hljs-keyword">then</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"x<span class="hljs-variable">${PACK_SECURE}</span>"</span> = <span class="hljs-string">"xsecure"</span> -o <span class="hljs-string">"x<span class="hljs-variable">${PACK_SIG}</span>"</span> = <span class="hljs-string">"xsecure"</span> -o <span class="hljs-string">"x<span class="hljs-variable">${PACK_SIG}</span>"</span> = <span class="hljs-string">"xprev_refurbish"</span> ] ; <span class="hljs-keyword">then</span>
<span class="hljs-built_in">printf</span> <span class="hljs-string">"copying secure boot file\n"</span>
<span class="hljs-keyword">for</span> file <span class="hljs-keyword">in</span> <span class="hljs-variable">${boot_file_secure[@]}</span> ; <span class="hljs-keyword">do</span>
cp <span class="hljs-operator">-f</span> `<span class="hljs-built_in">echo</span> <span class="hljs-variable">$file</span> | awk -F: <span class="hljs-string">'{print $1}'</span>` \
`<span class="hljs-built_in">echo</span> <span class="hljs-variable">$file</span> | awk -F: <span class="hljs-string">'{print $2}'</span>`
<span class="hljs-keyword">done</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">else</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"x<span class="hljs-variable">${PACK_SECURE}</span>"</span> = <span class="hljs-string">"xsecure"</span> -o <span class="hljs-string">"x<span class="hljs-variable">${PACK_SIG}</span>"</span> = <span class="hljs-string">"xsecure"</span> -o <span class="hljs-string">"x<span class="hljs-variable">${PACK_SIG}</span>"</span> = <span class="hljs-string">"xprev_refurbish"</span> ] ; <span class="hljs-keyword">then</span>
<span class="hljs-built_in">printf</span> <span class="hljs-string">"copying arm64 secure boot file\n"</span>
<span class="hljs-keyword">for</span> file <span class="hljs-keyword">in</span> <span class="hljs-variable">${a64_boot_file_secure[@]}</span> ; <span class="hljs-keyword">do</span>
cp <span class="hljs-operator">-f</span> `<span class="hljs-built_in">echo</span> <span class="hljs-variable">$file</span> | awk -F: <span class="hljs-string">'{print $1}'</span>` \
`<span class="hljs-built_in">echo</span> <span class="hljs-variable">$file</span> | awk -F: <span class="hljs-string">'{print $2}'</span>`
<span class="hljs-keyword">done</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"x<span class="hljs-variable">${PACK_SECURE}</span>"</span> = <span class="hljs-string">"xsecure"</span> -o <span class="hljs-string">"x<span class="hljs-variable">${PACK_SIG}</span>"</span> = <span class="hljs-string">"xsecure"</span> ] ; <span class="hljs-keyword">then</span>
<span class="hljs-built_in">printf</span> <span class="hljs-string">"add burn_secure_mode in target in sys config\n"</span>
sed -i <span class="hljs-operator">-e</span> <span class="hljs-string">'/^\[target\]/a\burn_secure_mode=1'</span> out/sys_config.fex
sed -i <span class="hljs-operator">-e</span> <span class="hljs-string">'/^\[platform\]/a\secure_without_OS=0'</span> out/sys_config.fex
<span class="hljs-keyword">elif</span> [ <span class="hljs-string">"x<span class="hljs-variable">${PACK_SIG}</span>"</span> = <span class="hljs-string">"xprev_refurbish"</span> ] ; <span class="hljs-keyword">then</span>
<span class="hljs-built_in">printf</span> <span class="hljs-string">"add burn_secure_mode in target in sys config\n"</span>
sed -i <span class="hljs-operator">-e</span> <span class="hljs-string">'/^\[target\]/a\burn_secure_mode=1'</span> out/sys_config.fex
sed -i <span class="hljs-operator">-e</span> <span class="hljs-string">'/^\[platform\]/a\secure_without_OS=1'</span> out/sys_config.fex
<span class="hljs-keyword">else</span>
sed -i <span class="hljs-string">'/^burn_secure_mod/d'</span> out/sys_config.fex
sed -i <span class="hljs-string">'/^secure_without_OS/d'</span> out/sys_config.fex
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"x<span class="hljs-variable">${PACK_MODE}</span>"</span> = <span class="hljs-string">"xota_test"</span> ] ; <span class="hljs-keyword">then</span>
<span class="hljs-built_in">printf</span> <span class="hljs-string">"copy ota test file\n"</span>
copy_ota_test_file
<span class="hljs-keyword">fi</span>
<span class="hljs-comment"># Here, we can switch uart to card or normal</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"x<span class="hljs-variable">${PACK_DEBUG}</span>"</span> = <span class="hljs-string">"xcard0"</span> <span class="hljs-operator">-a</span> <span class="hljs-string">"x<span class="hljs-variable">${PACK_MODE}</span>"</span> != <span class="hljs-string">"xdump"</span> \
<span class="hljs-operator">-a</span> <span class="hljs-string">"x<span class="hljs-variable">${PACK_FUNC}</span>"</span> != <span class="hljs-string">"xprvt"</span> ] ; <span class="hljs-keyword">then</span> \
uart_switch
<span class="hljs-keyword">fi</span>
sed -i <span class="hljs-string">'s/\\boot-resource/\/boot-resource/g'</span> out/boot-resource.ini
sed -i <span class="hljs-string">'s/\\\\/\//g'</span> out/image.cfg
sed -i <span class="hljs-string">'s/^imagename/;imagename/g'</span> out/image.cfg
IMG_NAME=<span class="hljs-string">"<span class="hljs-variable">${PACK_CHIP}</span>_<span class="hljs-variable">${PACK_PLATFORM}</span>6.0_<span class="hljs-variable">${PACK_BOARD}</span>_<span class="hljs-variable">${PACK_DEBUG}</span>"</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"x<span class="hljs-variable">${PACK_SIG}</span>"</span> != <span class="hljs-string">"xnone"</span> ]; <span class="hljs-keyword">then</span>
IMG_NAME=<span class="hljs-string">"<span class="hljs-variable">${IMG_NAME}</span>_<span class="hljs-variable">${PACK_SIG}</span>"</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"x<span class="hljs-variable">${PACK_MODE}</span>"</span> = <span class="hljs-string">"xdump"</span> -o <span class="hljs-string">"x<span class="hljs-variable">${PACK_MODE}</span>"</span> = <span class="hljs-string">"xota_test"</span> ] ; <span class="hljs-keyword">then</span>
IMG_NAME=<span class="hljs-string">"<span class="hljs-variable">${IMG_NAME}</span>_<span class="hljs-variable">${PACK_MODE}</span>"</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"x<span class="hljs-variable">${PACK_FUNC}</span>"</span> = <span class="hljs-string">"xprvt"</span> ] ; <span class="hljs-keyword">then</span>
IMG_NAME=<span class="hljs-string">"<span class="hljs-variable">${IMG_NAME}</span>_<span class="hljs-variable">${PACK_FUNC}</span>"</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"x<span class="hljs-variable">${PACK_SECURE}</span>"</span> = <span class="hljs-string">"xsecure"</span> ] ; <span class="hljs-keyword">then</span>
IMG_NAME=<span class="hljs-string">"<span class="hljs-variable">${IMG_NAME}</span>_<span class="hljs-variable">${PACK_SECURE}</span>"</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"x<span class="hljs-variable">${PACK_FUNC}</span>"</span> = <span class="hljs-string">"xprev_refurbish"</span> ] ; <span class="hljs-keyword">then</span>
IMG_NAME=<span class="hljs-string">"<span class="hljs-variable">${IMG_NAME}</span>_<span class="hljs-variable">${PACK_FUNC}</span>"</span>
<span class="hljs-keyword">fi</span>
IMG_NAME=<span class="hljs-string">"<span class="hljs-variable">${IMG_NAME}</span>_bv3.img"</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"imagename = <span class="hljs-variable">$IMG_NAME</span>"</span> >> out/image.cfg
<span class="hljs-built_in">echo</span> <span class="hljs-string">""</span> >> out/image.cfg
}
//
function do_ini_to_dts()
{
if [ “x${PACK_KERN}” != “xlinux-3.10” ] ; then // PACK_KERN=linux-3.10
return
fi
//声明局部变量及初始值
local DTC_COMPILER=<span class="hljs-variable">${LICHEE_OUT}</span>/../../../../<span class="hljs-variable">$PACK_KERN</span>/scripts/dtc/dtc
local DTC_DEP_FILE=<span class="hljs-variable">${LICHEE_OUT}</span>/../../../../<span class="hljs-variable">$PACK_KERN</span>/arch/<span class="hljs-variable">$ARCH</span>/boot/dts/.<span class="hljs-variable">${PACK_CHIP}</span>-<span class="hljs-variable">${PACK_BOARD}</span>.dtb.d.dtc.tmp
local DTC_SRC_PATH=<span class="hljs-variable">${LICHEE_OUT}</span>/../../../../<span class="hljs-variable">$PACK_KERN</span>/arch/<span class="hljs-variable">$ARCH</span>/boot/dts/
local DTC_SRC_FILE=<span class="hljs-variable">${LICHEE_OUT}</span>/../../../../<span class="hljs-variable">$PACK_KERN</span>/arch/<span class="hljs-variable">$ARCH</span>/boot/dts/.<span class="hljs-variable">${PACK_CHIP}</span>-<span class="hljs-variable">${PACK_BOARD}</span>.dtb.dts
local DTC_INI_FILE_BASE=<span class="hljs-variable">${LICHEE_OUT}</span>/../../../../tools/pack/out/sys_config.fex
local DTC_INI_FILE=<span class="hljs-variable">${LICHEE_OUT}</span>/../../../../tools/pack/out/sys_config_fix.fex
cp <span class="hljs-variable">$DTC_INI_FILE_BASE</span> <span class="hljs-variable">$DTC_INI_FILE</span>
sed -i <span class="hljs-string">"s/\(\[dram\)_para\(\]\)/\1\2/g"</span> <span class="hljs-variable">$DTC_INI_FILE</span>
sed -i <span class="hljs-string">"s/\(\[nand[0-9]\)_para\(\]\)/\1\2/g"</span> <span class="hljs-variable">$DTC_INI_FILE</span>
<span class="hljs-keyword">if</span> [ ! <span class="hljs-operator">-f</span> <span class="hljs-variable">$DTC_COMPILER</span> ]; <span class="hljs-keyword">then</span>
pack_error <span class="hljs-string">"Script_to_dts: Can not find dtc compiler.\n"</span>
<span class="hljs-keyword">exit</span> <span class="hljs-number">1</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">if</span> [ ! <span class="hljs-operator">-f</span> <span class="hljs-variable">$DTC_DEP_FILE</span> ]; <span class="hljs-keyword">then</span> //内核源码目录下不存在arch/arm64/boot/dts/.sun50iw1p1-p1.dtb.d.dtc.tmp文件
<span class="hljs-built_in">printf</span> <span class="hljs-string">"Script_to_dts: Can not find [%s-%s.dts]. Will use common dts file instead.\n"</span> <span class="hljs-variable">${PACK_CHIP}</span> <span class="hljs-variable">${PACK_BOARD}</span>
DTC_DEP_FILE=<span class="hljs-variable">${LICHEE_OUT}</span>/../../../../<span class="hljs-variable">$PACK_KERN</span>/arch/<span class="hljs-variable">$ARCH</span>/boot/dts/.<span class="hljs-variable">${PACK_CHIP}</span>-soc.dtb.d.dtc.tmp
DTC_SRC_FILE=<span class="hljs-variable">${LICHEE_OUT}</span>/../../../../<span class="hljs-variable">$PACK_KERN</span>/arch/<span class="hljs-variable">$ARCH</span>/boot/dts/.<span class="hljs-variable">${PACK_CHIP}</span>-soc.dtb.dts
<span class="hljs-keyword">fi</span>
<span class="hljs-variable">$DTC_COMPILER</span> -O dtb -o <span class="hljs-variable">${LICHEE_OUT}</span>/sunxi.dtb \
-b <span class="hljs-number">0</span> \
-i <span class="hljs-variable">$DTC_SRC_PATH</span> \
-F <span class="hljs-variable">$DTC_INI_FILE</span> \
<span class="hljs-operator">-d</span> <span class="hljs-variable">$DTC_DEP_FILE</span> <span class="hljs-variable">$DTC_SRC_FILE</span>
// dtc -O dtb -o lichee/out/sun50iw1p1/android/common/sunxi.dtb \
// -b <span class="hljs-number">0</span> -i lichee/linux-<span class="hljs-number">3.10</span>/arch/arm64/boot/dts \
// -F lichee/tools/pack/out/sys_config_fix.fex \
// <span class="hljs-operator">-d</span> lichee/linux-<span class="hljs-number">3.10</span>/arch/arm64/boot/dts/.sun50iw1p1-soc.dtb.d.dtc.tmp \
// lichee/linux-<span class="hljs-number">3.10</span>/arch/arm64/boot/dts/.sun50iw1p1-soc.dtb.dts
//生成的设备树dtb文件在lichee/out/sun50iw1p1/android/common/sunxi.dtb
<span class="hljs-keyword">if</span> [ $? <span class="hljs-operator">-ne</span> <span class="hljs-number">0</span> ]; <span class="hljs-keyword">then</span>
pack_error <span class="hljs-string">"Conver script to dts failed"</span>
<span class="hljs-keyword">exit</span> <span class="hljs-number">1</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-comment">#restore the orignal dtsi</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"x<span class="hljs-variable">${ARCH}</span>"</span> = <span class="hljs-string">"xarm64"</span> ]; <span class="hljs-keyword">then</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"x<span class="hljs-variable">${PACK_PLATFORM}</span>"</span> = <span class="hljs-string">"xdragonboard"</span> ]; <span class="hljs-keyword">then</span> //不成立
local DTS_PATH=../../linux-<span class="hljs-number">3.10</span>/arch/arm64/boot/dts/
<span class="hljs-keyword">if</span> [ <span class="hljs-operator">-f</span> <span class="hljs-variable">${DTS_PATH}</span>/sun50iw1p1_bak.dtsi ];<span class="hljs-keyword">then</span>
rm <span class="hljs-operator">-f</span> <span class="hljs-variable">${DTS_PATH}</span>/sun50iw1p1.dtsi
mv <span class="hljs-variable">${DTS_PATH}</span>/sun50iw1p1_bak.dtsi <span class="hljs-variable">${DTS_PATH}</span>/sun50iw1p1.dtsi
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-built_in">printf</span> <span class="hljs-string">"Conver script to dts ok.\n"</span>
<span class="hljs-keyword">return</span>
}
//
function do_common()
{
cd out/ //进入lichee/tools/pack/out目录
busybox unix2dos sys_config.fex //转换文件为dos格式
busybox unix2dos sys_partition.fex //转换文件为dos格式
script sys_config.fex > /dev/null
script sys_partition.fex > /dev/null
cp <span class="hljs-operator">-f</span> sys_config.bin config.fex
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"x<span class="hljs-variable">${PACK_PLATFORM}</span>"</span> = <span class="hljs-string">"xdragonboard"</span> ] ; <span class="hljs-keyword">then</span> //不成立
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/
<span class="hljs-keyword">fi</span>
<span class="hljs-comment"># Those files for SpiNor. We will try to find sys_partition_nor.fex</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-operator">-f</span> sys_partition_nor.fex ]; <span class="hljs-keyword">then</span> //没有此文件
<span class="hljs-keyword">if</span> [ <span class="hljs-operator">-f</span> <span class="hljs-string">"<span class="hljs-variable">${LICHEE_OUT}</span>/sunxi.dtb"</span> ]; <span class="hljs-keyword">then</span>
cp <span class="hljs-variable">${LICHEE_OUT}</span>/sunxi.dtb sunxi.fex
update_uboot_fdt u-boot-spinor.fex sunxi.fex u-boot-spinor.fex >/dev/null
<span class="hljs-keyword">fi</span>
<span class="hljs-comment"># Here, will create sys_partition_nor.bin</span>
busybox unix2dos sys_partition_nor.fex
script sys_partition_nor.fex > /dev/null
update_boot0 boot0_spinor.fex sys_config.bin SDMMC_CARD > /dev/null
update_uboot u-boot-spinor.fex sys_config.bin >/dev/null
<span class="hljs-keyword">if</span> [ <span class="hljs-operator">-f</span> boot_package_nor.cfg ]; <span class="hljs-keyword">then</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"pack boot package"</span>
busybox unix2dos boot_package.cfg
dragonsecboot -pack boot_package_nor.cfg
cp boot_package.fex boot_package_nor.fex
<span class="hljs-keyword">fi</span>
<span class="hljs-comment"># Ugly, but I don't have a better way to change it.</span>
<span class="hljs-comment"># We just set env's downloadfile name to env_nor.cfg in sys_partition_nor.fex</span>
<span class="hljs-comment"># And if env_nor.cfg is not exist, we should copy one.</span>
<span class="hljs-keyword">if</span> [ ! <span class="hljs-operator">-f</span> env_nor.cfg ]; <span class="hljs-keyword">then</span>
cp <span class="hljs-operator">-f</span> env.cfg env_nor.cfg >/dev/null <span class="hljs-number">2</span><&<span class="hljs-number">1</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-comment"># Fixup boot mode for SPINor, just can bootm</span>
sed -i <span class="hljs-string">'/^boot_normal/s#\<boota\>#bootm#g'</span> env_nor.cfg
u_boot_env_gen env_nor.cfg env_nor.fex >/dev/null
<span class="hljs-keyword">fi</span>
// updata_uboot*和update_boot*命令工具在lichee/tools/pack/pctools/linux/mod_update/目录里
<span class="hljs-keyword">if</span> [ <span class="hljs-operator">-f</span> <span class="hljs-string">"<span class="hljs-variable">${LICHEE_OUT}</span>/sunxi.dtb"</span> ]; <span class="hljs-keyword">then</span> //成立
cp <span class="hljs-variable">${LICHEE_OUT}</span>/sunxi.dtb sunxi.fex
update_uboot_fdt u-boot.fex sunxi.fex u-boot.fex >/dev/null
<span class="hljs-keyword">fi</span>
<span class="hljs-comment"># Those files for Nand or Card</span>
update_boot0 boot0_nand.fex sys_config.bin NAND > /dev/null
update_boot0 boot0_sdcard.fex sys_config.bin SDMMC_CARD > /dev/null
update_uboot u-boot.fex sys_config.bin > /dev/null
update_fes1 fes1.fex sys_config.bin > /dev/null
fsbuild boot-resource.ini split_xxxx.fex > /dev/null
<span class="hljs-keyword">if</span> [ <span class="hljs-operator">-f</span> boot_package.cfg ]; <span class="hljs-keyword">then</span> //文件存在
<span class="hljs-built_in">echo</span> <span class="hljs-string">"pack boot package"</span>
busybox unix2dos boot_package.cfg
dragonsecboot -pack boot_package.cfg
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"x<span class="hljs-variable">${PACK_FUNC}</span>"</span> = <span class="hljs-string">"xprvt"</span> ] ; <span class="hljs-keyword">then</span>
u_boot_env_gen env_burn.cfg env.fex > /dev/null
<span class="hljs-keyword">else</span>
u_boot_env_gen env.cfg env.fex > /dev/null
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-operator">-f</span> <span class="hljs-string">"<span class="hljs-variable">$LICHEE_OUT</span>/arisc"</span> ]; <span class="hljs-keyword">then</span>
ln <span class="hljs-operator">-s</span> <span class="hljs-variable">$LICHEE_OUT</span>/arisc arisc.fex
<span class="hljs-keyword">fi</span>
}
/
function do_pack_android()
{
printf “packing for android\n”
//ANDROID_IMAGE_OUT=android/out/target/product/tulip-p1
<span class="hljs-keyword">if</span> [ -z <span class="hljs-string">"<span class="hljs-variable">${ANDROID_IMAGE_OUT}</span>"</span> ] ; <span class="hljs-keyword">then</span>
pack_error <span class="hljs-string">"please specify ANDROID_IMAGE_OUT env"</span>
<span class="hljs-keyword">exit</span> <span class="hljs-number">1</span>
<span class="hljs-keyword">fi</span>
ln <span class="hljs-operator">-s</span> <span class="hljs-variable">${ANDROID_IMAGE_OUT}</span>/boot.img boot.fex
ln <span class="hljs-operator">-s</span> <span class="hljs-variable">${ANDROID_IMAGE_OUT}</span>/system.img system.fex
ln <span class="hljs-operator">-s</span> <span class="hljs-variable">${ANDROID_IMAGE_OUT}</span>/recovery.img recovery.fex
<span class="hljs-keyword">if</span> [ <span class="hljs-operator">-f</span> <span class="hljs-variable">${ANDROID_IMAGE_OUT}</span>/verity_block.img ] ; <span class="hljs-keyword">then</span>
ln <span class="hljs-operator">-s</span> <span class="hljs-variable">${ANDROID_IMAGE_OUT}</span>/verity_block.img verity_block.fex
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-operator">-f</span> <span class="hljs-variable">${ANDROID_IMAGE_OUT}</span>/userdata.img ] ; <span class="hljs-keyword">then</span>
ln <span class="hljs-operator">-s</span> <span class="hljs-variable">${ANDROID_IMAGE_OUT}</span>/userdata.img userdata.fex
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"x<span class="hljs-variable">${PACK_SIG}</span>"</span> = <span class="hljs-string">"xsig"</span> ] ; <span class="hljs-keyword">then</span> // PACK_SIG=none 不成立
<span class="hljs-built_in">echo</span> <span class="hljs-string">"signature sunxi mbr"</span>
signature sunxi_mbr.fex dlinfo.fex
<span class="hljs-built_in">echo</span> <span class="hljs-string">"signature over"</span>
<span class="hljs-keyword">elif</span> [ <span class="hljs-string">"x<span class="hljs-variable">${PACK_SECURE}</span>"</span> = <span class="hljs-string">"xsecure"</span> ] ; <span class="hljs-keyword">then</span> // PACK_SECURE=none
<span class="hljs-built_in">echo</span> <span class="hljs-string">"secure"</span>
<span class="hljs-keyword">do</span>_signature
<span class="hljs-keyword">elif</span> [ <span class="hljs-string">"x<span class="hljs-variable">${PACK_SIG}</span>"</span> = <span class="hljs-string">"xprev_refurbish"</span> ] ; <span class="hljs-keyword">then</span> //不成立
<span class="hljs-built_in">echo</span> <span class="hljs-string">"prev_refurbish"</span>
<span class="hljs-keyword">do</span>_signature
<span class="hljs-keyword">else</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"normal"</span>
<span class="hljs-keyword">fi</span>
}
function do_finish()
{
# Yeah, it should contain all files into full_img.fex for spinor
# Because, as usually, spinor image size is very small.
# If fail to create full_img.fex, we should fake it empty.
<span class="hljs-comment"># WTF, it is so ugly!!! It must be sunxi_mbr.fex & sys_partition.bin,</span>
<span class="hljs-comment"># not sunxi_mbr_xxx.fex & sys_partition_xxx.bin. In order to advoid this</span>
<span class="hljs-comment"># loathsome thing, we need to backup & copy files. Check whether</span>
<span class="hljs-comment"># sys_partition_nor.bin is exist, and create sunxi_mbr.fex for Nor.</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-operator">-f</span> sys_partition_nor.bin ]; <span class="hljs-keyword">then</span> //没有此文件, 不成立
mv <span class="hljs-operator">-f</span> sys_partition.bin sys_partition.bin_back
cp <span class="hljs-operator">-f</span> sys_partition_nor.bin sys_partition.bin
update_mbr sys_partition.bin <span class="hljs-number">1</span> > /dev/null
<span class="hljs-comment">#when use devicetree, the size of uboot+dtb is larger then 256K</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"x<span class="hljs-variable">${PACK_KERN}</span>"</span> = <span class="hljs-string">"xlinux-3.10"</span> ] ; <span class="hljs-keyword">then</span>
BOOT1_FILE=boot_package_nor.fex
LOGIC_START=<span class="hljs-number">496</span> <span class="hljs-comment">#496+16=512K</span>
merge_full_img --out full_img.fex \
--boot0 boot0_spinor.fex \
--boot1 <span class="hljs-variable">${BOOT1_FILE}</span> \
--mbr sunxi_mbr.fex \
--logic_start <span class="hljs-variable">${LOGIC_START}</span> \
--partition sys_partition.bin
<span class="hljs-keyword">if</span> [ $? <span class="hljs-operator">-ne</span> <span class="hljs-number">0</span> ]; <span class="hljs-keyword">then</span>
pack_error <span class="hljs-string">"merge_full_img failed"</span>
<span class="hljs-keyword">exit</span> <span class="hljs-number">1</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">else</span>
<span class="hljs-comment">#BOOT1_FILE=u-boot-spinor.fex</span>
<span class="hljs-comment">#LOGIC_START=240 #240+16=256K</span>
merge_package full_img.fex boot0_spinor.fex \
u-boot-spinor.fex sunxi_mbr.fex sys_partition.bin
<span class="hljs-keyword">fi</span>
mv <span class="hljs-operator">-f</span> sys_partition.bin_back sys_partition.bin
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">if</span> [ ! <span class="hljs-operator">-f</span> full_img.fex ]; <span class="hljs-keyword">then</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"full_img.fex is empty"</span> > full_img.fex
<span class="hljs-keyword">fi</span>
// update_mbr工具在lichee/tools/pack/pctools/linux/mod_update/目录
// dragon工具在lichee/tools/pack/pctools/linux/eDragonEx/目录
update_mbr sys_partition.bin <span class="hljs-number">4</span> > /dev/null
dragon image.cfg sys_partition.fex //生成镜像
<span class="hljs-keyword">if</span> [ $? <span class="hljs-operator">-eq</span> <span class="hljs-number">0</span> ]; <span class="hljs-keyword">then</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-operator">-e</span> <span class="hljs-variable">${IMG_NAME}</span> ]; <span class="hljs-keyword">then</span>
mv <span class="hljs-variable">${IMG_NAME}</span> ../<span class="hljs-variable">${IMG_NAME}</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">'----------image is at----------'</span>
<span class="hljs-built_in">echo</span> <span class="hljs-operator">-e</span> <span class="hljs-string">'\033[0;31;1m'</span>
<span class="hljs-built_in">echo</span> <span class="hljs-variable">${ROOT_DIR}</span>/<span class="hljs-variable">${IMG_NAME}</span>
<span class="hljs-built_in">echo</span> <span class="hljs-operator">-e</span> <span class="hljs-string">'\033[0m'</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-built_in">cd</span> ..
<span class="hljs-built_in">printf</span> <span class="hljs-string">"pack finish\n"</span>
}