# baudrate used for communication with pkernel
KERNEL_BAUDRATE=38400
+def recvByte():
+ i = tty.read()
+ return ord(i)
+
+def sendByte(byte):
+ time.sleep(0.005) # just to get sure, wait 5ms
+ tty.write(chr(byte))
+ tty.flush()
+
+def sendWord(word):
+ sendByte(word & 0xFF)
+ sendByte((word >> 8) & 0xFF)
+
+def sendDWord(dword):
+ sendByte(dword & 0xFF)
+ sendByte((dword >> 8) & 0xFF)
+ sendByte((dword >> 16) & 0xFF)
+ sendByte((dword >> 24) & 0xFF)
+
+def pkernCHIPERASE():
+ sendByte(0x15)
+ if (recvByte() != 0x45):
+ raise Exception
+ print "wait..."
+ if (recvByte() != 0x23):
+ raise Exception
+ print "Chip erasing done."
+
+def pkernERASE(address, size):
+ sendByte(0x12)
+ if (recvByte() != 0x11):
+ raise Exception
+ sendDWord(address)
+ sendWord(size)
+ if (recvByte() != 0x18):
+ raise Exception
+ print "Erasing done."
+
+
def pkernWRITE(address, size, data):
+ print "address:", hex(address), "size:", size
# send WRITE command
- sendByte(0x01)
- if (recvByte() != 0xF1):
- raise Exception
- sendByte(0x03)
- if (recvByte() != 0x83):
+ sendByte(0x13)
+ if (recvByte() != 0x37):
raise Exception
# tell desired address and size
sendDWord(address)
sendWord(size)
+
# write binary stream of data
for i in range(0, size):
sendByte(data[i])
- # get checksum
- recvChecksum()
+
+ if (recvByte() != 0x28):
+ raise Exception
+ print "Flashing done."
+
+
+class FlashSequence(object):
+ def __init__(self, address, data):
+ self.address = address
+ self.data = data
+
+# list of all our address/data pairs to flash
+flashseqs = []
+
print "Initializing serial port..."
-tty = SerialPort(DEVICE, 500, KERNEL_BAUDRATE)
+tty = SerialPort(DEVICE, None, KERNEL_BAUDRATE)
# check command line arguments
if len(sys.argv) != 2:
print "The following flash sequences have been read in:"
for seq in flashseqs:
- print hex(seq.address) + ":", seq.data
+ print hex(seq.address) + ":", [hex(x) for x in seq.data]
# let the fun begin!
+"""
+for seq in flashseqs:
+ print "Erasing", len(seq.data), "bytes at address", hex(seq.address)
+ pkernERASE(seq.address, len(seq.data))
+"""
+print "ChipErase..."
+pkernCHIPERASE()
+
+
for seq in flashseqs:
print "Flashing", len(seq.data), "bytes at address", hex(seq.address)
pkernWRITE(seq.address, len(seq.data), seq.data)
+"""
+sendByte(0x99) #exit and wait
print "Reset your board now to run code from Flash"
+"""
+
+sendByte(0x97) #exit and restart