forked from arduino/nina-fw
-
Notifications
You must be signed in to change notification settings - Fork 43
/
Copy pathcombine.py
69 lines (53 loc) · 1.99 KB
/
combine.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/bin/env python
import re
import sys
def extract_firmware_version():
with open('main/CommandHandler.cpp', 'r') as file:
for line in file:
if 'const char FIRMWARE_VERSION[] = ' in line:
# The line format is `const char FIRMWARE_VERSION[] = "2.0.0-adafruit";`
# Split by double quote and get the second element
version = line.split('"')[1]
return version
booloaderData = open("build/bootloader/bootloader.bin", "rb").read()
partitionData = open("build/partitions.bin", "rb").read()
#phyData = open("data/phy.bin", "rb").read()
appData = open("build/nina-fw.bin", "rb").read()
# remove everything between certificate markers to save space. There might be comments and other information.
certsData = b""
with open("certificates/data/roots.pem", "rb") as certs_file:
in_cert = False
for line in certs_file:
if line.startswith(b"-----BEGIN CERTIFICATE-----"):
in_cert = True
if in_cert:
certsData += line
if line.startswith(b"-----END CERTIFICATE-----"):
in_cert = False
# calculate the output binary size, app offset
outputSize = 0x30000 + len(appData)
if outputSize % 1024:
outputSize += 1024 - (outputSize % 1024)
# allocate and init to 0xff
outputData = bytearray(b"\xff") * outputSize
# copy data: bootloader, partitions, app
for i in range(0, len(booloaderData)):
outputData[0x1000 + i] = booloaderData[i]
for i in range(0, len(partitionData)):
outputData[0x8000 + i] = partitionData[i]
#for i in range(0, len(phyData)):
# outputData[0xf000 + i] = phyData[i]
for i in range(0, len(certsData)):
outputData[0x10000 + i] = certsData[i]
# zero terminate the pem file
outputData[0x10000 + len(certsData)] = 0
for i in range(0, len(appData)):
outputData[0x30000 + i] = appData[i]
version = extract_firmware_version()
outputFilename = f"NINA_W102-{version}.bin"
if len(sys.argv) > 1:
outputFilename = sys.argv[1]
# write out
with open(outputFilename, "w+b") as f:
f.seek(0)
f.write(outputData)