Mercurial > micro-bot
diff micropython/hexlifyscript.py @ 0:ce6b15e13fa9
Initial commit
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Thu, 26 Nov 2015 23:10:14 +0100 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/micropython/hexlifyscript.py Thu Nov 26 23:10:14 2015 +0100 @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 + +''' +Turn a Python script into Intel HEX format to be concatenated at the +end of the MicroPython firmware.hex. A simple header is added to the +script. + +To execute from command line: ./hexlifyscript.py <script.py> +''' + +import sys +import struct +import binascii + +SCRIPT_ADDR = 0x3e000 # magic start address in flash of script + +def hexlify_script(script): + # add header, pad to multiple of 16 bytes + data = b'MP' + struct.pack('<H', len(script)) + script + data = data + bytes(16 - len(data) % 16) + assert len(data) <= 0x2000 + + # convert to .hex format + output = [] + addr = SCRIPT_ADDR + assert(SCRIPT_ADDR >> 16 == 3) # 0x0003 is hard coded in line below + output.append(':020000040003F7') # extended linear address, 0x0003 + for i in range(0, len(data), 16): + chunk = data[i:min(i + 16, len(data))] + chunk = struct.pack('>BHB', len(chunk), addr & 0xffff, 0) + chunk + checksum = (-(sum(chunk))) & 0xff + hexline = ':%s%02X' % (str(binascii.hexlify(chunk), 'utf8').upper(), checksum) + output.append(hexline) + addr += 16 + + return '\n'.join(output) + +if __name__ == '__main__': + # read script from a file and print out the hexlified version + with open(sys.argv[1], 'rb') as f: + print(hexlify_script(f.read()))
