142 lines
3.0 KiB
Python
Executable File
142 lines
3.0 KiB
Python
Executable File
#!/usr/bin/env python
|
|
import serial
|
|
import array
|
|
|
|
#=========================================================
|
|
PORT = '/dev/ttyUSB1'
|
|
FILE = 'build/ch.bin'
|
|
|
|
RAM_ADDR = 0x10000300
|
|
PAGE_SIZE = 0x40
|
|
SECTOR_SIZE = 0x400
|
|
FLASH_SIZE = 0x4000
|
|
|
|
#=========================================================
|
|
ser = serial.Serial( PORT, 115200, timeout=1)
|
|
|
|
data = array.array('B')
|
|
f = file( FILE, 'rb')
|
|
try:
|
|
data.fromfile(f, FLASH_SIZE)
|
|
except:
|
|
pass
|
|
f.close()
|
|
|
|
## pad out to next whole page
|
|
data.fromstring( chr(0xff)*(PAGE_SIZE - (data.buffer_info()[1]%PAGE_SIZE)) )
|
|
|
|
#=========================================================
|
|
## fix-up LPC boot checksum
|
|
csum = 0;
|
|
for i in range(7):
|
|
csum = csum + \
|
|
(data[(i*4)] ) + \
|
|
(data[(i*4)+1]<<8 ) + \
|
|
(data[(i*4)+2]<<16) + \
|
|
(data[(i*4)+3]<<24); \
|
|
|
|
csum = -csum
|
|
data[28] = csum & 0xff
|
|
data[29] = csum>>8 & 0xff
|
|
data[30] = csum>>16 & 0xff
|
|
data[31] = csum>>24 & 0xff
|
|
|
|
#=========================================================
|
|
##
|
|
ser.write('?')
|
|
resp = ser.readline()
|
|
if resp.strip() <> 'Synchronized':
|
|
print 'No Response "?"'
|
|
exit(1)
|
|
|
|
ser.write('Synchronized\r\n')
|
|
resp = ser.readline()
|
|
resp = ser.readline()
|
|
if resp.strip() <> 'OK':
|
|
print 'Not Synchronized'
|
|
exit(1)
|
|
|
|
ser.write('12000\r\n')
|
|
resp = ser.readline()
|
|
resp = ser.readline()
|
|
if resp.strip() <> 'OK':
|
|
print 'No Response "12000"'
|
|
exit(1)
|
|
|
|
ser.write('A 0\r\n')
|
|
resp = ser.readline()
|
|
resp = ser.readline()
|
|
if resp.strip() <> '0':
|
|
print 'Error Response "A"', resp
|
|
exit(1)
|
|
|
|
ser.write('J\r\n')
|
|
resp = ser.readline()
|
|
if resp.strip() <> '0':
|
|
print 'Error Response "J"', resp
|
|
exit(1)
|
|
resp = ser.readline()
|
|
print 'Device ID: ', hex(int(resp))
|
|
|
|
ser.write('U 23130\r\n')
|
|
resp = ser.readline()
|
|
if resp.strip() <> '0':
|
|
print 'Error Response "U"', resp
|
|
exit(1)
|
|
|
|
|
|
## Erase whole device
|
|
ser.write('P 0 7\r\n')
|
|
resp = ser.readline()
|
|
if resp.strip() <> '0':
|
|
print 'Error Response "P"', resp
|
|
exit(1)
|
|
|
|
ser.write('E 0 7\r\n')
|
|
resp = ser.readline()
|
|
if resp.strip() <> '0':
|
|
print 'Error Response "P"', resp
|
|
exit(1)
|
|
|
|
|
|
#=========================================================
|
|
address = 0
|
|
|
|
while data.buffer_info()[1]:
|
|
|
|
ser.write( "W %d %d\r\n"%(RAM_ADDR, PAGE_SIZE) )
|
|
resp = ser.readline()
|
|
if resp.strip() <> '0':
|
|
print 'Error Response "W"', resp
|
|
exit(1)
|
|
|
|
for i in range(PAGE_SIZE):
|
|
ser.write( chr(data.pop(0)) )
|
|
|
|
#print('P %x %x\r\n'%( address/SECTOR_SIZE, address/SECTOR_SIZE ))
|
|
#print('C %x %x 0xff\r\n'%( address, RAM_ADDR ))
|
|
|
|
## Program page
|
|
ser.write('P %d %d\r\n'%( address/SECTOR_SIZE, address/SECTOR_SIZE ))
|
|
resp = ser.readline()
|
|
if resp.strip() <> '0':
|
|
print 'Error Response "P"', resp
|
|
exit(1)
|
|
|
|
ser.write( 'C %d %d %d\r\n'%(address, RAM_ADDR, PAGE_SIZE) )
|
|
resp = ser.readline()
|
|
if resp.strip() <> '0':
|
|
print 'Error Response "C"', resp
|
|
exit(1)
|
|
|
|
print '.',
|
|
address = address + PAGE_SIZE
|
|
if (address%SECTOR_SIZE) == 0:
|
|
print ''
|
|
|
|
#=========================================================
|
|
#=========================================================
|
|
|
|
|
|
|