1#!/usr/bin/env python3 2# encoding=utf-8 3# ============================================================================ 4# @brief packet files 5# Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED. 6# Licensed under the Apache License, Version 2.0 (the "License"); 7# you may not use this file except in compliance with the License. 8# You may obtain a copy of the License at 9# 10# http://www.apache.org/licenses/LICENSE-2.0 11# 12# Unless required by applicable law or agreed to in writing, software 13# distributed under the License is distributed on an "AS IS" BASIS, 14# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15# See the License for the specific language governing permissions and 16# limitations under the License. 17 18# ============================================================================ 19 20import os 21import sys 22import shutil 23import subprocess 24import platform 25import tarfile 26from typing import List 27 28PY_PATH = os.path.dirname(os.path.realpath(__file__)) 29sys.path.append(PY_PATH) 30PKG_DIR = os.path.dirname(PY_PATH) 31PKG_DIR = os.path.dirname(PKG_DIR) 32 33from packet_create import create_sha_file 34from packet_create import packet_bin 35 36TOOLS_DIR = os.path.dirname(PKG_DIR) 37SDK_DIR = os.path.dirname(TOOLS_DIR) 38sys.path.append(os.path.join(SDK_DIR, "build", "script")) 39sys.path.append(os.path.join(SDK_DIR, "build", "config")) 40from enviroment import TargetEnvironment 41 42def get_file_size(file_path: str)->int: 43 try: 44 return os.stat(file_path).st_size 45 except BaseException as e: 46 print(e) 47 exit(-1) 48 49 50def create_tar(source_dir, output_filename): 51 with tarfile.open(output_filename, "w") as tar: 52 tar.add(source_dir) 53 54 55# ws63 56def make_all_in_one_packet(pack_style_str, extr_defines): 57 # make all in one packet 58 boot_bin_dir = os.path.join(SDK_DIR, "output", "ws63", "acore", "boot_bin") 59 param_bin_dir = os.path.join(SDK_DIR, "output", "ws63", "acore", "param_bin") 60 nv_bin_dir = os.path.join(SDK_DIR, "output", "ws63", "acore", "nv_bin") 61 efuse_bin_dir = os.path.join(SDK_DIR, "output", "ws63", "acore", "boot_bin") 62 63 # loader boot 64 loadboot_bin = os.path.join(boot_bin_dir, "root_loaderboot_sign.bin") 65 loadboot_bx = loadboot_bin + "|0x0|0x200000|0" 66 67 # secure stage boot 68 ssb_bin = os.path.join(boot_bin_dir, "ssb_sign.bin") 69 ssb_bx = ssb_bin + f"|0x202000|{hex(get_file_size(ssb_bin))}|1" 70 71 # flash boot 72 flashboot_bin = os.path.join(boot_bin_dir, "flashboot_sign.bin") 73 flashboot_bx = flashboot_bin + f"|0x220000|{hex(get_file_size(flashboot_bin))}|1" 74 75 # flash boot backup 76 flashboot_backup_bin = os.path.join(boot_bin_dir, "flashboot_backup_sign.bin") 77 flashboot_backup_bx = flashboot_backup_bin + f"|0x210000|{hex(get_file_size(flashboot_backup_bin))}|1" 78 79 # params 80 params_bin = os.path.join(param_bin_dir, "root_params_sign.bin") 81 params_bx = params_bin + f"|0x200000|{hex(get_file_size(params_bin))}|1" 82 83 # nv 84 nv_bin = os.path.join(nv_bin_dir, "ws63_all_nv.bin") 85 nv_bx = nv_bin + f"|0x5FC000|0x4000|1" 86 87 # nv backup 88 nv_backup_bin = os.path.join(nv_bin_dir, "ws63_all_nv_backup.bin") 89 nv_backup_bx = nv_backup_bin + f"|0x20C000|0x4000|1" 90 91 # hilink 92 target_env = TargetEnvironment(pack_style_str) 93 defines = target_env.get('defines') 94 if "CONFIG_SUPPORT_HILINK_INDIE_UPGRADE" in defines: 95 hilink_bin_dir = os.path.join(SDK_DIR, "interim_binary", "ws63", "bin", "hilink_bin") 96 hilink_bin = os.path.join(hilink_bin_dir, "ws63-liteos-hilink-sign.bin") 97 hilink_bx = hilink_bin + f"|0x406000|{hex(get_file_size(hilink_bin))}|1" 98 99 # efuse bin 100 efuse_bin = os.path.join(efuse_bin_dir, "efuse_cfg.bin") 101 efuse_bx = efuse_bin + "|0x0|0x200000|3" 102 103 # app and rom 104 app_templat_bx = '%s|0x230000|%s|1' 105 106 # 输出目录 107 fwpkg_outdir = os.path.join(SDK_DIR, "output", "ws63", "fwpkg", pack_style_str) 108 109 # 键为target名,值为rom bin、app bin的名字 110 available_targets_map = { 111 'ws63-liteos-testsuite': [ 112 'ws63-liteos-testsuite_rom.bin', 113 'ws63-liteos-testsuite-sign.bin', 114 ], 115 'ws63-liteos-testsuite-asic': [ 116 'ws63-liteos-testsuite-asic_rom.bin', 117 'ws63-liteos-testsuite-asic-sign.bin', 118 ], 119 'ws63-freertos-testsuite': [ 120 'ws63-freertos-testsuite_rom.bin', 121 'ws63-freertos-testsuite-sign.bin', 122 ], 123 'ws63-alios-testsuite': [ 124 'ws63-alios-testsuite_rom.bin', 125 'ws63-alios-testsuite-sign.bin', 126 ], 127 'ws63-freertos-app': [ 128 'ws63-freertos-app_rom.bin', 129 'ws63-freertos-app-sign.bin', 130 ], 131 'ws63-alios-app': [ 132 'ws63-alios-app_rom.bin', 133 'ws63-alios-app-sign.bin', 134 ], 135 'ws63-liteos-bgle-all': [ 136 'ws63-liteos-bgle-all_rom.bin', 137 'ws63-liteos-bgle-all-sign.bin', 138 ], 139 'ws63-liteos-bgle-all-asic': [ 140 'ws63-liteos-bgle-all-asic_rom.bin', 141 'ws63-liteos-bgle-all-asic-sign.bin', 142 ], 143 'ws63-liteos-btc-only':[ 144 'ws63-liteos-btc-only_rom.bin', 145 'ws63-liteos-btc-only-sign.bin', 146 ], 147 'ws63-liteos-btc-only-asic':[ 148 'ws63-liteos-btc-only-asic_rom.bin', 149 'ws63-liteos-btc-only-asic-sign.bin', 150 ], 151 'ws63-liteos-gle-sparklyzer': [ 152 'ws63-liteos-gle-sparklyzer_rom.bin', 153 'ws63-liteos-gle-sparklyzer-sign.bin', 154 ], 155 'ws63-freertos-btc-only': [ 156 'ws63-freertos-btc-only_rom.bin', 157 'ws63-freertos-btc-only-sign.bin', 158 ], 159 'ws63-alios-btc-only': [ 160 'ws63-alios-btc-only_rom.bin', 161 'ws63-alios-btc-only-sign.bin', 162 ], 163 'ws63-liteos-app': [ 164 'ws63-liteos-app_rom.bin', 165 'ws63-liteos-app-sign.bin', 166 ], 167 'ws63-liteos-perf': [ 168 'ws63-liteos-perf_rom.bin', 169 'ws63-liteos-perf-sign.bin', 170 ], 171 'ws63-liteos-app-asic': [ 172 'ws63-liteos-app-asic_rom.bin', 173 'ws63-liteos-app-asic-sign.bin', 174 ], 175 'ws63-liteos-mfg': [ 176 'ws63-liteos-mfg_rom.bin', 177 'ws63-liteos-mfg-sign.bin', 178 ], 179 'ws63-liteos-app-gree': [ 180 'ws63-liteos-app-gree.bin', 181 'ws63-liteos-app-gree-sign.bin', 182 ], 183 'ws63-liteos-msmart': [ 184 'ws63-liteos-msmart_rom.bin', 185 'ws63-liteos-msmart-sign.bin', 186 ], 187 'ws63-liteos-msmart-xts': [ 188 'ws63-liteos-msmart-xts_rom.bin', 189 'ws63-liteos-msmart-xts-sign.bin', 190 ], 191 'ws63-liteos-xts': [ 192 'ws63-liteos-xts_rom.bin', 193 'ws63-liteos-xts-sign.bin', 194 ], 195 'ws63-liteos-app-iot': [ 196 'ws63-liteos-app-iot_rom.bin', 197 'ws63-liteos-app-iot-sign.bin', 198 ], 199 'ws63-liteos-testsuite-radar': [ 200 'ws63-liteos-testsuite-radar.bin', 201 'ws63-liteos-testsuite-radar-sign.bin', 202 ] 203 } 204 205 if pack_style_str in available_targets_map: 206 # 生成前清空 207 if os.path.exists(fwpkg_outdir): 208 shutil.rmtree(fwpkg_outdir) 209 os.makedirs(fwpkg_outdir) 210 211 rom_bin = os.path.join(SDK_DIR, "output", "ws63", "acore", pack_style_str, available_targets_map[pack_style_str][0]) 212 app_bin = os.path.join(SDK_DIR, "output", "ws63", "acore", pack_style_str, available_targets_map[pack_style_str][1]) 213 for fpath in (rom_bin, app_bin): 214 if not os.path.isfile(fpath): 215 print(f'[!] warning: File `{fpath}` is not exists !Skip fwpkg generate for target `{pack_style_str}` !') 216 return 217 218 app_bx = app_templat_bx % (app_bin, hex(get_file_size(app_bin))) 219 220 if pack_style_str == 'ws63-liteos-mfg': 221 output_bin_dir = os.path.join(SDK_DIR, "output", "ws63", "acore") 222 packet_post_agvs = list() 223 packet_post_agvs.append(loadboot_bx) 224 packet_post_agvs.append(params_bx) 225 packet_post_agvs.append(ssb_bx) 226 packet_post_agvs.append(flashboot_bx) 227 packet_post_agvs.append(flashboot_backup_bx) 228 packet_post_agvs.append(nv_bx) 229 packet_post_agvs.append(nv_backup_bx) 230 app_bin = os.path.join(output_bin_dir, "ws63-liteos-app", "ws63-liteos-app-sign.bin") 231 app_bx = app_bin + f"|0x230000|{hex(get_file_size(app_bin))}|1" 232 233 mfg_bin = os.path.join(output_bin_dir, "ws63-liteos-mfg", "ws63-liteos-mfg-sign.bin") 234 mfg_bx = mfg_bin + f"|0x470000|{hex(0x183000)}|1" # 0x183000为产测分区B区大小 235 packet_post_agvs.append(app_bx) 236 packet_post_agvs.append(mfg_bx) 237 fpga_fwpkg = os.path.join(fwpkg_outdir, f"{pack_style_str}_all.fwpkg") 238 packet_bin(fpga_fwpkg, packet_post_agvs) 239 return 240 241 packet_post_agvs = list() 242 packet_post_agvs.append(loadboot_bx) 243 packet_post_agvs.append(params_bx) 244 packet_post_agvs.append(ssb_bx) 245 packet_post_agvs.append(flashboot_bx) 246 packet_post_agvs.append(flashboot_backup_bx) 247 packet_post_agvs.append(nv_bx) 248 packet_post_agvs.append(nv_backup_bx) 249 if "CONFIG_SUPPORT_HILINK_INDIE_UPGRADE" in defines: 250 packet_post_agvs.append(hilink_bx) 251 packet_post_agvs.append(app_bx) 252 if "SUPPORT_EFUSE" in extr_defines or "PACKET_MFG_BIN" in extr_defines: 253 print("efuse pack") 254 packet_post_agvs.append(efuse_bx) 255 256 if "PACKET_MFG_BIN" in extr_defines: 257 mfg_sign_bin = os.path.join(SDK_DIR, "output", "ws63", "acore", "boot_bin", "ws63-liteos-mfg-sign.bin") 258 if os.path.exists(mfg_sign_bin): 259 mfg_bx = mfg_sign_bin + f"|0x470000|{hex(0x183000)}|1" # 0x183000为产测分区B区大小 260 packet_post_agvs.append(mfg_bx) 261 else: 262 print("warning: don't find ws63-liteos-mfg-sign.bin...") 263 else: 264 if os.path.exists(os.path.join(SDK_DIR, "output", "ws63", "pktbin", "ws63-liteos-mfg.bin")): 265 os.remove(os.path.join(SDK_DIR, "output", "ws63", "pktbin", "ws63-liteos-mfg.bin")) 266 267 fpga_fwpkg = os.path.join(fwpkg_outdir, f"{pack_style_str}_all.fwpkg") 268 packet_bin(fpga_fwpkg, packet_post_agvs) 269 270 packet_post_agvs = list() 271 packet_post_agvs.append(loadboot_bx) 272 packet_post_agvs.append(app_bx) 273 fpga_loadapp_only_fwpkg = os.path.join(fwpkg_outdir, f"{pack_style_str}_load_only.fwpkg") 274 packet_bin(fpga_loadapp_only_fwpkg, packet_post_agvs) 275 276 if "windows" in platform.system().lower(): 277 os.chdir(os.path.join(SDK_DIR, "output", "ws63")) 278 create_tar('./pktbin', 'pktbin.zip') 279 else: 280 print("not windows.") 281 subprocess.run(["tar", "-cf", "pktbin.zip", "./pktbin"], cwd=os.path.join(SDK_DIR, "output", "ws63")) 282 283 284def is_packing_files_exist(soc, pack_style_str): 285 return 286