打印
[DemoCode下载]

python 寫的pc 端isp code

[复制链接]
916|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a_ziliu|  楼主 | 2017-4-12 16:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
因為想寫個跨平台的主機端isp,把pc端用vc寫的代碼,移植到python上面
python isp_command.zip (6.48 KB)
沙发
heisexingqisi| | 2017-4-12 18:31 | 只看该作者
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()

使用特权

评论回复
板凳
heisexingqisi| | 2017-4-12 18:32 | 只看该作者
贴点代码或者说明比较正规。。看着嗨皮。

使用特权

评论回复
地板
mintspring| | 2017-4-12 19:53 | 只看该作者
Python可以生成那种EXE的程序吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

100

主题

295

帖子

6

粉丝