• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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