337 lines
16 KiB
Python
337 lines
16 KiB
Python
|
|
#!/usr/bin/env python3
|
||
|
|
# coding=utf-8
|
||
|
|
|
||
|
|
|
||
|
|
# -----------------------------------------------------------------------------------------
|
||
|
|
#Purpose:hupg main build scripts
|
||
|
|
#Copyright CompanyNameMagicTag 2018-2020.All rights reserved
|
||
|
|
#Author: CompanyName
|
||
|
|
#------------------------------------------------------------------------------------------
|
||
|
|
|
||
|
|
import os, sys, time, string, re ,shutil, time, xml.etree.ElementTree as ET
|
||
|
|
from configparser import ConfigParser
|
||
|
|
from functools import reduce
|
||
|
|
from ctypes import *
|
||
|
|
import struct
|
||
|
|
import binascii
|
||
|
|
from zlib import crc32
|
||
|
|
import random
|
||
|
|
|
||
|
|
import make_image_module as MAKE_IMAGE
|
||
|
|
import make_partition_table as MAKE_PARTITION
|
||
|
|
sys.path.append(os.path.join(os.getcwd(), 'scripts'))
|
||
|
|
from analyze_dependence import user_pannel_config
|
||
|
|
#=================================================#
|
||
|
|
def modify_config_ini():
|
||
|
|
cfg = ConfigParser()
|
||
|
|
cfg.read('config.ini')
|
||
|
|
cfg.set('app','app_list',reduce(lambda x,y:'%s,%s'%(x,y),g_user_pannel_config.get_app_name(g_project_name)))
|
||
|
|
cfg.set('product','chip',g_user_pannel_config.get_product_chip())
|
||
|
|
cfg.set('product','product_ver',g_user_pannel_config.get_product_ver())
|
||
|
|
cfg.set('product','product_type',reduce(lambda x,y:'%s,%s'%(x,y),g_user_pannel_config.get_dev_list()))
|
||
|
|
cfg.set('path','product_name',g_project_name)
|
||
|
|
cfg.set('path','debug_mode',g_user_pannel_config.get_debug_mode())
|
||
|
|
with open('config.ini','w') as fp:
|
||
|
|
cfg.write(fp)
|
||
|
|
#=================================================#
|
||
|
|
|
||
|
|
time.sleep(1)
|
||
|
|
|
||
|
|
g_user_pannel_config = user_pannel_config()
|
||
|
|
g_project_name = g_user_pannel_config.get_project_name()
|
||
|
|
modify_config_ini()
|
||
|
|
|
||
|
|
root_path = os.path.join(os.getcwd(), '..')
|
||
|
|
cfg = ConfigParser()
|
||
|
|
cfg.read('config.ini')
|
||
|
|
#cfg.sections()
|
||
|
|
hb_cfg_file=os.path.join(root_path,r"hb.cfg")
|
||
|
|
pkt_path = os.path.join(root_path,cfg.get('path','pkt_path'))
|
||
|
|
chip_name = cfg.get('product','chip')
|
||
|
|
product_name = cfg.get('path','product_name')
|
||
|
|
product_ver = cfg.get('product','product_ver')
|
||
|
|
product_type = cfg.get('product','product_type')
|
||
|
|
boot_ver = cfg.get('mode','boot_ver')
|
||
|
|
target_type = cfg.get('mode','target_type')
|
||
|
|
app_list = cfg.get('app','app_list')
|
||
|
|
#Configuration file address#
|
||
|
|
boot_bin_path = os.path.join(root_path,cfg.get('path','boot_bin_path'))
|
||
|
|
cco_bin_path = os.path.join(root_path,cfg.get('path','cco_bin_path'))
|
||
|
|
sta_bin_path= os.path.join(root_path,cfg.get('path','sta_bin_path'))
|
||
|
|
ndm_bin_path= os.path.join(root_path,cfg.get('path','ndm_bin_path'))
|
||
|
|
cco_nv_path = os.path.join(root_path,cfg.get('path','cco_nv_path'))
|
||
|
|
sta_nv_path = os.path.join(root_path,cfg.get('path','sta_nv_path'))
|
||
|
|
ndm_nv_path = os.path.join(root_path,cfg.get('path','ndm_nv_path'))
|
||
|
|
hupg_xml_file = os.path.join(os.getcwd(),"packet_cfg/21_hupg.xml")
|
||
|
|
hupg_ini_path = os.path.join(os.getcwd(),"packet_cfg")
|
||
|
|
|
||
|
|
# Source file address#
|
||
|
|
bin_src_dir = os.path.join(pkt_path,"src/")
|
||
|
|
|
||
|
|
# Destination file address#
|
||
|
|
image_dir = os.path.join(pkt_path,"image/" )
|
||
|
|
image_list_file = os.path.join(pkt_path,"image/image_list.txt")
|
||
|
|
|
||
|
|
# Version magic header file: upgrade code, upgrade file, NV need to match
|
||
|
|
g_ver_h_file=os.path.join(os.getcwd(),"../build_tmp/config/hb_magic.h")
|
||
|
|
|
||
|
|
g_ver_magic=0
|
||
|
|
|
||
|
|
#-----------------------------------Basic type definition-----------------------------------
|
||
|
|
TD_CHAR=c_char
|
||
|
|
TD_S8=c_byte
|
||
|
|
TD_U8=c_ubyte
|
||
|
|
TD_S16=c_short
|
||
|
|
TD_U16=c_ushort
|
||
|
|
TD_S32=c_int
|
||
|
|
UAPI_U32=c_uint
|
||
|
|
|
||
|
|
# Note The NV structure here must be the same as the NV structure of build_nv_xx.y!
|
||
|
|
class NV_FILE_STRU(Structure):
|
||
|
|
_fields_ = [
|
||
|
|
("magic", UAPI_U32),
|
||
|
|
("crc", UAPI_U32),
|
||
|
|
("ver", TD_U8),
|
||
|
|
("head_len", TD_U8),
|
||
|
|
("total_num", TD_U16),
|
||
|
|
("seq", UAPI_U32),
|
||
|
|
("ver_magic", UAPI_U32),
|
||
|
|
("flash_size", UAPI_U32),
|
||
|
|
("keep_id_range", TD_U8*2),
|
||
|
|
("reserve", TD_U8*2),
|
||
|
|
("nv_item_index", TD_U8*0),
|
||
|
|
]
|
||
|
|
|
||
|
|
def modify_nv_ver_magic(nv_file, ver_magic):
|
||
|
|
with open(nv_file,'rb') as nv_file_fp:
|
||
|
|
nv_file_bin=nv_file_fp.read()
|
||
|
|
|
||
|
|
nv_tmp_bin=bytearray(len(nv_file_bin))
|
||
|
|
nv_tmp_bin[0:len(nv_file_bin)]=nv_file_bin
|
||
|
|
|
||
|
|
nv_file_st=NV_FILE_STRU.from_buffer(nv_tmp_bin)
|
||
|
|
nv_file_st.ver_magic=ver_magic
|
||
|
|
# Recalculate crc32 for entire region
|
||
|
|
nv_file_st.crc=crc32(nv_tmp_bin[8:len(nv_tmp_bin)])
|
||
|
|
|
||
|
|
with open(nv_file,'wb+') as nv_file_fp:
|
||
|
|
nv_file_fp.write(nv_tmp_bin)
|
||
|
|
|
||
|
|
def get_ver_magic(ver_h_file,app_name):
|
||
|
|
ver_magic=0
|
||
|
|
with open(ver_h_file, 'r') as f:
|
||
|
|
find = False
|
||
|
|
for line in f.readlines():
|
||
|
|
if app_name in line:
|
||
|
|
find = True
|
||
|
|
continue
|
||
|
|
if 'PRODUCT_CFG_BUILD_MAGIC' in line and find == True:
|
||
|
|
L=line.split()
|
||
|
|
ver_magic=L[2].strip()
|
||
|
|
print("app_name:%s ver_magic:0x%x"%(app_name,int(ver_magic)))
|
||
|
|
find = False
|
||
|
|
return int(ver_magic)
|
||
|
|
|
||
|
|
class ImageBuild:
|
||
|
|
def __init__(self):
|
||
|
|
if not os.path.exists(pkt_path):
|
||
|
|
os.makedirs(pkt_path)
|
||
|
|
if not os.path.exists(image_dir):
|
||
|
|
os.makedirs(image_dir)
|
||
|
|
if not os.path.exists(bin_src_dir):
|
||
|
|
os.makedirs(bin_src_dir)
|
||
|
|
self.__bootBinPath = boot_bin_path
|
||
|
|
self.__ccoBinPath = cco_bin_path
|
||
|
|
self.__staBinPath = sta_bin_path
|
||
|
|
self.__ndmBinPath = ndm_bin_path
|
||
|
|
self.cco_nv_path = cco_nv_path
|
||
|
|
self.sta_nv_path = sta_nv_path
|
||
|
|
self.ndm_nv_path = ndm_nv_path
|
||
|
|
|
||
|
|
self.__binSrcDir = bin_src_dir
|
||
|
|
self.__imageDir = image_dir
|
||
|
|
self.__chipName = chip_name
|
||
|
|
self.__prodVer = product_ver
|
||
|
|
self.__app_list = app_list
|
||
|
|
self.__product_type = product_type
|
||
|
|
self.__product_name = product_name
|
||
|
|
self.__imageListFile = open(image_list_file, "wb")
|
||
|
|
|
||
|
|
def work(self):
|
||
|
|
self.__GetSrcBin()
|
||
|
|
self.__BuildImage()
|
||
|
|
|
||
|
|
# Copy bin file #
|
||
|
|
def __GetSrcBin(self):
|
||
|
|
for name in os.listdir(self.__binSrcDir):
|
||
|
|
os.remove(os.path.join(self.__binSrcDir.encode('utf-8'), name.encode('utf-8')))
|
||
|
|
|
||
|
|
if os.path.exists(self.__bootBinPath):
|
||
|
|
bootBinFileNames = os.listdir(self.__bootBinPath)
|
||
|
|
for a in bootBinFileNames:
|
||
|
|
if '.bin' in a:
|
||
|
|
shutil.copy(os.path.join(self.__bootBinPath.encode('utf-8'), a.encode('utf-8')),self.__binSrcDir.encode('utf-8'))
|
||
|
|
|
||
|
|
if os.path.exists(self.__ccoBinPath):
|
||
|
|
ccoBinFileNames = os.listdir(self.__ccoBinPath)
|
||
|
|
for b in ccoBinFileNames:
|
||
|
|
if '.bin' in b:
|
||
|
|
shutil.copy(os.path.join(self.__ccoBinPath.encode('utf-8'), b.encode('utf-8')),self.__binSrcDir.encode('utf-8'))
|
||
|
|
|
||
|
|
if os.path.exists(self.__staBinPath):
|
||
|
|
staBinFileNames = os.listdir(self.__staBinPath)
|
||
|
|
for c in staBinFileNames:
|
||
|
|
if '.bin' in c:
|
||
|
|
shutil.copy(os.path.join(self.__staBinPath.encode('utf-8'), c.encode('utf-8')),self.__binSrcDir.encode('utf-8'))
|
||
|
|
|
||
|
|
if os.path.exists(self.__ndmBinPath):
|
||
|
|
ndmBinFileNames = os.listdir(self.__ndmBinPath)
|
||
|
|
for d in ndmBinFileNames:
|
||
|
|
if '.bin' in d:
|
||
|
|
shutil.copy(os.path.join(self.__ndmBinPath.encode('utf-8'), d.encode('utf-8')),self.__binSrcDir.encode('utf-8'))
|
||
|
|
|
||
|
|
if os.path.exists(self.cco_nv_path):
|
||
|
|
nvHnvFileNames = os.listdir(self.cco_nv_path)
|
||
|
|
for e in nvHnvFileNames:
|
||
|
|
if '.hnv' in e:
|
||
|
|
shutil.copy(os.path.join(self.cco_nv_path.encode('utf-8'), e.encode('utf-8')),self.__binSrcDir.encode('utf-8'))
|
||
|
|
|
||
|
|
if os.path.exists(self.sta_nv_path):
|
||
|
|
nvHnvFileNames = os.listdir(self.sta_nv_path)
|
||
|
|
for e in nvHnvFileNames:
|
||
|
|
if '.hnv' in e:
|
||
|
|
shutil.copy(os.path.join(self.sta_nv_path.encode('utf-8'), e.encode('utf-8')),self.__binSrcDir.encode('utf-8'))
|
||
|
|
|
||
|
|
if os.path.exists(self.ndm_nv_path):
|
||
|
|
nvHnvFileNames = os.listdir(self.ndm_nv_path)
|
||
|
|
for e in nvHnvFileNames:
|
||
|
|
if '.hnv' in e:
|
||
|
|
shutil.copy(os.path.join(self.ndm_nv_path.encode('utf-8'), e.encode('utf-8')),self.__binSrcDir.encode('utf-8'))
|
||
|
|
|
||
|
|
def __BuildImage(self):
|
||
|
|
product_name = self.__product_name.upper()
|
||
|
|
product_ver = self.__prodVer
|
||
|
|
app_name = self.__app_list.upper()
|
||
|
|
# Read xml configuration #
|
||
|
|
print('read from xml ...')
|
||
|
|
tree = ET.parse(hupg_xml_file)
|
||
|
|
list_product = tree.findall("PROJECT")
|
||
|
|
for product in list_product:
|
||
|
|
# Select project name #
|
||
|
|
if (product.attrib['name'].upper() == product_name):
|
||
|
|
print('PROJECT name : %s'%product.attrib['name'])
|
||
|
|
for app in product:
|
||
|
|
# Choose APP name #
|
||
|
|
app_name_in_xml = app.attrib['NAME'].upper()
|
||
|
|
if app_name_in_xml in app_name :
|
||
|
|
print('APP name : %s'%app.attrib['NAME'])
|
||
|
|
g_ver_magic = get_ver_magic(g_ver_h_file,app_name_in_xml.lower())
|
||
|
|
|
||
|
|
for prod_type in app:
|
||
|
|
if 'CFG_FILE' in prod_type.attrib.keys():
|
||
|
|
config_file=prod_type.attrib['CFG_FILE'].strip()
|
||
|
|
else:
|
||
|
|
config_file=None
|
||
|
|
|
||
|
|
src_files = prod_type.attrib['SRC_NAME'].split(',')
|
||
|
|
prod_name = prod_type.attrib['ID']
|
||
|
|
|
||
|
|
# hupg configuration
|
||
|
|
if prod_type.attrib['TYPE'] == 'hupg':
|
||
|
|
build_flag=0
|
||
|
|
for X in prod_type.attrib['DEV'].lower().split('_'):
|
||
|
|
for Y in self.__product_type.lower().split(','):
|
||
|
|
if (X == Y):
|
||
|
|
build_flag =1
|
||
|
|
if build_flag:
|
||
|
|
kernel_file = os.path.join(bin_src_dir,src_files[0])
|
||
|
|
normal_nv_file = os.path.join(bin_src_dir,src_files[1])
|
||
|
|
partition_bin_file = os.path.join(bin_src_dir,src_files[2])
|
||
|
|
if not os.path.exists(normal_nv_file):
|
||
|
|
continue
|
||
|
|
|
||
|
|
modify_nv_ver_magic(normal_nv_file,g_ver_magic)
|
||
|
|
# Construct output file name #
|
||
|
|
image_file_name = '%s_%s_%s_%s.%s'%(product_name,app.attrib['NAME'].lower(),product_ver.lower(),prod_name,prod_type.attrib['TYPE'])
|
||
|
|
self.__imageListFile.write(('%s\r\n'%image_file_name).encode('utf-8'))
|
||
|
|
image_file = os.path.join(image_dir, image_file_name)
|
||
|
|
#print("%s %s"%(normal_nv_file,image_file_name))
|
||
|
|
MAKE_IMAGE.make_hupg(root_path,kernel_file,normal_nv_file,partition_bin_file,
|
||
|
|
image_file,config_file,product_ver,g_ver_magic, app.attrib['NAME'].lower())
|
||
|
|
print(image_file_name)
|
||
|
|
|
||
|
|
# hbin configuration
|
||
|
|
elif prod_type.attrib['TYPE'] == 'hbin':
|
||
|
|
build_flag=0
|
||
|
|
for X in prod_type.attrib['DEV'].lower().split('_'):
|
||
|
|
for Y in self.__product_type.lower().split(','):
|
||
|
|
if (X == Y):
|
||
|
|
build_flag =1
|
||
|
|
if build_flag:
|
||
|
|
flash_boot_file = os.path.join(bin_src_dir,src_files[0])
|
||
|
|
factory_nv_file = os.path.join(bin_src_dir,src_files[1])
|
||
|
|
normal_nv_file = os.path.join(bin_src_dir,src_files[2])
|
||
|
|
kernel_file = os.path.join(bin_src_dir,src_files[3].lower())
|
||
|
|
if not os.path.exists(normal_nv_file) or not os.path.exists(factory_nv_file):
|
||
|
|
continue
|
||
|
|
|
||
|
|
modify_nv_ver_magic(normal_nv_file,g_ver_magic)
|
||
|
|
modify_nv_ver_magic(factory_nv_file,g_ver_magic)
|
||
|
|
# Construct output file name #
|
||
|
|
image_file_name = '%s_%s_%s_%s.%s'%(product_name,app.attrib['NAME'].lower(),product_ver.lower(),prod_name,prod_type.attrib['TYPE'])
|
||
|
|
self.__imageListFile.write(('%s\r\n'%image_file_name).encode('utf-8'))
|
||
|
|
image_file = os.path.join(image_dir, image_file_name)
|
||
|
|
MAKE_IMAGE.make_hbin(root_path,flash_boot_file, factory_nv_file, normal_nv_file,
|
||
|
|
kernel_file, image_file, config_file, product_ver,g_ver_magic, app.attrib['NAME'].lower())
|
||
|
|
print(image_file_name)
|
||
|
|
|
||
|
|
#bootupg configuration
|
||
|
|
elif prod_type.attrib['TYPE'] == 'bootupg':
|
||
|
|
flash_boot_file = os.path.join(bin_src_dir,src_files[0])
|
||
|
|
# Construct output file name #
|
||
|
|
image_file_name = '%s_%s_%s.%s'%(product_name,product_ver.lower(),prod_name,prod_type.attrib['TYPE'])
|
||
|
|
self.__imageListFile.write(('%s\r\n'%image_file_name).encode('utf-8'))
|
||
|
|
image_file = os.path.join(image_dir, image_file_name)
|
||
|
|
print("*******************************************")
|
||
|
|
print(flash_boot_file)
|
||
|
|
MAKE_IMAGE.make_bootupg(root_path,flash_boot_file, image_file, config_file, product_ver, g_ver_magic)
|
||
|
|
print(image_file_name)
|
||
|
|
elif prod_type.attrib['TYPE'] == 'partion_bin':
|
||
|
|
build_flag=0
|
||
|
|
for X in prod_type.attrib['DEV'].lower().split('_'):
|
||
|
|
for Y in self.__product_type.split(','):
|
||
|
|
if (X == Y):
|
||
|
|
build_flag =1
|
||
|
|
if build_flag:
|
||
|
|
MAKE_PARTITION.make_partition_table_bin(prod_type.attrib['DEV'].lower(),root_path,
|
||
|
|
config_file,bin_src_dir,app.attrib['NAME'].lower())
|
||
|
|
elif prod_type.attrib['TYPE'] == 'partion_upg':
|
||
|
|
build_flag=0
|
||
|
|
for X in prod_type.attrib['DEV'].lower().split('_'):
|
||
|
|
for Y in self.__product_type.split(','):
|
||
|
|
if (X == Y):
|
||
|
|
build_flag =1
|
||
|
|
if build_flag:
|
||
|
|
print("product_name",type(product_name),product_name)
|
||
|
|
print("product_ver",type(product_ver),product_ver)
|
||
|
|
print("prod_name",type(prod_name),prod_name)
|
||
|
|
image_file_name='%s_%s_%s_%s.hupg'%(product_name, app.attrib['NAME'].lower(), product_ver.lower(),prod_name)
|
||
|
|
self.__imageListFile.write(('%s\r\n'%image_file_name).encode('utf-8'))
|
||
|
|
image_file = os.path.join(image_dir, image_file_name)
|
||
|
|
partion_file = os.path.join(bin_src_dir,src_files[0])
|
||
|
|
print("partion_file", type(partion_file), partion_file)
|
||
|
|
MAKE_IMAGE.make_partion_upg(root_path,partion_file,image_file,config_file,product_ver,g_ver_magic, app.attrib['NAME'])
|
||
|
|
self.__imageListFile.close()
|
||
|
|
|
||
|
|
def pkt_build():
|
||
|
|
t1 = time.time()
|
||
|
|
fu = ImageBuild()
|
||
|
|
fu.work()
|
||
|
|
|
||
|
|
print ("hupg and hbin ok!! \r\n")
|
||
|
|
print('TOTAL TIME:%ss'%str(time.time() - t1))
|
||
|
|
|
||
|
|
# main function #
|
||
|
|
if __name__ == '__main__':
|
||
|
|
pkt_build()
|