annotate micropython/hexlifyscript.py @ 3:1dc1a2e5e642 default tip

add some comments
author Radomir Dopieralski <bitbucket@sheep.art.pl>
date Wed, 20 Mar 2019 23:15:39 +0000
parents ce6b15e13fa9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
1 #!/usr/bin/env python3
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
2
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
3 '''
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
4 Turn a Python script into Intel HEX format to be concatenated at the
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
5 end of the MicroPython firmware.hex. A simple header is added to the
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
6 script.
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
7
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
8 To execute from command line: ./hexlifyscript.py <script.py>
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
9 '''
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
10
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
11 import sys
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
12 import struct
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
13 import binascii
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
14
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
15 SCRIPT_ADDR = 0x3e000 # magic start address in flash of script
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
16
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
17 def hexlify_script(script):
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
18 # add header, pad to multiple of 16 bytes
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
19 data = b'MP' + struct.pack('<H', len(script)) + script
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
20 data = data + bytes(16 - len(data) % 16)
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
21 assert len(data) <= 0x2000
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
22
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
23 # convert to .hex format
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
24 output = []
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
25 addr = SCRIPT_ADDR
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
26 assert(SCRIPT_ADDR >> 16 == 3) # 0x0003 is hard coded in line below
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
27 output.append(':020000040003F7') # extended linear address, 0x0003
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
28 for i in range(0, len(data), 16):
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
29 chunk = data[i:min(i + 16, len(data))]
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
30 chunk = struct.pack('>BHB', len(chunk), addr & 0xffff, 0) + chunk
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
31 checksum = (-(sum(chunk))) & 0xff
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
32 hexline = ':%s%02X' % (str(binascii.hexlify(chunk), 'utf8').upper(), checksum)
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
33 output.append(hexline)
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
34 addr += 16
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
35
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
36 return '\n'.join(output)
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
37
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
38 if __name__ == '__main__':
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
39 # read script from a file and print out the hexlified version
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
40 with open(sys.argv[1], 'rb') as f:
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
41 print(hexlify_script(f.read()))