[DemoCode下载] python 寫的pc 端isp code

[复制链接]
1142|3
 楼主| a_ziliu 发表于 2017-4-12 16:09 | 显示全部楼层 |阅读模式
因為想寫個跨平台的主機端isp,把pc端用vc寫的代碼,移植到python上面
python isp_command.zip (6.48 KB, 下载次数: 19)
heisexingqisi 发表于 2017-4-12 18:31 | 显示全部楼层
  1. import io
  2. import struct
  3. import serial
  4. import sys
  5. import time
  6. AP_FILE=[]
  7. AP_CHECKSUM=0
  8. com=None
  9. PacketNumber=0
  10. def error_return():
  11. com.close()
  12. sys.exit()


  13. def UART_TRANSFER( thelist, PN):
  14. thelist[4]=PN&0xff
  15. thelist[5]=PN>>8&0xff
  16. thelist[6]=PN>>16&0xff
  17. thelist[7]=PN>>24&0xff


  18. #print 'tx package'
  19. #print '[{}]'.format(', '.join(hex(x) for x in thelist))

  20. test=com.write(thelist)
  21. #print test
  22. return_str=com.read(64) #return by string
  23. return_buffer=bytearray(return_str)
  24. #print 'rx package'
  25. #print '[{}]'.format(', '.join(hex(x) for x in return_buffer))

  26. checksum=0
  27. for i in range(64):
  28.   checksum=checksum+thelist[i]
  29. #print "checksum=0x%x"%checksum
  30. packege_checksum=0
  31. packege_checksum=return_buffer[0]
  32. packege_checksum=(return_buffer[1]<<8)|packege_checksum
  33. if checksum!=packege_checksum:
  34.     print "checksum error"
  35.     error_return()
  36. RPN=0
  37. RPN=return_buffer[4]
  38. RPN=(return_buffer[5]<<8)|RPN
  39. RPN=(return_buffer[6]<<16)|RPN
  40. RPN=(return_buffer[7]<<24)|RPN
  41. if RPN!=(PN+1):
  42.     print "package number error"
  43.     error_return()
  44. return return_buffer


  45. def UART_TRANSFER_AUTO( thelist, PN):
  46. thelist[4]=PN&0xff
  47. thelist[5]=PN>>8&0xff
  48. thelist[6]=PN>>16&0xff
  49. thelist[7]=PN>>24&0xff


  50. #print 'tx package'
  51. #print '[{}]'.format(', '.join(hex(x) for x in thelist))
  52. while (True):
  53.   com.flushInput()
  54.   com.timeout=0.5
  55.   com.flushOutput()
  56.   test=com.write(thelist)
  57. #print test
  58.   time.sleep(0.1)
  59.   return_str=com.read(64) #return by string
  60.   return_buffer=bytearray(return_str)
  61. #print 'rx package'
  62. #print '[{}]'.format(', '.join(hex(x) for x in return_buffer))
  63.   if(len(return_buffer)!=0):
  64.    checksum=0
  65.    for i in range(64):
  66.     checksum=checksum+thelist[i]
  67. #print "checksum=0x%x"%checksum
  68.    packege_checksum=0
  69.    packege_checksum=return_buffer[0]
  70.    packege_checksum=(return_buffer[1]<<8)|packege_checksum
  71.    if checksum!=packege_checksum:
  72.     print "checksum error"
  73.     #error_return()
  74.    RPN=0
  75.    RPN=return_buffer[4]
  76.    RPN=(return_buffer[5]<<8)|RPN
  77.    RPN=(return_buffer[6]<<16)|RPN
  78.    RPN=(return_buffer[7]<<24)|RPN
  79.    if RPN!=(PN+1):
  80.     print "package number error"
  81.    else:
  82.     break
  83.     #error_return()
  84. #return return_buffer


  85. def UART_AUTO_DETECT():
  86. global PacketNumber
  87. LINK = [0 for i in range(64)] # 64 byte data buffer is all zero
  88. PacketNumber=0x01
  89. LINK[0]=0xae
  90. UART_TRANSFER_AUTO(LINK,PacketNumber)


  91. def LINK_FUN():
  92. global PacketNumber
  93. LINK = [0 for i in range(64)] # 64 byte data buffer is all zero
  94. PacketNumber=0x01
  95. LINK[0]=0xae
  96. UART_TRANSFER(LINK,PacketNumber)
  97.   

  98. def SN_FUN():
  99. global  PacketNumber
  100. PacketNumber =PacketNumber+2
  101. SN_PACKAGE = [0 for i in range(64)]
  102. SN_PACKAGE[0]=0xa4
  103. SN_PACKAGE[8]=PacketNumber&0xff
  104. SN_PACKAGE[9]=PacketNumber>>8&0xff
  105. SN_PACKAGE[10]=PacketNumber>>16&0xff
  106. SN_PACKAGE[11]=PacketNumber>>24&0xff
  107. UART_TRANSFER(SN_PACKAGE,PacketNumber)

  108. def READ_fW_FUN():
  109. global PacketNumber
  110. PacketNumber=PacketNumber+2
  111. READFW_VERSION = [0 for i in range(64)]
  112. READFW_VERSION[0]=0xa6
  113. buf=UART_TRANSFER(READFW_VERSION,PacketNumber)
  114. FW_VERSION=buf[8]
  115. print "FW_VERSION=0x%8x" % FW_VERSION

  116. def RUN_TO_APROM_FUN():
  117. global PacketNumber
  118. PacketNumber=PacketNumber+2
  119. RUN_TO_APROM = [0 for i in range(64)]
  120. RUN_TO_APROM[0]=0xab
  121. UART_TRANSFER(RUN_TO_APROM,PacketNumber)


  122. def READ_PID_FUN():
  123. global PacketNumber
  124. PacketNumber=PacketNumber+2
  125. READ_PID = [0 for i in range(64)]
  126. READ_PID[0]=0xB1
  127. buf=UART_TRANSFER(READ_PID,PacketNumber)
  128. PID=buf[8]|buf[9]<<8|buf[10]<<16|buf[11]<<24
  129. print "PID=0x%8x" % PID

  130. def READ_CONFIG_FUN():
  131. global PacketNumber
  132. PacketNumber=PacketNumber+2
  133. READ_CONFIG = [0 for i in range(64)]
  134. READ_CONFIG[0]=0xa2
  135. buf=UART_TRANSFER(READ_CONFIG,PacketNumber)
  136. CONFIG0=buf[8]|buf[9]<<8|buf[10]<<16|buf[11]<<24
  137. CONFIG1=buf[12]|buf[13]<<8|buf[14]<<16|buf[15]<<24
  138. print "CONFIG0=0x%8x" % CONFIG0
  139. print "CONFIG1=0x%8x" % CONFIG1

  140. def READ_APROM_BIN_FILE(FILENAME):
  141. #open file to array
  142. try:
  143.   f=open(FILENAME, 'rb')
  144.   global AP_FILE
  145.   global AP_CHECKSUM
  146.   AP_CHECKSUM=0
  147.   while True:
  148.     x=f.read(1)
  149.     if x=='':
  150.      break
  151.     temp=struct.unpack('B',x)
  152.     AP_FILE.append(temp[0])
  153.     AP_CHECKSUM=AP_CHECKSUM+temp[0]
  154.   f.close()  
  155. except:
  156.   print ("APROM File load error")
  157.   error_return
  158. #print '[{}]'.format(', '.join(hex(x) for x in AP_FILE))
  159. #print len(AP_FILE)



  160. def UPDATE_APROM():
  161. global AP_FILE
  162. global PacketNumber
  163. PacketNumber=PacketNumber+2
  164. AP_ADRESS=0;
  165. AP_SIZE=len(AP_FILE)
  166. PAP_COMMNAD = [0 for i in range(64)]
  167. PAP_COMMNAD[0]=0xa0
  168. #APROM START ADDRESS
  169. PAP_COMMNAD[8]=AP_ADRESS&0xff
  170. PAP_COMMNAD[9]=AP_ADRESS>>8&0xff
  171. PAP_COMMNAD[10]=AP_ADRESS>>16&0xff
  172. PAP_COMMNAD[11]=AP_ADRESS>>24&0xff
  173. #APROM SIZE
  174. PAP_COMMNAD[12]=AP_SIZE&0xff  
  175. PAP_COMMNAD[13]=AP_SIZE>>8&0xff
  176. PAP_COMMNAD[14]=AP_SIZE>>16&0xff
  177. PAP_COMMNAD[15]=AP_SIZE>>24&0xff
  178. PAP_COMMNAD[16:64]=AP_FILE[0:48] #first package to copy
  179. #print '[{}]'.format(', '.join(hex(x) for x in PAP_COMMNAD))
  180. UART_TRANSFER(PAP_COMMNAD,PacketNumber)

  181. for i in range(48,AP_SIZE,56):
  182.    PacketNumber=PacketNumber+2
  183.    PAP1_COMMNAD = [0 for j in range(64)]
  184.    PAP1_COMMNAD[8:64]=AP_FILE[i:(i+56)]
  185.    #print "test len: %d" % len(PAP1_COMMNAD)
  186.    if len(PAP1_COMMNAD) < 64:
  187.       for k in range(64-len(PAP1_COMMNAD)):
  188.         PAP1_COMMNAD.append(0xFF)         
  189.    #print '[{}]'.format(', '.join(hex(x) for x in PAP1_COMMNAD))
  190.    if (((AP_SIZE-i)<56) or ((AP_SIZE-i)==56)):
  191.     #print "end"   
  192.     buf=UART_TRANSFER(PAP1_COMMNAD,PacketNumber)
  193.     d_checksum=buf[8]|buf[9]<<8
  194.     if(d_checksum==(AP_CHECKSUM&0xffff)):
  195.         print("checksum pass")
  196.    else:
  197.     #print "loop"     
  198.     UART_TRANSFER(PAP1_COMMNAD,PacketNumber)


  199. #ISP CODE START FORM THERE
  200. if len(sys.argv)!=3:
  201. print "isp_command port number file name"
  202. print "isp_command com0 c:\\test.bin"
  203. com=serial.Serial(sys.argv[1],115200)


  204. UART_AUTO_DETECT()
  205. com.timeout=None
  206. LINK_FUN()
  207. SN_FUN()
  208. READ_PID_FUN()
  209. READ_fW_FUN()
  210. READ_CONFIG_FUN()
  211. READ_APROM_BIN_FILE(sys.argv[2])
  212. UPDATE_APROM()
  213. #RUN_TO_APROM_FUN();
  214. com.close()
heisexingqisi 发表于 2017-4-12 18:32 | 显示全部楼层
贴点代码或者说明比较正规。。看着嗨皮。
mintspring 发表于 2017-4-12 19:53 | 显示全部楼层
Python可以生成那种EXE的程序吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

100

主题

310

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部