#!/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('\n') 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('\n') 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\n" %(board) listSave.append(line) elif line.find("CONFIG_MODEL_BOARD_NAME") != -1: line = "CONFIG_MODEL_BOARD_NAME=\"%s\"\n" %(board) listSave.append(line) elif line.find("CONFIG_PROJECT_NAME") != -1 : line = "CONFIG_PROJECT_NAME=\"%s___%s___ATV\"\n" %(board,ui) listSave.append(line) elif line.find("CONFIG_APP_FOLDER_NAME") != -1: line = "CONFIG_APP_FOLDER_NAME=\"%s\"\n" %(ui) listSave.append(line) elif re.search("CONFIG_.*___ATV__RADISSON__RADISSON__RADISSON",line): line = "CONFIG_%s_%s___ATV__RADISSON__RADISSON__RADISSON=y\n" %(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('\n') 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\n" %(board) listSave.append(line) elif line.find("CONFIG_MODEL_BOARD_NAME") != -1: line = "CONFIG_MODEL_BOARD_NAME=\"%s\"\n" %(board) listSave.append(line) elif line.find("CONFIG_PROJECT_NAME") != -1 : line = "CONFIG_PROJECT_NAME=\"%s___%s___ATV\"\n" %(board,ui) listSave.append(line) elif line.find("CONFIG_APP_FOLDER_NAME") != -1: line = "CONFIG_APP_FOLDER_NAME=\"%s\"\n" %(ui) listSave.append(line) elif re.search("CONFIG_.*___ATV__RADISSON__RADISSON__RADISSON",line): line = "CONFIG_%s_%s___ATV__RADISSON__RADISSON__RADISSON=y\n" %(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 "\nThis mode don't compile all modeCode!" print "python gen_codebin.py -i complie all modeCode\n" #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()