Python VIL Service Bin

#!/usr/bin/python
#coding:UTF-8

import sys
import re
import getopt
import md5
import os
import subprocess
import shutil
import xlrd
import xlwt
from xlutils.copy import copy


#from subprocess import call

g_bAllBin = 0
g_bAllBinbyId = 0
g_bDecrypt = 0
g_binDir = "./decryptDir"
g_strBinPath="./"
g_BinSplitext=[".BIN", ".bin"]
g_listBoard = ["VR01A", "VR01AX", "VR01B"]
g_listUI = ["videocon", "sansui", "philips"]
g_listMode = []

mapModeCode = {}
g_headerLen = 16*1024
g_listBin=[]


'''
解密当前目录BIN文件到 decryptDir文件夹
    运行命令:
    python gen_codebin.py -d


VIL 服务软件:
    运行命令:
    
    编译全部modeCode
    python gen_codebin.py -a
    
    编译EXCEL文档包含的MODELCODE
    python gen_codebin.py -i [./]
    
    将当前目录所有的BIN打包为“VIL_SER.BIN”
    python gen_codebin.py [-p]   
    
    打包格式为:HEAD长度+BIN总数+BIN_1名字+BIN_1长度+....BIN_N名字+BIN_N长度+版本号+BIN内容
    步骤:
    先读取“Design Data.xls”得到需要的打包ModeID,然后根据ModeID逐个进行编译。再将编译完成的BIN打包 
'''

def fun_get_head_info():
    try:
        raise Exception
    except:
        f = sys.exc_info()[2].tb_frame.f_back
    print("[debug]function :%s, line :%s"%(f.f_code.co_name, str(f.f_lineno)))

def usage():
    print'''param error.'''

def fun_parse_InputParam():
    global g_bAllBin
    global g_bDecrypt
    global g_strBinPath
    global g_bAllBinbyId
    try:
        opts, args = getopt.getopt(sys.argv[1:], 'hi:dpa')
    except getopt.GetoptError, err:
        print str(err)
        usage()
        sys.exit()

    for op, value in opts:
        if op == "-i":
            g_bAllBin = 1
            g_strBinPath = value
        elif op == "-p":
            g_bAllBin = 0
        elif op == "-a":
            g_bAllBinbyId = 1
        elif op == "-d":
            g_bDecrypt = 1
        elif op == "-h":
            usage()
            sys.exit()
        else:
            print("unhandled option")
            sys.exit()

#==生成BIN LIST==#
def fun_getBinList(Path):
    for item in os.listdir(Path):
        abs_item=os.path.join(Path, item)
        if os.path.isdir(abs_item):
            fun_getBinList(abs_item)
        elif os.path.isfile(abs_item):
            if  os.path.splitext(abs_item)[1] in g_BinSplitext:
                g_listBin.append(abs_item)
                #print abs_item
            else:
                pass
        else:
            pass
    return

def fun_decryptBinFile(listBin):
    os.mkdir(g_binDir)
    os.system('gcc -m32 -o decrypt decrypt.c')
    for line in listBin:
        outfile = ""
        strCmd = "./decrypt %s" %line
        os.system(strCmd)
        outfile = "./decrypt_%s" %(line[2:])
        shutil.move(outfile,g_binDir)


def fun_genCombinationbin(binCombinFile, str_BinTable, str_BinData):
    print str_BinTable
    with open(str_BinTable) as binTable_op:
        #print binTable_op
        for line in binTable_op:
            binCombinFile.write(line)
    binCombinFile.seek(g_headerLen)
            
    with open(str_BinData) as bindata1_op:
        for line in bindata1_op:
            binCombinFile.write(line)
                
            
    return

def fun_GetBinTableandBin(list_binpath, binTable_op, binData_op):
    strTable=""
    for binpath in list_binpath:
        with open(binpath,"r+") as binFile:
            binFile.truncate(4*1024*1024)#(0x3e083c) FLASH编译大小
            for line in binFile:
                binData_op.write(line)
               
        binname = os.path.basename(binpath)
        binsize = os.path.getsize(binpath)
        #删除每个文件的扩展名.bin
        binname = binname[:-4]
        strTable=binname+","+str(binsize)+","
        print strTable
        binTable_op.write(strTable)
        #os.remove(binpath)
    #写默认版本号为1
    binTable_op.write("1,")
                                
