diff options
Diffstat (limited to 'demos/ARMCM0P-LPC812-LPCXPRESSO/lpc8xx_isp.py')
-rwxr-xr-x | demos/ARMCM0P-LPC812-LPCXPRESSO/lpc8xx_isp.py | 141 |
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 '' + +#========================================================= +#========================================================= + + + |