aboutsummaryrefslogtreecommitdiffstats
path: root/demos/ARMCM0P-LPC812-LPCXPRESSO/lpc8xx_isp.py
diff options
context:
space:
mode:
Diffstat (limited to 'demos/ARMCM0P-LPC812-LPCXPRESSO/lpc8xx_isp.py')
-rwxr-xr-xdemos/ARMCM0P-LPC812-LPCXPRESSO/lpc8xx_isp.py141
1 files changed, 141 insertions, 0 deletions
diff --git a/demos/ARMCM0P-LPC812-LPCXPRESSO/lpc8xx_isp.py b/demos/ARMCM0P-LPC812-LPCXPRESSO/lpc8xx_isp.py
new file mode 100755
index 000000000..13f976bf9
--- /dev/null
+++ b/demos/ARMCM0P-LPC812-LPCXPRESSO/lpc8xx_isp.py
@@ -0,0 +1,141 @@
+#!/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 ''
+
+#=========================================================
+#=========================================================
+
+
+