import io
import struct
import serial
import sys
import time
AP_FILE=[]
AP_CHECKSUM=0
com=None
PacketNumber=0
def error_return():
com.close()
sys.exit()
def UART_TRANSFER( thelist, PN):
thelist[4]=PN&0xff
thelist[5]=PN>>8&0xff
thelist[6]=PN>>16&0xff
thelist[7]=PN>>24&0xff
#print 'tx package'
#print '[{}]'.format(', '.join(hex(x) for x in thelist))
test=com.write(thelist)
#print test
return_str=com.read(64) #return by string
return_buffer=bytearray(return_str)
#print 'rx package'
#print '[{}]'.format(', '.join(hex(x) for x in return_buffer))
checksum=0
for i in range(64):
checksum=checksum+thelist[i]
#print "checksum=0x%x"%checksum
packege_checksum=0
packege_checksum=return_buffer[0]
packege_checksum=(return_buffer[1]<<8)|packege_checksum
if checksum!=packege_checksum:
print "checksum error"
error_return()
RPN=0
RPN=return_buffer[4]
RPN=(return_buffer[5]<<8)|RPN
RPN=(return_buffer[6]<<16)|RPN
RPN=(return_buffer[7]<<24)|RPN
if RPN!=(PN+1):
print "package number error"
error_return()
return return_buffer
def UART_TRANSFER_AUTO( thelist, PN):
thelist[4]=PN&0xff
thelist[5]=PN>>8&0xff
thelist[6]=PN>>16&0xff
thelist[7]=PN>>24&0xff
#print 'tx package'
#print '[{}]'.format(', '.join(hex(x) for x in thelist))
while (True):
com.flushInput()
com.timeout=0.5
com.flushOutput()
test=com.write(thelist)
#print test
time.sleep(0.1)
return_str=com.read(64) #return by string
return_buffer=bytearray(return_str)
#print 'rx package'
#print '[{}]'.format(', '.join(hex(x) for x in return_buffer))
if(len(return_buffer)!=0):
checksum=0
for i in range(64):
checksum=checksum+thelist[i]
#print "checksum=0x%x"%checksum
packege_checksum=0
packege_checksum=return_buffer[0]
packege_checksum=(return_buffer[1]<<8)|packege_checksum
if checksum!=packege_checksum:
print "checksum error"
#error_return()
RPN=0
RPN=return_buffer[4]
RPN=(return_buffer[5]<<8)|RPN
RPN=(return_buffer[6]<<16)|RPN
RPN=(return_buffer[7]<<24)|RPN
if RPN!=(PN+1):
print "package number error"
else:
break
#error_return()
#return return_buffer
def UART_AUTO_DETECT():
global PacketNumber
LINK = [0 for i in range(64)] # 64 byte data buffer is all zero
PacketNumber=0x01
LINK[0]=0xae
UART_TRANSFER_AUTO(LINK,PacketNumber)
def LINK_FUN():
global PacketNumber
LINK = [0 for i in range(64)] # 64 byte data buffer is all zero
PacketNumber=0x01
LINK[0]=0xae
UART_TRANSFER(LINK,PacketNumber)
def SN_FUN():
global PacketNumber
PacketNumber =PacketNumber+2
SN_PACKAGE = [0 for i in range(64)]
SN_PACKAGE[0]=0xa4
SN_PACKAGE[8]=PacketNumber&0xff
SN_PACKAGE[9]=PacketNumber>>8&0xff
SN_PACKAGE[10]=PacketNumber>>16&0xff
SN_PACKAGE[11]=PacketNumber>>24&0xff
UART_TRANSFER(SN_PACKAGE,PacketNumber)
def READ_fW_FUN():
global PacketNumber
PacketNumber=PacketNumber+2
READFW_VERSION = [0 for i in range(64)]
READFW_VERSION[0]=0xa6
buf=UART_TRANSFER(READFW_VERSION,PacketNumber)
FW_VERSION=buf[8]
print "FW_VERSION=0x%8x" % FW_VERSION
def RUN_TO_APROM_FUN():
global PacketNumber
PacketNumber=PacketNumber+2
RUN_TO_APROM = [0 for i in range(64)]
RUN_TO_APROM[0]=0xab
UART_TRANSFER(RUN_TO_APROM,PacketNumber)
def READ_PID_FUN():
global PacketNumber
PacketNumber=PacketNumber+2
READ_PID = [0 for i in range(64)]
READ_PID[0]=0xB1
buf=UART_TRANSFER(READ_PID,PacketNumber)
PID=buf[8]|buf[9]<<8|buf[10]<<16|buf[11]<<24
print "PID=0x%8x" % PID
def READ_CONFIG_FUN():
global PacketNumber
PacketNumber=PacketNumber+2
READ_CONFIG = [0 for i in range(64)]
READ_CONFIG[0]=0xa2
buf=UART_TRANSFER(READ_CONFIG,PacketNumber)
CONFIG0=buf[8]|buf[9]<<8|buf[10]<<16|buf[11]<<24
CONFIG1=buf[12]|buf[13]<<8|buf[14]<<16|buf[15]<<24
print "CONFIG0=0x%8x" % CONFIG0
print "CONFIG1=0x%8x" % CONFIG1
def READ_APROM_BIN_FILE(FILENAME):
#open file to array
try:
f=open(FILENAME, 'rb')
global AP_FILE
global AP_CHECKSUM
AP_CHECKSUM=0
while True:
x=f.read(1)
if x=='':
break
temp=struct.unpack('B',x)
AP_FILE.append(temp[0])
AP_CHECKSUM=AP_CHECKSUM+temp[0]
f.close()
except:
print ("APROM File load error")
error_return
#print '[{}]'.format(', '.join(hex(x) for x in AP_FILE))
#print len(AP_FILE)
def UPDATE_APROM():
global AP_FILE
global PacketNumber
PacketNumber=PacketNumber+2
AP_ADRESS=0;
AP_SIZE=len(AP_FILE)
PAP_COMMNAD = [0 for i in range(64)]
PAP_COMMNAD[0]=0xa0
#APROM START ADDRESS
PAP_COMMNAD[8]=AP_ADRESS&0xff
PAP_COMMNAD[9]=AP_ADRESS>>8&0xff
PAP_COMMNAD[10]=AP_ADRESS>>16&0xff
PAP_COMMNAD[11]=AP_ADRESS>>24&0xff
#APROM SIZE
PAP_COMMNAD[12]=AP_SIZE&0xff
PAP_COMMNAD[13]=AP_SIZE>>8&0xff
PAP_COMMNAD[14]=AP_SIZE>>16&0xff
PAP_COMMNAD[15]=AP_SIZE>>24&0xff
PAP_COMMNAD[16:64]=AP_FILE[0:48] #first package to copy
#print '[{}]'.format(', '.join(hex(x) for x in PAP_COMMNAD))
UART_TRANSFER(PAP_COMMNAD,PacketNumber)
for i in range(48,AP_SIZE,56):
PacketNumber=PacketNumber+2
PAP1_COMMNAD = [0 for j in range(64)]
PAP1_COMMNAD[8:64]=AP_FILE[i:(i+56)]
#print "test len: %d" % len(PAP1_COMMNAD)
if len(PAP1_COMMNAD) < 64:
for k in range(64-len(PAP1_COMMNAD)):
PAP1_COMMNAD.append(0xFF)
#print '[{}]'.format(', '.join(hex(x) for x in PAP1_COMMNAD))
if (((AP_SIZE-i)<56) or ((AP_SIZE-i)==56)):
#print "end"
buf=UART_TRANSFER(PAP1_COMMNAD,PacketNumber)
d_checksum=buf[8]|buf[9]<<8
if(d_checksum==(AP_CHECKSUM&0xffff)):
print("checksum pass")
else:
#print "loop"
UART_TRANSFER(PAP1_COMMNAD,PacketNumber)
#ISP CODE START FORM THERE
if len(sys.argv)!=3:
print "isp_command port number file name"
print "isp_command com0 c:\\test.bin"
com=serial.Serial(sys.argv[1],115200)
UART_AUTO_DETECT()
com.timeout=None
LINK_FUN()
SN_FUN()
READ_PID_FUN()
READ_fW_FUN()
READ_CONFIG_FUN()
READ_APROM_BIN_FILE(sys.argv[2])
UPDATE_APROM()
#RUN_TO_APROM_FUN();
com.close()
|