当前位置: 首页 > news >正文

Tina_Linux打包流程说明指南_new

OpenRemoved_Tina_Linux_打包流程_说明指南_new

1 概述

1.1 编写目的

介绍Allwinner 平台上打包流程。

1.2 适用范围

Allwinner 软件平台Tina v3.0 版本以上。

1.3 相关人员

适用Tina 平台的广大客户,想了解Tina 打包流程的开发人员。

2 固件打包简介

固件打包是指将我们编译出来的bootloader、内核和根文件系统一起写到一个镜像文件中,这个镜像文件也叫固件。然后可以将这个镜像写到nand、nor flash 或是sd 卡上,从而启动系统。打包成固件时需要使用到一些打包工具,打包脚本以及打包配置文件。本文主要就是介绍打包时需要哪些工具,需要哪些配置文件,以及固件的生成流程。

3 打包工具介绍

本文只介绍Tina 打包时特有的工具,其他通用工具如unix2dos 等请自行百度。在tina SDK 中特有的打包工具保存在如下路径:

tina/tools/pack-bintools/src

3.1 update_mbr

工具名称update_mbr
功能说明根据分区配置文件,更新主引导目录文件sunxi_mbr.fex ,sunxi_gpt.fex
及分区的下载文件列表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。
参数说明partition_file:分区配置文件,如sys_partition.bin
mbr_count:mbr 的备份数量,如果不指定,缺省mbr_count = 4;
output_name:修改sunxi_mbr.fex 的输出名,没有特殊需求不建议使用此用法。
应用举例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 及分区文件下载列表里的文件合
并成img 固件包,应用于小容量的nor flash。此时没有分区的概念。
使用方法merge_full_img –out
–boot0 <boot0.fex>
–boot1 <boot1.fex>
–mbr <mbr.fex>
–partition <partition.fex> \–logic_start <512|256>–help
参数说明–out :指定输出目标文件
–boot0 <boot0.fex>:指定输入的boot0 文件–boot1 <boot1.fex>:指定输入的boot1 文件
–mbr <mbr.fex>:指定输入的mbr 文件–partition <partition.fex>:指定输入的分区配置文件
–logic_start <512|256>:指定起始逻辑地址
–help:显示使用方法
应用举例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) 它是全志实现的一个同名工具,工具功能说明如下:

工具名称script
功能说明解析输入文本文件的所有数据项,生成新的二进制bin 文件,以便程序解析。
生成的目标文件与源文件名字(除后缀) 一样,但后缀为.bin。
使用方法script <source_file>
参数说明source_file:输入的文本文件,可多个
应用举例scriptsys_config.fex
scriptsys_partition.fex

3.4 dragonsecboot

工具名称dragonsecboot
功能说明1) 根据指定的keys 生成toc0 文件。
2) 根据指定的keys 和cnfbase 生成toc1 文件。
3) 根据配置文件生成keys。
4) 按配置文件的配置进行打包生成目的文件。
使用方法dragonsecboot -toc0 <cfg_file> <version_file>
dragonsecboot -toc1 <cfg_file> <version_file>
dragonsecboot -key <cfg_file>
dragonsecboot -pack <cfg_file>
参数说明-toc0:表示要生成toc0 文件
-toc1:表示要生成toc1 文件
-key:表示要生成key
-pack:表示进行打包
cfg_file:配置文件
keypath:key 的路径
cnfbase:输入的cnf_base.cnf 文件
version_file:固件防回滚配置文件
应用举例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
功能说明根据配置脚本内容,修正boot0 头部的参数。修正参数:debug_mode、
dram_para 参数、uart 参数、bootcpu、jtag 参数、NAND 参数等。
使用方法update_boot0 <sys_config_file> <storage_type>
参数说明boot0:boot0 文件
sys_config_file:系统配置文件storage_type:存储介质类型
应用举例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 设备树二进制dtb 文件进行512 字节对齐后再预留空间。
使用方法update_dtb <dtb_file> <reserve_size>
参数说明dtb_file:输入的Linux 设备树二进制dtb 文件reserve_size:输出目标文件预留多少字节
应用举例update_dtb sunxi.fex 4096

3.7 update_fes1

工具名称update_fes1
功能说明从系统配置文件中取出数据对fes1 头部相关参数进行修正。
修正参数包括:DRAM 参数、UART 参数、JTAG 参数等。
使用方法update_fes1 <fes1_file> <config_file>
参数说明fes1_file:更修正的FES1 文件
config_file:输入的系统配置文件
应用举例update_fes1 fes1.fex sys_config.bin

3.8 signature

工具名称signature
功能说明对MBR 指定要进行签名的分区文件进行签名。
使用方法signature <sunxi_mbr_file> <dlinfo_file>
参数说明sunxi_mbr_file:输入的MBR 文件
dlinfo_file:输入的分区下载列表文件
应用举例signature sunxi_mbr.fex dlinfo.fex

