[工具下载] Linux下通过Python进行ISP

[复制链接]
 楼主| wahahaheihei 发表于 2018-11-25 16:15 | 显示全部楼层 |阅读模式
readme.pdf (825.91 KB, 下载次数: 21)


  1. 826012
  2. 8260# -*- coding: utf-8 -*-

  3. # Form implementation generated from reading ui file 'c:\pp\pyt1.ui'
  4. #
  5. # Created by: PyQt5 UI code generator 5.10.1
  6. #
  7. # WARNING! All changes made in this file will be lost!

  8. from PyQt5 import QtCore, QtGui, QtWidgets
  9. from PyQt5.QtWidgets import QApplication , QMainWindow
  10. from PyQt5.QtGui import QPainter, QColor, QPen
  11. from PyQt5.QtCore import Qt
  12. from PyQt5.QtCore import *
  13. from PyQt5.QtGui import *
  14. from PyQt5.QtWidgets import *
  15. import usb.core
  16. import usb.util
  17. import struct
  18. import sys
  19. import time

  20. class ISP_USB:
  21.       AP_FILE=[]
  22.       AP_CHECKSUM=0
  23.       PacketNumber=0
  24.       dev=None
  25.       ep_in=None
  26.       name=""
  27.       def __init__(self):
  28.             #self.name=name
  29.             #print(name)
  30.             self.PacketNumber=0;
  31.             self.dev = usb.core.find(idVendor=0x0416, idProduct=0x3F00)
  32.             # was it found?
  33.             if self.dev is None:
  34.                 raise ValueError('USB Device not found')
  35.             if self.dev.is_kernel_driver_active(0):
  36.                 self.dev.detach_kernel_driver(0)
  37.             self.dev.set_configuration()
  38.             usb.util.claim_interface(self.dev, 0)
  39.             self.dev.reset()
  40.             cfg=self.dev[0]
  41.             intf=cfg[(0,0)]
  42.             self.ep_in= usb.util.find_descriptor(intf,# match the first OUT endpoint
  43.                                                     custom_match = \
  44.                                                     lambda e: \
  45.                                                     usb.util.endpoint_direction(e.bEndpointAddress) == \
  46.                                                     usb.util.ENDPOINT_IN)
  47.             ep_out = usb.util.find_descriptor(intf,# match the first OUT endpoint
  48.                                                 custom_match = \
  49.                                                 lambda e: \
  50.                                                 usb.util.endpoint_direction(e.bEndpointAddress) == \
  51.                                                 usb.util.ENDPOINT_OUT)
  52.       def USB_TRANSFER(self, thelist, PN):
  53.             thelist[4]=PN&0xff
  54.             thelist[5]=PN>>8&0xff
  55.             thelist[6]=PN>>16&0xff
  56.             thelist[7]=PN>>24&0xff
  57.             

  58.             test=self.dev.write(0x02,thelist)            
  59.             return_str=self.dev.read(0x81,64,1000) #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.             checksum=0
  64.             for i in range(64):
  65.                 checksum=checksum+thelist[i]
  66. #print "checksum=0x%x"%checksum
  67.             packege_checksum=0
  68.             packege_checksum=return_buffer[0]
  69.             packege_checksum=(return_buffer[1]<<8)|packege_checksum
  70.             if checksum!=packege_checksum:
  71.                 #print("checksum error")
  72.                 error_return()
  73.             RPN=0
  74.             RPN=return_buffer[4]
  75.             RPN=(return_buffer[5]<<8)|RPN
  76.             RPN=(return_buffer[6]<<16)|RPN
  77.             RPN=(return_buffer[7]<<24)|RPN
  78.             if RPN!=(PN+1):
  79.                 #print("package number error")
  80.                 error_return()
  81.             return return_buffer

  82.       def LINK_FUN(self):            
  83.             LINK = [0 for i in range(64)] # 64 byte data buffer is all zero
  84.             self.PacketNumber=0x01
  85.             LINK[0]=0xae
  86.             self.USB_TRANSFER(LINK,self.PacketNumber)

  87.       def SN_FUN(self):
  88.             self.PacketNumber =self.PacketNumber+2
  89.             SN_PACKAGE = [0 for i in range(64)]
  90.             SN_PACKAGE[0]=0xa4
  91.             SN_PACKAGE[8]=self.PacketNumber&0xff
  92.             SN_PACKAGE[9]=self.PacketNumber>>8&0xff
  93.             SN_PACKAGE[10]=self.PacketNumber>>16&0xff
  94.             SN_PACKAGE[11]=self.PacketNumber>>24&0xff
  95.             self.USB_TRANSFER(SN_PACKAGE,self.PacketNumber)

  96.       def READ_fW_FUN(self):            
  97.             self.PacketNumber=self.PacketNumber+2
  98.             READFW_VERSION = [0 for i in range(64)]
  99.             READFW_VERSION[0]=0xa6
  100.             buf=self.USB_TRANSFER(READFW_VERSION,self.PacketNumber)
  101.             FW_VERSION=buf[8]
  102.             #print("FW_VERSION=0x%8x" % FW_VERSION)

  103.       def RUN_TO_APROM_FUN(self):            
  104.             self.PacketNumber=self.PacketNumber+2
  105.             RUN_TO_APROM = [0 for i in range(64)]
  106.             RUN_TO_APROM[0]=0xab
  107.             self.USB_TRANSFER(RUN_TO_APROM,self.PacketNumber)
  108.    
  109.       def READ_PID_FUN(self):
  110.             self.PacketNumber=self.PacketNumber+2
  111.             READ_PID = [0 for i in range(64)]
  112.             READ_PID[0]=0xB1
  113.             buf=self.USB_TRANSFER(READ_PID,self.PacketNumber)
  114.             PID=buf[8]|buf[9]<<8|buf[10]<<16|buf[11]<<24
  115.             #print("PID=0x%8x" % PID)

  116.       def READ_CONFIG_FUN(self):
  117.             self.PacketNumber=self.PacketNumber+2
  118.             READ_CONFIG = [0 for i in range(64)]
  119.             READ_CONFIG[0]=0xa2
  120.             buf=self.USB_TRANSFER(READ_CONFIG,self.PacketNumber)
  121.             CONFIG0=buf[8]|buf[9]<<8|buf[10]<<16|buf[11]<<24
  122.             CONFIG1=buf[12]|buf[13]<<8|buf[14]<<16|buf[15]<<24
  123.             #print("CONFIG0=0x%8x" % CONFIG0)
  124.             #print("CONFIG1=0x%8x" % CONFIG1)

  125.       def READ_APROM_BIN_FILE(self, FILENAME):
  126.             f=open(FILENAME, 'rb')            
  127.             self.AP_CHECKSUM=0
  128.             while True:
  129.                 x=f.read(1)
  130.                 if not x:
  131.                     break
  132.                 temp=struct.unpack('B',x)
  133.                 self.AP_FILE.append(temp[0])
  134.                 self.AP_CHECKSUM=self.AP_CHECKSUM+temp[0]
  135.             f.close()
  136.             #print(len(self.AP_FILE))
  137.             #print(self.AP_CHECKSUM)

  138.       def USB_TRANSFER_ERASE(self, thelist, PN):
  139.             thelist[4]=PN&0xff
  140.             thelist[5]=PN>>8&0xff
  141.             thelist[6]=PN>>16&0xff
  142.             thelist[7]=PN>>24&0xff
  143.             test=self.dev.write(0x02,thelist)
  144.             time.sleep(5)
  145.             return_str=self.dev.read(0x81,64,1000) #return by string
  146.             return_buffer=bytearray(return_str)
  147. #print 'rx package'
  148. #print '[{}]'.format(', '.join(hex(x) for x in return_buffer))

  149.             checksum=0
  150.             for i in range(64):
  151.                 checksum=checksum+thelist[i]
  152. #print "checksum=0x%x"%checksum
  153.             packege_checksum=0
  154.             packege_checksum=return_buffer[0]
  155.             packege_checksum=(return_buffer[1]<<8)|packege_checksum
  156.             if checksum!=packege_checksum:
  157.                 #print("checksum error")
  158.                 error_return()
  159.             RPN=0
  160.             RPN=return_buffer[4]
  161.             RPN=(return_buffer[5]<<8)|RPN
  162.             RPN=(return_buffer[6]<<16)|RPN
  163.             RPN=(return_buffer[7]<<24)|RPN
  164.             if RPN!=(PN+1):
  165.                 #print("package number error")
  166.                 error_return()
  167.             return return_buffer

  168.       def UPDATE_APROM(self):
  169.             self.PacketNumber=self.PacketNumber+2
  170.             AP_ADRESS=0;
  171.             AP_SIZE=len(self.AP_FILE)
  172.             PAP_COMMNAD = [0 for i in range(64)]
  173.             PAP_COMMNAD[0]=0xa0
  174.             #APROM START ADDRESS
  175.             PAP_COMMNAD[8]=AP_ADRESS&0xff
  176.             PAP_COMMNAD[9]=AP_ADRESS>>8&0xff
  177.             PAP_COMMNAD[10]=AP_ADRESS>>16&0xff
  178.             PAP_COMMNAD[11]=AP_ADRESS>>24&0xff
  179.             #APROM SIZE
  180.             PAP_COMMNAD[12]=AP_SIZE&0xff  
  181.             PAP_COMMNAD[13]=AP_SIZE>>8&0xff
  182.             PAP_COMMNAD[14]=AP_SIZE>>16&0xff
  183.             PAP_COMMNAD[15]=AP_SIZE>>24&0xff
  184.             PAP_COMMNAD[16:64]=self.AP_FILE[0:48] #first package to copy
  185.             #print '[{}]'.format(', '.join(hex(x) for x in PAP_COMMNAD))
  186.             self.USB_TRANSFER_ERASE(PAP_COMMNAD,self.PacketNumber)

  187.             for i in range(48,AP_SIZE,56):
  188.                 #print(i)
  189.                 self.PacketNumber=self.PacketNumber+2
  190.                 PAP1_COMMNAD = [0 for j in range(64)]
  191.                 PAP1_COMMNAD[8:64]=self.AP_FILE[i:(i+56)]
  192.                 #print "test len: %d" % len(PAP1_COMMNAD)
  193.                 if len(PAP1_COMMNAD) < 64:
  194.                     for k in range(64-len(PAP1_COMMNAD)):
  195.                         PAP1_COMMNAD.append(0xFF)         
  196.                         #print '[{}]'.format(', '.join(hex(x) for x in PAP1_COMMNAD))
  197.                 if (((AP_SIZE-i)<56) or ((AP_SIZE-i)==56)):
  198.                     #print "end"   
  199.                     buf=self.USB_TRANSFER(PAP1_COMMNAD,self.PacketNumber)
  200.                     d_checksum=buf[8]|buf[9]<<8
  201.                     if(d_checksum==(self.AP_CHECKSUM&0xffff)):
  202.                         error_return()
  203.                         #print("checksum pass")
  204.                 else:
  205.                         #print "loop"     
  206.                     self.USB_TRANSFER(PAP1_COMMNAD,self.PacketNumber)

  207. class Ui_Form(object):
  208.    
  209.     def setupUi(self, Form):
  210.         Form.setObjectName("Form")
  211.         Form.resize(400, 200)
  212.         Form.setFixedSize(400, 200);  
  213.         Form.setStyleSheet("")
  214.         self.progressBar = QtWidgets.QProgressBar(Form)
  215.         self.progressBar.setGeometry(QtCore.QRect(90, 60, 271, 23))
  216.         self.progressBar.setMinimumSize(QtCore.QSize(0, 0))
  217.         self.progressBar.setProperty("value", 0)
  218.         self.progressBar.setObjectName("progressBar")
  219.         self.pushButton_1 = QtWidgets.QPushButton(Form)
  220.         self.pushButton_1.setGeometry(QtCore.QRect(90, 140, 75, 23))
  221.         self.pushButton_1.setMinimumSize(QtCore.QSize(0, 0))
  222.         self.pushButton_1.setObjectName("pushButton_1")
  223.         self.pushButton_1.clicked.connect(self.getFilename)
  224.         self.pushButton_2 = QtWidgets.QPushButton(Form)
  225.         self.pushButton_2.setGeometry(QtCore.QRect(240, 140, 75, 23))
  226.         self.pushButton_2.setMinimumSize(QtCore.QSize(0, 0))
  227.         self.pushButton_2.setObjectName("pushButton_2")
  228.         self.pushButton_2.clicked.connect(self.startISP)
  229.         self.pushButton_2.setEnabled(False)
  230.         self.textEdit = QtWidgets.QTextEdit(Form)
  231.         self.textEdit.setEnabled(False)
  232.         self.textEdit.setGeometry(QtCore.QRect(90, 90, 231, 31))
  233.         self.textEdit.setMinimumSize(QtCore.QSize(0, 0))
  234.         self.textEdit.setObjectName("textEdit")      
  235.         self.thread = Worker()
  236.         self.thread.sinOut.connect(self.slotAdd)
  237.         
  238.         #goable variable
  239.         self.findname=""
  240.         self.retranslateUi(Form)
  241.         QtCore.QMetaObject.connectSlotsByName(Form)

  242.     def retranslateUi(self, Form):
  243.         _translate = QtCore.QCoreApplication.translate
  244.         Form.setWindowTitle(_translate("Form", "Nuvoton ISP"))
  245.         self.pushButton_1.setText(_translate("Form", "Load Bin File"))
  246.         self.pushButton_2.setText(_translate("Form", "Start ISP"))

  247.     def getFilename(self):
  248.         fname, _  = QFileDialog.getOpenFileName(self, 'Open file', 'c:\\',"Bin file (*.bin)")
  249.         if (fname==""):
  250.             return

  251.         self.findname=fname
  252.         self.textEdit.setText(fname)
  253.         self.pushButton_2.setEnabled(True)
  254.     def startISP(self):
  255.         self.progressBar.setValue(0)
  256.         self.pushButton_1.setEnabled(False)
  257.         self.pushButton_2.setEnabled(False)
  258.         self.thread.setfilename(self.findname)
  259.         self.thread.start()

  260.     def slotAdd(self,count):
  261.         if(int(count)<=100):
  262.              self.progressBar.setValue(int(count))
  263.         if(int(count)==100):
  264.            self.pushButton_1.setEnabled(True)
  265.            self.pushButton_2.setEnabled(True)

  266. class Worker(QThread):
  267.         sinOut = pyqtSignal(str)

  268.         def __init__(self,parent=None):
  269.                 super(Worker,self).__init__(parent)
  270.                 self.working = True
  271.                 self.num = 0
  272.                 self.ISP = ISP_USB()
  273.                 self.filename=""

  274.         def __del__(self):
  275.                 self.working = False
  276.                 self.wait()

  277.         def setfilename(self,msg):
  278.                 self.filename=msg

  279.         def Thread_UPDATE_APROM(self):
  280.             self.ISP.PacketNumber=self.ISP.PacketNumber+2
  281.             AP_ADRESS=0;
  282.             AP_SIZE=len(self.ISP.AP_FILE)
  283.             PAP_COMMNAD = [0 for i in range(64)]
  284.             PAP_COMMNAD[0]=0xa0
  285.             #APROM START ADDRESS
  286.             PAP_COMMNAD[8]=AP_ADRESS&0xff
  287.             PAP_COMMNAD[9]=AP_ADRESS>>8&0xff
  288.             PAP_COMMNAD[10]=AP_ADRESS>>16&0xff
  289.             PAP_COMMNAD[11]=AP_ADRESS>>24&0xff
  290.             #APROM SIZE
  291.             PAP_COMMNAD[12]=AP_SIZE&0xff  
  292.             PAP_COMMNAD[13]=AP_SIZE>>8&0xff
  293.             PAP_COMMNAD[14]=AP_SIZE>>16&0xff
  294.             PAP_COMMNAD[15]=AP_SIZE>>24&0xff
  295.             PAP_COMMNAD[16:64]=self.ISP.AP_FILE[0:48] #first package to copy
  296.             #print '[{}]'.format(', '.join(hex(x) for x in PAP_COMMNAD))
  297.             self.ISP.USB_TRANSFER_ERASE(PAP_COMMNAD,self.ISP.PacketNumber)

  298.             for i in range(48,AP_SIZE,56):
  299.                 #print(int(i/AP_SIZE*100))
  300.                 self.sinOut.emit(str(int(i/AP_SIZE*100)))
  301.                 #if(int(i/AP_SIZE)%10==0):
  302.                 #    print(int(i/AP_SIZE))
  303.                 #    self.sleep(0.5)
  304.                 self.ISP.PacketNumber=self.ISP.PacketNumber+2
  305.                 PAP1_COMMNAD = [0 for j in range(64)]
  306.                 PAP1_COMMNAD[8:64]=self.ISP.AP_FILE[i:(i+56)]
  307.                 #print "test len: %d" % len(PAP1_COMMNAD)
  308.                 if len(PAP1_COMMNAD) < 64:
  309.                     for k in range(64-len(PAP1_COMMNAD)):
  310.                         PAP1_COMMNAD.append(0xFF)         
  311.                         #print '[{}]'.format(', '.join(hex(x) for x in PAP1_COMMNAD))
  312.                 if (((AP_SIZE-i)<56) or ((AP_SIZE-i)==56)):
  313.                     #print "end"   
  314.                     buf=self.ISP.USB_TRANSFER(PAP1_COMMNAD,self.ISP.PacketNumber)
  315.                     d_checksum=buf[8]|buf[9]<<8
  316.                     if(d_checksum==(self.ISP.AP_CHECKSUM&0xffff)):
  317.                         #print("checksum pass")
  318.                         self.sinOut.emit("100")
  319.                 else:
  320.                         #print "loop"     
  321.                     self.ISP.USB_TRANSFER(PAP1_COMMNAD,self.ISP.PacketNumber)


  322.         def run(self):
  323.          self.ISP.LINK_FUN()
  324.          self.ISP.SN_FUN()
  325.          self.ISP.READ_fW_FUN()
  326.          self.ISP.READ_PID_FUN()
  327.          self.ISP.READ_CONFIG_FUN()
  328.          self.ISP.READ_APROM_BIN_FILE(self.filename)
  329.          self.Thread_UPDATE_APROM()      
  330.          #self.sinOut.emit("100")



  331. class MyMainWindow(QMainWindow, Ui_Form):
  332.     def __init__(self, parent=None):   
  333.         super(MyMainWindow, self).__init__(parent)
  334.         self.setupUi(self)
  335.         self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint)  #only keep close button


  336. if __name__=="__main__":  
  337.     '''
  338.     test=ISP_USB()
  339.     test.LINK_FUN()   
  340.     test.SN_FUN()
  341.     test.READ_PID_FUN()
  342.     test.READ_fW_FUN()
  343.     test.READ_APROM_BIN_FILE("c:\\t1.bin")
  344.     test.UPDATE_APROM()
  345.     '''
  346.     app = QApplication(sys.argv)  
  347.     myWin = MyMainWindow()  
  348.     myWin.show()  
  349.     sys.exit(app.exec_())


huahuagg 发表于 2018-11-25 18:43 | 显示全部楼层
看不懂,不知道在Windows上可以执行不
mintspring 发表于 2018-11-25 20:20 | 显示全部楼层
Linux下的开发软件也越来越多了。
mintspring 发表于 2018-11-25 20:21 | 显示全部楼层
现在好多软件都开始支持Linux了。比如eclipse的开发工具,都可以移植到Linux下。
643757107 发表于 2018-11-25 22:02 | 显示全部楼层
我不用Linux啊,不过先MARK一下。
yiyigirl2014 发表于 2018-11-25 23:22 | 显示全部楼层
现在到处都是Python,真搞不懂
饕餮人 发表于 2022-2-26 09:18 | 显示全部楼层
这个支持 Linux 下运行吗?可以的话我打个 AUR 包
饕餮人 发表于 2022-2-26 10:35 | 显示全部楼层
能否上传到开源仓库呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

231

主题

3197

帖子

12

粉丝
快速回复 返回顶部 返回列表