forked from vtunr/esp32_binary_merger
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmerge_bin_esp.py
85 lines (75 loc) · 3.38 KB
/
merge_bin_esp.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import os
import argparse
class bin():
def __init__(self, file_path, addr):
self.file_path = file_path
self.file_name = os.path.basename(file_path)
self.addr = addr
self.size = self.get_size()
def get_size(self):
return int(os.path.getsize(self.file_path))
class multiple_bin():
def __init__(self, name, output_folder):
self.name = name
self.output_folder = output_folder
try:
os.makedirs(os.path.realpath(self.output_folder))
except:
pass
self.output_path = os.path.realpath(os.path.join(self.output_folder,self.name))
self.bin_array = []
def add_bin(self, file_path, addr):
self.bin_array.append(bin(file_path, addr))
def sort_bin(self):
swapped = True
while swapped:
swapped = False
for i in range(len(self.bin_array) - 1):
if self.bin_array[i].addr > self.bin_array[i + 1].addr:
self.bin_array[i], self.bin_array[i + 1] = self.bin_array[i + 1], self.bin_array[i]
swapped = True
def add_bin_to_other_bin(self, previous, binary):
with open(self.output_path, "a") as output_file:
output_file.write( '\xff' * (binary.addr-previous))
print "Add %s from 0x%x to 0x%x (0x%x)"%(binary.file_name, binary.addr, binary.addr+binary.size, binary.size)
with open(self.output_path, "a") as output_file, open(binary.file_path, "rb") as bin_file:
output_file.write(bin_file.read())
return binary.addr+binary.size
def create_bin(self):
new_start = 0
open(self.output_path, "wb").close
for b in self.bin_array:
new_start = self.add_bin_to_other_bin(new_start, b)
def check_if_possible(self):
for i in range(1, len(self.bin_array)):
if(self.bin_array[i].addr <= (self.bin_array[i-1].addr+self.bin_array[i-1].size)):
print self.bin_array[i].addr, (self.bin_array[i-1].addr+self.bin_array[i-1].size)
raise Exception("Not possible to create this bin, overlapping between %s and %s"%(self.bin_array[i].file_name, self.bin_array[i-1].file_name))
def main():
parser = argparse.ArgumentParser(description='Script to merge *.bin file at different position')
parser.add_argument(
'--output_name',
help = 'Output file name', default = "output.bin")
parser.add_argument(
'--output_folder', default = "output",
help = 'Output folder path')
parser.add_argument(
'--input_folder', default = "",
help = 'Input folder path')
parser.add_argument(
'--bin_path',nargs='+',required=True,
help = 'List of bin path, same order as bin_address (space seperated)')
parser.add_argument(
'--bin_address',nargs='+',type=lambda x: int(x,0),required=True,
help = 'List of addr, same order as bin_path (space seperated)')
parser.add_argument
args = parser.parse_args()
mb = multiple_bin(args.output_name, args.output_folder)
for path,address in zip(args.bin_path, args.bin_address):
mb.add_bin(os.path.join(args.input_folder, path), address)
mb.sort_bin()
mb.check_if_possible()
mb.create_bin()
print "%s generated with success ! (size %u)"%(args.output_name, int(os.path.getsize(mb.output_path)))
if __name__ == "__main__":
exit(main())