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