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: nv build scripts. 191bd4fe43Sopenharmony_ci''' 201bd4fe43Sopenharmony_ci 211bd4fe43Sopenharmony_ciimport os 221bd4fe43Sopenharmony_ciimport sys 231bd4fe43Sopenharmony_ciimport re 241bd4fe43Sopenharmony_ciimport subprocess 251bd4fe43Sopenharmony_ciimport configparser 261bd4fe43Sopenharmony_ciimport shutil 271bd4fe43Sopenharmony_ciimport sys 281bd4fe43Sopenharmony_ciimport xml.etree.ElementTree as ET 291bd4fe43Sopenharmony_ciimport copy 301bd4fe43Sopenharmony_cifrom ctypes import * 311bd4fe43Sopenharmony_ciimport time 321bd4fe43Sopenharmony_ciimport hashlib 331bd4fe43Sopenharmony_ciimport binascii 341bd4fe43Sopenharmony_ciimport datetime 351bd4fe43Sopenharmony_cifrom zlib import crc32 361bd4fe43Sopenharmony_ciimport struct 371bd4fe43Sopenharmony_cisys.path.append("'..', '..', 'build'") 381bd4fe43Sopenharmony_ci#from scripts.analyze_dependence import user_pannel_config 391bd4fe43Sopenharmony_ci 401bd4fe43Sopenharmony_ci#-----------------------------------基本错误定义----------------------------------- 411bd4fe43Sopenharmony_ciHI_ERR_SUCCESS = 0 421bd4fe43Sopenharmony_ci#-----------------------------------基本类型定义----------------------------------- 431bd4fe43Sopenharmony_ciHI_CHAR = c_char 441bd4fe43Sopenharmony_ciHI_S8 = c_byte 451bd4fe43Sopenharmony_ciHI_U8 = c_ubyte 461bd4fe43Sopenharmony_ciHI_S16 = c_short 471bd4fe43Sopenharmony_ciHI_U16 = c_ushort 481bd4fe43Sopenharmony_ciHI_S32 = c_int 491bd4fe43Sopenharmony_ciHI_U32 = c_uint 501bd4fe43Sopenharmony_ci#-----------------------------------NV结构体定义----------------------------------- 511bd4fe43Sopenharmony_ciclass NV_FILE_STRU(Structure): 521bd4fe43Sopenharmony_ci _fields_ = [ 531bd4fe43Sopenharmony_ci ("magic", HI_U32), 541bd4fe43Sopenharmony_ci ("crc", HI_U32), 551bd4fe43Sopenharmony_ci ("ver", HI_U8), 561bd4fe43Sopenharmony_ci ("head_len", HI_U8), 571bd4fe43Sopenharmony_ci ("total_num", HI_U16), 581bd4fe43Sopenharmony_ci ("seq", HI_U32), 591bd4fe43Sopenharmony_ci ("ver_magic", HI_U32), 601bd4fe43Sopenharmony_ci ("flash_size", HI_U32), 611bd4fe43Sopenharmony_ci ("keep_id_range", HI_U8*2), 621bd4fe43Sopenharmony_ci ("reserve", HI_U8*2), 631bd4fe43Sopenharmony_ci ("nv_item_index", HI_U8*0), 641bd4fe43Sopenharmony_ci ] 651bd4fe43Sopenharmony_ci 661bd4fe43Sopenharmony_ciclass NV_ITEM_INDEX_STRU(Structure): 671bd4fe43Sopenharmony_ci _fields_ = [ 681bd4fe43Sopenharmony_ci ("nv_id", HI_U8), 691bd4fe43Sopenharmony_ci ("nv_len", HI_U8), 701bd4fe43Sopenharmony_ci ("nv_offset", HI_U16), 711bd4fe43Sopenharmony_ci ] 721bd4fe43Sopenharmony_ciNV_ITEM_INDEX_LEN = 4 731bd4fe43Sopenharmony_ciNV_ITEM_CRC_LEN = 4 741bd4fe43Sopenharmony_ci 751bd4fe43Sopenharmony_ciHNV_MAGIC = 0x24564E48 761bd4fe43Sopenharmony_ciFNV_MAGIC = 0x23564E46 771bd4fe43Sopenharmony_ci 781bd4fe43Sopenharmony_ci#SEC_CONN_SALT = '"sec conn salt"' 791bd4fe43Sopenharmony_ci#SEC_NV_ID = 0x8c 801bd4fe43Sopenharmony_ci 811bd4fe43Sopenharmony_ci###############################NV 分区头格式 ############################################### 821bd4fe43Sopenharmony_ci#Hi3921不再在NV中体现Factory/Modem/APP等不同分区头 831bd4fe43Sopenharmony_ci 841bd4fe43Sopenharmony_ci###############################NV项头信息############################################### 851bd4fe43Sopenharmony_ci#Hi3921各个NV项(条目)没有头信息. 861bd4fe43Sopenharmony_ci 871bd4fe43Sopenharmony_ci#-----------------------------------生成HNV文件流程----------------------------------- 881bd4fe43Sopenharmony_cidef nv_process_mk_section(element_root, src_bin_dic, is_factory): 891bd4fe43Sopenharmony_ci nv_id_list = [] 901bd4fe43Sopenharmony_ci nv_keep_id_list = [] 911bd4fe43Sopenharmony_ci nv_item_bin_list = [] 921bd4fe43Sopenharmony_ci nv_item_index_bin_list = [] 931bd4fe43Sopenharmony_ci nv_total_size = 0 941bd4fe43Sopenharmony_ci nv_offset = 0 951bd4fe43Sopenharmony_ci nv_len = 0 961bd4fe43Sopenharmony_ci nv_total_num = 0 971bd4fe43Sopenharmony_ci 981bd4fe43Sopenharmony_ci #1.遍历,取出工厂区或非工厂区的所有NV ID,并排序 991bd4fe43Sopenharmony_ci for element_grp in element_root: 1001bd4fe43Sopenharmony_ci# print("element_grp: ", element_grp) 1011bd4fe43Sopenharmony_ci# print("NAME: ", element_grp.attrib['NAME']) 1021bd4fe43Sopenharmony_ci if True == is_factory: 1031bd4fe43Sopenharmony_ci if element_grp.attrib['NAME'] == 'Factory': 1041bd4fe43Sopenharmony_ci for nv_element in element_grp: 1051bd4fe43Sopenharmony_ci nv_id_list.append(int(nv_element.attrib['ID'], 16)) 1061bd4fe43Sopenharmony_ci break; 1071bd4fe43Sopenharmony_ci else: 1081bd4fe43Sopenharmony_ci if element_grp.attrib['NAME'] != 'Factory': 1091bd4fe43Sopenharmony_ci for nv_element in element_grp: 1101bd4fe43Sopenharmony_ci nv_id_list.append(int(nv_element.attrib['ID'], 16)) 1111bd4fe43Sopenharmony_ci if element_grp.attrib['NAME'] == 'Keep': 1121bd4fe43Sopenharmony_ci nv_keep_id_list.append(int(nv_element.attrib['ID'], 16)) 1131bd4fe43Sopenharmony_ci 1141bd4fe43Sopenharmony_ci nv_id_list.sort() 1151bd4fe43Sopenharmony_ci nv_keep_id_list.sort() 1161bd4fe43Sopenharmony_ci nv_total_num = len(nv_id_list) 1171bd4fe43Sopenharmony_ci nv_offset = sizeof(NV_FILE_STRU)+nv_total_num*4#NV相对本区的偏移初始化在索引区之后 1181bd4fe43Sopenharmony_ci 1191bd4fe43Sopenharmony_ci #print(nv_id_list) 1201bd4fe43Sopenharmony_ci 1211bd4fe43Sopenharmony_ci #2.按照ID顺序生成nv_item_bin(含nv_item头和nv_item内容),添加到nv_item_bin_list中 1221bd4fe43Sopenharmony_ci for nv_id in nv_id_list: 1231bd4fe43Sopenharmony_ci #申请nv_item_bin空间并转换成nv_item_st 1241bd4fe43Sopenharmony_ci src_bin = src_bin_dic[hex(nv_id)] 1251bd4fe43Sopenharmony_ci nv_len = len(src_bin) 1261bd4fe43Sopenharmony_ci nv_item_bin = bytearray(nv_len+NV_ITEM_CRC_LEN)#申请空间 1271bd4fe43Sopenharmony_ci 1281bd4fe43Sopenharmony_ci #填充nv_item_bin,并将nv_item_bin添加到nv_item_bin_list中 1291bd4fe43Sopenharmony_ci nv_item_bin[0:] = src_bin#拷贝bin 1301bd4fe43Sopenharmony_ci nv_item_bin[nv_len:] = struct.pack('<L', crc32(src_bin)) 1311bd4fe43Sopenharmony_ci nv_item_bin_list.append(nv_item_bin) 1321bd4fe43Sopenharmony_ci 1331bd4fe43Sopenharmony_ci #累加nv_item_bin总大小 1341bd4fe43Sopenharmony_ci nv_total_size = nv_total_size+nv_len+NV_ITEM_CRC_LEN#计算所有nv长度 1351bd4fe43Sopenharmony_ci 1361bd4fe43Sopenharmony_ci #NV索引 1371bd4fe43Sopenharmony_ci nv_item_index_bin = bytearray(NV_ITEM_INDEX_LEN) 1381bd4fe43Sopenharmony_ci nv_item_index_st = NV_ITEM_INDEX_STRU.from_buffer(nv_item_index_bin) 1391bd4fe43Sopenharmony_ci nv_item_index_st.nv_id = nv_id 1401bd4fe43Sopenharmony_ci nv_item_index_st.nv_len = nv_len 1411bd4fe43Sopenharmony_ci nv_item_index_st.nv_offset = nv_offset 1421bd4fe43Sopenharmony_ci nv_item_index_bin_list.append(nv_item_index_bin) 1431bd4fe43Sopenharmony_ci nv_offset = nv_offset+nv_len+NV_ITEM_CRC_LEN 1441bd4fe43Sopenharmony_ci 1451bd4fe43Sopenharmony_ci #3.生成section_bin 1461bd4fe43Sopenharmony_ci #申请section_bin空间 1471bd4fe43Sopenharmony_ci section_bin = bytearray(nv_total_size) 1481bd4fe43Sopenharmony_ci 1491bd4fe43Sopenharmony_ci #将nv_item_bin依次拷贝到section_bin的后面 1501bd4fe43Sopenharmony_ci offset = 0 1511bd4fe43Sopenharmony_ci for nv_item_bin in nv_item_bin_list: 1521bd4fe43Sopenharmony_ci section_bin[offset:] = nv_item_bin 1531bd4fe43Sopenharmony_ci offset = offset+len(nv_item_bin) 1541bd4fe43Sopenharmony_ci 1551bd4fe43Sopenharmony_ci #4.生成index_bin 1561bd4fe43Sopenharmony_ci index_bin = bytearray(NV_ITEM_INDEX_LEN*nv_total_num) 1571bd4fe43Sopenharmony_ci offset = 0 1581bd4fe43Sopenharmony_ci for nv_item_index_bin in nv_item_index_bin_list: 1591bd4fe43Sopenharmony_ci index_bin[offset:] = nv_item_index_bin 1601bd4fe43Sopenharmony_ci offset = offset+NV_ITEM_INDEX_LEN 1611bd4fe43Sopenharmony_ci 1621bd4fe43Sopenharmony_ci return (HI_ERR_SUCCESS, nv_total_num, section_bin, index_bin, nv_keep_id_list) 1631bd4fe43Sopenharmony_ci 1641bd4fe43Sopenharmony_ci''' 1651bd4fe43Sopenharmony_ci功能:生成hnv文件 1661bd4fe43Sopenharmony_ci入参 1671bd4fe43Sopenharmony_cielement_root:nv根节点 1681bd4fe43Sopenharmony_cisrc_bin_dic:nv bin字典 {'0xf01':bytearray(...),....} 1691bd4fe43Sopenharmony_ciis_factory:是否是工厂区NV文件 1701bd4fe43Sopenharmony_ci返回值 1711bd4fe43Sopenharmony_ciret错误码 1721bd4fe43Sopenharmony_cinv_file_Bin: 类型bytearray nv文件内容 1731bd4fe43Sopenharmony_ci''' 1741bd4fe43Sopenharmony_cidef hi_nv_process_mk_hnv(element_root, src_bin_dic, nv_file_name, is_factory): 1751bd4fe43Sopenharmony_ci #print(src_bin_dic) 1761bd4fe43Sopenharmony_ci global g_nv_env 1771bd4fe43Sopenharmony_ci 1781bd4fe43Sopenharmony_ci #2.生成index_bin和section_bin 1791bd4fe43Sopenharmony_ci# print("element_root: ", element_root) 1801bd4fe43Sopenharmony_ci (ret, nv_total_num, section_bin, index_bin, nv_keep_id_list) = nv_process_mk_section(element_root, src_bin_dic, is_factory) 1811bd4fe43Sopenharmony_ci if ret != HI_ERR_SUCCESS: 1821bd4fe43Sopenharmony_ci return(ret, None) 1831bd4fe43Sopenharmony_ci 1841bd4fe43Sopenharmony_ci nv_name = '' 1851bd4fe43Sopenharmony_ci if is_factory == True: 1861bd4fe43Sopenharmony_ci nv_name = 'Factory NV' 1871bd4fe43Sopenharmony_ci else: 1881bd4fe43Sopenharmony_ci nv_name = 'Normal NV' 1891bd4fe43Sopenharmony_ci 1901bd4fe43Sopenharmony_ci print("%s total num:%d"%(nv_name,nv_total_num)) 1911bd4fe43Sopenharmony_ci 1921bd4fe43Sopenharmony_ci nv_index_total_size = len(index_bin) 1931bd4fe43Sopenharmony_ci nv_bin_total_size = len(section_bin) 1941bd4fe43Sopenharmony_ci 1951bd4fe43Sopenharmony_ci #3.申请nv_file_Bin空间,转成nv_file_st结构并填充nv_file_st 1961bd4fe43Sopenharmony_ci nv_file_Bin = bytearray(g_nv_env.flash_size) 1971bd4fe43Sopenharmony_ci 1981bd4fe43Sopenharmony_ci nv_file_st = NV_FILE_STRU.from_buffer(nv_file_Bin) 1991bd4fe43Sopenharmony_ci 2001bd4fe43Sopenharmony_ci #填充nv_file_st 2011bd4fe43Sopenharmony_ci if is_factory == True: 2021bd4fe43Sopenharmony_ci nv_file_st.magic = FNV_MAGIC 2031bd4fe43Sopenharmony_ci else: 2041bd4fe43Sopenharmony_ci nv_file_st.magic = HNV_MAGIC 2051bd4fe43Sopenharmony_ci nv_file_st.ver = 0 2061bd4fe43Sopenharmony_ci nv_file_st.head_len = sizeof(NV_FILE_STRU) 2071bd4fe43Sopenharmony_ci print('NV_FILE_STRU :'+str(nv_file_st.head_len)) 2081bd4fe43Sopenharmony_ci nv_file_st.total_num = nv_total_num 2091bd4fe43Sopenharmony_ci nv_file_st.seq = 0 2101bd4fe43Sopenharmony_ci nv_file_st.ver_magic = g_nv_env.ver_magic 2111bd4fe43Sopenharmony_ci nv_file_st.flash_size = g_nv_env.flash_size 2121bd4fe43Sopenharmony_ci nv_file_st.reserve[0] = 0 2131bd4fe43Sopenharmony_ci nv_file_st.reserve[1] = 0 2141bd4fe43Sopenharmony_ci if(len(nv_keep_id_list) == 0): 2151bd4fe43Sopenharmony_ci nv_file_st.keep_id_range[0] = 0 2161bd4fe43Sopenharmony_ci nv_file_st.keep_id_range[1] = 0 2171bd4fe43Sopenharmony_ci else: 2181bd4fe43Sopenharmony_ci nv_file_st.keep_id_range[0] = 0x80 2191bd4fe43Sopenharmony_ci nv_file_st.keep_id_range[1] = 0x9f 2201bd4fe43Sopenharmony_ci 2211bd4fe43Sopenharmony_ci #将index_bin添加到管理区后面,作为管理区的索引 2221bd4fe43Sopenharmony_ci offset = sizeof(NV_FILE_STRU) 2231bd4fe43Sopenharmony_ci nv_file_Bin[offset:offset+nv_index_total_size] = index_bin 2241bd4fe43Sopenharmony_ci offset = offset+nv_index_total_size 2251bd4fe43Sopenharmony_ci 2261bd4fe43Sopenharmony_ci #将section_bin添加到管理区的索引后面 2271bd4fe43Sopenharmony_ci nv_file_Bin[offset:offset+nv_bin_total_size] = section_bin 2281bd4fe43Sopenharmony_ci offset = offset+nv_bin_total_size 2291bd4fe43Sopenharmony_ci 2301bd4fe43Sopenharmony_ci print("%s total size:%d"%(nv_name, offset)) 2311bd4fe43Sopenharmony_ci if offset > g_nv_env.flash_size: 2321bd4fe43Sopenharmony_ci print("Error: NV is larger than flash_size:%d"%(g_nv_env.flash_size)) 2331bd4fe43Sopenharmony_ci exit(-1) 2341bd4fe43Sopenharmony_ci 2351bd4fe43Sopenharmony_ci #将nv_flash空闲区域置为F 2361bd4fe43Sopenharmony_ci for i in range(offset, g_nv_env.flash_size): 2371bd4fe43Sopenharmony_ci nv_file_Bin[i] = 0xFF 2381bd4fe43Sopenharmony_ci 2391bd4fe43Sopenharmony_ci #计算整区的crc32 2401bd4fe43Sopenharmony_ci nv_file_st.crc = crc32(nv_file_Bin[8:g_nv_env.flash_size]) 2411bd4fe43Sopenharmony_ci 2421bd4fe43Sopenharmony_ci return (HI_ERR_SUCCESS, nv_file_Bin) 2431bd4fe43Sopenharmony_ci 2441bd4fe43Sopenharmony_ciclass NvEnv: 2451bd4fe43Sopenharmony_ci def __init__(self): 2461bd4fe43Sopenharmony_ci self.app_name = []#app名称 2471bd4fe43Sopenharmony_ci self.root_dir = []#编译根目录 2481bd4fe43Sopenharmony_ci self.mdm_xml = []#mdm_xml全路径 2491bd4fe43Sopenharmony_ci self.app_xml = []#app_xml全路径 2501bd4fe43Sopenharmony_ci self.app_sdk_level = []#app sdk等级 2511bd4fe43Sopenharmony_ci self.app_cfg_dir = []#客制化文件夹路径,带产品形态路径 2521bd4fe43Sopenharmony_ci self.src_bin_dir = []#原bin路径,带产品形态路径 2531bd4fe43Sopenharmony_ci 2541bd4fe43Sopenharmony_ci self.product_type = []#产品形态名称 2551bd4fe43Sopenharmony_ci self.temp_dir = []#临时文件夹路径,带产品形态 2561bd4fe43Sopenharmony_ci self.combin_xml = []#合并后xml全路径,带or不带产品形态 2571bd4fe43Sopenharmony_ci self.nv_tool_dir = []# 2581bd4fe43Sopenharmony_ci self.nv_h_dir = []# 2591bd4fe43Sopenharmony_ci self.nv_bin_max_size = 0 2601bd4fe43Sopenharmony_ci self.flash_size = 0 2611bd4fe43Sopenharmony_ci self.ver_magic = 0 2621bd4fe43Sopenharmony_ci 2631bd4fe43Sopenharmony_cig_nv_env = NvEnv() 2641bd4fe43Sopenharmony_ci 2651bd4fe43Sopenharmony_cidef hi_str_to_int(line, num): 2661bd4fe43Sopenharmony_ci if num is not None: 2671bd4fe43Sopenharmony_ci return int(line, num) 2681bd4fe43Sopenharmony_ci match1 = re.match(r'\s*0x', line) 2691bd4fe43Sopenharmony_ci match2 = re.match(r'\s*0X', line) 2701bd4fe43Sopenharmony_ci if match1 or match2: 2711bd4fe43Sopenharmony_ci return int(line, 16) 2721bd4fe43Sopenharmony_ci else: 2731bd4fe43Sopenharmony_ci return int(line, 10) 2741bd4fe43Sopenharmony_ci 2751bd4fe43Sopenharmony_ci''' ''' 2761bd4fe43Sopenharmony_cidef hi_nv_set_cfg(root_dir, product_lib_out, xml_hfile_dir, product_name, app_name, hnv_dir, flash_size, ver_magic, hnv_file_name): 2771bd4fe43Sopenharmony_ci global g_nv_env 2781bd4fe43Sopenharmony_ci subver = g_subver_name 2791bd4fe43Sopenharmony_ci if subver =='common': 2801bd4fe43Sopenharmony_ci subver = app_name 2811bd4fe43Sopenharmony_ci 2821bd4fe43Sopenharmony_ci if hnv_dir is None:#hnv存放位置 2831bd4fe43Sopenharmony_ci g_nv_env.hnv_dir=product_lib_out 2841bd4fe43Sopenharmony_ci else: 2851bd4fe43Sopenharmony_ci g_nv_env.hnv_dir=hnv_dir 2861bd4fe43Sopenharmony_ci 2871bd4fe43Sopenharmony_ci g_nv_env.nv_h_dir=xml_hfile_dir#存放结构体txt文件存放位置 2881bd4fe43Sopenharmony_ci g_nv_env.app_name=app_name#app名称 2891bd4fe43Sopenharmony_ci g_nv_env.product_type=product_name#产品形态名称 2901bd4fe43Sopenharmony_ci g_nv_env.root_dir=root_dir#根目录 2911bd4fe43Sopenharmony_ci g_nv_env.temp_dir=os.path.join(product_lib_out, app_name, '%s%s'%(g_common_ver, g_subver_name))#临时文件目录 2921bd4fe43Sopenharmony_ci print('root_dir:', root_dir) 2931bd4fe43Sopenharmony_ci g_nv_env.mdm_xml=os.path.join(root_dir, 'xml_file', hnv_file_name) 2941bd4fe43Sopenharmony_ci print('mdm_xml:', g_nv_env.mdm_xml) 2951bd4fe43Sopenharmony_ci g_nv_env.app_xml=os.path.join(root_dir, 'xml_file', 'app_nvi_db.xml') 2961bd4fe43Sopenharmony_ci g_nv_env.app_cfg_dir=os.path.join(root_dir, 'xml_file')#区分不同产品形态 2971bd4fe43Sopenharmony_ci print('HNV NAME:' + hnv_file_name) 2981bd4fe43Sopenharmony_ci g_nv_env.combin_xml=os.path.join(product_lib_out, app_name, hnv_file_name)#合并后combin.xml路径 2991bd4fe43Sopenharmony_ci g_nv_env.combin_product_xml=os.path.join(g_nv_env.temp_dir, 'mss_nvi_db_%s.xml'%(g_nv_env.product_type))#合并分割后combin_coo.xml路径 3001bd4fe43Sopenharmony_ci g_nv_env.combin_product_security_xml=os.path.join(g_nv_env.temp_dir, 'combin_%s_security.xml'%(g_nv_env.product_type))#合并分割后combin_coo.xml路径 3011bd4fe43Sopenharmony_ci 3021bd4fe43Sopenharmony_ci g_nv_env.src_bin_dir=os.path.join(root_dir, 'app', g_nv_env.app_name, 'nv', 'src_bin', g_nv_env.product_type)#存放必源src bin文件路径 3031bd4fe43Sopenharmony_ci g_nv_env.nv_tool=os.path.join(root_dir, 'tools', 'nv', 'cdbm')#nv工具路径 3041bd4fe43Sopenharmony_ci print('nv_tool:', g_nv_env.nv_tool) 3051bd4fe43Sopenharmony_ci #g_nv_env.pwd_nv_tool=os.path.join(root_dir, 'tools', 'nv', 'pwd_nv_tool.exe')#pwd nv 制作工具路径 3061bd4fe43Sopenharmony_ci g_nv_env.nv_bin_max_size=65536#暂定最大支持64K flash 3071bd4fe43Sopenharmony_ci 3081bd4fe43Sopenharmony_ci g_nv_env.flash_size=flash_size 3091bd4fe43Sopenharmony_ci g_nv_env.ver_magic=ver_magic 3101bd4fe43Sopenharmony_ci return 0 3111bd4fe43Sopenharmony_ci 3121bd4fe43Sopenharmony_cidef hi_nv_fomat_nv_id(root): 3131bd4fe43Sopenharmony_ci ret = 0 3141bd4fe43Sopenharmony_ci for grp in root: 3151bd4fe43Sopenharmony_ci for nv in grp: 3161bd4fe43Sopenharmony_ci if 'ID' in nv.attrib.keys(): 3171bd4fe43Sopenharmony_ci str_id=nv.attrib['ID'] 3181bd4fe43Sopenharmony_ci int_id=hi_str_to_int(str_id, None) 3191bd4fe43Sopenharmony_ci str_id=hex(int_id) 3201bd4fe43Sopenharmony_ci nv.attrib['ID']=str_id 3211bd4fe43Sopenharmony_ci return 0 3221bd4fe43Sopenharmony_ci 3231bd4fe43Sopenharmony_ci""" 3241bd4fe43Sopenharmony_ci合并xml;nv id标准化;nv 按组号进行排序 3251bd4fe43Sopenharmony_ci""" 3261bd4fe43Sopenharmony_cidef HI_NV_XmlCombineXml(src_xml_list, combin_xml): 3271bd4fe43Sopenharmony_ci root_list=[] 3281bd4fe43Sopenharmony_ci group_dics={} 3291bd4fe43Sopenharmony_ci exist_item_id_list=[] 3301bd4fe43Sopenharmony_ci global g_nv_env 3311bd4fe43Sopenharmony_ci 3321bd4fe43Sopenharmony_ci for src_xml in src_xml_list: 3331bd4fe43Sopenharmony_ci tree = ET.parse(src_xml) 3341bd4fe43Sopenharmony_ci root = tree.getroot() 3351bd4fe43Sopenharmony_ci hi_nv_fomat_nv_id(root)#标准化NVID 3361bd4fe43Sopenharmony_ci root_list.append(root) 3371bd4fe43Sopenharmony_ci 3381bd4fe43Sopenharmony_ci new_root=ET.Element('HISTUDIO') 3391bd4fe43Sopenharmony_ci print('root_list', root_list) 3401bd4fe43Sopenharmony_ci 3411bd4fe43Sopenharmony_ci #判断是否有重复的ID 3421bd4fe43Sopenharmony_ci for root in root_list: 3431bd4fe43Sopenharmony_ci grp_list=root.findall('GROUP')#找到所有的grp 3441bd4fe43Sopenharmony_ci for grp in grp_list: 3451bd4fe43Sopenharmony_ci item_list=grp.findall('NV') 3461bd4fe43Sopenharmony_ci for item in item_list: 3471bd4fe43Sopenharmony_ci str_id=item.attrib['ID'] 3481bd4fe43Sopenharmony_ci int_id=hi_str_to_int(str_id, None) 3491bd4fe43Sopenharmony_ci if int_id in exist_item_id_list: 3501bd4fe43Sopenharmony_ci print(exist_item_id_list) 3511bd4fe43Sopenharmony_ci return -1 3521bd4fe43Sopenharmony_ci exist_item_id_list.append(int_id) 3531bd4fe43Sopenharmony_ci 3541bd4fe43Sopenharmony_ci #合并xml 3551bd4fe43Sopenharmony_ci for root in root_list: 3561bd4fe43Sopenharmony_ci grp_list=root.findall('GROUP')#找到所有的grp 3571bd4fe43Sopenharmony_ci for grp in grp_list: 3581bd4fe43Sopenharmony_ci grp_name=grp.attrib['NAME'] 3591bd4fe43Sopenharmony_ci if not grp_name in group_dics.keys(): 3601bd4fe43Sopenharmony_ci new_root.append(grp) 3611bd4fe43Sopenharmony_ci group_dics[grp_name]=grp 3621bd4fe43Sopenharmony_ci else: 3631bd4fe43Sopenharmony_ci old_grp=group_dics[grp_name] 3641bd4fe43Sopenharmony_ci sub_elements=grp.findall('NV') 3651bd4fe43Sopenharmony_ci old_grp.extend(sub_elements) 3661bd4fe43Sopenharmony_ci 3671bd4fe43Sopenharmony_ci #对新xml进行排序 3681bd4fe43Sopenharmony_ci element_grp_list=[] 3691bd4fe43Sopenharmony_ci for element_grp in new_root: 3701bd4fe43Sopenharmony_ci element_grp_list.append(element_grp) 3711bd4fe43Sopenharmony_ci 3721bd4fe43Sopenharmony_ci element_grp_list.sort(key=lambda x:int(x.attrib['ID'], 16)) 3731bd4fe43Sopenharmony_ci i=0 3741bd4fe43Sopenharmony_ci while i< len(element_grp_list): 3751bd4fe43Sopenharmony_ci new_root[i]=element_grp_list[i] 3761bd4fe43Sopenharmony_ci i=i+1 3771bd4fe43Sopenharmony_ci 3781bd4fe43Sopenharmony_ci #回写xml 3791bd4fe43Sopenharmony_ci new_tree=ET.ElementTree(new_root) 3801bd4fe43Sopenharmony_ci new_tree.write(combin_xml, encoding="utf-8") 3811bd4fe43Sopenharmony_ci 3821bd4fe43Sopenharmony_cidef hi_nv_mk_temp_dir(temp_dir, hnv_dir): 3831bd4fe43Sopenharmony_ci global g_nv_env 3841bd4fe43Sopenharmony_ci if os.path.exists(temp_dir): 3851bd4fe43Sopenharmony_ci shutil.rmtree(temp_dir) 3861bd4fe43Sopenharmony_ci os.makedirs(temp_dir) 3871bd4fe43Sopenharmony_ci else: 3881bd4fe43Sopenharmony_ci os.makedirs(temp_dir) 3891bd4fe43Sopenharmony_ci 3901bd4fe43Sopenharmony_ci if hnv_dir is None: 3911bd4fe43Sopenharmony_ci pass 3921bd4fe43Sopenharmony_ci elif not os.path.exists(hnv_dir): 3931bd4fe43Sopenharmony_ci os.makedirs(hnv_dir) 3941bd4fe43Sopenharmony_ci else: 3951bd4fe43Sopenharmony_ci pass 3961bd4fe43Sopenharmony_ci 3971bd4fe43Sopenharmony_ci""" 3981bd4fe43Sopenharmony_ci合并mss和app xml 3991bd4fe43Sopenharmony_ci""" 4001bd4fe43Sopenharmony_cidef hi_nv_combine_mss_and_app_xml(): 4011bd4fe43Sopenharmony_ci global g_nv_env 4021bd4fe43Sopenharmony_ci src_xml_list=[] 4031bd4fe43Sopenharmony_ci src_xml_list.append(g_nv_env.mdm_xml) 4041bd4fe43Sopenharmony_ci print('mdmxml:'+g_nv_env.mdm_xml) 4051bd4fe43Sopenharmony_ci if os.path.exists(g_nv_env.app_xml): 4061bd4fe43Sopenharmony_ci src_xml_list.append(g_nv_env.app_xml) 4071bd4fe43Sopenharmony_ci print('appxml:'+g_nv_env.app_xml) 4081bd4fe43Sopenharmony_ci print('src_xml_list:', src_xml_list) 4091bd4fe43Sopenharmony_ci print('combin_xml:%s'%g_nv_env.combin_xml) 4101bd4fe43Sopenharmony_ci HI_NV_XmlCombineXml(src_xml_list, g_nv_env.combin_xml) 4111bd4fe43Sopenharmony_ci 4121bd4fe43Sopenharmony_cidef HI_NV_XmlSplitByProductType(src_xml, product_list, dst_xml_list): 4131bd4fe43Sopenharmony_ci new_root_list=[] 4141bd4fe43Sopenharmony_ci tree = ET.parse(src_xml) 4151bd4fe43Sopenharmony_ci root = tree.getroot() 4161bd4fe43Sopenharmony_ci i=0 4171bd4fe43Sopenharmony_ci #print('src_xml', src_xml) 4181bd4fe43Sopenharmony_ci #print('product_list', product_list) 4191bd4fe43Sopenharmony_ci #print('dst_xml_list', dst_xml_list) 4201bd4fe43Sopenharmony_ci while i<len(product_list): 4211bd4fe43Sopenharmony_ci new_root=copy.deepcopy(root) 4221bd4fe43Sopenharmony_ci for grp in new_root: 4231bd4fe43Sopenharmony_ci del_nv_list=[] 4241bd4fe43Sopenharmony_ci for nv in grp: 4251bd4fe43Sopenharmony_ci list=nv.attrib['DEV'].lower().split('-') 4261bd4fe43Sopenharmony_ci #print('list', list) 4271bd4fe43Sopenharmony_ci if product_list[i] not in list: 4281bd4fe43Sopenharmony_ci del_nv_list.append(nv) 4291bd4fe43Sopenharmony_ci else: 4301bd4fe43Sopenharmony_ci pass 4311bd4fe43Sopenharmony_ci #del nv.attrib['DEV']#删除dev属性 4321bd4fe43Sopenharmony_ci for nv in del_nv_list: 4331bd4fe43Sopenharmony_ci grp.remove(nv) 4341bd4fe43Sopenharmony_ci new_tree=ET.ElementTree(new_root) 4351bd4fe43Sopenharmony_ci new_tree.write(dst_xml_list[i], encoding="utf-8") 4361bd4fe43Sopenharmony_ci i=i+1 4371bd4fe43Sopenharmony_ci 4381bd4fe43Sopenharmony_cidef hi_nv_split_by_product_type(): 4391bd4fe43Sopenharmony_ci global g_nv_env 4401bd4fe43Sopenharmony_ci product_list=[] 4411bd4fe43Sopenharmony_ci product_list.append(g_nv_env.product_type) 4421bd4fe43Sopenharmony_ci dst_xml_list=[] 4431bd4fe43Sopenharmony_ci dst_xml_list.append(g_nv_env.combin_product_xml) 4441bd4fe43Sopenharmony_ci HI_NV_XmlSplitByProductType(g_nv_env.combin_xml, product_list, dst_xml_list) 4451bd4fe43Sopenharmony_ci 4461bd4fe43Sopenharmony_cidef nv_replace_val(root, str_id, str_val, bForce): 4471bd4fe43Sopenharmony_ci #print(str_id, str_val) 4481bd4fe43Sopenharmony_ci 4491bd4fe43Sopenharmony_ci for grp in root: 4501bd4fe43Sopenharmony_ci for nv in grp: 4511bd4fe43Sopenharmony_ci if nv.attrib['ID'] == str_id: 4521bd4fe43Sopenharmony_ci if 0:#nv.attrib['SECURITY'] == 'PRIVATE': 4531bd4fe43Sopenharmony_ci return -1#私有NV不允许客制化 4541bd4fe43Sopenharmony_ci else: 4551bd4fe43Sopenharmony_ci nv.attrib['PARAM_VALUE']=str_val 4561bd4fe43Sopenharmony_ci 4571bd4fe43Sopenharmony_ci return 0 4581bd4fe43Sopenharmony_ci 4591bd4fe43Sopenharmony_cidef HI_NV_XmlModifyByCfg(cfg_file, src_xml, dst_xml): 4601bd4fe43Sopenharmony_ci tree = ET.parse(src_xml) 4611bd4fe43Sopenharmony_ci root = tree.getroot() 4621bd4fe43Sopenharmony_ci str_id='' 4631bd4fe43Sopenharmony_ci str_val='' 4641bd4fe43Sopenharmony_ci 4651bd4fe43Sopenharmony_ci with open(cfg_file) as cfg_fp: 4661bd4fe43Sopenharmony_ci for line in cfg_fp.readlines(): 4671bd4fe43Sopenharmony_ci L=line.split('=') 4681bd4fe43Sopenharmony_ci if len(L) == 2: 4691bd4fe43Sopenharmony_ci key=L[0].strip() 4701bd4fe43Sopenharmony_ci val=L[1].strip() 4711bd4fe43Sopenharmony_ci if key == 'ID': 4721bd4fe43Sopenharmony_ci int_id=hi_str_to_int(val, None) 4731bd4fe43Sopenharmony_ci str_id=hex(int_id) 4741bd4fe43Sopenharmony_ci elif key == 'PARAM_VALUE': 4751bd4fe43Sopenharmony_ci str_val = val 4761bd4fe43Sopenharmony_ci nv_replace_val(root, str_id, str_val, False) 4771bd4fe43Sopenharmony_ci else: 4781bd4fe43Sopenharmony_ci pass 4791bd4fe43Sopenharmony_ci 4801bd4fe43Sopenharmony_ci new_tree = ET.ElementTree(root) 4811bd4fe43Sopenharmony_ci new_tree.write(dst_xml, encoding = "utf-8") 4821bd4fe43Sopenharmony_ci 4831bd4fe43Sopenharmony_cidef HI_NV_Xml2Bin(nv_tool, src_xml, dst_bin_dir, include_dir): 4841bd4fe43Sopenharmony_ci cmd_line = (nv_tool, src_xml, include_dir, dst_bin_dir) 4851bd4fe43Sopenharmony_ci print("\ncmd_line=", cmd_line) 4861bd4fe43Sopenharmony_ci 4871bd4fe43Sopenharmony_ci ret = subprocess.run(cmd_line).returncode 4881bd4fe43Sopenharmony_ci if ret!=0: 4891bd4fe43Sopenharmony_ci print('error', cmd_line) 4901bd4fe43Sopenharmony_ci print("============== NV Build Failed =============") 4911bd4fe43Sopenharmony_ci sys.exit(ret) 4921bd4fe43Sopenharmony_ci 4931bd4fe43Sopenharmony_cidef HI_NV_HNV_Build(src_xml, dst_hnv, bin_dir): 4941bd4fe43Sopenharmony_ci global g_nv_env 4951bd4fe43Sopenharmony_ci #print("src_xml=", src_xml) 4961bd4fe43Sopenharmony_ci print("dst_hnv=", dst_hnv) 4971bd4fe43Sopenharmony_ci #print("bin_dir=", bin_dir) 4981bd4fe43Sopenharmony_ci #input("继续") 4991bd4fe43Sopenharmony_ci 5001bd4fe43Sopenharmony_ci src_bin_dic = {} 5011bd4fe43Sopenharmony_ci tree = ET.parse(src_xml) 5021bd4fe43Sopenharmony_ci root = tree.getroot() 5031bd4fe43Sopenharmony_ci 5041bd4fe43Sopenharmony_ci bin_file_list = os.listdir(bin_dir) 5051bd4fe43Sopenharmony_ci 5061bd4fe43Sopenharmony_ci #生成bin dictionary 5071bd4fe43Sopenharmony_ci for bin_file in bin_file_list: 5081bd4fe43Sopenharmony_ci if bin_file.endswith(".bin"): 5091bd4fe43Sopenharmony_ci bin_id = bin_file[:-len('.bin')] 5101bd4fe43Sopenharmony_ci bin_file_full_name = os.path.join(bin_dir, bin_file) 5111bd4fe43Sopenharmony_ci with open(bin_file_full_name, 'rb') as fp: 5121bd4fe43Sopenharmony_ci bin = fp.read() 5131bd4fe43Sopenharmony_ci src_bin_dic[bin_id] = bin 5141bd4fe43Sopenharmony_ci #print(src_bin_dic) 5151bd4fe43Sopenharmony_ci #input("继续") 5161bd4fe43Sopenharmony_ci 5171bd4fe43Sopenharmony_ci #生成工厂区NV文件_factory.hnv 5181bd4fe43Sopenharmony_ci (ret, bytearray_hnv) = hi_nv_process_mk_hnv(root, src_bin_dic, os.path.basename(dst_hnv), True) 5191bd4fe43Sopenharmony_ci factory_hnv = dst_hnv.replace('.hnv', '_factory.hnv') 5201bd4fe43Sopenharmony_ci if len(bytearray_hnv) >= g_nv_env.nv_bin_max_size:#检测NV文件大小,边界也有问题 5211bd4fe43Sopenharmony_ci print(factory_hnv, "error nv size large than nv_bin_max_size(%u)"%(g_nv_env.nv_bin_max_size)) 5221bd4fe43Sopenharmony_ci exit(-1) 5231bd4fe43Sopenharmony_ci if ret == HI_ERR_SUCCESS: 5241bd4fe43Sopenharmony_ci with open(factory_hnv, 'wb+') as hnvfp: 5251bd4fe43Sopenharmony_ci hnvfp.write(bytearray_hnv) 5261bd4fe43Sopenharmony_ci g_target_hnv.append(factory_hnv) 5271bd4fe43Sopenharmony_ci 5281bd4fe43Sopenharmony_ci #生成非工厂区NV文件_normal.hnv 5291bd4fe43Sopenharmony_ci (ret, bytearray_hnv) = hi_nv_process_mk_hnv(root, src_bin_dic, os.path.basename(dst_hnv), False) 5301bd4fe43Sopenharmony_ci normal_hnv = dst_hnv.replace('.hnv', '_normal.hnv') 5311bd4fe43Sopenharmony_ci if len(bytearray_hnv) >= g_nv_env.nv_bin_max_size:#检测NV文件大小,边界也有问题 5321bd4fe43Sopenharmony_ci print(normal_hnv, "error nv size large than nv_bin_max_size(%u)"%(g_nv_env.nv_bin_max_size)) 5331bd4fe43Sopenharmony_ci exit(-1) 5341bd4fe43Sopenharmony_ci if ret == HI_ERR_SUCCESS: 5351bd4fe43Sopenharmony_ci with open(normal_hnv, 'wb+') as hnvfp: 5361bd4fe43Sopenharmony_ci hnvfp.write(bytearray_hnv) 5371bd4fe43Sopenharmony_ci g_target_hnv.append(normal_hnv) 5381bd4fe43Sopenharmony_ci 5391bd4fe43Sopenharmony_ci#def generate_pwd_nv(nv_bin_dir): 5401bd4fe43Sopenharmony_ci #cmd_line = (os.path.join(nv_bin_dir, ''.join([hex(SEC_NV_ID),'.bin']))) 5411bd4fe43Sopenharmony_ci #print('conn pwd: ', g_diag_auth_pwd) 5421bd4fe43Sopenharmony_ci #ret = os.system(cmd_line) 5431bd4fe43Sopenharmony_ci #ret = subprocess.run(cmd_line).returncode 5441bd4fe43Sopenharmony_ci #if ret!=0: 5451bd4fe43Sopenharmony_ci # print('error:', cmd_line) 5461bd4fe43Sopenharmony_ci # sys.exit(ret) 5471bd4fe43Sopenharmony_ci 5481bd4fe43Sopenharmony_cidef check_hnv_result(file_name): 5491bd4fe43Sopenharmony_ci if os.path.exists(file_name.replace('.hnv', '_factory.hnv')): 5501bd4fe43Sopenharmony_ci if os.path.exists(file_name.replace('.hnv', '_normal.hnv')): 5511bd4fe43Sopenharmony_ci return 0 5521bd4fe43Sopenharmony_ci return -1 5531bd4fe43Sopenharmony_ci 5541bd4fe43Sopenharmony_cidef hi_nv_modify_by_cfg(): 5551bd4fe43Sopenharmony_ci print('hi_nv_modify_by_cfg') 5561bd4fe43Sopenharmony_ci global g_nv_env 5571bd4fe43Sopenharmony_ci if os.path.exists(g_nv_env.app_cfg_dir): 5581bd4fe43Sopenharmony_ci cfg_file_list = os.listdir(g_nv_env.app_cfg_dir) 5591bd4fe43Sopenharmony_ci else: 5601bd4fe43Sopenharmony_ci return 0 5611bd4fe43Sopenharmony_ci for cfg_file in cfg_file_list: 5621bd4fe43Sopenharmony_ci if cfg_file.endswith(".cfg"): 5631bd4fe43Sopenharmony_ci cfg_file = cfg_file[:-len('.cfg')] 5641bd4fe43Sopenharmony_ci print('cfg_file:', cfg_file) 5651bd4fe43Sopenharmony_ci cfg_file_full_name = os.path.join(g_nv_env.app_cfg_dir, '%s.cfg'%cfg_file) 5661bd4fe43Sopenharmony_ci cfg_xml_full_name = os.path.join(g_nv_env.temp_dir, '%s.xml'%cfg_file) 5671bd4fe43Sopenharmony_ci cfg_hnv_full_name = os.path.join(g_nv_env.hnv_dir, '%s.hnv'%g_nv_env.app_name) 5681bd4fe43Sopenharmony_ci cfg_bin_dir = os.path.join(g_nv_env.temp_dir, cfg_file) 5691bd4fe43Sopenharmony_ci if os.path.exists(cfg_bin_dir): 5701bd4fe43Sopenharmony_ci shutil.rmtree(cfg_bin_dir) 5711bd4fe43Sopenharmony_ci os.makedirs(cfg_bin_dir) 5721bd4fe43Sopenharmony_ci else: 5731bd4fe43Sopenharmony_ci os.makedirs(cfg_bin_dir) 5741bd4fe43Sopenharmony_ci 5751bd4fe43Sopenharmony_ci HI_NV_XmlModifyByCfg(cfg_file_full_name, g_nv_env.combin_product_xml, cfg_xml_full_name) 5761bd4fe43Sopenharmony_ci 5771bd4fe43Sopenharmony_ci HI_NV_Xml2Bin(g_nv_env.nv_tool, cfg_xml_full_name, cfg_bin_dir, g_nv_env.nv_h_dir) 5781bd4fe43Sopenharmony_ci #替换0x90安全连接NV 5791bd4fe43Sopenharmony_ci #generate_pwd_nv(cfg_bin_dir) 5801bd4fe43Sopenharmony_ci #将xml和bin文件合成hnv文件 5811bd4fe43Sopenharmony_ci HI_NV_HNV_Build(cfg_xml_full_name, cfg_hnv_full_name, cfg_bin_dir) 5821bd4fe43Sopenharmony_ci ret = check_hnv_result(cfg_hnv_full_name) 5831bd4fe43Sopenharmony_ci if ret!=0: 5841bd4fe43Sopenharmony_ci print('Build hnv ERROR:%s'%cfg_hnv_full_name) 5851bd4fe43Sopenharmony_ci sys.exit(ret) 5861bd4fe43Sopenharmony_ci print('build hnv OK:%s'%cfg_hnv_full_name) 5871bd4fe43Sopenharmony_ci print('ENDING') 5881bd4fe43Sopenharmony_ci 5891bd4fe43Sopenharmony_cig_common_ver = 'bbit_' 5901bd4fe43Sopenharmony_cig_subver_name = 'common' 5911bd4fe43Sopenharmony_cidef hi_nv_mk_app_subtemp_dir(product_lib_out, app_name): 5921bd4fe43Sopenharmony_ci app_subver_temp_dir = os.path.join(product_lib_out, app_name, '%s%s'%(g_common_ver, g_subver_name)) 5931bd4fe43Sopenharmony_ci print('app_subver_temp_dir:%s'%app_subver_temp_dir) 5941bd4fe43Sopenharmony_ci 5951bd4fe43Sopenharmony_ci if os.path.exists(product_lib_out): 5961bd4fe43Sopenharmony_ci if os.path.exists(app_subver_temp_dir): 5971bd4fe43Sopenharmony_ci shutil.rmtree(app_subver_temp_dir) 5981bd4fe43Sopenharmony_ci else: 5991bd4fe43Sopenharmony_ci os.makedirs(app_subver_temp_dir) 6001bd4fe43Sopenharmony_ci print('make app_subver_temp_dir') 6011bd4fe43Sopenharmony_ci 6021bd4fe43Sopenharmony_cidef hi_app_subver_list_filter(app_name, subver_list): 6031bd4fe43Sopenharmony_ci app_subver_list = [] 6041bd4fe43Sopenharmony_ci for sub_name in subver_list: 6051bd4fe43Sopenharmony_ci if sub_name == app_name: 6061bd4fe43Sopenharmony_ci app_subver_list.append('common') 6071bd4fe43Sopenharmony_ci else: 6081bd4fe43Sopenharmony_ci app_subver_list.append(sub_name) 6091bd4fe43Sopenharmony_ci return app_subver_list 6101bd4fe43Sopenharmony_ci 6111bd4fe43Sopenharmony_cig_root_dir = os.path.abspath(os.path.dirname(__file__)) 6121bd4fe43Sopenharmony_cig_out_dir = os.path.join(g_root_dir, 'out_nv_bin')#sys.argv[2] #nv编译结果根目录,v1r1/build_tmp/HiMDL_release(该名称可变) 6131bd4fe43Sopenharmony_cig_flash_size = 4096#int(sys.argv[3]) 6141bd4fe43Sopenharmony_ci#g_diag_auth_pwd = 'cih518@AMR'#(sys.argv[4]) 6151bd4fe43Sopenharmony_cig_ver_magic = 0#ver_magic在制作hupg的时候会重新写入,此处默认0即可,可用于单独升级NV场景下(正常无此场景),固定赋值。 6161bd4fe43Sopenharmony_ci#g_user_pannel_config = user_pannel_config() 6171bd4fe43Sopenharmony_ci#g_project_name = g_user_pannel_config.get_project_name() 6181bd4fe43Sopenharmony_cig_project_name = 'himdl' 6191bd4fe43Sopenharmony_cig_target_hnv = [] 6201bd4fe43Sopenharmony_ci 6211bd4fe43Sopenharmony_cidef HI_NV_MakeMain(root_dir, product_lib_out, xml_hfile_dir, product_name, app_name, app_subver_list, hnv_dir, 6221bd4fe43Sopenharmony_ci flash_size, ver_magic, hnv_file_name): 6231bd4fe43Sopenharmony_ci global g_common_ver 6241bd4fe43Sopenharmony_ci global g_subver_name 6251bd4fe43Sopenharmony_ci #common_ver_list = ['bbit_', 'outside_'] 6261bd4fe43Sopenharmony_ci common_ver_list = ['outside_'] 6271bd4fe43Sopenharmony_ci if app_subver_list == []: 6281bd4fe43Sopenharmony_ci print(app_name.upper(), 'selected 0 nv config!!!please select at least one!!!') 6291bd4fe43Sopenharmony_ci sys.exit(1) 6301bd4fe43Sopenharmony_ci for common_ver in common_ver_list: 6311bd4fe43Sopenharmony_ci g_common_ver = common_ver 6321bd4fe43Sopenharmony_ci for subver_name in app_subver_list: 6331bd4fe43Sopenharmony_ci print('current subver_name:%s'%subver_name) 6341bd4fe43Sopenharmony_ci g_subver_name = subver_name 6351bd4fe43Sopenharmony_ci ret = hi_nv_set_cfg(root_dir, product_lib_out, xml_hfile_dir, product_name, app_name, hnv_dir, flash_size, 6361bd4fe43Sopenharmony_ci ver_magic, hnv_file_name) 6371bd4fe43Sopenharmony_ci if ret != 0: 6381bd4fe43Sopenharmony_ci continue 6391bd4fe43Sopenharmony_ci hi_nv_mk_app_subtemp_dir(product_lib_out, app_name) 6401bd4fe43Sopenharmony_ci hi_nv_combine_mss_and_app_xml() 6411bd4fe43Sopenharmony_ci hi_nv_split_by_product_type() 6421bd4fe43Sopenharmony_ci hi_nv_modify_by_cfg() 6431bd4fe43Sopenharmony_ci 6441bd4fe43Sopenharmony_cidef make_nv_bin(target_path = '.', target_name = 'hi3861', hnv_file_name = ''): 6451bd4fe43Sopenharmony_ci product_name_list = ['sta'] 6461bd4fe43Sopenharmony_ci ''' analyse begin ''' 6471bd4fe43Sopenharmony_ci app_name_list = [target_name] 6481bd4fe43Sopenharmony_ci print('product_name_list:', product_name_list) 6491bd4fe43Sopenharmony_ci for product_name in product_name_list: 6501bd4fe43Sopenharmony_ci product_out_dir = os.path.join(g_out_dir, product_name) 6511bd4fe43Sopenharmony_ci product_lib_out = os.path.join(product_out_dir, 'nv') 6521bd4fe43Sopenharmony_ci xml_hfile_dir = os.path.join(g_root_dir, 'h_file', 'nv') 6531bd4fe43Sopenharmony_ci print('xml h file:', xml_hfile_dir) 6541bd4fe43Sopenharmony_ci hnv_dir = os.path.join(product_out_dir, 'nv', 'hnv') 6551bd4fe43Sopenharmony_ci hi_nv_mk_temp_dir(product_lib_out, hnv_dir) 6561bd4fe43Sopenharmony_ci print(product_out_dir) 6571bd4fe43Sopenharmony_ci for app_name in app_name_list: 6581bd4fe43Sopenharmony_ci nv_total_list = ['demo'] 6591bd4fe43Sopenharmony_ci app_subver_list = hi_app_subver_list_filter(app_name, nv_total_list) 6601bd4fe43Sopenharmony_ci print('app_subver_list:', app_subver_list) 6611bd4fe43Sopenharmony_ci HI_NV_MakeMain(g_root_dir, product_lib_out, xml_hfile_dir, product_name, app_name, app_subver_list, hnv_dir, 6621bd4fe43Sopenharmony_ci g_flash_size, g_ver_magic, hnv_file_name) 6631bd4fe43Sopenharmony_ci 6641bd4fe43Sopenharmony_ci if len(g_target_hnv) > 0: 6651bd4fe43Sopenharmony_ci for hnv in g_target_hnv: 6661bd4fe43Sopenharmony_ci shutil.copy(hnv, target_path) 6671bd4fe43Sopenharmony_ci 6681bd4fe43Sopenharmony_ciif __name__ == '__main__': 6691bd4fe43Sopenharmony_ci if len(sys.argv) == 4: 6701bd4fe43Sopenharmony_ci make_nv_bin(sys.argv[1], sys.argv[2], sys.argv[3]) 6711bd4fe43Sopenharmony_ci else: 6721bd4fe43Sopenharmony_ci filename = sys.argv[1] 6731bd4fe43Sopenharmony_ci target_name = sys.argv[2] 6741bd4fe43Sopenharmony_ci default_target_path = os.path.join(g_root_dir, '..', '..', 'build', 'build_tmp', 'nv') 6751bd4fe43Sopenharmony_ci if os.path.exists(default_target_path) is False: 6761bd4fe43Sopenharmony_ci os.makedirs(default_target_path) 6771bd4fe43Sopenharmony_ci make_nv_bin(default_target_path, target_name, filename) 6781bd4fe43Sopenharmony_ci 679