11bd4fe43Sopenharmony_ci#!/usr/bin/env python3 21bd4fe43Sopenharmony_ci# coding=utf-8 31bd4fe43Sopenharmony_ci 41bd4fe43Sopenharmony_ci''' 51bd4fe43Sopenharmony_ci* Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED. 61bd4fe43Sopenharmony_ci* Licensed under the Apache License, Version 2.0 (the "License"); 71bd4fe43Sopenharmony_ci* you may not use this file except in compliance with the License. 81bd4fe43Sopenharmony_ci* You may obtain a copy of the License at 91bd4fe43Sopenharmony_ci* 101bd4fe43Sopenharmony_ci* http://www.apache.org/licenses/LICENSE-2.0 111bd4fe43Sopenharmony_ci* 121bd4fe43Sopenharmony_ci* Unless required by applicable law or agreed to in writing, software 131bd4fe43Sopenharmony_ci* distributed under the License is distributed on an "AS IS" BASIS, 141bd4fe43Sopenharmony_ci* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 151bd4fe43Sopenharmony_ci* See the License for the specific language governing permissions and 161bd4fe43Sopenharmony_ci* limitations under the License. 171bd4fe43Sopenharmony_ci* 181bd4fe43Sopenharmony_ci* Description: packet allinone bin file 191bd4fe43Sopenharmony_ci''' 201bd4fe43Sopenharmony_ciimport struct 211bd4fe43Sopenharmony_ciimport sys 221bd4fe43Sopenharmony_ciimport os 231bd4fe43Sopenharmony_ci 241bd4fe43Sopenharmony_ciclass crc16: 251bd4fe43Sopenharmony_ci POLYNOMIAL = 0x1021 261bd4fe43Sopenharmony_ci PRESET = 0x0000 271bd4fe43Sopenharmony_ci _tab = [] 281bd4fe43Sopenharmony_ci def __init__(self): 291bd4fe43Sopenharmony_ci self._tab = [self._initial(i) for i in range(256)] 301bd4fe43Sopenharmony_ci 311bd4fe43Sopenharmony_ci def _initial(self, c): 321bd4fe43Sopenharmony_ci crc = 0 331bd4fe43Sopenharmony_ci c = c << 8 341bd4fe43Sopenharmony_ci for j in range(8): 351bd4fe43Sopenharmony_ci if (crc ^ c) & 0x8000: 361bd4fe43Sopenharmony_ci crc = (crc << 1) ^ self.POLYNOMIAL 371bd4fe43Sopenharmony_ci else: 381bd4fe43Sopenharmony_ci crc = crc << 1 391bd4fe43Sopenharmony_ci c = c << 1 401bd4fe43Sopenharmony_ci return crc 411bd4fe43Sopenharmony_ci 421bd4fe43Sopenharmony_ci def _update_crc(self, crc, c): 431bd4fe43Sopenharmony_ci cc = 0xff & int(c) 441bd4fe43Sopenharmony_ci 451bd4fe43Sopenharmony_ci tmp = (crc >> 8) ^ cc 461bd4fe43Sopenharmony_ci crc = (crc << 8) ^ self._tab[tmp & 0xff] 471bd4fe43Sopenharmony_ci crc = crc & 0xffff 481bd4fe43Sopenharmony_ci 491bd4fe43Sopenharmony_ci return crc 501bd4fe43Sopenharmony_ci 511bd4fe43Sopenharmony_ci def crc(self, str): 521bd4fe43Sopenharmony_ci crc = self.PRESET 531bd4fe43Sopenharmony_ci for c in str: 541bd4fe43Sopenharmony_ci crc = self._update_crc(crc, ord(c)) 551bd4fe43Sopenharmony_ci return crc 561bd4fe43Sopenharmony_ci 571bd4fe43Sopenharmony_ci def crcb(self, i): 581bd4fe43Sopenharmony_ci crc = self.PRESET 591bd4fe43Sopenharmony_ci for c in i: 601bd4fe43Sopenharmony_ci crc = self._update_crc(crc, c) 611bd4fe43Sopenharmony_ci return crc 621bd4fe43Sopenharmony_ci 631bd4fe43Sopenharmony_cit = crc16() 641bd4fe43Sopenharmony_cidef packet_bin(outputPath, inputList): 651bd4fe43Sopenharmony_ci pathList = [] 661bd4fe43Sopenharmony_ci burnAddrList = [] 671bd4fe43Sopenharmony_ci burnSizeList = [] 681bd4fe43Sopenharmony_ci imageSizeList = [] 691bd4fe43Sopenharmony_ci typeList = [] 701bd4fe43Sopenharmony_ci for item in inputList: 711bd4fe43Sopenharmony_ci path, burnAddr, burnSize, type = item.split("|") 721bd4fe43Sopenharmony_ci imageSize = os.path.getsize(path) 731bd4fe43Sopenharmony_ci pathList.append(path) 741bd4fe43Sopenharmony_ci burnAddrList.append(int(burnAddr)) 751bd4fe43Sopenharmony_ci burnSizeList.append(int(burnSize)) 761bd4fe43Sopenharmony_ci imageSizeList.append(imageSize) 771bd4fe43Sopenharmony_ci typeList.append(int(type)) 781bd4fe43Sopenharmony_ci 791bd4fe43Sopenharmony_ci print(pathList) 801bd4fe43Sopenharmony_ci print(burnAddrList) 811bd4fe43Sopenharmony_ci print(burnSizeList) 821bd4fe43Sopenharmony_ci print(imageSizeList) 831bd4fe43Sopenharmony_ci print(typeList) 841bd4fe43Sopenharmony_ci 851bd4fe43Sopenharmony_ci flag = 0xefbeaddf 861bd4fe43Sopenharmony_ci print(flag) 871bd4fe43Sopenharmony_ci crc = 0 881bd4fe43Sopenharmony_ci imageNum = len(pathList) 891bd4fe43Sopenharmony_ci headLen = imageNum*52 + 12 901bd4fe43Sopenharmony_ci totalFileSize = sum(imageSizeList) + headLen 911bd4fe43Sopenharmony_ci 921bd4fe43Sopenharmony_ci with open(outputPath, 'wb+') as file: 931bd4fe43Sopenharmony_ci file.write(struct.pack('IHHI', flag, crc, imageNum, totalFileSize)) 941bd4fe43Sopenharmony_ci startIndex = headLen 951bd4fe43Sopenharmony_ci times = 0 961bd4fe43Sopenharmony_ci for path in pathList: 971bd4fe43Sopenharmony_ci pathName = os.path.basename(path) 981bd4fe43Sopenharmony_ci file.write( 991bd4fe43Sopenharmony_ci struct.pack('32sIIIII', bytes(pathName, 'ascii'), startIndex, imageSizeList[times], burnAddrList[times], 1001bd4fe43Sopenharmony_ci burnSizeList[times], typeList[times])) 1011bd4fe43Sopenharmony_ci startIndex = startIndex + imageSizeList[times] + 16 1021bd4fe43Sopenharmony_ci times += 1 1031bd4fe43Sopenharmony_ci 1041bd4fe43Sopenharmony_ci for path in pathList: 1051bd4fe43Sopenharmony_ci with open(path, 'rb+') as subfile: 1061bd4fe43Sopenharmony_ci data = subfile.read() 1071bd4fe43Sopenharmony_ci file.write(data) 1081bd4fe43Sopenharmony_ci file.write(struct.pack('IIII', 0, 0, 0, 0)) 1091bd4fe43Sopenharmony_ci 1101bd4fe43Sopenharmony_ci file.flush() 1111bd4fe43Sopenharmony_ci file.seek(6) 1121bd4fe43Sopenharmony_ci newdata = file.read(headLen - 6) 1131bd4fe43Sopenharmony_ci crc16 = t.crcb(newdata) 1141bd4fe43Sopenharmony_ci file.seek(4) 1151bd4fe43Sopenharmony_ci file.write(struct.pack('H', crc16)) 1161bd4fe43Sopenharmony_ci 1171bd4fe43Sopenharmony_ciif __name__=="__main__": 1181bd4fe43Sopenharmony_ci print("main") 1191bd4fe43Sopenharmony_ci args = len(sys.argv) 1201bd4fe43Sopenharmony_ci argv = sys.argv 1211bd4fe43Sopenharmony_ci print(args) 1221bd4fe43Sopenharmony_ci print(argv) 1231bd4fe43Sopenharmony_ci if(args <= 2): 1241bd4fe43Sopenharmony_ci print("param should be : python main.py \"outputPath\" \"name|burnAddr|burnSize|type\"...") 1251bd4fe43Sopenharmony_ci ''' 1261bd4fe43Sopenharmony_ci enum IMAGE_TYPE { 1271bd4fe43Sopenharmony_ci IMAGE_TYPE_LOADER, 1281bd4fe43Sopenharmony_ci IMAGE_TYPE_NORMAL, 1291bd4fe43Sopenharmony_ci IMAGE_TYPE_PARAM, 1301bd4fe43Sopenharmony_ci IMAGE_TYPE_EFUSE, 1311bd4fe43Sopenharmony_ci IMAGE_TYPE_OTP, 1321bd4fe43Sopenharmony_ci IMAGE_TYPE_FORMALBIN, 1331bd4fe43Sopenharmony_ci }; 1341bd4fe43Sopenharmony_ci ''' 1351bd4fe43Sopenharmony_ci sys.exit() 1361bd4fe43Sopenharmony_ci 1371bd4fe43Sopenharmony_ci outputPath = argv[1] 1381bd4fe43Sopenharmony_ci print(outputPath) 1391bd4fe43Sopenharmony_ci del argv[1] 1401bd4fe43Sopenharmony_ci del argv[0] 1411bd4fe43Sopenharmony_ci packet_bin(outputPath, argv) 1421bd4fe43Sopenharmony_ci 1431bd4fe43Sopenharmony_ci'''' 1441bd4fe43Sopenharmony_cipathList = [] 1451bd4fe43Sopenharmony_ciburnAddrList = [] 1461bd4fe43Sopenharmony_ciburnSizeList = [] 1471bd4fe43Sopenharmony_ciimageSizeList = [] 1481bd4fe43Sopenharmony_citypeList = [] 1491bd4fe43Sopenharmony_ci 1501bd4fe43Sopenharmony_cifor arg in argv: 1511bd4fe43Sopenharmony_ci path, burnAddr, burnSize, type = arg.split("|") 1521bd4fe43Sopenharmony_ci imageSize = os.path.getsize(path) 1531bd4fe43Sopenharmony_ci pathList.append(path) 1541bd4fe43Sopenharmony_ci burnAddrList.append(int(burnAddr)) 1551bd4fe43Sopenharmony_ci burnSizeList.append(int(burnSize)) 1561bd4fe43Sopenharmony_ci imageSizeList.append(imageSize) 1571bd4fe43Sopenharmony_ci typeList.append(int(type)) 1581bd4fe43Sopenharmony_ci 1591bd4fe43Sopenharmony_ciprint(pathList) 1601bd4fe43Sopenharmony_ciprint(burnAddrList) 1611bd4fe43Sopenharmony_ciprint(burnSizeList) 1621bd4fe43Sopenharmony_ciprint(imageSizeList) 1631bd4fe43Sopenharmony_ciprint(typeList) 1641bd4fe43Sopenharmony_ci 1651bd4fe43Sopenharmony_ciflag = 0xefbeaddf 1661bd4fe43Sopenharmony_ciprint(flag) 1671bd4fe43Sopenharmony_cicrc = 0 1681bd4fe43Sopenharmony_ciimageNum = len(pathList) 1691bd4fe43Sopenharmony_ciheadLen = imageNum*52 + 12 1701bd4fe43Sopenharmony_citotalFileSize = sum(imageSizeList) + headLen 1711bd4fe43Sopenharmony_ci 1721bd4fe43Sopenharmony_cifile = open(outputPath, 'wb+') 1731bd4fe43Sopenharmony_ci 1741bd4fe43Sopenharmony_cifile.write(struct.pack('IHHI', flag, crc, imageNum, totalFileSize)) 1751bd4fe43Sopenharmony_cistartIndex = headLen 1761bd4fe43Sopenharmony_citimes = 0 1771bd4fe43Sopenharmony_cifor path in pathList: 1781bd4fe43Sopenharmony_ci pathName = path.split("\\")[-1] 1791bd4fe43Sopenharmony_ci file.write(struct.pack('32sIIIII', bytes(pathName, 'ascii'), startIndex, imageSizeList[times], burnAddrList[times], 1801bd4fe43Sopenharmony_ci burnSizeList[times], typeList[times])) 1811bd4fe43Sopenharmony_ci startIndex = startIndex + imageSizeList[times] + 16 1821bd4fe43Sopenharmony_ci times += 1 1831bd4fe43Sopenharmony_ci 1841bd4fe43Sopenharmony_cifor path in pathList: 1851bd4fe43Sopenharmony_ci subfile = open(path, 'rb+') 1861bd4fe43Sopenharmony_ci data = subfile.read() 1871bd4fe43Sopenharmony_ci file.write(data) 1881bd4fe43Sopenharmony_ci file.write(struct.pack('IIII', 0, 0, 0, 0)) 1891bd4fe43Sopenharmony_ci 1901bd4fe43Sopenharmony_cifile.flush() 1911bd4fe43Sopenharmony_cifile.seek(6) 1921bd4fe43Sopenharmony_cinewdata = file.read(headLen - 6) 1931bd4fe43Sopenharmony_cit = crc16() 1941bd4fe43Sopenharmony_cicrc16 = t.crcb(newdata) 1951bd4fe43Sopenharmony_cifile.seek(4) 1961bd4fe43Sopenharmony_cifile.write(struct.pack('H', crc16)) 1971bd4fe43Sopenharmony_cifile.close() 1981bd4fe43Sopenharmony_ci''''' 1991bd4fe43Sopenharmony_ci 200