網(wǎng)頁設(shè)計(jì)與網(wǎng)站建設(shè)教材微信營銷的模式有哪些
OpenRemoved_Tina_Linux_打包流程_說明指南_new
1 概述
1.1 編寫目的
介紹Allwinner 平臺上打包流程。
1.2 適用范圍
Allwinner 軟件平臺Tina v3.0 版本以上。
1.3 相關(guān)人員
適用Tina 平臺的廣大客戶,想了解Tina 打包流程的開發(fā)人員。
2 固件打包簡介
固件打包是指將我們編譯出來的bootloader、內(nèi)核和根文件系統(tǒng)一起寫到一個(gè)鏡像文件中,這個(gè)鏡像文件也叫固件。然后可以將這個(gè)鏡像寫到nand、nor flash 或是sd 卡上,從而啟動(dòng)系統(tǒng)。打包成固件時(shí)需要使用到一些打包工具,打包腳本以及打包配置文件。本文主要就是介紹打包時(shí)需要哪些工具,需要哪些配置文件,以及固件的生成流程。
3 打包工具介紹
本文只介紹Tina 打包時(shí)特有的工具,其他通用工具如unix2dos 等請自行百度。在tina SDK 中特有的打包工具保存在如下路徑:
tina/tools/pack-bintools/src
3.1 update_mbr
工具名稱 | update_mbr |
---|---|
功能說明 | 根據(jù)分區(qū)配置文件,更新主引導(dǎo)目錄文件sunxi_mbr.fex ,sunxi_gpt.fex 及分區(qū)的下載文件列表dlinfo.fex 。 |
使用方法 | update_mbr <partition_file> (mbr_count) 如果不指定mbr_count,mbr_count = 4; update_mbr <partition_file> <mbr_countnt> <output_name> 使用此用法必須指定mbr_count,本來輸出的sunxi_mbr.fex 會改名為output_name。 |
參數(shù)說明 | partition_file:分區(qū)配置文件,如sys_partition.bin mbr_count:mbr 的備份數(shù)量,如果不指定,缺省mbr_count = 4; output_name:修改sunxi_mbr.fex 的輸出名,沒有特殊需求不建議使用此用法。 |
應(yīng)用舉例 | update_mbr sys_partition.bin 4 update_mbr sys_partition.bin 1 sunxi_mbr_tmp.fex (沒有特殊需求不建議使用此用法) |
3.2 merge_full_img
工具名稱 | merge_full_img |
---|---|
功能說明 | 指定起始邏輯地址,把boot0,boot1,mbr 及分區(qū)文件下載列表里的文件合 并成img 固件包,應(yīng)用于小容量的nor flash。此時(shí)沒有分區(qū)的概念。 |
使用方法 | merge_full_img –out –boot0 <boot0.fex> –boot1 <boot1.fex> –mbr <mbr.fex> –partition <partition.fex> \–logic_start <512|256>–help |
參數(shù)說明 | –out :指定輸出目標(biāo)文件 –boot0 <boot0.fex>:指定輸入的boot0 文件–boot1 <boot1.fex>:指定輸入的boot1 文件 –mbr <mbr.fex>:指定輸入的mbr 文件–partition <partition.fex>:指定輸入的分區(qū)配置文件 |
–logic_start <512|256>:指定起始邏輯地址 | |
–help:顯示使用方法 | |
應(yīng)用舉例 | merge_full_img –out full_img.fex <br/>–boot0 boot0_spinor.fex <br/>–boot1 ${BOOT1_FILE} <br/>–mbr sunxi_mbr.fex <br/>–logic_start ${LOGIC_START} <br/>–partition_file |
3.3 script
(1) 注意: 此處講述的不是Linux 通用的script 工具(Linux 下script 工具用于終端會話錄制)
(2) 它是全志實(shí)現(xiàn)的一個(gè)同名工具,工具功能說明如下:
工具名稱 | script |
---|---|
功能說明 | 解析輸入文本文件的所有數(shù)據(jù)項(xiàng),生成新的二進(jìn)制bin 文件,以便程序解析。 生成的目標(biāo)文件與源文件名字(除后綴) 一樣,但后綴為.bin。 |
使用方法 | script <source_file> |
參數(shù)說明 | source_file:輸入的文本文件,可多個(gè) |
應(yīng)用舉例 | scriptsys_config.fex scriptsys_partition.fex |
3.4 dragonsecboot
工具名稱 | dragonsecboot |
---|---|
功能說明 | 1) 根據(jù)指定的keys 生成toc0 文件。 2) 根據(jù)指定的keys 和cnfbase 生成toc1 文件。 3) 根據(jù)配置文件生成keys。 4) 按配置文件的配置進(jìn)行打包生成目的文件。 |
使用方法 | dragonsecboot -toc0 <cfg_file> <version_file> dragonsecboot -toc1 <cfg_file> <version_file> dragonsecboot -key <cfg_file> dragonsecboot -pack <cfg_file> |
參數(shù)說明 | -toc0:表示要生成toc0 文件 -toc1:表示要生成toc1 文件 -key:表示要生成key -pack:表示進(jìn)行打包 cfg_file:配置文件 keypath:key 的路徑 cnfbase:輸入的cnf_base.cnf 文件 version_file:固件防回滾配置文件 |
應(yīng)用舉例 | dragonsecboot -pack boot_package.cfg dragonsecboot -key dragon_toc.cfg keys dragonsecboot -toc0 dragon_toc.cfg keys version_base.mk dragonsecboot -toc1 dragon_toc.cfg keys cnf_base.cnf version_base.mk |
3.5 update_boot0
工具名稱 | update_boot0 |
---|---|
功能說明 | 根據(jù)配置腳本內(nèi)容,修正boot0 頭部的參數(shù)。修正參數(shù):debug_mode、 dram_para 參數(shù)、uart 參數(shù)、bootcpu、jtag 參數(shù)、NAND 參數(shù)等。 |
使用方法 | update_boot0 <sys_config_file> <storage_type> |
參數(shù)說明 | boot0:boot0 文件 sys_config_file:系統(tǒng)配置文件storage_type:存儲介質(zhì)類型 |
應(yīng)用舉例 | update_boot0 boot0_nand.fex sys_config.bin NAND update_boot0 boot0_sdcard.fex sys_config.bin SDMMC_CARD update_boot0 boot0_spinor.fex sys_config.bin SDMMC_CARD |
3.6 update_dtb
工具名稱 | update_dtb |
---|---|
功能說明 | 把Linux 設(shè)備樹二進(jìn)制dtb 文件進(jìn)行512 字節(jié)對齊后再預(yù)留空間。 |
使用方法 | update_dtb <dtb_file> <reserve_size> |
參數(shù)說明 | dtb_file:輸入的Linux 設(shè)備樹二進(jìn)制dtb 文件reserve_size:輸出目標(biāo)文件預(yù)留多少字節(jié) |
應(yīng)用舉例 | update_dtb sunxi.fex 4096 |
3.7 update_fes1
工具名稱 | update_fes1 |
---|---|
功能說明 | 從系統(tǒng)配置文件中取出數(shù)據(jù)對fes1 頭部相關(guān)參數(shù)進(jìn)行修正。 修正參數(shù)包括:DRAM 參數(shù)、UART 參數(shù)、JTAG 參數(shù)等。 |
使用方法 | update_fes1 <fes1_file> <config_file> |
參數(shù)說明 | fes1_file:更修正的FES1 文件 config_file:輸入的系統(tǒng)配置文件 |
應(yīng)用舉例 | update_fes1 fes1.fex sys_config.bin |
3.8 signature
工具名稱 | signature |
---|---|
功能說明 | 對MBR 指定要進(jìn)行簽名的分區(qū)文件進(jìn)行簽名。 |
使用方法 | signature <sunxi_mbr_file> <dlinfo_file> |
參數(shù)說明 | sunxi_mbr_file:輸入的MBR 文件 dlinfo_file:輸入的分區(qū)下載列表文件 |
應(yīng)用舉例 | signature sunxi_mbr.fex dlinfo.fex |
3.9 update_toc0
工具名稱 | update_toc0 |
---|---|
功能說明 | 從系統(tǒng)配置文件中取出相關(guān)參數(shù)對toc0 配置參數(shù)進(jìn)行修正,修正參數(shù)包括: DRAM、UART、JTAG、NAND、卡0 、卡2 、secure 參數(shù)等。 |
使用方法 | update_toc0 <toc0_file> <config_file> |
參數(shù)說明 | toc0_file:輸入的toc0 文件 config_file:輸入的系統(tǒng)配置文件 |
應(yīng)用舉例 | update_toc0 toc0.fex sys_config.bin |
3.10 update_uboot
工具名稱 | update_uboot |
---|---|
功能說明 | 從系統(tǒng)配置文件中取出相關(guān)參數(shù)對uboot 頭部參數(shù)進(jìn)行修正。 修正參數(shù)包括:UART 參數(shù)、TWI 參數(shù)、target 參數(shù)、SDCARD 參數(shù)等。 |
使用方法 | update_uboot <uboot_file> <config_file> update_uboot -merge <uboot_file> <config_file> update_uboot -no_merge <uboot_file> <config_file> |
參數(shù)說明 | uboot_file:要更新的uboot 文件 config_file:系統(tǒng)配置文件 -merge:系統(tǒng)配置文件會拼接在uboot 文件尾部 -no_merge:系統(tǒng)配置文件不會拼接在uboot 文件尾部注意:沒有顯式指明-no_merge 參數(shù)默認(rèn)會把系統(tǒng)配置文件拼接在uboot 文件尾部 |
應(yīng)用舉例 | update_uboot u-boot.fex sys_config.bin update_uboot -merge u-boot.fex sys_config.bin update_uboot -no_merge u-boot.fex sys_config.bin |
3.11 update_scp
工具名稱 | update_scp |
---|---|
功能說明 | 從系統(tǒng)配置文件中取出相關(guān)參數(shù)對scp (小cpu 運(yùn)行代碼只有帶有小cpu 方案的芯片 會用到)頭部參數(shù)進(jìn)行修正。修正參數(shù)包括:UART 參數(shù)、dram_para 參數(shù)等。 |
使用方法 | update_scp <scp_file> <config_file> |
參數(shù)說明 | uboot_file:要更新的scp 文件 config_file:系統(tǒng)配置文件 |
應(yīng)用舉例 | update_scp scp.fex sunxi.fex |
3.12 u_boot_env_gen
工具名稱 | u_boot_env_gen |
---|---|
功能說明 | 解析env 文件生成uboot 能識別的env 二進(jìn)制數(shù)據(jù)文件,功能與標(biāo)準(zhǔn)的mkenvimage 工具類似。 |
使用方法 | u_boot_env_gen <env_file> <env_bin_file> |
參數(shù)說明 | env_file:輸入的evn 文件 env_bin_file:輸出的env 二進(jìn)制文件 |
應(yīng)用舉例 | u_boot_env_gen env.cfg env.fex |
3.13 fsbuild
工具名稱 | fsbuild |
---|---|
功能說明 | 根據(jù)boot-resource.ini 生成fat 格式文件。 |
使用方法 | fsbuild <rootfs_config_file> <magic_file> |
參數(shù)說明 | rootfs_config_file:fat 系統(tǒng)配置文件 magic:用于fat 文件系統(tǒng)校驗(yàn) |
應(yīng)用舉例 | fsbuild boot-resource.ini split_xxxx.fex |
3.14 update_toc1(舊版本工具,后面會棄用,可以不理會
工具名稱 | update_toc1 |
---|---|
功能說明 | 從系統(tǒng)配置文件中取出相關(guān)參數(shù)對toc1 配置參數(shù)進(jìn)行修正,修正參數(shù)包括: board_id_simple_gpio 參數(shù)(需配置啟用,目前已沒有方案使用)。 |
使用方法 | update_toc1 <toc1_file> <config_file> |
參數(shù)說明 | toc1_file:輸入的toc1 文件 config_file:輸入的系統(tǒng)配置文件 |
應(yīng)用舉例 | update_toc1 toc1.fex sys_config.bin |
3.15 programmer_img
工具名稱 | programmer_img |
---|---|
功能說明 | 生成mmc 介質(zhì)的燒錄固件。 |
使用方法 | programmer_img <boot0_file> <uboot_file> <out_img> programmer_img <mbr_file> <out_img> <in_img> |
參數(shù)說明 | in_img:輸入的文件或鏡像 boot0_file:boot0 文件 uboot_file:uboot 文件 partition_file:分區(qū)配置文件 mbr_file:sunxi_mbr 文件output_img:輸出的文件或鏡像 |
應(yīng)用舉例 | programmer_img boot0_sdcard.fex boot_package.fex ${out_img} programmer_img sys_partition.bin sunxi_mbr.fex ${out_img} ${in_img} |
3.16 dragon
工具名稱 | dragon |
---|---|
功能說明 | 根據(jù)img 配置文件和分區(qū)配置文件生成固件。 |
使用方法 | dragon <img_config> <partition_file> |
參數(shù)說明 | img_config:配置文件,描述img 文件格式和包含其他文件列表 partition_file:分區(qū)配置文件 |
應(yīng)用舉例 | dragon image.cfg sys_partition.fex |
3.17 sigbootimg
工具名稱 | sigbootimg |
---|---|
功能說明 | 在輸入文件的后面添加一個(gè)證書,并輸出一個(gè)帶證書的文件。 |
使用方法 | sigbootimg –image <input_img> –cert <cert_file> –output <output_img> |
參數(shù)說明 | input_img:輸入的文件或鏡像 cert_file:文件或鏡像對應(yīng)的證書 output_img:帶證書的文件或鏡像 |
應(yīng)用舉例 | sigbootimg –image boot.fex –cert boot.fex –output boot_sig.fex |
4 打包腳本分析
4.1 腳本的調(diào)用流程
在Tina 主目錄下執(zhí)行make -j16 編譯完成后便可以執(zhí)行pack 進(jìn)行打包工作,整個(gè)打包過程大概如下圖所示:
結(jié)合上面的打包流程圖分析,打包方法在Tina SDK 根目錄下運(yùn)行:
pack
最終打包出來的固件放在目錄tina/out/platform?{board}/下。pack 命令實(shí)質(zhì)上是tina SDK 內(nèi)置的一個(gè)環(huán)境變量命令。
在使用tina SDK 時(shí)需要執(zhí)行source build/envsetup.sh 這個(gè)命令。這個(gè)命令是把tina SDK 實(shí)現(xiàn)的一些shell 命令export 到當(dāng)前shell 中。
打開build/envsetup.sh 腳本,可以發(fā)現(xiàn)里面實(shí)現(xiàn)了一個(gè)shell 函數(shù):
function pack()
在tina 根目錄下執(zhí)行pack 命令后調(diào)用到的就是build/envsetup.sh 腳本中的function pack()函數(shù),function pack() 函數(shù)進(jìn)行一些參數(shù)設(shè)置后最終調(diào)用到以下語句:
$T/scripts/pack_img.sh -c $chip -p $platform -b $board -d $debug -s $sigmode -m $mode -w
$programmer -v $securemode -i $tar_image -t $T
-c:輸入的芯片類型例如:sun8iw18p1
-p:輸入的平臺例如:tina
-b:輸入的板級方案例如:r328s2-perf1
-d:輸入調(diào)試時(shí)log輸入方式例如:uart0/card0
-s:輸入是否打包成安全固件例如:none/secure
-m:輸入是正常固件還是調(diào)試用的dump固件:normal/dump
-w:
-v:輸入打包時(shí)是否使用安全boot,對于tinaSDK來說該參數(shù)功能已由-s替代,參數(shù)只是歷史遺留或做兼容用,客戶可以不
用理會該參數(shù)
-i:輸入是否制作壓縮包none/tar_image,調(diào)試時(shí)用,客戶可以不用理會該參數(shù)
-t:Tina根目錄的路徑
從上面可以看出function pack() 函數(shù)最終調(diào)用到tina/scripts/pack_img.sh 這個(gè)腳本文件,這個(gè)腳本文件實(shí)現(xiàn)了打包的最終流程。
目前打包腳本主要分為5 個(gè)階段(其他階段都是一些特殊化處理),分別是:
do_prepare
do_ini_to_dts
do_common
do_pack_tina
do_finish
4.2 打包的各階段分析
4.2.1 do_prepare 階段
此階段完成文件拷貝動(dòng)作。打包時(shí)需要拷貝若干文件到tina/out/xxxplatform/image 目錄下,目前腳本對其進(jìn)行了分類,分別是tools_file_list,configs_file_list,boot_resource_list 和boot_file_list,boot_file_secure,a64_boot_file_secure 如有新增文件,可以歸入其中一類或者創(chuàng)建新類,后續(xù)打包會使用到這些文件。
function do_prepare()
{
......
#拷貝tools_file_list 類文件到tina/out/xxxplatform/image 目錄下
printf "copying tools file\n"
for file in ${tools_file_list[@]} ; do
cp -f $file ${ROOT_DIR}/image/ 2> /dev/null
done
......
#拷貝configs_file_list 類文件到tina/out/xxxplatform/image 目錄下
printf "copying configs file\n"
for file in ${configs_file_list[@]} ; do
cp -f $file ${ROOT_DIR}/image/ 2> /dev/null
done
......
#拷貝boot_resource_list 類文件到tina/out/xxxplatform/image 目錄下
printf "copying boot resource\n"
#根據(jù)不同的arm架構(gòu)拷貝不同的boot_file_secure 類文件到tina/out/xxxplatform/image 目錄下
#32位系統(tǒng)
printf "copying secure boot file\n"
for file in ${boot_file_secure[@]} ; do
cp -f `echo $file | awk -F: '{print $1}'` \
${ROOT_DIR}/`echo $file | awk -F: '{print $2}'`
done
#64位系統(tǒng)
printf "copying arm64 secure boot file\n"
for file in ${a64_boot_file_secure[@]} ; do
cp -f `echo $file | awk -F: '{print $1}'` \
${ROOT_DIR}/`echo $file | awk -F: '{print $2}'`
done
}
4.2.2 do_ini_to_dts 階段
在linux-3.10,引入了linux 設(shè)備樹的概念。此階段主要是編譯生成描述設(shè)備樹的sunxi.dtb 文件。該文件在linux 內(nèi)核啟動(dòng)過程中會被解析,根據(jù)該文件中設(shè)備列表進(jìn)行加載各個(gè)外設(shè)的設(shè)備驅(qū)動(dòng)模塊。具體實(shí)現(xiàn)分析如下:
function do_ini_to_dts()
{
if [ "x${PACK_KERN}" == "xlinux-3.4" ] ;
then return
fi
......
#根據(jù)不同的內(nèi)核設(shè)置不同的參數(shù),最后調(diào)用下的命令編譯生成.dbt 文件
$DTC_COMPILER ${DTC_FLAGS} -O dtb -o ${ROOT_DIR}/image/sunxi{SUFFIX}.dtb \
-b 0\
-i $DTC_SRC_PATH\
-F $DTC_INI_FILE\
-d $DTC_DEP_FILE $DTC_SRC_FILE &int> /dev/null
if [ $? -ne 0 ]; then
pack_error "Conver script to dts failed" exit 1
fi
printf "Conver script to dts ok.\n"
......}
4.2.3 do_common 階段
此階段完成所有系統(tǒng)平臺通用的文件解析,分區(qū)打包。具體實(shí)現(xiàn)分析如下。(代碼順序與腳本的不一致,主要是為了方便說明),該階段與存儲介質(zhì)、內(nèi)核版本等有耦合。因此比較復(fù)雜,但主要包括下面的5 個(gè)階段:
(1) 使用unix2dos 工具確保文本文件為dos 格式。
(2) 使用script 工具解析文本文件,生成對應(yīng)的二進(jìn)制文件,便于后續(xù)工具解析。
(3) 更新boot0,uboot,scp 的頭部參數(shù)。
(4) 生成boot_package。
(5) 生成env 分區(qū)數(shù)據(jù)env.fex。
具體實(shí)現(xiàn)分析如下:
function do_common()
{
busybox unix2dos sys_config.fex
busybox unix2dos sys_partition.fex
busybox unix2dos sys_partition_nor.fex
#使用script 程序解析文本文件sys_config.fex 和sys_partition.fex/sys_partition_nor.fex
#生成相應(yīng)的二進(jìn)制文件sys_config.bin 和sys_partition.bin 便于后續(xù)工具程序解析
script sys_config.fex > /dev/null
script sys_partition.fex > /dev/null
script sys_partition_nor.fex > /dev/null
#根據(jù)sys_config.bin 參數(shù),取出DRAM,UART 等參數(shù)更新boot0 頭部參數(shù)
update_boot0 boot0_nand.fex sys_config.bin NAND > /dev/null
update_boot0 boot0_sdcard.fex sys_config.bin SDMMC_CARD > /dev/null
#根據(jù)sys_config.bin 參數(shù)設(shè)置,更新uboot 頭部參數(shù)
update_uboot u-boot.fex sys_config.bin > /dev/null
#根據(jù)sys_config.bin 參數(shù)設(shè)置,更新fes1.fex 參數(shù)
update_fes1 fes1.fex sys_config.bin > /dev/null#制作啟動(dòng)過程相關(guān)資源的分區(qū)鏡像
fsbuildboot-resource.inisplit_xxxx.fex > /dev/null
#根據(jù)配置生成uboot 基本配置二進(jìn)制文件env.fex
mkenvimage -r -p 0x00 -s ${env_size} -o env.fex env_burn.cfg
u_boot_env_gen env.cfg env.fex > /dev/null
#根據(jù)boot_package.cfg配置生成boot_package
echo "pack boot package"
busybox unix2dos boot_package.cfg
dragonsecboot -pack boot_package.cfg
}
4.2.4 do_pack_tina 階段
此階段完成當(dāng)前系統(tǒng)平臺特有的工作以及安全相關(guān)的工作,主要對內(nèi)核文件,文件系統(tǒng)等進(jìn)行軟鏈接,以及安全件的簽名和toc0 的生成。
具體實(shí)現(xiàn)分析如下:
function do_pack_tina()
{
#軟鏈接boot.fex,rootfs.fex
ln -s ${ROOT_DIR}/boot.img boot.fex
ln -s ${ROOT_DIR}/rootfs.img rootfs.fex
......
#如果需要打包成安全固件就會調(diào)用do_signature函數(shù)
do_signature
{
#生成toc0文件
dragonsecboot -toc0 dragon_toc.cfg ${ROOT_DIR}/keys ${ROOT_DIR}/image/version_base.
mk
#根據(jù)sys_config.bin 參數(shù),取出DRAM,UART 等參數(shù)更新toc0 頭部參數(shù)
update_toc0 toc0.fex sys_config.bin
......
#生成toc1文件
dragonsecboot -toc1 dragon_toc.cfg ${ROOT_DIR}/keys \
${CNF_BASE_FILE} \
${ROOT_DIR}/image/version_base.mk
#對內(nèi)核進(jìn)行簽名
sigbootimg --image boot.fex --cert toc1/cert/boot.der --output boot_sig.fex
#根據(jù)sys_config.bin 參數(shù),取出DRAM,UART 等參數(shù)更新toc1 頭部參數(shù)
update_toc1 toc1.fex sys_config.bin
}
}
4.2.5 do_finish 階段
此階段根據(jù)指定的固件成員完成打包。具體實(shí)現(xiàn)分析如下:
function do_finish()
{
......
#生成分區(qū)結(jié)構(gòu)文件sunxi_mbr.fex 及分區(qū)下載文件列表文件dlinfo.fex
update_mbr sys_partition.bin 4 > /dev/null
#根據(jù)所列的成員文件及分區(qū)信息,組合完成打包
dragon image.cfg sys_partition.fex
......
}
4.3 打包過程數(shù)據(jù)流分析
上一章節(jié)講述了打包腳本的幾個(gè)階段,本節(jié)我們換個(gè)視角看打包過程。打包過程是將編譯好后的二進(jìn)制鏡像和各種配置文件,通過一些加工、轉(zhuǎn)換和合成最終生成固件包。如下圖所示,講述了需要打包的各種文件在哪個(gè)位置,會經(jīng)過如何處理,合成什么文件,最終生
成了固件包。
其中藍(lán)色的是源文件或者生成的中間文件;
綠色的是打包用到的工具;
紅色的是最終生成的固件。
固件里面包含哪些文件,可以參考下一章節(jié)。
這里展示另一張圖,可以從Tina SDK 全局看打包的作用位置,以及數(shù)據(jù)的流動(dòng)。
4.4 固件組成成員分析
固件包本質(zhì)是由一系列的文件組成,類似于一個(gè)壓縮包,把多個(gè)文件壓縮成了一個(gè)固件包。這里通過一個(gè)描述性的配置文件(image.cfg),把需要添加到固件包的文件枚舉出來。然后打包過程就讀取這個(gè)配置文件,生成了最終的固件包。由do_finish 函數(shù)可以知道,生成固件的工具是dragon,dragon 工具需要2 個(gè)配置文件image.cfg 和sys_partition.fex,下面將會分析這2個(gè)配置文件。
4.4.1 image.cfg 配置文件分析
用文本方式,打開tina/out/xxxplatform/image/image.cfg 文件,可以看到大致如下的內(nèi)容:
[FILELIST]
{filename = "sys_config.fex", maintype = ITEM_COMMON, subtype = "
SYS_CONFIG100000",},
{filename = "config.fex", maintype = ITEM_COMMON, subtype = "
SYS_CONFIG_BIN00",},
{filename = "board.fex", maintype = ITEM_COMMON, subtype = "
BOARD_CONFIG_BIN",},
{filename = "split_xxxx.fex", maintype = ITEM_COMMON, subtype = "
SPLIT_0000000000",},
{filename = "sys_partition.fex", maintype = ITEM_COMMON, subtype = "
SYS_CONFIG000000",},
{filename = "sunxi.fex", maintype = ITEM_COMMON, subtype = "
DTB_CONFIG000000",},
{filename = "boot0_nand.fex", maintype = ITEM_BOOT, subtype = "
BOOT0_0000000000",},
{filename = "boot0_sdcard.fex", maintype = "12345678", subtype = "1234567890
BOOT_0",},
{filename = "u-boot.fex", maintype = "12345678", subtype = "
UBOOT_0000000000",},
{filename = "toc1.fex", maintype = "12345678", subtype = "
TOC1_00000000000",},
{filename = "toc0.fex", maintype = "12345678", subtype = "
TOC0_00000000000",},
{filename = "fes1.fex", maintype = ITEM_FES, subtype = "FES_1
-0000000000",},
{filename = "boot_package.fex", maintype = "12345678", subtype = "BOOTPKG
-00000000",},
;-------------------------------usb量產(chǎn)部分-------------------------------------;
;-->tools文件
{filename = "usbtool.fex", maintype = "PXTOOLSB", subtype = "
xxxxxxxxxxxxxxxx",},
{filename = "aultools.fex", maintype = "UPFLYTLS", subtype = "
xxxxxxxxxxxxxxxx",},
{filename = "aultls32.fex", maintype = "UPFLTL32", subtype = "
xxxxxxxxxxxxxxxx",},
;-------------------------------卡量產(chǎn)部分----------------------------------------;
;-->固定不變的PC使用
{filename = "cardtool.fex", maintype = "12345678", subtype = "1234567890
cardtl",},
{filename = "cardscript.fex", maintype = "12345678", subtype = "1234567890
script",},
;-->需要燒寫到卡上的文件
{filename = "sunxi_mbr.fex", maintype = "12345678", subtype = "1234567890
___MBR",},
{filename = "dlinfo.fex", maintype = "12345678", subtype = "1234567890
DLINFO",},
{filename = "arisc.fex", maintype = "12345678", subtype = "1234567890
ARISC" ,},
;鏡像配置信息
[IMAGE_CFG]
version = 0x100234 ;-->Image的版本
pid = 0x00001234 ;-->產(chǎn)品ID
vid = 0x00008743 ;-->供應(yīng)商ID
hardwareid = 0x100 ;-->硬件ID bootrom
firmwareid = 0x100 ;-->固件ID bootrom
bootromconfig = "bootrom_071203_00001234.cfg"
rootfsconfig = "rootfs.cfg"
filelist = FILELIST
imagename = tina_XXXXXX.img
該文件項(xiàng)的格式:
filename= name,maintype=ITEM_ROOTFSFAT16,subtype = user_define
當(dāng)用戶需要添加文件的時(shí)候,按照同樣的格式,把自己需要的文件寫到腳本文件中即可。
? filename:打包文件
是指文件的全路徑??梢允褂孟鄬β窂?#xff0c;如上述文件中,就使用了相對路徑。
? maintype:打包格式
表明文件的格式類型,該文件有此類型定義的列表。
? subtype:自定義名稱
用戶自己定義的名稱,使用數(shù)字和英文字符(區(qū)分大小寫),最大長度必須為16 字節(jié)。只要按照上述規(guī)則書寫,并放到文件的[FILELIST] 之后,等到打包的時(shí)候就會自動(dòng)把文件添加到固件包中。
下表描述image.cfg 文件中的各固件成員的作用。
4.4.2 sys_partition.fex 配置文件分析
除image.cfg 文件所列的文件,固件還包含了sys_partition.fex 所列的分區(qū)的文件。用文本文件打開sys_partition.fex,可以看到大致如下的內(nèi)容(主要分區(qū)有3 個(gè),不同方案分區(qū)表可能不一樣,用戶也可以添加自己的分區(qū)):
[partition_start]
[partition]
name = env
size = 32768
downloadfile = "env.fex"
user_type = 0x8000
[partition]
name = boot
size = 131072
downloadfile = "boot.fex"
user_type = 0x8000
[partition]
name = rootfs
size = 1048576
downloadfile = "rootfs.fex"
user_type = 0x8000
這是一個(gè)規(guī)劃磁盤分區(qū)的文件,一個(gè)分區(qū)的屬性,有如下幾項(xiàng):
? 分區(qū)名稱
? 分區(qū)的大小
? 下載的文件
? 分區(qū)的用戶屬性
以下是文件中所描述的一個(gè)分區(qū)的屬性:
? name:分區(qū)名稱
分區(qū)名稱由用戶自定義。當(dāng)用戶在定義一個(gè)分區(qū)的時(shí)候,可以把這里改成自己希望的字符串,但是長度不能超過16 個(gè)字節(jié)。
? size: 分區(qū)的大小
定義該分區(qū)的大小,以扇區(qū)的單位。
? downloadfile: 下載的文件
下載文件的路徑和名稱,可以使用相對路徑,相對是指相對于image.cfg 文件所在分區(qū),也可以
使用絕對路徑。
? user_type: 分區(qū)的用戶屬性
目前該標(biāo)志位只有spi nand 的ubi 文件系統(tǒng)還在使用,是歷史遺留問題,客戶可以不理會,仿照文檔中的分區(qū)填寫即可(例如0x8000)。
下表描述了sys_partition.fex 文件指定的分區(qū)里的文件。
固件成員 | 成員作用 |
---|---|
env.fex | u-boot 的基本配置文件 |
boot.fex | tina SDK 生成的boot.img 的軟鏈接,主要包含kernel |
rootfs.fex | tina SDK 生成的rootfs 鏡像的軟鏈接,根文件系統(tǒng) |
5 獲得打包后的分區(qū)鏡像文件
由于方案的差異化不同,一些方案需要獲取到每個(gè)分區(qū)的鏡像文件而非全志的整個(gè)固件燒錄包。這些分區(qū)鏡像可能主要用來做OTA 升級,或者創(chuàng)建自己的燒錄固件。
出于這方面考慮,Tina SDK 提供一種可以將分區(qū)鏡像文件整理輸出,同時(shí)輸出后的可以脫離Tina SDK 再次進(jìn)行打包的方法。方便可移植到貴方SDK 中進(jìn)行二次修改和再次打包。
5.1 開啟[pack out of tina] 功能
上述功能需要開啟[pack out of tina] 功能
make meunconfig
Target Image -->
[*] support pack out of tina
開啟[pack out of tina] 功能后,直接pack 即可看到打印提示多生成了一個(gè)文件夾:
out/xx方案/aw_pack_src
5.2 aw_pack_src 目錄介紹
./aw_pack_src
|--aw_pack.sh #執(zhí)行此腳本即可在aw_pack_src/out/目錄生成固件
|--config #打包配置文件
|--image #各種鏡像文件,可替換,但不能改文件名
| |--boot0_nand.fex #nand介質(zhì)boot0鏡像
| |--boot0_sdcard.fex #SD卡boot0鏡像
| |--boot0_spinor.fex #nor介質(zhì)boot0鏡像
| |--boot0_spinor.fex #nor介質(zhì)boot0鏡像
| |--boot_package.fex #nand和SD卡uboot鏡像
| |--boot_package_nor.fex #nor介質(zhì)uboot鏡像
| |--env.fex #env環(huán)境變量鏡像
| |--boot.fex #內(nèi)核鏡像
| |--rootfs.fex #rootfs鏡像
|--other #打包所需的其他文件
|--out #固件生成目錄
|--tmp #打包使用的臨時(shí)目錄
|--rootfs #存放rootfs的tar.gz打包,給二次修改使用
|--tools #工具
|--lib_aw #拷貝全志方案的庫文件,如多媒體組件eyesempp等,給應(yīng)用app編譯鏈接使用(沒有選擇這些庫,則可
能是空文件)
|--README #關(guān)于板級方案的一些說明,例如分區(qū)布局等等(無說明則沒有這個(gè)文件夾)。
- aw_pack_src 目錄以及里面的文件,您可以移植到貴方SDK 上。當(dāng)您重新執(zhí)行aw_pack.sh的時(shí)候,即會根據(jù)這個(gè)目錄里面的分區(qū)文件和分區(qū)信息重新打包成生成全志的固件包?;诖?#xff0c;您可以手動(dòng)二次修改分區(qū)鏡像文件后再重新打包。
- 您也可以將分區(qū)文件單獨(dú)拿出來,去做自己的OTA 升級包,或者做自己的flash 固件。
說明
Tina SDK 原本設(shè)定好的分區(qū)大小和分區(qū)名字在aw_pack_src 是無法改變的。
6 打包常見問題FAQ
? Q1: 鏡像文件的大小超過規(guī)劃的分區(qū)大小
...
ERROR: dl file rootfs.fex size too large
ERROR: filename = rootfs.fex
ERROR: dl_file_size = 5888 sector
ERROR: part_size = 4864 sector
ERROR: update mbr file fail
ERROR: update_mbr failed
A:這里表明rootfs 分區(qū)所關(guān)聯(lián)的rootfs.fex 鏡像文件(dl_file_size: 5888 x 512 byte) 大于分區(qū)規(guī)劃的大小(part_size = 4864 x 512 byte)
需要將sys_partition.fex (NOR 案:sys_partition_nor.fex) 里面的分區(qū)大小改大,以便可以裝下分區(qū)鏡像的大小。
說明
sys_partition.fex 里面的分區(qū)都需要按照flash的擦除塊大小來對齊。例如SPINOR Flash, 應(yīng)該按照64K
來對齊。
? Q2: 找不到指定的分區(qū)鏡像
...
ERROR: unable to open file usr.fex
update_for_part_info -1
ERROR: update mbr file fail
ERROR: update_mbr failed
A: 這個(gè)錯(cuò)誤是說明你設(shè)定的分區(qū)指定了分區(qū)鏡像文件,但在打包的時(shí)候沒有找到。像這個(gè)usr.fex 是需要開啟[CONFIG_SUNXI_SMALL_STORAGE_OTA] 才會主動(dòng)生成的。其他自建的分區(qū)鏡像文件,改后綴名xx.fex 并放以下目錄即可自動(dòng)找到:
device/config/chips/${TARGET_PLATFORM}/configs/${TARGET_PLAN}/linux
或者在sys_partition.fex(NOR 方案:sys_partition_nor.fex) 里面寫入絕對路徑
...
downloadfile = "/home/aw1315/img/DIY.fex"
? Q3: NOR 方案分區(qū)設(shè)置太大
...
load file: env_nor.fex ok
load file: bootlogo.fex ok
error:offset(67252224) is too large MAX_IMAGE_SIZE:67108864!
merge_package fail
...
scripts/pack_img.sh: line 1441: 73617 Segmentation fault (core dumped) merge_full_img
--out full_img.fex --boot0 boot0_spinor.fex --boot1 ${BOOT1_FILE} --mbr ${mbr_file} --
logic_start ${LOGIC_START} --uboot_start ${UBOOT_START} --partition sys_partition_nor.
bin
ERROR: merge_full_img failed
A:以上兩種情況都是屬于在sys_partition_nor.fex 里面設(shè)置太大的分區(qū)了,需要到合適大小??紤]到SPINOR Flash 不會超過64M, 所以做了這個(gè)限制。這個(gè)也是merge_full_img 這個(gè)應(yīng)用的缺陷,如果確實(shí)需要打包這么大的Nor 固件,可能需要把merge_full_img 這個(gè)工具注釋掉。
#create img for nor programmer
merge_full_img --out full_img.fex \
--boot0 boot0_spinor.fex \
--boot1 ${BOOT1_FILE} \
--mbr ${mbr_file} \
--logic_start ${LOGIC_START} \
--uboot_start ${UBOOT_START} \
--partition sys_partition_nor.bin
if [ $? -ne 0 ]; then
pack_error "merge_full_img failed"
exit 1
fi
將scripts/pack_img.sh 里面兩處有上述命令的地方,使用“#” 號注釋掉即可。
說明
merge_full_img 只是用來做燒錄器固件,不影響全志固件的生成。
7 打包流程總結(jié)
(1) 最終打包生成固件的工具是dragon。
(2)dragon 工具需要2 個(gè)配置文件image.cfg,sys_partition.fex。
(3)dragon 工具就是根據(jù)image.cfg 和sys_partition.fex 描述進(jìn)行固件文件的打包。
(4) 整個(gè)打包流程實(shí)質(zhì)上就是在處理image.cfg 和sys_partition.fex 里描述的文件。
(5) 整個(gè)打包流程可以簡單理解為下面3 個(gè)步驟:
? 生成或拷貝image.cfg 和sys_partition.fex 描述的文件。
? 對描述的文件進(jìn)行一些中間處理,例如更新一些配置到文件里面等。
e_full_img --out full_img.fex
–boot0 boot0_spinor.fex
–boot1 ${BOOT1_FILE}
–mbr ${mbr_file}
–logic_start ${LOGIC_START}
–uboot_start ${UBOOT_START}
–partition sys_partition_nor.bin
if [ $? -ne 0 ]; then
pack_error “merge_full_img failed”
exit 1
fi
將scripts/pack_img.sh 里面兩處有上述命令的地方,使用“#” 號注釋掉即可。
**說明**
**merge_full_img 只是用來做燒錄器固件,不影響全志固件的生成。**# 7 打包流程總結(jié)(1) 最終打包生成固件的工具是dragon。
(2)dragon 工具需要2 個(gè)配置文件image.cfg,sys_partition.fex。
(3)dragon 工具就是根據(jù)image.cfg 和sys_partition.fex 描述進(jìn)行固件文件的打包。
(4) 整個(gè)打包流程實(shí)質(zhì)上就是在處理image.cfg 和sys_partition.fex 里描述的文件。
(5) 整個(gè)打包流程可以簡單理解為下面3 個(gè)步驟:
? 生成或拷貝image.cfg 和sys_partition.fex 描述的文件。
? 對描述的文件進(jìn)行一些中間處理,例如更新一些配置到文件里面等。
? 用dragon 工具生成最終固件。