3.9 update_toc0

工具名称update_toc0
功能说明从系统配置文件中取出相关参数对toc0 配置参数进行修正,修正参数包括:
DRAM、UART、JTAG、NAND、卡0 、卡2 、secure 参数等。
使用方法update_toc0 <toc0_file> <config_file>
参数说明toc0_file:输入的toc0 文件
config_file:输入的系统配置文件
应用举例update_toc0 toc0.fex sys_config.bin

3.10 update_uboot

工具名称update_uboot
功能说明从系统配置文件中取出相关参数对uboot 头部参数进行修正。
修正参数包括:UART 参数、TWI 参数、target 参数、SDCARD 参数等。
使用方法update_uboot <uboot_file> <config_file>
update_uboot -merge <uboot_file> <config_file>
update_uboot -no_merge <uboot_file> <config_file>
参数说明uboot_file:要更新的uboot 文件
config_file:系统配置文件
-merge:系统配置文件会拼接在uboot 文件尾部
-no_merge:系统配置文件不会拼接在uboot 文件尾部注意:没有显式指明-no_merge 参数默认会把系统配置文件拼接在uboot 文件尾部
应用举例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
功能说明从系统配置文件中取出相关参数对scp (小cpu 运行代码只有带有小cpu 方案的芯片
会用到)头部参数进行修正。修正参数包括:UART 参数、dram_para 参数等。
使用方法update_scp <scp_file> <config_file>
参数说明uboot_file:要更新的scp 文件
config_file:系统配置文件
应用举例update_scp scp.fex sunxi.fex

3.12 u_boot_env_gen

工具名称u_boot_env_gen
功能说明解析env 文件生成uboot 能识别的env 二进制数据文件,功能与标准的mkenvimage
工具类似。
使用方法u_boot_env_gen <env_file> <env_bin_file>
参数说明env_file:输入的evn 文件
env_bin_file:输出的env 二进制文件
应用举例u_boot_env_gen env.cfg env.fex

3.13 fsbuild

工具名称fsbuild
功能说明根据boot-resource.ini 生成fat 格式文件。
使用方法fsbuild <rootfs_config_file> <magic_file>
参数说明rootfs_config_file:fat 系统配置文件
magic:用于fat 文件系统校验
应用举例fsbuild boot-resource.ini split_xxxx.fex

