Damien George | 075d597 | 2014-11-27 20:30:33 +0000 | [diff] [blame] | 1 | import sys |
Paul Sokolovsky | a621333 | 2016-08-04 00:19:09 +0300 | [diff] [blame] | 2 | import struct |
Paul Sokolovsky | bf47b71 | 2016-08-04 00:21:05 +0300 | [diff] [blame] | 3 | import hashlib |
Damien George | 075d597 | 2014-11-27 20:30:33 +0000 | [diff] [blame] | 4 | |
Damien George | 497ca99 | 2020-04-04 16:30:39 +1100 | [diff] [blame] | 5 | # This region at the start of flash contains a small header and then segments |
| 6 | # containing .text, .data and .rodata, and so must be large enough to hold all |
| 7 | # of this. This data is loaded to the appropriate places in RAM by the ROM |
| 8 | # bootloader at boot. After this in flash comes .irom0.text, which must begin |
| 9 | # on a flash erase-page boundary. |
Paul Sokolovsky | 8d2bcaf | 2016-04-03 15:40:53 +0300 | [diff] [blame] | 10 | SEGS_MAX_SIZE = 0x9000 |
| 11 | |
Damien George | 075d597 | 2014-11-27 20:30:33 +0000 | [diff] [blame] | 12 | assert len(sys.argv) == 4 |
| 13 | |
Paul Sokolovsky | bf47b71 | 2016-08-04 00:21:05 +0300 | [diff] [blame] | 14 | md5 = hashlib.md5() |
| 15 | |
Damien George | 69661f3 | 2020-02-27 15:36:53 +1100 | [diff] [blame] | 16 | with open(sys.argv[3], "wb") as fout: |
Damien George | 69661f3 | 2020-02-27 15:36:53 +1100 | [diff] [blame] | 17 | with open(sys.argv[1], "rb") as f: |
Damien George | 075d597 | 2014-11-27 20:30:33 +0000 | [diff] [blame] | 18 | data_flash = f.read() |
| 19 | fout.write(data_flash) |
Paul Sokolovsky | bf47b71 | 2016-08-04 00:21:05 +0300 | [diff] [blame] | 20 | # First 4 bytes include flash size, etc. which may be changed |
| 21 | # by esptool.py, etc. |
| 22 | md5.update(data_flash[4:]) |
Damien George | 69661f3 | 2020-02-27 15:36:53 +1100 | [diff] [blame] | 23 | print("flash ", len(data_flash)) |
Damien George | 075d597 | 2014-11-27 20:30:33 +0000 | [diff] [blame] | 24 | |
Damien George | 497ca99 | 2020-04-04 16:30:39 +1100 | [diff] [blame] | 25 | # Print info about segments in this first part of flash |
| 26 | num_segs = struct.unpack_from("<BBBBI", data_flash, 0)[1] |
| 27 | offset = 8 |
| 28 | for seg_num in range(num_segs): |
| 29 | seg_name = [".text", ".data", ".rodata"][seg_num] |
| 30 | seg_offset, seg_size = struct.unpack_from("<II", data_flash, offset) |
| 31 | print(" {:7} {} at 0x{:x}".format(seg_name, seg_size, seg_offset)) |
| 32 | offset += 8 + seg_size |
| 33 | |
Damien George | 69661f3 | 2020-02-27 15:36:53 +1100 | [diff] [blame] | 34 | with open(sys.argv[2], "rb") as f: |
Damien George | 075d597 | 2014-11-27 20:30:33 +0000 | [diff] [blame] | 35 | data_rom = f.read() |
Paul Sokolovsky | a621333 | 2016-08-04 00:19:09 +0300 | [diff] [blame] | 36 | |
Damien George | 69661f3 | 2020-02-27 15:36:53 +1100 | [diff] [blame] | 37 | pad = b"\xff" * (SEGS_MAX_SIZE - len(data_flash)) |
Paul Sokolovsky | a621333 | 2016-08-04 00:19:09 +0300 | [diff] [blame] | 38 | assert len(pad) >= 4 |
| 39 | fout.write(pad[:-4]) |
Paul Sokolovsky | bf47b71 | 2016-08-04 00:21:05 +0300 | [diff] [blame] | 40 | md5.update(pad[:-4]) |
| 41 | len_data = struct.pack("I", SEGS_MAX_SIZE + len(data_rom)) |
| 42 | fout.write(len_data) |
| 43 | md5.update(len_data) |
Damien George | 69661f3 | 2020-02-27 15:36:53 +1100 | [diff] [blame] | 44 | print("padding ", len(pad)) |
Paul Sokolovsky | a621333 | 2016-08-04 00:19:09 +0300 | [diff] [blame] | 45 | |
| 46 | fout.write(data_rom) |
Paul Sokolovsky | bf47b71 | 2016-08-04 00:21:05 +0300 | [diff] [blame] | 47 | md5.update(data_rom) |
Damien George | 69661f3 | 2020-02-27 15:36:53 +1100 | [diff] [blame] | 48 | print("irom0text", len(data_rom)) |
Damien George | 075d597 | 2014-11-27 20:30:33 +0000 | [diff] [blame] | 49 | |
Paul Sokolovsky | bf47b71 | 2016-08-04 00:21:05 +0300 | [diff] [blame] | 50 | fout.write(md5.digest()) |
| 51 | |
Damien George | 69661f3 | 2020-02-27 15:36:53 +1100 | [diff] [blame] | 52 | print("total ", SEGS_MAX_SIZE + len(data_rom)) |
| 53 | print("md5 ", md5.hexdigest()) |