annotate micropython/makecombinedhex.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 Combine the MicroPython firmware with a Python script and produce a hex file
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
5 ready for uploading to the micro:bit.
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
6
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
7 Usage: ./makecombinedhex.py <firmware.hex> <script.py> [-o <combined.hex>]
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
8
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
9 Output goes to stdout if no filename is given.
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
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
12 import sys
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
13 import argparse
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
14 import hexlifyscript
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
15
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
16 def get_largest_addr(hexfile):
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
17 largest_addr = 0
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
18 for line in hexfile:
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
19 count = int(line[1:3], 16)
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
20 addr = int(line[3:7], 16)
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
21 type = int(line[7:9], 16)
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
22 if count == 2 and type == 4: # ext linear addr
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
23 page = int(line[9:13], 16) << 16
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
24 elif type == 0: # data
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
25 largest_addr = max(largest_addr, page + addr + count)
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
26 return largest_addr
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
27
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
28 if __name__ == '__main__':
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
29 arg_parser = argparse.ArgumentParser(description='Produce combined hex firmware for the micro:bit.')
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
30 arg_parser.add_argument('-o', '--output', default=sys.stdout, type=argparse.FileType('wt'), help='output file (default is stdout)')
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
31 arg_parser.add_argument('firmware', nargs=1, help='input MicroPython firmware')
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
32 arg_parser.add_argument('script', nargs=1, help='input Python script')
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
33 args = arg_parser.parse_args()
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
34
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
35 # read in the firmware
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
36 with open(args.firmware[0], 'rt') as f:
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
37 firmware = f.readlines()
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
38
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
39 # check the firmware is not too large
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
40 if get_largest_addr(firmware) > hexlifyscript.SCRIPT_ADDR:
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
41 raise Exception('firmware overflows into script region')
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
42
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
43 # hexlify the script
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
44 with open(args.script[0], 'rb') as f:
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
45 script = hexlifyscript.hexlify_script(f.read())
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
46
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
47 # print head of firmware
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
48 for line in firmware[:-2]:
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
49 print(line, end='', file=args.output)
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
50
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
51 # print script
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
52 print(script, file=args.output)
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
53
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
54 # print tail of firmware
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
55 print(firmware[-2], end='', file=args.output)
ce6b15e13fa9 Initial commit
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
56 print(firmware[-1], end='', file=args.output)