3.14 update_toc1(旧版本工具,后面会弃用,可以不理会

工具名称update_toc1
功能说明从系统配置文件中取出相关参数对toc1 配置参数进行修正,修正参数包括:
board_id_simple_gpio 参数(需配置启用,目前已没有方案使用)。
使用方法update_toc1 <toc1_file> <config_file>
参数说明toc1_file:输入的toc1 文件
config_file:输入的系统配置文件
应用举例update_toc1 toc1.fex sys_config.bin

3.15 programmer_img

工具名称programmer_img
功能说明生成mmc 介质的烧录固件。
使用方法programmer_img <boot0_file> <uboot_file> <out_img>
programmer_img <mbr_file> <out_img> <in_img>
参数说明in_img:输入的文件或镜像
boot0_file:boot0 文件
uboot_file:uboot 文件
partition_file:分区配置文件
mbr_file:sunxi_mbr 文件output_img:输出的文件或镜像
应用举例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
功能说明根据img 配置文件和分区配置文件生成固件。
使用方法dragon <img_config> <partition_file>
参数说明img_config:配置文件,描述img 文件格式和包含其他文件列表
partition_file:分区配置文件
应用举例dragon image.cfg sys_partition.fex

3.17 sigbootimg

工具名称sigbootimg
功能说明在输入文件的后面添加一个证书,并输出一个带证书的文件。
使用方法sigbootimg –image <input_img> –cert <cert_file> –output <output_img>
参数说明input_img:输入的文件或镜像
cert_file:文件或镜像对应的证书
output_img:带证书的文件或镜像
应用举例sigbootimg –image boot.fex –cert boot.fex –output boot_sig.fex

4 打包脚本分析

4.1 脚本的调用流程

在Tina 主目录下执行make -j16 编译完成后便可以执行pack 进行打包工作,整个打包过程大概如下图所示:

image-20230104103604851

结合上面的打包流程图分析,打包方法在Tina SDK 根目录下运行:

pack

最终打包出来的固件放在目录tina/out/platform−{board}/下。pack 命令实质上是tina SDK 内置的一个环境变量命令。

在使用tina SDK 时需要执行source build/envsetup.sh 这个命令。这个命令是把tina SDK 实现的一些shell 命令export 到当前shell 中。
打开build/envsetup.sh 脚本,可以发现里面实现了一个shell 函数:

function pack()

在tina 根目录下执行pack 命令后调用到的就是build/envsetup.sh 脚本中的function pack()函数,function pack() 函数进行一些参数设置后最终调用到以下语句:

$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:输入调试时log输入方式例如:uart0/card0
-s:输入是否打包成安全固件例如:none/secure
-m:输入是正常固件还是调试用的dump固件:normal/dump
-w:
-v:输入打包时是否使用安全boot,对于tinaSDK来说该参数功能已由-s替代,参数只是历史遗留或做兼容用,客户可以不
用理会该参数
-i:输入是否制作压缩包none/tar_image,调试时用,客户可以不用理会该参数
-t:Tina根目录的路径

从上面可以看出function pack() 函数最终调用到tina/scripts/pack_img.sh 这个脚本文件,这个脚本文件实现了打包的最终流程。
目前打包脚本主要分为5 个阶段(其他阶段都是一些特殊化处理),分别是:

do_prepare
do_ini_to_dts
do_common
do_pack_tina
do_finish

4.2 打包的各阶段分析

4.2.1 do_prepare 阶段

此阶段完成文件拷贝动作。打包时需要拷贝若干文件到tina/out/xxxplatform/image 目录下,目前脚本对其进行了分类,分别是tools_file_list,configs_file_list,boot_resource_list 和boot_file_list,boot_file_secure,a64_boot_file_secure 如有新增文件,可以归入其中一类或者创建新类,后续打包会使用到这些文件。

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"
#根据不同的arm架构拷贝不同的boot_file_secure 类文件到tina/out/xxxplatform/image 目录下
#32位系统
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位系统
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 设备树的概念。此阶段主要是编译生成描述设备树的sunxi.dtb 文件。该文件在linux 内核启动过程中会被解析,根据该文件中设备列表进行加载各个外设的设备驱动模块。具体实现分析如下:

function do_ini_to_dts()
{
if [ "x${PACK_KERN}" == "xlinux-3.4" ] ;
then return
fi
......
#根据不同的内核设置不同的参数,最后调用下的命令编译生成.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 阶段

此阶段完成所有系统平台通用的文件解析,分区打包。具体实现分析如下。(代码顺序与脚本的不一致,主要是为了方便说明),该阶段与存储介质、内核版本等有耦合。因此比较复杂,但主要包括下面的5 个阶段:
(1) 使用unix2dos 工具确保文本文件为dos 格式。
(2) 使用script 工具解析文本文件,生成对应的二进制文件,便于后续工具解析。
(3) 更新boot0,uboot,scp 的头部参数。
(4) 生成boot_package。
(5) 生成env 分区数据env.fex。
具体实现分析如下:

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
#生成相应的二进制文件sys_config.bin 和sys_partition.bin 便于后续工具程序解析
script sys_config.fex > /dev/null
script sys_partition.fex > /dev/null
script sys_partition_nor.fex > /dev/null
#根据sys_config.bin 参数,取出DRAM,UART 等参数更新boot0 头部参数
update_boot0 boot0_nand.fex sys_config.bin NAND > /dev/null
update_boot0 boot0_sdcard.fex sys_config.bin SDMMC_CARD > /dev/null
#根据sys_config.bin 参数设置,更新uboot 头部参数
update_uboot u-boot.fex sys_config.bin > /dev/null
#根据sys_config.bin 参数设置,更新fes1.fex 参数
update_fes1 fes1.fex sys_config.bin > /dev/null#制作启动过程相关资源的分区镜像
fsbuildboot-resource.inisplit_xxxx.fex > /dev/null
#根据配置生成uboot 基本配置二进制文件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
#根据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 阶段

此阶段完成当前系统平台特有的工作以及安全相关的工作,主要对内核文件,文件系统等进行软链接,以及安全件的签名和toc0 的生成。
具体实现分析如下:

function do_pack_tina()
{
#软链接boot.fex,rootfs.fex
ln -s ${ROOT_DIR}/boot.img boot.fex
ln -s ${ROOT_DIR}/rootfs.img rootfs.fex
......
#如果需要打包成安全固件就会调用do_signature函数
do_signature
{
#生成toc0文件
dragonsecboot -toc0 dragon_toc.cfg ${ROOT_DIR}/keys ${ROOT_DIR}/image/version_base.
mk
#根据sys_config.bin 参数,取出DRAM,UART 等参数更新toc0 头部参数
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
#对内核进行签名
sigbootimg --image boot.fex --cert toc1/cert/boot.der --output boot_sig.fex
#根据sys_config.bin 参数,取出DRAM,UART 等参数更新toc1 头部参数
update_toc1 toc1.fex sys_config.bin
}
}

4.2.5 do_finish 阶段

此阶段根据指定的固件成员完成打包。具体实现分析如下:

function do_finish()
{
......
#生成分区结构文件sunxi_mbr.fex 及分区下载文件列表文件dlinfo.fex
update_mbr sys_partition.bin 4 > /dev/null
#根据所列的成员文件及分区信息,组合完成打包
dragon image.cfg sys_partition.fex
......
}

4.3 打包过程数据流分析

上一章节讲述了打包脚本的几个阶段,本节我们换个视角看打包过程。打包过程是将编译好后的二进制镜像和各种配置文件,通过一些加工、转换和合成最终生成固件包。如下图所示,讲述了需要打包的各种文件在哪个位置,会经过如何处理,合成什么文件,最终生
成了固件包。

image-20230104104015158

其中蓝色的是源文件或者生成的中间文件;
绿色的是打包用到的工具;
红色的是最终生成的固件。
固件里面包含哪些文件,可以参考下一章节。
这里展示另一张图,可以从Tina SDK 全局看打包的作用位置,以及数据的流动。

image-20230104104033322

4.4 固件组成成员分析

固件包本质是由一系列的文件组成,类似于一个压缩包,把多个文件压缩成了一个固件包。这里通过一个描述性的配置文件(image.cfg),把需要添加到固件包的文件枚举出来。然后打包过程就读取这个配置文件,生成了最终的固件包。由do_finish 函数可以知道,生成固件的工具是dragon,dragon 工具需要2 个配置文件image.cfg 和sys_partition.fex,下面将会分析这2个配置文件。

4.4.1 image.cfg 配置文件分析

用文本方式,打开tina/out/xxxplatform/image/image.cfg 文件,可以看到大致如下的内容:

[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量产部分-------------------------------------;
;-->tools文件
{filename = "usbtool.fex", maintype = "PXTOOLSB", subtype = "
xxxxxxxxxxxxxxxx",},
{filename = "aultools.fex", maintype = "UPFLYTLS", subtype = "
xxxxxxxxxxxxxxxx",},
{filename = "aultls32.fex", maintype = "UPFLTL32", subtype = "
xxxxxxxxxxxxxxxx",},
;-------------------------------卡量产部分----------------------------------------;
;-->固定不变的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 ;-->产品ID
vid = 0x00008743 ;-->供应商ID
hardwareid = 0x100 ;-->硬件ID bootrom
firmwareid = 0x100 ;-->固件ID bootrom
bootromconfig = "bootrom_071203_00001234.cfg"
rootfsconfig = "rootfs.cfg"
filelist = FILELIST
imagename = tina_XXXXXX.img

该文件项的格式:

filename= name,maintype=ITEM_ROOTFSFAT16,subtype = user_define

当用户需要添加文件的时候,按照同样的格式,把自己需要的文件写到脚本文件中即可。

• filename:打包文件
是指文件的全路径。可以使用相对路径,如上述文件中,就使用了相对路径。
• maintype:打包格式
表明文件的格式类型,该文件有此类型定义的列表。
• subtype:自定义名称
用户自己定义的名称,使用数字和英文字符(区分大小写),最大长度必须为16 字节。只要按照上述规则书写,并放到文件的[FILELIST] 之后,等到打包的时候就会自动把文件添加到固件包中。
下表描述image.cfg 文件中的各固件成员的作用。

image-20230104104210037

4.4.2 sys_partition.fex 配置文件分析

除image.cfg 文件所列的文件,固件还包含了sys_partition.fex 所列的分区的文件。用文本文件打开sys_partition.fex,可以看到大致如下的内容(主要分区有3 个,不同方案分区表可能不一样,用户也可以添加自己的分区):

[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

这是一个规划磁盘分区的文件,一个分区的属性,有如下几项:
• 分区名称
• 分区的大小
• 下载的文件
• 分区的用户属性

以下是文件中所描述的一个分区的属性:
• name:分区名称
分区名称由用户自定义。当用户在定义一个分区的时候,可以把这里改成自己希望的字符串,但是长度不能超过16 个字节。
• size: 分区的大小
定义该分区的大小,以扇区的单位。
• downloadfile: 下载的文件
下载文件的路径和名称,可以使用相对路径,相对是指相对于image.cfg 文件所在分区,也可以
使用绝对路径。
• user_type: 分区的用户属性

目前该标志位只有spi nand 的ubi 文件系统还在使用,是历史遗留问题,客户可以不理会,仿照文档中的分区填写即可(例如0x8000)。
下表描述了sys_partition.fex 文件指定的分区里的文件。

固件成员成员作用
env.fexu-boot 的基本配置文件
boot.fextina SDK 生成的boot.img 的软链接,主要包含kernel
rootfs.fextina SDK 生成的rootfs 镜像的软链接,根文件系统

5 获得打包后的分区镜像文件

由于方案的差异化不同,一些方案需要获取到每个分区的镜像文件而非全志的整个固件烧录包。这些分区镜像可能主要用来做OTA 升级,或者创建自己的烧录固件。
出于这方面考虑,Tina SDK 提供一种可以将分区镜像文件整理输出,同时输出后的可以脱离Tina SDK 再次进行打包的方法。方便可移植到贵方SDK 中进行二次修改和再次打包。

5.1 开启[pack out of tina] 功能

上述功能需要开启[pack out of tina] 功能

make meunconfig
Target Image -->
[*] support pack out of tina

开启[pack out of tina] 功能后,直接pack 即可看到打印提示多生成了一个文件夹:

out/xx方案/aw_pack_src

5.2 aw_pack_src 目录介绍

./aw_pack_src
|--aw_pack.sh #执行此脚本即可在aw_pack_src/out/目录生成固件
|--config #打包配置文件
|--image #各种镜像文件,可替换,但不能改文件名
| |--boot0_nand.fex #nand介质boot0镜像
| |--boot0_sdcard.fex #SD卡boot0镜像
| |--boot0_spinor.fex #nor介质boot0镜像
| |--boot0_spinor.fex #nor介质boot0镜像
| |--boot_package.fex #nand和SD卡uboot镜像
| |--boot_package_nor.fex #nor介质uboot镜像
| |--env.fex #env环境变量镜像
| |--boot.fex #内核镜像
| |--rootfs.fex #rootfs镜像
|--other #打包所需的其他文件
|--out #固件生成目录
|--tmp #打包使用的临时目录
|--rootfs #存放rootfs的tar.gz打包,给二次修改使用
|--tools #工具
|--lib_aw #拷贝全志方案的库文件,如多媒体组件eyesempp等,给应用app编译链接使用(没有选择这些库,则可
能是空文件)
|--README #关于板级方案的一些说明,例如分区布局等等(无说明则没有这个文件夹)。
  1. aw_pack_src 目录以及里面的文件,您可以移植到贵方SDK 上。当您重新执行aw_pack.sh的时候,即会根据这个目录里面的分区文件和分区信息重新打包成生成全志的固件包。基于此,您可以手动二次修改分区镜像文件后再重新打包。
  2. 您也可以将分区文件单独拿出来,去做自己的OTA 升级包,或者做自己的flash 固件。
    说明
    Tina SDK 原本设定好的分区大小和分区名字在aw_pack_src 是无法改变的。

6 打包常见问题FAQ

• Q1: 镜像文件的大小超过规划的分区大小

...
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 分区所关联的rootfs.fex 镜像文件(dl_file_size: 5888 x 512 byte) 大于分区规划的大小(part_size = 4864 x 512 byte)
需要将sys_partition.fex (NOR 案:sys_partition_nor.fex) 里面的分区大小改大,以便可以装下分区镜像的大小。
说明

sys_partition.fex 里面的分区都需要按照flash的擦除块大小来对齐。例如SPINOR Flash, 应该按照64K
来对齐。

• Q2: 找不到指定的分区镜像

...
ERROR: unable to open file usr.fex
update_for_part_info -1
ERROR: update mbr file fail
ERROR: update_mbr failed

A: 这个错误是说明你设定的分区指定了分区镜像文件,但在打包的时候没有找到。像这个usr.fex 是需要开启[CONFIG_SUNXI_SMALL_STORAGE_OTA] 才会主动生成的。其他自建的分区镜像文件,改后缀名xx.fex 并放以下目录即可自动找到:

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 方案分区设置太大

...
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 里面设置太大的分区了,需要到合适大小。考虑到SPINOR Flash 不会超过64M, 所以做了这个限制。这个也是merge_full_img 这个应用的缺陷,如果确实需要打包这么大的Nor 固件,可能需要把merge_full_img 这个工具注释掉。

#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 打包流程总结

(1) 最终打包生成固件的工具是dragon。
(2)dragon 工具需要2 个配置文件image.cfg,sys_partition.fex。
(3)dragon 工具就是根据image.cfg 和sys_partition.fex 描述进行固件文件的打包。
(4) 整个打包流程实质上就是在处理image.cfg 和sys_partition.fex 里描述的文件。
(5) 整个打包流程可以简单理解为下面3 个步骤:
• 生成或拷贝image.cfg 和sys_partition.fex 描述的文件。
• 对描述的文件进行一些中间处理,例如更新一些配置到文件里面等。
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 打包流程总结(1) 最终打包生成固件的工具是dragon。
(2)dragon 工具需要2 个配置文件image.cfg,sys_partition.fex。
(3)dragon 工具就是根据image.cfg 和sys_partition.fex 描述进行固件文件的打包。
(4) 整个打包流程实质上就是在处理image.cfg 和sys_partition.fex 里描述的文件。
(5) 整个打包流程可以简单理解为下面3 个步骤:
• 生成或拷贝image.cfg 和sys_partition.fex 描述的文件。
• 对描述的文件进行一些中间处理,例如更新一些配置到文件里面等。
• 用dragon 工具生成最终固件。

相关文章:

Tina_Linux打包流程说明指南_new

OpenRemoved_Tina_Linux_打包流程_说明指南_new 1 概述 1.1 编写目的 介绍Allwinner 平台上打包流程。 1.2 适用范围 Allwinner 软件平台Tina v3.0 版本以上。 1.3 相关人员 适用Tina 平台的广大客户&#xff0c;想了解Tina 打包流程的开发人员。 2 固件打包简介 固件…...

JVM面试题

JVM 1.jvm的组成部分 类加载器:将javac编译的class文件加载到内存中 运行时数据区&#xff1a;将内存划分成若干个不同的区域。 执行引擎&#xff1a;负责解析命令&#xff0c;提交操作系统执行。 本地接口&#xff1a;融合不同的语言为java所用 2.运行时数据区 方法区&…...

@FeignClient注解

1.在启动类上开启Feign功能 不开会提示找不到所需要的bean Consider defining a bean of type in your configuration SpringBootApplication EnableFeignClients public class AuthApplication {public static void main(String[] args) {SpringApplication.run(AuthApplic…...

一文搞懂如何在 React 中使用 防抖(Debounce)和 节流(Throttle)

在前端的日常开发中&#xff0c;经常会使用到两个函数防抖&#xff08;Debounce&#xff09;和节流&#xff08;Throttle&#xff09;&#xff0c;防抖函数可以有效控制在一段时间内只执行最后一次请求&#xff0c;例如搜索框输入时&#xff0c;只在输入完成后才进行请求接口。…...

Airbyte API

Airbyte API涵盖了Airbyte功能的方方面面&#xff0c;主要分类&#xff1a;Source_definition&#xff1a;来源定义&#xff0c;实现了来源的增删改查功能。Destination_definition&#xff1a;目标定义&#xff0c;实现了目标的增删改查功能。Workspace&#xff1a;工作区管理…...

vue项目使用Electron开发桌面应用

添加npm配置避免安装Electron错误 请确保您的 node 版本大于等于 18. cmd运行&#xff1a; npm config edit 该命令会打开npm的配置文件&#xff0c;请在空白处添加&#xff1a; electron_builder_binaries_mirrorhttps://npmmirror.com/mirrors/electron-builder-binaries/ e…...

std::chrono笔记

文章目录1. radio原型作用示例2. duration原型&#xff1a;作用示例3. time_point原型作用示例4. clockssystem_clock示例steady_clock示例high_resolution_clock先说感觉&#xff0c;这个库真恶心&#xff0c;刚接触感觉跟shi一样&#xff0c;特别是那个命名空间&#xff0c;太…...

接收arp请求并发送回应的实例

本文简单介绍了arp协议,用一个实例查看收到的ARP请求,并对该请求发出ARP回应,实例有完整的源代码,使用C语言在Linux下实现,代码中有详细的注释。 1. ARP协议 ARP(Address Resolution Protocol),地址解析协议;在局域网上通过IP地址获取物理地址MAC的协议,该协议工作在数…...

【高性能计算】TVM使用TE手动优化矩阵乘法算法解析与代码解读

引言 注&#xff1a;本文主要介绍、解释TVM的矩阵优化思想、代码&#xff0c;需要配合代码注释一起阅读。 矩阵乘法是计算密集型运算。为了获得良好的 CPU 性能&#xff0c;有两个重要的优化措施&#xff1a; 提高内存访问的高速缓存命中率。复杂的数值计算和热点内存&#x…...

消息中间件的概念

中间件(middleware)是基础软件的一大类&#xff0c;属于可复用的软件范畴。中间件在操作系统软件&#xff0c;网络和数据库之上&#xff0c;应用软件之下&#xff0c;总的作用是为处于自己上层的应用软件提供运行于开发的环境&#xff0c;帮助用户灵活、高效的开发和集成复杂的…...

窃密恶意软件Raccoon最新样本Stealer v2分析

Raccoon 是一个恶意软件家族&#xff0c;2019 年来一直在地下犯罪论坛中以恶意软件即服务的身份进行售卖。2022 年 7 月&#xff0c;该恶意软件家族发布了 C 语言编写的新版本 Raccoon Stealer v2&#xff0c;打破了以往使用 C 开发的传统。 Raccoon 是一个信息窃密恶意软件&a…...

足球俱乐部管理系统

技术&#xff1a;Java、JSP等摘要&#xff1a;网站是一种主要的渠道。人们通过互联网快速、准确的发布信息、获取信息。而足球俱乐部是足球职业化、专业化的一个标志&#xff0c;是足球运动员以足球谋生时&#xff0c;所被聘用的机构&#xff0c;应运时代发展&#xff0c;规模、…...

2023上半年数学建模竞赛汇总(比赛时间、难易程度、含金量、竞赛官网)

1、美国大学生数学建模竞赛等级&#xff1a;国家级是否可跨校&#xff1a;否竞赛开始时间&#xff1a;2月17日~2月21日综合难度&#xff1a;⭐⭐⭐⭐ 竞赛含金量&#xff1a;⭐⭐⭐⭐⭐竞赛官网&#xff1a;https://www.comap.com/2、MathorCup高校数学建模挑战赛---大数据竞赛…...

【python学习笔记】:PHP7 Null合并运算符

在PHP7&#xff0c;一个新的功能&#xff0c;空合并运算符(??)已被引入。它被用来代替三元运算并与 isset()函数功能结合一起使用。如果它存在并且它不是空的&#xff0c;空合并运算符返回它的第一个操作数;否则返回第二个操作数。 示例 <?php// fetch the value of $_…...

数据结构与算法——3.时间复杂度分析1(概述)

前面我们已经介绍了&#xff0c;研究算法的最终目的是如何花费更少的时间&#xff0c;如何占用更少的内存去完成相同的需求&#xff0c;并且也通过案例演示了不同算法之间时间耗费和空间耗费上的差异&#xff0c;但我们并不能将时间占用和空间占用量化。因此&#xff0c;接下来…...

FPGA学习之日常工作复位电路

最近一个多月没有写博客了&#xff0c;然后最近工作中也遇到一个复位信号的问题。问题是这样的&#xff0c;关于外部复位信号&#xff0c;之前我们的处理方式都是通过PLL产生的Lock信号作为内部的复位信号。但是由于换到A54上面没有IP核&#xff0c;所以只有不用PLL&#xff0c…...

【洛谷 P1177】【模板】快速排序 题解(快速排序+指针)

【模板】快速排序 题目描述 利用快速排序算法将读入的 NNN 个数从小到大排序后输出。 快速排序是信息学竞赛的必备算法之一。对于快速排序不是很了解的同学可以自行上网查询相关资料&#xff0c;掌握后独立完成。&#xff08;C 选手请不要试图使用 STL&#xff0c;虽然你可以…...

Pthon--自动化实用技巧篇--文件目录处理

为什么要讲这一篇&#xff0c;主要是因为这个在自动化测试框架或者脚本的编写的时候会用到&#xff0c;还是比较方便的。看上述两个函数。getcwd()、chdir()。使用 os.getcwd() 函数获得当前工作目录。使用 os.chdir()函数改变当前工作目录。所以在用chdir()函数的时候别忘记指…...

想招到实干派程序员?你需要这种面试法

技术招聘中最痛的点其实是不精准。技术面试官或CTO们常常会向我们吐槽&#xff1a; “我经常在想&#xff0c;能不能把我们项目中的代码打印出来&#xff0c;作为候选人的面试题的一部分&#xff1f;” “能不能把一个Bug带上环境&#xff0c;让候选人来试试怎么解决&#xf…...

cesium常见操作:鼠标点击获取对象

目录 一、viewer.scene.pick&#xff08;获取Cartesian2&#xff09; 二、 viewer.scene.pickPosition&#xff08;获取Cartesian3&#xff09; 三、viewer.scene.drillPick&#xff08;穿透拾取&#xff0c;获取所有对象&#xff09; 四、viewer.scene.globe.pick&#xf…...

【玩转c++】git的安装和使用以及可视化处理

本期主题&#xff1a;git的安装和使用&#xff08;windows环境&#xff09;博客主页&#xff1a;小峰同学分享小编的在Linux中学习到的知识和遇到的问题 小编的能力有限&#xff0c;出现错误希望大家不吝赐1.两个工具介绍第一个工具git&#xff0c;链接gitee或者github等代码托…...

第三阶段02-Mybatis框架

Mybatis框架 Mybatis框架是目前最流行的数据持久层框架, 使用Mybatis框架可以帮助程序员自动生成JDBC代码, 程序员只需要通过注解或xml配置文件提供需要执行的SQL语句,以及对象和表的映射关系, Mybatis框架会根据此映射关系和SQL自动生成出JDBC代码,从而提高开发效率 Mybatis框…...

基于超像素的多视觉特征图像分割算法研究

0.引言 背景&#xff1a; 经典聚类算法&#xff1a;Kmeans、FCM 现有问题&#xff1a; 1&#xff09;现有算法大都是基于单一的视觉特征而设计的&#xff0c;eg&#xff1a;基于颜色特征的分割。 2&#xff09;没有考虑像素周围的空间信息&#xff1b;分割结果&#xff1a;多噪…...

mysql的三大日志

摘自https://blog.csdn.net/chuige2013/article/details/123027580 一. 初步认识 binlog二进制日志 redolog undolog 二. binlog binlog记录写入行操作 作用 1&#xff09;、主从复制&#xff1a;在Master端开启binlog&#xff0c;然后将binlog发送到各个Slave端&#xff0c;S…...

API接口及社区电子商务化的解释

API是应用程序的开发接口&#xff0c;在开发程序的时候&#xff0c;我们有些功能可能不需要从到到位去研发&#xff0c;我们可以拿现有的开发出来的功能模块来使用&#xff0c;而这个功能模块&#xff0c;就叫做库(libary)。比如说&#xff1a;要实现数据传输的安全&#xff0c…...

[蓝帽杯 2021]One Pointer PHP

知识点&#xff1a;php 数组整型溢出&#xff0c;open_basedir 绕过分析 利用数组整型溢出绕过&#xff0c;因为PHP 会对溢出的数字处理为 float 类型。 <?php include "user.php"; if($userunserialize($_COOKIE["data"])){$count[$user->count]…...

【JAVA】xxl-job服务搭建

xxl-job服务搭建 1.下载xxl-job项目 https://github.com/xuxueli/xxl-job 2.数据库表创建 3.修改配置 注意&#xff1a;这是两个项目&#xff0c;一个是xxl-job前台&#xff0c;一个是xxl-job执行器&#xff0c;找到这两个项目得配置文件&#xff0c;修改配置。 配置文件地址…...

毕业设计 基于STM32单片机生理监控心率脉搏TFT彩屏波形曲线设计

基于STM32单片机生理监控心率脉搏TFT彩屏波形曲线设计1、项目简介1.1 系统构成1.2 系统功能2、部分电路设计2.1 STM32F103C8T6核心系统电路设计2.2心率检测电路设计2.3 TFT2.4寸彩屏电路设计3、部分代码展示3.1 ADC初始化3.2 获取ADC采样值3.3 LCD引脚初始化3.3 在LCD指定位置显…...

【10k~30k的区别】=== 功能测试、自动化测试、性能测试的区别

按测试执行的类型来分&#xff1a;功能测试、自动化测试、性能测试 1&#xff0e;功能测试 功能测试俗称点点点测试。初级测试人员的主要测试任务就是执行测试工程师所写的测试用 例&#xff0c;记录用例的执行状态及bug情况。与开发人员进行交互直到bug被修复。 功能测试理论…...

《MySQL学习》 索引失效的三种特殊情况

一.条件字段使用函数 explain select * from bpm_proc_instance bpi where CREATED_AT > 2022-06-01 CREATED_AT 字段建立了索引&#xff0c;此时explain分析的结果表明能使用到索引 但如果我们对 CREATED_AT 字段使用函数 explain select * from bpm_proc_instance bpi w…...

网站建设职业/电商代运营公司100强

发邮件分为几种协议&#xff1a; IMAP&#xff1a;收imap.example.com , 发stmp.example.com&#xff0c;端口&#xff0c;加密&#xff08;SSL/TLS、 STARTTLS&#xff09;。exchange&#xff1a;服务器、域、SSLPOP3&#xff1a; 收pop.example.com , 发stmp.example.com&am…...

做网赌网站需要多少钱/莱阳seo排名

“蜀道难&#xff0c;难于上青天”&#xff0c;对于很多学习CAD的小伙伴来说CAD就跟蜀道一样&#xff0c;太难了&#xff0c;下面小编分享几个在学习CAD过程中会遇到的问题以及解决的方法&#xff0c;一起来看看吧&#xff01;1. 如何替换找不到的原文字体&#xff1f;答&#…...

服装私人订制网站/seo上海培训

下面是一个字符界面的Java Application程序&#xff0c;它接受用户输入的一个浮点数&#xff0c;并将它的整数部分和小数部分分别输出。请勿改动原有代码&#xff0c;在下画线处填人适当语句&#xff0c;将程序补充完整。import java.io.*&#xff1b;public class test16_2{pu…...

用java做直播网站/外贸seo建站

##46XXsettings.txt文件内容繁杂&#xff0c;很多同志一头雾水。##其实很多内容是不太用的。##这里列举一些比较有用的信息解释一下&#xff1a;##首先&#xff1a;凡是##开头的&#xff0c;IP话机都会忽略不看##而以#开头的是跳转指针位置##没有任何#标志的是会执行的条目SET …...

wordpress 红酒/百度广告费

【前言】“养兰一点通&#xff0c;浇水三年功”。养兰可是个细心的活&#xff0c;要认真呵护管理&#xff0c;仔细养护。有个花友养了几盆墨兰、蕙兰和春兰等&#xff0c;经常和我进行交流&#xff0c;相互探讨养殖兰花的一些经验和教训。今天&#xff0c;又和我探讨&#xff1…...

软件开发外包公司赚钱不/上海小红书seo

我在我的项目中使用Spring Data JPA和Hibernate JPA提供程序.在我的服务中,我有一个方法,它将实体保存在数据库中,而不是使用返回的对象,我尝试获取有关此实体的更多详细信息.因此,不会获取详细信息.在日志中,我只看到insert语句,没有select的详细信息.这是我的代码&#xff1a…...