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