Skip to content

Commit 4496d1f

Browse files
jgangemideadprogram
authored andcommitted
chore: update all stubs to esp-flasher-stub v0.5.1
- replace all 9 vendored stubs with upstream release artifacts - add tools/update-stubs.sh for automated stub updates via go generate - add go:generate directive to stub.go - add development docs to README - fix golangci-lint warnings
1 parent e9d4fce commit 4496d1f

File tree

16 files changed

+96
-43
lines changed

16 files changed

+96
-43
lines changed

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,16 @@ The library is organized in layers:
174174
| Flasher | `pkg/espflasher/flasher.go` | High-level flash/verify/reset API |
175175
| CLI | `main.go` | Command-line interface |
176176

177+
## Development
178+
179+
### Updating Stubs
180+
181+
The flasher includes pre-compiled bootloader stubs from [esp-flasher-stub](https://github.com/espressif/esp-flasher-stub) releases. To update stubs:
182+
183+
1. Edit `STUB_VERSION` in `tools/update-stubs.sh` to the desired release version
184+
2. Run `go generate ./pkg/espflasher/...` to download and embed the latest stubs
185+
3. The `go:generate` directive in `pkg/espflasher/stub.go` will invoke `tools/update-stubs.sh`
186+
177187
## Protocol Reference
178188

179189
This library implements the ESP serial bootloader protocol as documented by Espressif's [esptool](https://github.com/espressif/esptool). Key protocol features:

main.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,11 @@ func main() {
112112
if err != nil {
113113
log.Fatalf("Failed to connect: %v", err)
114114
}
115-
defer flasher.Close()
115+
defer func() {
116+
if err := flasher.Close(); err != nil {
117+
log.Printf("Warning: failed to close flasher: %v", err)
118+
}
119+
}()
116120

117121
fmt.Printf("Chip: %s\n", flasher.ChipName())
118122

pkg/espflasher/flasher.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1051,5 +1051,5 @@ type StdoutLogger struct {
10511051

10521052
// Logf implements the Logger interface.
10531053
func (l *StdoutLogger) Logf(format string, args ...interface{}) {
1054-
fmt.Fprintf(l.W, format+"\n", args...)
1054+
_, _ = fmt.Fprintf(l.W, format+"\n", args...)
10551055
}

pkg/espflasher/protocol_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func TestChecksum(t *testing.T) {
2222
{
2323
name: "single byte zero",
2424
data: []byte{0x00},
25-
expected: checksumMagic ^ 0x00,
25+
expected: checksumMagic,
2626
},
2727
{
2828
name: "single byte 0xFF",

pkg/espflasher/slip.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,9 @@ func (r *slipReader) ReadFrame(timeout time.Duration) ([]byte, error) {
145145
break
146146
}
147147
readTimeout := min(remaining, 100*time.Millisecond)
148-
r.port.SetReadTimeout(readTimeout) //nolint:errcheck
148+
if err := r.port.SetReadTimeout(readTimeout); err != nil {
149+
return nil, fmt.Errorf("failed to set read timeout: %w", err)
150+
}
149151
n, err := r.port.Read(buf)
150152
if err != nil && err != io.EOF {
151153
if n == 0 {

pkg/espflasher/stub.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"fmt"
88
)
99

10+
//go:generate bash ../../tools/update-stubs.sh
1011
//go:embed stubs
1112
var stubFS embed.FS
1213

pkg/espflasher/stubs/esp32.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
{
2-
"entry": 1074521688,
3-
"text": "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",
4-
"text_start": 1074520064,
5-
"data": "DMD8P1XoC0Dr6AtAd+0LQIvpC0AO6QtAi+kLQOTpC0Dr6gtAYesLQAbrC0AB6AtAl+oLQODqC0AC6gtAgusLQCzqC0CC6wtA4ugLQETpC0CL6QtA5OkLQPToC0BP7AtAO+0LQCLnC0Bb7QtAIucLQCLnC0Ai5wtAIucLQCLnC0Ai5wtAIucLQCLnC0Dj6wtAIucLQGrsC0A77QtA",
6-
"data_start": 1073605548,
2+
"entry": 1074429964,
3+
"text": "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",
4+
"text_start": 1074429952,
5+
"data": "XJMKQCxC/T9omgpAaJoKQGiaCkBomgpAaJoKQGiaCkBomgpAaJoKQGiaCkBomgpAaJoKQGiaCkBomgpAaJoKQGiaCkBomgpAaJoKQGiaCkBomgpAaJoKQGiaCkBomgpAaJoKQGiaCkBomgpAaJoKQGiaCkBPSEFJAAAAALWKCkC7igpAI4sKQC6LCkDXiwpAb4sKQIeKCkAQjApAhowKQNGMCkAEjwpAq4wKQASPCkArjQpASo0KQFyNCkAjiwpAwo0KQNiNCkA=",
6+
"data_start": 1073605988,
77
"bss_start": 1073528832
88
}

0 commit comments

Comments
 (0)