You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
398 lines
11 KiB
398 lines
11 KiB
import ctypes
|
|
import sys
|
|
import os
|
|
import array
|
|
|
|
global arrayelementsize
|
|
|
|
|
|
def Generate_CRC(inlist):
|
|
crc = int(~0)&0xffffffff
|
|
for i in range(len(inlist)-1):
|
|
crc = crc ^ (int(inlist[i]&0xffffffff))
|
|
for j in range(4*8):
|
|
crc = ((int(crc >> 1)&0xffffffff) ^ int(0xEDB88320 & ((-(crc & 1))&0xffffffff) ))&0xffffffff
|
|
|
|
crc=(~crc)&0xffffffff
|
|
|
|
|
|
if (crc>0x7fffffff):
|
|
crc=-(0x7fffffff-(crc&0x7fffffff)+1)
|
|
|
|
print("Calculated CRC= ", crc)
|
|
print("Actual CRC=", inlist[len(inlist)-1])
|
|
|
|
return(crc)
|
|
|
|
|
|
def convertto24bit(binarydata):
|
|
|
|
if (binarydata[14]==2):
|
|
print("16 bit detected")
|
|
binarydata[14]=4
|
|
elif (binarydata[14]==4):
|
|
print("24 bit detected")
|
|
return(1)
|
|
else:
|
|
print("unknown config")
|
|
return(0)
|
|
|
|
ilist = [16,18,20]
|
|
|
|
for i in ilist:
|
|
if (binarydata[i]==2):
|
|
binarydata[i]=4
|
|
elif (binarydata[14]==4):
|
|
print("unknown config 4")
|
|
return(0)
|
|
else:
|
|
print("unknown config")
|
|
return(0)
|
|
|
|
for i in range(21,len(binarydata)-1):
|
|
if (binarydata[i]==17):
|
|
if (binarydata[i+1]==0):
|
|
binarydata[i]=53
|
|
if (binarydata[i+1]==1):
|
|
binarydata[i]=53
|
|
if (binarydata[i+1]==2):
|
|
binarydata[i]=53
|
|
if (binarydata[i+1]==3):
|
|
binarydata[i]=53
|
|
if (binarydata[i]==16):
|
|
if (binarydata[i+1]==5):
|
|
binarydata[i]=52
|
|
if (binarydata[i+1]==4):
|
|
binarydata[i]=52
|
|
|
|
crc=Generate_CRC(binarydata)
|
|
binarydata[len(binarydata)-1]=crc
|
|
return(1)
|
|
|
|
|
|
def detectbitpersample(binarydata):
|
|
|
|
if (binarydata[14]==4):
|
|
print("24 bit detected")
|
|
elif (binarydata[14]==2):
|
|
print("16 bit detected")
|
|
else:
|
|
print("unknown config")
|
|
|
|
def convertto16bit(binarydata):
|
|
|
|
if (binarydata[14]==4):
|
|
print("24 bit detected")
|
|
binarydata[14]=2
|
|
elif (binarydata[14]==2):
|
|
print("16 bit detected")
|
|
return(1)
|
|
else:
|
|
print("unknown config")
|
|
return(0)
|
|
|
|
ilist = [16,18,20]
|
|
|
|
for i in ilist:
|
|
if (binarydata[i]==4):
|
|
binarydata[i]=2
|
|
elif (binarydata[14]==2):
|
|
print("unknown config 4")
|
|
return(0)
|
|
else:
|
|
print("unknown config")
|
|
return(0)
|
|
|
|
for i in range(21,len(binarydata)-1):
|
|
if (binarydata[i]==53):
|
|
if (binarydata[i+1]==0):
|
|
binarydata[i]=17
|
|
if (binarydata[i+1]==1):
|
|
binarydata[i]=17
|
|
if (binarydata[i+1]==2):
|
|
binarydata[i]=17
|
|
if (binarydata[i+1]==3):
|
|
binarydata[i]=17
|
|
if (binarydata[i]==52):
|
|
if (binarydata[i+1]==5):
|
|
binarydata[i]=16
|
|
if (binarydata[i+1]==4):
|
|
binarydata[i]=16
|
|
|
|
crc=Generate_CRC(binarydata)
|
|
binarydata[len(binarydata)-1]=crc
|
|
return(1)
|
|
|
|
|
|
def binary2header(fileinput,fileinput1,fileoutput,to24bit,fileoutput1,fileoutput2):
|
|
binarydata=array.array(arrayelementsize)
|
|
file=open(fileinput,'rb')
|
|
if file==-1:
|
|
print('error cannot open file for reading:',fileinput)
|
|
return
|
|
file.seek(0,2)
|
|
arraysize=int(file.tell()/4)
|
|
print('length of config string RX:', arraysize)
|
|
file.seek(0,0)
|
|
binarydata.fromfile(file,arraysize)
|
|
file.close()
|
|
|
|
binarydata1=array.array(arrayelementsize)
|
|
file1=open(fileinput1,'rb')
|
|
if file1==-1:
|
|
print('error cannot open file for reading:',fileinput)
|
|
return
|
|
file1.seek(0,2)
|
|
arraysize1=int(file1.tell()/4)
|
|
print('length of config string TX:', arraysize1)
|
|
file1.seek(0,0)
|
|
binarydata1.fromfile(file1,arraysize1)
|
|
file1.close()
|
|
|
|
|
|
|
|
if (to24bit==0):
|
|
detectbitpersample(binarydata)
|
|
|
|
elif (to24bit==1):
|
|
result=convertto16bit(binarydata)
|
|
if (result==0):
|
|
print("Problem converting to 16bit")
|
|
exit(0)
|
|
|
|
elif (to24bit==2):
|
|
result=convertto24bit(binarydata)
|
|
if (result==0):
|
|
print("Problem converting to 24bit")
|
|
exit(0)
|
|
|
|
|
|
fileo=open(fileoutput,'wt')
|
|
if (fileo==-1):
|
|
print('error cannot open file for writing:',fileoutput)
|
|
return
|
|
|
|
fileo.write('\n\n\n#define CSPL_CONFIG_RX ')
|
|
|
|
for i in range(len(binarydata)-1):
|
|
fileo.write(str(binarydata[i])+', ')
|
|
|
|
fileo.write(str(binarydata[len(binarydata)-1])+'\n\n\n\n')
|
|
|
|
fileo.write('\n\n\n#define CSPL_CONFIG_TX ')
|
|
|
|
for i in range(len(binarydata1)-1):
|
|
fileo.write(str(binarydata1[i])+', ')
|
|
|
|
fileo.write(str(binarydata1[len(binarydata1)-1])+'\n\n\n\n')
|
|
|
|
fileo.close()
|
|
print('wrote file:',fileoutput)
|
|
|
|
if (fileoutput1!=None):
|
|
fileo=open(fileoutput1,'wb')
|
|
if (fileo==-1):
|
|
print('error cannot open file for writing:',fileoutput1)
|
|
return
|
|
|
|
binarydata.tofile(fileo)
|
|
fileo.close()
|
|
print('wrote file:',fileoutput1)
|
|
|
|
if (fileoutput2!=None):
|
|
fileo=open(fileoutput2,'wb')
|
|
if (fileo==-1):
|
|
print('error cannot open file for writing:',fileoutput2)
|
|
return
|
|
|
|
binarydata1.tofile(fileo)
|
|
fileo.close()
|
|
print('wrote file:',fileoutput2)
|
|
|
|
|
|
|
|
def header2binary(fileinput,fileoutput,to24bit,fileoutput1,fileoutput2):
|
|
RX=array.array(arrayelementsize)
|
|
TX=array.array(arrayelementsize)
|
|
file=open(fileinput,'rt')
|
|
if file==-1:
|
|
print('error cannot open file for reading:',fileinput)
|
|
return
|
|
|
|
while True:
|
|
line=file.readline()
|
|
sline=line.split()
|
|
if (len(sline)>1):
|
|
if (sline[1]=='CSPL_CONFIG_RX'):
|
|
for r in range(2,len(sline)-1,1):
|
|
RX.append(int(sline[r][0:len(sline[r])-1]))
|
|
RX.append(int(sline[len(sline)-1]))
|
|
|
|
if (sline[1]=='CSPL_CONFIG_TX'):
|
|
for r in range(2,len(sline)-1,1):
|
|
TX.append(int(sline[r][0:len(sline[r])-1]))
|
|
TX.append(int(sline[len(sline)-1]))
|
|
|
|
if (line == ''):
|
|
break
|
|
|
|
file.close()
|
|
|
|
if (to24bit==0):
|
|
detectbitpersample(RX)
|
|
|
|
elif (to24bit==1):
|
|
result=convertto16bit(RX)
|
|
if (result==0):
|
|
print("Problem converting to 16bit")
|
|
exit(0)
|
|
|
|
elif (to24bit==2):
|
|
result=convertto24bit(RX)
|
|
if (result==0):
|
|
print("Problem converting to 24bit")
|
|
exit(0)
|
|
|
|
if (fileoutput!=None):
|
|
fileo=open(fileoutput,'wt')
|
|
if (fileo==-1):
|
|
print('error cannot open file for writing:',fileoutput)
|
|
return
|
|
if (len(RX)>0):
|
|
fileo.write('\n\n\n#define CSPL_CONFIG_RX ')
|
|
|
|
for i in range(len(RX)-1):
|
|
fileo.write(str(RX[i])+', ')
|
|
|
|
fileo.write(str(RX[len(RX)-1])+'\n\n\n\n')
|
|
|
|
if (len(TX)>0):
|
|
fileo.write('\n\n\n#define CSPL_CONFIG_TX ')
|
|
|
|
for i in range(len(TX)-1):
|
|
fileo.write(str(TX[i])+', ')
|
|
|
|
fileo.write(str(TX[len(TX)-1])+'\n\n\n\n')
|
|
|
|
fileo.close()
|
|
print('wrote file:',fileoutput)
|
|
|
|
if (len(RX)>0):
|
|
if (fileoutput1!=None):
|
|
fileo=open(fileoutput1,'wb')
|
|
if (fileo==-1):
|
|
print('error cannot open file for writing:',fileoutput1)
|
|
return
|
|
RX.tofile(fileo)
|
|
fileo.close()
|
|
print('wrote file:',fileoutput1)
|
|
|
|
if (len(TX)>0):
|
|
if (fileoutput2!=None):
|
|
fileo=open(fileoutput2,'wb')
|
|
if (fileo==-1):
|
|
print('error cannot open file for writing:',fileoutput2)
|
|
return
|
|
TX.tofile(fileo)
|
|
fileo.close()
|
|
print('wrote file:',fileoutput2)
|
|
|
|
pass
|
|
|
|
|
|
def usage():
|
|
print('Possible usages: ')
|
|
print('1. Convert from binary to text header file:')
|
|
print('\t\targs: bin <binary file RX> <binary file TX> <output text file>')
|
|
|
|
print('2. Convert from binary from 16bit to 24bit then output to text header file:')
|
|
print('\t\targs: bin16 <binary file RX> <binary file TX> <output text file>')
|
|
|
|
print('3. Convert from binary from 16bit to 24bit then output to text header file and binary file')
|
|
print('\t\targs: bin16 <binary file RX> <binary file TX> <output text file> <binary rx file> <binary tx file>')
|
|
|
|
print('4. Convert from binary from 24bit to 16bit then output to text header file:')
|
|
print('\t\targs: bin24 <binary file RX> <binary file TX> <output text file>')
|
|
|
|
print('5. Convert from binary from 24bit to 16bit then output to text header file and binary file')
|
|
print('\t\targs: bin24 <binary file RX> <binary file TX> <output text file> <binary rx file> <binary tx file>')
|
|
|
|
print('6. Convert from text to binary file')
|
|
print('\t\targs: txt <text file> <output binary file RX> <output binary file TX>')
|
|
|
|
print('7. Convert from text 16bit to 24bit to text file')
|
|
print('\t\targs: txt16 <text file> <text output file>')
|
|
|
|
print('8. Convert from text 16bit to 24bit to text file and binary files')
|
|
print('\t\targs: txt16 <text file> <text output file> <output binary file RX> <output binary file TX>')
|
|
|
|
print('9. Convert from text 24bit to 16bit to text file')
|
|
print('\t\targs: txt24 <text file> <text output file>')
|
|
|
|
print('10. Convert from text 24bit to 16bit to text file and binary files')
|
|
print('\t\targs: txt24 <text file> <text output file> <output binary file RX> <output binary file TX>')
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
def main(argv):
|
|
|
|
print('CSPL config string conversion used for android system')
|
|
|
|
if (len(argv)<4):
|
|
usage()
|
|
return
|
|
|
|
global arrayelementsize
|
|
|
|
print("python version: ",sys.version_info)
|
|
print("Current Os name: ",os.name)
|
|
|
|
validsize=0
|
|
for r in ['l','i']:
|
|
arrayelementsize=r
|
|
t=array.array(arrayelementsize)
|
|
if (t.itemsize==4):
|
|
validsize=1
|
|
break
|
|
|
|
if (validsize!=1):
|
|
print("Expected element size donot match firmware requirement")
|
|
|
|
|
|
if (argv[1]=='bin'):
|
|
binary2header(argv[2],argv[3],argv[4],0)
|
|
elif (argv[1]=='txt'):
|
|
header2binary(argv[2],None,0,argv[3],argv[4])
|
|
elif (argv[1]=='bin16'):
|
|
if (len(argv)==5):
|
|
binary2header(argv[2],argv[3],argv[4],1,None,None)
|
|
elif (len(argv)==7):
|
|
binary2header(argv[2],argv[3],argv[4],1,argv[5],argv[6])
|
|
elif (argv[1]=='bin24'):
|
|
if (len(argv)==5):
|
|
binary2header(argv[2],argv[3],argv[4],2,None,None)
|
|
elif (len(argv)==7):
|
|
binary2header(argv[2],argv[3],argv[4],2,argv[5],argv[6])
|
|
elif (argv[1]=='txt16'):
|
|
if (len(argv)==4):
|
|
header2binary(argv[2],argv[3],1,None,None)
|
|
elif (len(argv)==6):
|
|
header2binary(argv[2],argv[3],1,argv[4],argv[5])
|
|
elif (argv[1]=='txt24'):
|
|
if (len(argv)==4):
|
|
header2binary(argv[2],argv[3],2,None,None)
|
|
elif (len(argv)==6):
|
|
header2binary(argv[2],argv[3],2,argv[4],argv[5])
|
|
|
|
else :
|
|
usage()
|
|
return
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main(sys.argv)
|