|
5 | 5 | import struct |
6 | 6 | import zipfile |
7 | 7 | import click |
| 8 | +import re |
8 | 9 |
|
9 | 10 | # input_file = "../artifacts_signed/ota.zip" |
10 | 11 | # output_file = "../artifacts_signed/ota.bin" |
11 | 12 |
|
12 | 13 | INIT_DATA_SIZE = 512 |
13 | 14 |
|
14 | 15 | OFFSET_MAGIC = 0x00 |
| 16 | +OFFSET_VERSION_MAJOR = 0x10 |
| 17 | +OFFSET_VERSION_MINOR = 0x11 |
| 18 | +OFFSET_VERSION_PATCH = 0x12 |
15 | 19 | OFFSET_HASHES = 0x20 |
16 | 20 | OFFSET_NRF_DAT_SIZE = 0x400 |
17 | 21 | OFFSET_NRF_DAT = 0x404 |
@@ -50,11 +54,34 @@ def gen_hashes(data: bytes) -> bytes: |
50 | 54 | return hashes |
51 | 55 |
|
52 | 56 | def gen_onekey_bin(nrf_dat: bytes, nrf_bin: bytes) -> bytes: |
| 57 | + |
| 58 | + header_file = "../app/firmware_config.h" |
| 59 | + |
| 60 | + with open(header_file, "r") as file: |
| 61 | + content = file.read() |
| 62 | + |
| 63 | + match = re.search(r'#define\s+FW_REVISION\s+"([^"]+)"', content) |
| 64 | + |
| 65 | + major = 0 |
| 66 | + minor = 0 |
| 67 | + patch = 0 |
| 68 | + |
| 69 | + if match: |
| 70 | + version_string = match.group(1) |
| 71 | + major, minor, patch = map(int, version_string.split('.')) |
| 72 | + |
53 | 73 | buffer = io.BytesIO() |
54 | 74 |
|
55 | 75 | buffer.seek(OFFSET_MAGIC, 0) |
56 | 76 | buffer.write(b"5283") |
57 | 77 |
|
| 78 | + buffer.seek(OFFSET_VERSION_MAJOR, 0) |
| 79 | + buffer.write(struct.pack("B", major)) |
| 80 | + buffer.seek(OFFSET_VERSION_MINOR, 0) |
| 81 | + buffer.write(struct.pack("B", minor)) |
| 82 | + buffer.seek(OFFSET_VERSION_PATCH, 0) |
| 83 | + buffer.write(struct.pack("B", patch)) |
| 84 | + |
58 | 85 | buffer.seek(OFFSET_NRF_DAT_SIZE, 0) |
59 | 86 | buffer.write(struct.pack("i", len(nrf_dat))) |
60 | 87 | buffer.seek(OFFSET_NRF_DAT, 0) |
|
0 commit comments