1 import os, struct, sys, time
\r
3 from serial import Serial
\r
4 from serial import SerialException
\r
6 import ispBase, intelHex
\r
8 class Stk500v2(ispBase.IspBase):
\r
14 def connect(self, port = 'COM3', speed = 115200):
\r
15 if self.serial != None:
\r
18 self.serial = Serial(port, speed, timeout=1)
\r
19 except SerialException as e:
\r
20 raise ispBase.IspError("Failed to open serial port")
\r
22 raise ispBase.IspError("Unexpected error while connecting to serial port:" + port + ":" + str(sys.exc_info()[0]))
\r
25 #Reset the controller
\r
26 self.serial.setDTR(1)
\r
27 self.serial.setDTR(0)
\r
30 self.sendMessage([1])
\r
31 if self.sendMessage([0x10, 0xc8, 0x64, 0x19, 0x20, 0x00, 0x53, 0x03, 0xac, 0x53, 0x00, 0x00]) != [0x10, 0x00]:
\r
33 raise ispBase.IspError("Failed to enter programming mode")
\r
36 if self.serial != None:
\r
40 def isConnected(self):
\r
41 return self.serial != None
\r
43 def sendISP(self, data):
\r
44 recv = self.sendMessage([0x1D, 4, 4, 0, data[0], data[1], data[2], data[3]])
\r
47 def writeFlash(self, flashData):
\r
48 #Set load addr to 0, in case we have more then 64k flash we need to enable the address extension
\r
49 flashSize = self.chip['pageSize'] * 2 * self.chip['pageCount']
\r
50 if flashSize > 0xFFFF:
\r
51 self.sendMessage([0x06, 0x80, 0x00, 0x00, 0x00])
\r
53 self.sendMessage([0x06, 0x00, 0x00, 0x00, 0x00])
\r
55 loadCount = (len(flashData) + 0xFF) / 0x100
\r
56 for i in xrange(0, loadCount):
\r
57 recv = self.sendMessage([0x13, 0x01, 0x00, 0xc1, 0x0a, 0x40, 0x4c, 0x20, 0x00, 0x00] + flashData[(i * 0x100):(i * 0x100 + 0x100)])
\r
58 if self.progressCallback != None:
\r
59 self.progressCallback(i + 1, loadCount*2)
\r
61 def verifyFlash(self, flashData):
\r
62 #Set load addr to 0, in case we have more then 64k flash we need to enable the address extension
\r
63 flashSize = self.chip['pageSize'] * 2 * self.chip['pageCount']
\r
64 if flashSize > 0xFFFF:
\r
65 self.sendMessage([0x06, 0x80, 0x00, 0x00, 0x00])
\r
67 self.sendMessage([0x06, 0x00, 0x00, 0x00, 0x00])
\r
69 loadCount = (len(flashData) + 0xFF) / 0x100
\r
70 for i in xrange(0, loadCount):
\r
71 recv = self.sendMessage([0x14, 0x01, 0x00, 0x20])[2:0x102]
\r
72 if self.progressCallback != None:
\r
73 self.progressCallback(loadCount + i + 1, loadCount*2)
\r
74 for j in xrange(0, 0x100):
\r
75 if i * 0x100 + j < len(flashData) and flashData[i * 0x100 + j] != recv[j]:
\r
76 raise ispBase.IspError('Verify error at: 0x%x' % (i * 0x100 + j))
\r
78 def sendMessage(self, data):
\r
79 message = struct.pack(">BBHB", 0x1B, self.seq, len(data), 0x0E)
\r
81 message += struct.pack(">B", c)
\r
85 message += struct.pack(">B", checksum)
\r
87 self.serial.write(message)
\r
89 except SerialTimeoutException:
\r
90 raise ispBase.IspError('Serial send timeout')
\r
91 self.seq = (self.seq + 1) & 0xFF
\r
92 return self.recvMessage()
\r
94 def recvMessage(self):
\r
98 s = self.serial.read()
\r
100 raise ispBase.IspError("Timeout")
\r
101 b = struct.unpack(">B", s)[0]
\r
104 if state == 'Start':
\r
108 elif state == 'GetSeq':
\r
110 elif state == 'MsgSize1':
\r
113 elif state == 'MsgSize2':
\r
116 elif state == 'Token':
\r
122 elif state == 'Data':
\r
124 if len(data) == msgSize:
\r
126 elif state == 'Checksum':
\r
134 programmer = Stk500v2()
\r
135 programmer.connect()
\r
136 programmer.programChip(intelHex.readHex("cfg_4f55234def059.hex"))
\r
139 if __name__ == '__main__':
\r