Skip to content

Commit 2b7d91b

Browse files
committed
Fix merge-bootloader to accept composite bootloaders
for example: Leonardo like bootloaders composed by blink+empty space+actual bootloader Signed-off-by: Martino Facchin <[email protected]>
1 parent bf70c66 commit 2b7d91b

File tree

1 file changed

+45
-1
lines changed

1 file changed

+45
-1
lines changed

Diff for: src/arduino.cc/builder/merge_sketch_with_bootloader.go

+45-1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,48 @@ func (s *MergeSketchWithBootloader) Run(context map[string]interface{}) error {
8686
return err
8787
}
8888

89+
func hexLineOnlyContainsFF(line string) bool {
90+
//:206FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1
91+
if len(line) <= 11 {
92+
return false
93+
}
94+
byteArray := []byte(line)
95+
for _, char := range byteArray[9:(len(byteArray) - 2)] {
96+
if char != 'F' {
97+
return false
98+
}
99+
}
100+
return true
101+
}
102+
103+
func extractActualBootloader(bootloader []string) []string {
104+
105+
var realBootloader []string
106+
107+
// skip until we find a line full of FFFFFF (except address and checksum)
108+
for i, row := range bootloader {
109+
if hexLineOnlyContainsFF(row) {
110+
realBootloader = bootloader[i:len(bootloader)]
111+
break
112+
}
113+
}
114+
115+
// drop all "empty" lines
116+
for i, row := range realBootloader {
117+
if !hexLineOnlyContainsFF(row) {
118+
realBootloader = realBootloader[i:len(realBootloader)]
119+
break
120+
}
121+
}
122+
123+
if len(realBootloader) == 0 {
124+
// we didn't find any line full of FFFF, thus it's a standalone bootloader
125+
realBootloader = bootloader
126+
}
127+
128+
return realBootloader
129+
}
130+
89131
func merge(builtSketchPath, bootloaderPath, mergedSketchPath string) error {
90132
sketch, err := utils.ReadFileToRows(builtSketchPath)
91133
if err != nil {
@@ -98,7 +140,9 @@ func merge(builtSketchPath, bootloaderPath, mergedSketchPath string) error {
98140
return utils.WrapError(err)
99141
}
100142

101-
for _, row := range bootloader {
143+
realBootloader := extractActualBootloader(bootloader)
144+
145+
for _, row := range realBootloader {
102146
sketch = append(sketch, row)
103147
}
104148

0 commit comments

Comments
 (0)