def fun_getBinCountToProject():
    with open("../aps/application/radisson/videocon/sys_common_guiobj/app_guiobj_setup.c", "r") as project_op:
        temStr = '#define CONFIG_FLASH_BIN_COUNT ' + str(len(g_listBin))
        print temStr
        content = project_op.read()

        pos = content.find('#define CONFIG_FLASH_BIN_COUNT')
        if pos != -1:
            pos_end = content[pos:].find('
')
            print '======================================='      
            print 'pos = %d, pos_end = %d' %(pos, pos_end)
            content = content[:pos] + temStr + content[pos + pos_end:]
            with open("../aps/application/radisson/videocon/sys_common_guiobj/app_guiobj_setup.c", "w") as project_op:
                project_op.write(content)
                
                
                
def fun_getMapModeCode():
    #读EXCEL到映射表
    book = xlrd.open_workbook(r'Design Data.xls')
    sheet = book.sheet_by_index(0)
    
    for row in range(sheet.nrows):
        bFindModeId = False
        for col in range(sheet.ncols):
            cellStr = str(sheet.cell(row,col).value)
            cellStr.rstrip()
            if cellStr == "MODEL ID":
                bFindModeId = True
                break
        if bFindModeId:
            break
    
    
    for id in range(row+1,sheet.nrows):
        listValue = []
        strMode = sheet.cell(id,col).value
        if len(strMode) <= 8:
            continue
        listValue.append(strMode)
        if sheet.cell(id,col-3).value != "":
            strBoard = sheet.cell(id,col-3).value
        listValue.append(strBoard)
        listValue.append("videocon" if sheet.cell(id,col-4).value == "V" else "sansui")
        mapModeCode[id-row] = listValue
        
def fun_modifyCommonPatchFile(strMode):
    modeId = ""
    for board in g_listBoard:
        for line in open("../aps/customer/radisson/%s/adaptable/model_data.c" %board,"r"):
            if strMode in line and re.search(".*?(d+).*{.*",line):
                modeId = re.search(".*?(d+).*{.*",line).group(1)
                with open("../aps/include/common_patch.h","r") as file:
                    tempStr = "#define DEFAULT_MODE_ID                        " + modeId
                    content = file.read()
                    pos = content.find("#define DEFAULT_MODE_ID")
                    if pos != -1:
                        pos_end = content[pos:].find('
')
                        content = content[:pos] + tempStr + content[pos + pos_end:]
                        with open("../aps/include/common_patch.h", "w") as project_op:
                            project_op.write(content)
                return True
    return False

def fun_genAllSerBin():
    listSave = []
    fun_getMapModeCode()
    with open("../mconfig.config", "r") as mFile:
        list = mFile.readlines()
    for (k,v) in mapModeCode.items():
        strMode = v[0]
        board = v[1]
        ui = v[2]
        if fun_modifyCommonPatchFile(strMode) == False:
            continue
        os.system('cd ..; make clean')
        for line in list:
            if "#" in line:
                continue
            elif line.find("CONFIG_BOARD_") != -1 :
                line = "CONFIG_BOARD_%s__RADISSON__RADISSON__RADISSON=y
" %(board)
                listSave.append(line)
            elif line.find("CONFIG_MODEL_BOARD_NAME") != -1:
                line = "CONFIG_MODEL_BOARD_NAME="%s"
" %(board)
                listSave.append(line)
            elif line.find("CONFIG_PROJECT_NAME") != -1 :
                line = "CONFIG_PROJECT_NAME="%s___%s___ATV"
" %(board,ui)
                listSave.append(line)
            elif line.find("CONFIG_APP_FOLDER_NAME") != -1:
                line = "CONFIG_APP_FOLDER_NAME="%s"
" %(ui)
                listSave.append(line)
            elif re.search("CONFIG_.*___ATV__RADISSON__RADISSON__RADISSON",line):
                line = "CONFIG_%s_%s___ATV__RADISSON__RADISSON__RADISSON=y
" %(board,ui.upper())
                listSave.append(line)
            else:
                listSave.append(line)
        with open("../mconfig.config", "w") as mFile:
            mFile.writelines(listSave)
        listSave = []
        
        shutil.copy("../aps/customer/radisson/sub_customer/radisson/radisson/project/%s___%s___ATV.config" %(board,ui), "../menuconfig.config")
        os.system('cd ..; make clean; make -j')
        
        if ui == "videocon" and os.path.exists("../mergedir/VIDEOCON.code.bin"):
            shutil.copy("../mergedir/VIDEOCON.code.bin","../kitking/%s.bin" %strMode)
        elif ui == "philips" and os.path.exists("../mergedir/PHILIPS.code.bin"):
            shutil.copy("../mergedir/PHILIPS.code.bin","../kitking/%s.bin" %strMode)
        elif ui == "sansui" and os.path.exists("../mergedir/SANSUI.code.bin"):
            shutil.copy("../mergedir/SANSUI.code.bin","../kitking/%s.bin" %strMode)
            
        #print k,strMode,board,ui
        #var = raw_input("debug pause:")
        
def fun_searchModeCode(board):
    global g_listMode
    global mapModeCode
    g_listMode = []
    mapModeCode = {}
    modeId = ""
    for line in open("../aps/customer/radisson/%s/adaptable/model_data.c" %board,"r"):
        if re.search(".*?(d+).*{.*"(.*)".*",line):
            modeId = re.search(".*?(d+).*{.*",line).group(1)
            strMode = re.search(".*?(d+).*{.*"(.*)".*",line).group(2)
            mapModeCode[modeId] = strMode
            g_listMode.append(strMode)   
    return modeId
            
            
def fun_genCommonPatchFilebyId(modeId):
    with open("../aps/include/common_patch.h","r") as file:
        tempStr = "#define DEFAULT_MODE_ID                        " + modeId
        content = file.read()
        pos = content.find("#define DEFAULT_MODE_ID")
        if pos != -1:
            pos_end = content[pos:].find('
')
            content = content[:pos] + tempStr + content[pos + pos_end:]
            with open("../aps/include/common_patch.h", "w") as project_op:
                project_op.write(content)

        
def fun_genAllSerBinbyId():
    listSave = []
    with open("../mconfig.config", "r") as mFile:
        list = mFile.readlines()
        
    for board in g_listBoard: 
        fun_searchModeCode(board)  
        for ui in g_listUI:
            os.system('cd ..; make clean')
            for line in list:
                if "#" in line:
                    continue
                elif line.find("CONFIG_BOARD_") != -1 :
                    line = "CONFIG_BOARD_%s__RADISSON__RADISSON__RADISSON=y
" %(board)
                    listSave.append(line)
                elif line.find("CONFIG_MODEL_BOARD_NAME") != -1:
                    line = "CONFIG_MODEL_BOARD_NAME="%s"
" %(board)
                    listSave.append(line)
                elif line.find("CONFIG_PROJECT_NAME") != -1 :
                    line = "CONFIG_PROJECT_NAME="%s___%s___ATV"
" %(board,ui)
                    listSave.append(line)
                elif line.find("CONFIG_APP_FOLDER_NAME") != -1:
                    line = "CONFIG_APP_FOLDER_NAME="%s"
" %(ui)
                    listSave.append(line)
                elif re.search("CONFIG_.*___ATV__RADISSON__RADISSON__RADISSON",line):
                    line = "CONFIG_%s_%s___ATV__RADISSON__RADISSON__RADISSON=y
" %(board,ui.upper())
                    listSave.append(line)
                else:
                    listSave.append(line)
            with open("../mconfig.config", "w") as mFile:
                mFile.writelines(listSave)
            listSave = []
                
            for (k,v) in mapModeCode.items():
                fun_genCommonPatchFilebyId(k)
                shutil.copy("../aps/customer/radisson/sub_customer/radisson/radisson/project/%s___%s___ATV.config" %(board,ui), "../menuconfig.config")
                os.system('make -j')
                
                if ui == "videocon" and os.path.exists("../mergedir/VIDEOCON.code.bin"):
                    shutil.copy("../mergedir/VIDEOCON.code.bin","../kitking/%s_%s_%s.bin" %(board,ui.upper(),v))
                elif ui == "philips" and os.path.exists("../mergedir/PHILIPS.code.bin"):
                    shutil.copy("../mergedir/PHILIPS.code.bin","../kitking/%s_%s_%s.bin" %(board,ui.upper(),v))
                elif ui == "sansui" and os.path.exists("../mergedir/SANSUI.code.bin"):
                    shutil.copy("../mergedir/SANSUI.code.bin","../kitking/%s_%s_%s.bin" %(board,ui.upper(),v))
                    
                print board,ui
                #var = raw_input("debug pause:")
            

def main():
        
    str_BinTable="bintable.txt"
    str_BinData="bindata.txt"
    str_CombinationBin="VIL_SER.BIN"

    str_temp=""
    int_tablesize=0
    
    #get bin path
    fun_parse_InputParam()

    if os.path.exists(str_CombinationBin):
        os.remove(str_CombinationBin)
        
    if os.path.exists(g_binDir):
        shutil.rmtree(g_binDir)
    
    #gen all service bin file
    if g_bAllBinbyId:
        fun_genAllSerBinbyId()
        return
    elif g_bAllBin:
        fun_genAllSerBin()
        return
    else:
        print "
This mode don't compile all modeCode!"
        print "python gen_codebin.py -i complie all modeCode
"

    #get bin name
    fun_getBinList(g_strBinPath)
    g_listBin.sort()
    
    #decrypt bin file
    if g_bDecrypt:
        fun_decryptBinFile(g_listBin)
        print "Decrypt finish"
        return

    binTable_op = open(str_BinTable, "w+")
    binData_op = open(str_BinData, "wb+")

    fun_GetBinTableandBin(g_listBin, binTable_op, binData_op)
    #binTable_op.truncate(1024)
    binTable_op.close()
    binData_op.close()

    #gen header bin
    binCombinFile = open(str_CombinationBin, "wb+")
    int_tablesize=os.path.getsize(str_BinTable)
    str_temp=str(int_tablesize)+","+str(len(g_listBin))+","
    int_tablesize+=len(str_temp)
    binCombinFile.write(str(g_headerLen) + ","+ str(len(g_listBin))+",")
    
    #gen combin bin
    fun_genCombinationbin(binCombinFile, str_BinTable, str_BinData)

    binCombinFile.close()
    #subprocess.call(["mv", str_CombinationBin, g_strBinPath])
    os.remove(str_BinTable)
    os.remove(str_BinData)
    
if __name__ == '__main__':
    main()
原文地址:https://www.cnblogs.com/jiangzhaowei/p/9278468.html