#!/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()

Python VIL Service Bin的更多相关文章

  1. #!/usr/bin/env python与#!/usr/bin/python的区别

    [摘自:http://blog.csdn.net/wh_19910525/article/details/8040494] 一般的python文件的开头都有#!/usr/bin/python.这是什么 ...

  2. Python 头部 #!/usr/bin/python 和 #!/usr/bin/env 的区别

    这个网址 https://www.cnblogs.com/scofi/p/4867851.html 讲述了Python 头部 #!/usr/bin/python 和 #!/usr/bin/env 的区 ...

  3. !/usr/bin/env python和!/usr/bin/python的区别

    脚本语言第一行 作用:文件中代码用指定可执行程序运行 #!/usr/bin/Python  执行脚本时,调用/usr/bin下python解释器 #!/usr/bin/env python  在环境设 ...

  4. 解决安装虚拟环境出现的问题(OSError: Command /home/python/.virtua...ngo3_web/bin/python3 - setuptools pkg_resources pip wheel failed with error code 2)

    python3的报错解决: OSError: Command /home/python/.virtua...ngo3_web/bin/python3 - setuptools pkg_resource ...

  5. python中#!/usr/bin/env python与#!/usr/bin/python

    通常在脚本语言的第一行会看到#!/usr/bin/env python 与 #!/usr/bin/python其中之一,这两句话的目的都是指出你的python文件用什么可执行程序去运行它. #!/us ...

  6. python中#!/usr/bin/python与#!/usr/bin/env python的区别

    目的是在运行python脚本的时候告诉操作系统我们要用python解释器去运行py脚本 所以我们在第一句往往会写如下两句中的其中一句: #!/usr/bin/python 或 >#!/usr/b ...

  7. #!/usr/bin/python和#!/usr/bin/env 的区别

    #!/usr/bin/python 通常在一个.py文件开头都会有这个语句 它只在Linux系统下生效,意思是当作为可执行文件运行时调用的解释器的位置上面代码的意思是调用/usr/bin/下的Pyth ...

  8. #!/usr/bin/python和#!/usr/bin/env 的区别(转)

    #!/usr/bin/python和#!/usr/bin/env 的区别   #!/usr/bin/python 通常在一个.py文件开头都会有这个语句 它只在Linux系统下生效,意思是当作为可执行 ...

  9. python头部 #!/usr/bin/env python

    *.py运行: python *.py OR ./*.py 对于*.py其首行应标明 #!/usr/bin/env python,定义python解释器调用路径,对比#!/usr/bin/python ...

随机推荐

  1. linux实践--字符集

    一.ASCII码 首先懂得ASCII码表 二 八 十 十六 缩写/字符 0000 0000 0 0 00 NUL(null) 0000 0001 1 1 01 SOH(start of headlin ...

  2. tomcat的安装和启动

    下载apache-tomcat-8.5.5-src,我将其放在了/usr/local/tomcat目录下 要启动需要运行: /usr/local/tomcat/apache-tomcat-8.5.5- ...

  3. 经查-- git使用报错及解决办法

    git push 错误 error: failed to push some refs to 'git@github.com:charblus/ ...' 本地和远程的文件应该合并后才能上传本地的新文 ...

  4. 视觉SLAM漫谈 (三): 研究点介绍

    1. 前言 读者朋友们大家好!(很久很久)之前,我们为大家介绍了SLAM的基本概念和方法.相信大家对SLAM,应该有了基本的认识.在忙完一堆写论文.博士开题的事情之后,我准备回来继续填坑:为大家介绍S ...

  5. 解决 E: Could not get lock /var/lib/apt/lists/lock

    参考:Unable to lock the administration directory (/var/lib/dpkg/) is another process using it? 在更换软件源时 ...

  6. Redis哨兵(sentinel)

    介绍 Redis的sentinel主要是用来管理多个Redis服务器,sentinel负责(1)监控主服务器和从服务器的运行状态(2)主服务器运行故障时自动切换其中一台从服务器为主服务器 Sentin ...

  7. Android -- 怎么发出和接收广播, Broadcast, 电话拨号拦截,短信拦截

    1. 发送广播 使用以下三个API可以发送广播 public void click(View view){ Intent intent = new Intent(); intent.setAction ...

  8. Android之获取输入用户名与密码发送短信

    打算在过两三天的时间我就要准备出发去浙江了,所以把之前的资料来个总结. 这都是在课堂上做过的作业. 好了,废话少说,直接上代码. 步骤: 1.设置单击事件2.获取输入的QQ号码与密码3.判断输入获取的 ...

  9. 设计点滴&css效果点滴

    走向设计师的第一步, 做一个自由的设计师. 优秀的移动端设计的:http://www.cnblogs.com/coding4/p/6842849.html 一些好的设计图片的收藏,一些好的设计理念,一 ...

  10. Swagger使用总结(十九)

    1. Swagger是什么? Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件. 官方说法:Swagger是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTfu ...