# flashtool-scripts
**Repository Path**: hanhai-ide/flashtool-scripts
## Basic Information
- **Project Name**: flashtool-scripts
- **Description**: 来自黑芝麻智能科技(bstai)瀚海(hanhai)IDE的烧录脚本
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-04-26
- **Last Updated**: 2025-12-29
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 小系统烧录打包工具
[TOC]
## 前置条件
### 1 需要有编译好的临时文件目录
此脚本基于CI已经编译好的临时文件目录(images),目录格式:
``` bash
$ tree images
images/
├── ADS-Platform-Tools_v0.1.1.zip
├── backup.img
├── backup.img.sign
├── boot.img
├── boot.img.sign
├── bstos_version
├── BST-SAFETY-release-0-1-9.bin
├── BST-SAFETY-release-0-1-9.bin.sign
├── cache.img
├── cache.img.sign
├── core-image-bstos-a1000.ext4
├── core-image-bstos.img
├── core-image-bstos.img.sign
├── dynamic_pr_test.ko
├── flash_all_from_bootrom.sh
├── flash_all_from_bootrom_usb.sh
├── otp_disable
│ ├── BST-SBL-release-2-0-0.bin
│ └── BST-SBL-release-2-0-0.bin.sign
├── otp_enable
│ ├── BST-SBL-release-2-0-0.bin
│ └── BST-SBL-release-2-0-0.bin.sign
├── panic_module.ko
├── partition.img
├── partition.img.sign
├── persistence.img
├── persistence.img.sign
├── README.txt
├── recovery.img
├── recovery.img.sign
├── TC397-firmware-fad_v0.9.8.zip
├── tc397_v00.00.09.05_202107200956.bin
├── u-boot-full.img
├── u-boot-full.img.sign
├── u-boot-tools.img
└── vmlinux
```
### 2 必须和REPO SYNC协同工作
```bash
$ repo init -u http://bstcd.stuffs.biz/lizq/images-scripts-manifest.git
...
Downloading manifest from http://bstcd.stuffs.biz/lizq/images-scripts-manifest.git
...
repo has been initialized in /workspace/lizq/images-test
$ repo sync
Fetching: 100% (6/6), done in 4.870s
Garbage collecting: 100% (6/6), done in 0.029s
repo sync has finished successfully.
lizq@devbot:/workspace/lizq/images-test$ ls
dl scripts
```
**images-scripts-manifest.git** 中default.xml,若您为外部用户,请自行创建images-scripts-manifest
```
```
### 3 脚本执行环境
- 安装*android-tools-fsutils* - 包含simg2img命令
- 安装*7zip-full* - 包含7z命令
- Python环境为Python3,需要安装requests库
> ubuntu22的机器,python环境需要安装: pip3 install requests pycryptodome
## 使用方法
> 注意:脚本运行环境依赖仓库文件,故需要先用repo的方式,将所需全部文件下载完成后,再在目录内执行脚本。
可以使用python3 make-image.py或者直接make-image.py,可以在repo sync执行目录内执行,或在script目录内执行,其他执行路径无法正常工作。详细参数见下面的帮助信息。
``` bash
usage: make-image.py [-h] [--input-dir INPUT_DIR] [--script-dir SCRIPT_DIR]
[--output-dir OUTPUT_DIR] [--verbose]
[--no-clean-staging] [--version VERSION]
[--type {dev,release}] [--suffix SUFFIX]
script to generate images for flashTool
optional arguments:
-h, --help show this help message and exit
--input-dir INPUT_DIR, -i INPUT_DIR
raw images input dir
--script-dir SCRIPT_DIR, -s SCRIPT_DIR
script input dir
--output-dir OUTPUT_DIR, -o OUTPUT_DIR
images output dir
--verbose, -v verbose mode
--no-clean-staging not clean staging dir before build
--version VERSION version of image
--type {dev,release}, -t {dev,release}
type of image
--suffix SUFFIX suffix of image name, eg: IMG-...-$suffix.zip
```
> Note: *--input-dir/-i*,*--script-dir/-s*,* --version*是正常打包镜像时的必选参数。*type*指定镜像包是dev还是release,dev类型镜像使用的opt_disable的BSL镜像。
### 参数说明
#### --input-dir | -i
指定构建系统构建完成,经CI脚本拷贝后形成的镜像目录,**必选参数**。里面存放了各种类型的镜像文件,但是需要注意的是,sbl镜像需要放置到otp_disable和otp_enable目录下(以后或许会更改,脚本修改的时候也会修改该文档)。目录结构示例如下:
```bash
images/
otp_disable/ 06-Jul-2022 03:26 -
BST-SBL-RELEASE-A1000B-4G-2-6-2-ECC-PARITY..> 06-Jul-2022 03:24 1M
otp_enable/ 06-Jul-2022 03:26 -
BST-SBL-RELEASE-A1000B-4G-2-6-2.bin 06-Jul-2022 03:24 1M
ADS-Platform-Tools_v1.1.2.zip 06-Jul-2022 03:19 590M
BST-SAFETY-RELEASE-A1000B-4-0-4.bin 06-Jul-2022 03:24 1M
BST-SAFETY-RELEASE-A1000B-4-0-4.bin.sign 06-Jul-2022 03:25 1318
README.txt 06-Jul-2022 03:24 36
RUBOOT-A1000B-1M.bin 06-Jul-2022 03:24 1M
SBL-DEBUG-A1000B.bin 06-Jul-2022 03:24 96K
TC397-firmware-a1000b_fad_v0.12.4.zip 06-Jul-2022 03:18 26M
atf-a1000b.bin 06-Jul-2022 03:24 462K
atf-a1000b.bin.sign 06-Jul-2022 03:24 1318
...
```
#### --scripts-dir | -s
指定对应镜像的烧录脚本和描述文件目录,**必选参数**。打包脚本通过解析镜像目录内各个镜像子目录内的描述文件,和--input-dir中指定的镜像目录中的文件进行匹配,匹配完成后会放到暂存目录,最终打包到镜像中。目录结构示例:
```bash
flash-scripts/
atf/ 06-Jul-2022 03:24 -
atf.sh 06-Jul-2022 03:24 776
description.json 06-Jul-2022 03:24 1058
backup/ 06-Jul-2022 03:24 -
cache/ 06-Jul-2022 03:24 -
hyp/ 06-Jul-2022 03:24 -
kernel/ 06-Jul-2022 03:24 -
partition/ 06-Jul-2022 03:24 -
persistence/ 06-Jul-2022 03:24 -
recovery/ 06-Jul-2022 03:24 -
recovery-tools/ 06-Jul-2022 03:24 -
rootfs/ 06-Jul-2022 03:24 -
ruboot/ 06-Jul-2022 03:28 -
safety/ 06-Jul-2022 03:28 -
sbl/ 06-Jul-2022 03:28 -
sbl_debug/ 06-Jul-2022 03:28 -
uboot/ 06-Jul-2022 03:28 -
# 新增参数配置选项(烧录工具烧录时,在界面选择配置参数,烧录时会设置到单板)
# 需要将git仓库parameter-configs中的内容按照如下目录结构准备
parameter-configs
ecc
config.json
scripts
ecc.sh
hyp
config.json
scripts
hyp.sh
...
README.md
```
#### --output-dir | -o
指定打包后镜像的存放目录,**必选参数**。
#### --verbose | -v
详细模式,打印脚本执行过程中更多的提示信息。
#### --no-clean-staging
构建之前不清除暂存目录。之前如果有其他文件,可能会遗留在生成的镜像包里。
#### --version
指定生成的镜像报文件名中的版本号部分。
#### --type | -t
指定使用-i指定的镜像目录内,使用otp_enable还是otp_disable目录下的sbl镜像文件(以后或许会更改,脚本修改的时候也会修改该文档)。-t dev使用otp_disable目录下的sbl镜像文件,-t release使用otp_enable目录下的镜像文件。
更新:针对包含ddrdtb的d版本,-t dev使用ecc_open对应的dtb和签名,-t release使用ecc_close对应的dtb和签名。
#### --suffix
指定生成的镜像包文件名中的后缀部分,前面部分为固定的*IMGS-${Name}-${version}-${suffix}.zip*。
```
file_name = 'IMGS-' + _images_conf[NAME_KEY] + '-' + \
_images_conf[VERSION_KEY] + '-' + suffix + '.zip'
```
### 快速使用
```bash
$ repo init -u http://bstcd.stuffs.biz/lizq/images-scripts-manifest.git
$ repo sync
$ ./scripts/make-image.py -i ../images/images/ -s ../images/flash-scripts --version 2.1.2
2021-12-16 16:15:40,006 - __main__ - INFO - input-dir: /workspace/lizq/images/images
2021-12-16 16:15:40,006 - __main__ - INFO - output-dir: /workspace/lizq/images-test/output
2021-12-16 16:15:40,006 - __main__ - INFO - Cleanning /workspace/lizq/images-test/output
2021-12-16 16:15:40,008 - __main__ - INFO - Cleanning staging
2021-12-16 16:15:40,010 - __main__ - INFO - Generating directories and files...
...
2021-12-16 16:15:54,295 - __main__ - INFO - Generating zip package:BST-HS-Linux-2.1.2.zip to /workspace/lizq/images-test/output
lizq@devbot:/workspace/lizq/images-test$ ls /workspace/lizq/images-test/output/
BST-HS-Linux-2.1.2.zip
```
## 工作目录介绍
```bash
lizq@devbot:/workspace/lizq/images-test$ tree . -L 1
.
├── dl
├── output
├── scripts
└── staging
```
脚本工作过程中会有如下目录:
- dl - repo拉取的除脚本外所有的文件和目录
- output - 存放最终生成的镜像包(未指定输出目录时才会存在)
- staging - 暂存生成镜像包所需的所有文件
- scripts - repo拉取的镜像打包脚本存放目录
## 镜像包目录介绍
脚本生成的`-.zip`存放在--output-dir目录指定的目录,如果未指定,则为当前目录的output目录。下面对zip包中的目录做个详细说明。
### 目录列表
下面是镜像包中的目录列表:
```
├── Images
│ ├── atf
│ │ └── atf-a1000.bin
│ │ ├── atf-a1000.bin.sign
│ ├── Backup
│ │ ├── backup.img
│ │ ├── backup.img.sign
│ ├── ...
├── meta.ini
├── description.json
├── parameters.json
└── project.json
// meta.ini是加密过的zip包,解开后是如下文件:
├── Bin
│ ├── adb.exe
│ ├── AdbWinApi.dll
│ ├── AdbWinUsbApi.dll
│ ├── fastboot.exe
│ ├── RUBOOT-A1000-1M.bin
│ ├── SBL-DEBUG-A1000.bin
│ └── simg2img.exe
├── Config
│ └── config.json
├── Executor
│ ├── adb-check.json
│ ├── ...
│ ├── setenv.json
│ ├── template
│ │ ├── bootloader.json
│ │ ├── os.json
│ │ ├── partition.json
│ │ ├── safety.json
│ │ ├── sbl.json
│ │ └── uboot.json
│ └── try
│ ├── ...
├── flashtool
│ ├── bin
│ ├── ...
├── Images-scripts
│ ├── atf
│ │ └── atf.sh
│ ├── ...
│ └── uboot
│ ├── bureFunction.sh
│ ├── bureMain.sh
│ └── env_parameters.json
└── Recovery-min
├── bsta1000-apa.dtb
├── ...
├── bsta1000-pat.dtb
├── Image.itb
├── recovery.gz
└── uEnv.txt
```
### 目录与文件说明
#### 镜像包根目录说明
- Images - 存放根据输入目录,和git仓库中各个类型镜像的配置和脚本所生成的最终目录
- description.json - 存放描述各个类型的镜像参数
- parameters.json - 存放参数
- project.json - 存放版本信息
- meta.ini - 加密过的压缩包
#### meta.ini文件说明
- Bin - 存放烧录工具使用的文件,如本机工具和救砖跳板文件
- Executor - 存放烧录工具除镜像烧录以外的流程需要的脚本
- flashtool - 存放烧录工具使用的文件
- Config - 存放烧录工具使用的配置
### 镜像目录生成说明
1. Images中的目录,对应description.json中的Key对应的值,并且用MatchCase对应的值去输入目录去匹配,匹配成功进入下一步。
2. 根据SupportBoard中的内容到project.json中去匹配,匹配成功进入下一步
3. 根据SubBoards内容更新project.json中的DBFiles和Files字段,并拷贝对应镜像和脚本到暂存目录
3. 根据暂存目录生成对应的meta.ini,再打包整个staging目录为最终镜像包
上面三个步骤全部完成后,会生成只支持烧录project.json中指定的单板镜像,会过滤掉多余的镜像文件。
```json
// 原始project.json
{
...
"BoardsInfo": [
{
"BoardName": "FAD",
"SOCName": "A1000",
"HWVersion": "1.0",
"SubBoards": [
{
"Name": "FADA",
"DTB": "bsta1000-fada.dtb",
"DBFiles": [],
"Files": []
}
]
}
]
}
// 最终的project.json
{
...
"BoardsInfo": [
{
"BoardName": "FAD",
"SOCName": "A1000",
"HWVersion": "1.0",
"SubBoards": [
{
"Name": "FADA",
"DTB": "bsta1000-fada.dtb",
"DBFiles": [
{
"Key": "sbl_debug",
"SubType": "4fa31998-93f2-11ec-a829-00155de3b8a2"
},
{
"Key": "ruboot",
"SubType": "562476c6-93f3-11ec-95cd-00155de3b8a2"
}
],
"Files": [
{
"Key": "safety",
"SubType": "9af299e4-9098-11ec-ab58-b75feee2ed84"
},
{
"Key": "rootfs",
"SubType": "562476b2-93f3-11ec-95cc-00155de3b8a2"
},
...
]
}
]
}
]
}
```
### 工程文件编写说明
工程文件(project.json)的具体编写说明见[“外部工程文件说明”](http://bstcd.stuffs.biz/P2107-Linux-2.0/documentation/tree/master/06.%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1/Toolchain/%E6%89%B9%E9%87%8F%E3%80%81VScode%E7%83%A7%E5%BD%95%E5%B7%A5%E5%85%B7#%E5%A4%96%E9%83%A8%E5%B7%A5%E7%A8%8B%E6%96%87%E4%BB%B6%E8%AF%B4%E6%98%8E)。
### 脚本文件编写说明
描述文件,参数文件的具体编写说明见[“外部烧录脚本目录说明”](http://bstcd.stuffs.biz/P2107-Linux-2.0/documentation/tree/master/06.%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1/Toolchain/%E6%89%B9%E9%87%8F%E3%80%81VScode%E7%83%A7%E5%BD%95%E5%B7%A5%E5%85%B7#%E5%A4%96%E9%83%A8%E7%83%A7%E5%BD%95%E8%84%9A%E6%9C%AC%E7%9B%AE%E5%BD%95%E8%AF%B4%E6%98%8E)。
### 其他说明
#### 源文件说明
- 镜像文件由输入目录中匹配到MatchCase的文件提供。
- 脚本文件由输入目录中各个镜像名称对应的目录里的文件提供。
- 项目文件project.json由模板,修改生成
- 参数文件parameters.json由仓库默认和各个镜像脚本目录中的参数文件拼接而成
- 描述文件description.json由各个镜像脚本目录中的描述文件拼接而成
- 其他文件为烧录工具强依赖文件,由仓库提供
## 打包脚本工作流程
大部分流程见下图:
