Skip to content

Commit 6e78509

Browse files
cmaglieumbynos
andcommitted
Bunch of refactorings / Added support for Arduino Nano RP2040 Connect (#20)
* Close flasher after completing operations * Refactored and simplified Programmer - removed DumpAndFlash (it doesn't work reliably) - simplified ctx message passing * Removed now unused DumpAndFlash methods * Added Arduino Nano RP2040 Connect support * Fix upload problems * Fixed bossac init... ooops * fix import removed by error * bump arduino-cli -> include the latest updates in serialutils.go Co-authored-by: Umberto Baldi <[email protected]> Co-authored-by: Umberto Baldi <[email protected]>
1 parent cef9dfc commit 6e78509

File tree

12 files changed

+209
-147
lines changed

12 files changed

+209
-147
lines changed
1.24 MB
Binary file not shown.

Diff for: go.mod

+4-3
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ go 1.14
66
replace go.bug.st/serial => github.com/cmaglie/go-serial v0.0.0-20200923162623-b214c147e37e
77

88
require (
9-
github.com/arduino/arduino-cli v0.0.0-20200924151007-69ac12c98b2b
10-
github.com/arduino/go-paths-helper v1.3.2
9+
github.com/arduino/arduino-cli v0.0.0-20210422154105-5aa424818026
10+
github.com/arduino/go-paths-helper v1.4.0
11+
github.com/imjasonmiller/godice v0.1.2 // indirect
1112
github.com/pkg/errors v0.9.1
1213
github.com/stretchr/testify v1.6.1
13-
go.bug.st/serial v1.1.1
14+
go.bug.st/serial v1.1.2
1415
)

Diff for: go.sum

+60
Large diffs are not rendered by default.

Diff for: main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
"github.com/arduino/FirmwareUploader/utils/context"
1616
)
1717

18-
var ctx context.Context
18+
var ctx = &context.Context{}
1919

2020
func init() {
2121
flag.StringVar(&ctx.PortName, "port", "", "serial port to use for flashing")

Diff for: modules/nina/main.go

+22-31
Original file line numberDiff line numberDiff line change
@@ -28,24 +28,25 @@ import (
2828
"strconv"
2929
"strings"
3030

31+
"github.com/arduino/FirmwareUploader/programmers/rp2040load"
3132
"github.com/arduino/FirmwareUploader/programmers/avrdude"
3233
"github.com/arduino/FirmwareUploader/programmers/bossac"
3334
"github.com/arduino/FirmwareUploader/utils/context"
3435
)
3536

36-
var f *Flasher
37+
var flasher *Flasher
3738
var payloadSize uint16
3839
var programmer context.Programmer
3940

40-
func Run(ctx context.Context) {
41-
42-
var err error
41+
func Run(ctx *context.Context) {
4342

4443
if ctx.ProgrammerPath != "" {
4544
if strings.Contains(filepath.Base(ctx.ProgrammerPath), "bossac") {
46-
programmer = &bossac.Bossac{}
45+
programmer = bossac.NewBossac(ctx)
4746
} else if strings.Contains(filepath.Base(ctx.ProgrammerPath), "avrdude") {
48-
programmer = &avrdude.Avrdude{}
47+
programmer = avrdude.NewAvrdude(ctx)
48+
} else if strings.Contains(filepath.Base(ctx.ProgrammerPath), "rp2040load") {
49+
programmer = rp2040load.NewRP2040Load(ctx)
4950
} else {
5051
log.Fatal("Programmer path not specified correctly, programmer path set to: " + ctx.ProgrammerPath)
5152
}
@@ -56,34 +57,27 @@ func Run(ctx context.Context) {
5657
if programmer == nil {
5758
log.Fatal("ERROR: You must specify a programmer!")
5859
}
59-
if ctx.BinaryToRestore == "" {
60-
ctx.BinaryToRestore, err = programmer.DumpAndFlash(&ctx, ctx.FWUploaderBinary)
61-
} else {
62-
err = programmer.Flash(&ctx, ctx.FWUploaderBinary)
63-
}
64-
if err != nil {
60+
if err := programmer.Flash(ctx.FWUploaderBinary, nil); err != nil {
6561
log.Fatal(err)
6662
}
6763
}
6864

6965
log.Println("Connecting to programmer")
70-
if _f, err := OpenFlasher(ctx.PortName); err != nil {
66+
if f, err := OpenFlasher(ctx.PortName); err != nil {
7167
log.Fatal(err)
7268
} else {
73-
f = _f
69+
flasher = f
7470
}
75-
defer f.Close()
7671

7772
// Synchronize with programmer
7873
log.Println("Sync with programmer")
79-
if err := f.Hello(); err != nil {
74+
if err := flasher.Hello(); err != nil {
8075
log.Fatal(err)
8176
}
8277

8378
// Check maximum supported payload size
8479
log.Println("Reading max payload size")
85-
_payloadSize, err := f.GetMaximumPayloadSize()
86-
if err != nil {
80+
if _payloadSize, err := flasher.GetMaximumPayloadSize(); err != nil {
8781
log.Fatal(err)
8882
} else {
8983
payloadSize = _payloadSize
@@ -111,25 +105,22 @@ func Run(ctx context.Context) {
111105
}
112106
}
113107

114-
if ctx.BinaryToRestore != "" {
115-
f.Close()
108+
flasher.Close()
116109

117-
log.Println("Restoring previous sketch")
110+
if ctx.BinaryToRestore != "" {
111+
log.Println("Restoring binary")
118112
if programmer == nil {
119113
log.Fatal("ERROR: You must specify a programmer!")
120114
}
121-
if err := programmer.Flash(&ctx, ctx.BinaryToRestore); err != nil {
115+
if err := programmer.Flash(ctx.BinaryToRestore, nil); err != nil {
122116
log.Fatal(err)
123117
}
124-
125-
// just to allow cleanup via defer()
126-
// f.port, _ = OpenSerial(ctx.PortName)
127118
}
128119
}
129120

130121
func readAllFlash() error {
131122
for i := 0; i < 256; i++ {
132-
if data, err := f.Read(uint32(i*1024), 1024); err != nil {
123+
if data, err := flasher.Read(uint32(i*1024), 1024); err != nil {
133124
log.Fatal(err)
134125
} else {
135126
os.Stdout.Write(data)
@@ -138,7 +129,7 @@ func readAllFlash() error {
138129
return nil
139130
}
140131

141-
func flashCerts(ctx context.Context) error {
132+
func flashCerts(ctx *context.Context) error {
142133
CertificatesOffset := 0x10000
143134

144135
if ctx.RootCertDir != "" {
@@ -164,7 +155,7 @@ func flashCerts(ctx context.Context) error {
164155
return flashChunk(CertificatesOffset, certificatesData, false)
165156
}
166157

167-
func flashFirmware(ctx context.Context) error {
158+
func flashFirmware(ctx *context.Context) error {
168159
FirmwareOffset := 0x0000
169160

170161
log.Printf("Flashing firmware from '%v'", ctx.FirmwareFile)
@@ -181,7 +172,7 @@ func flashChunk(offset int, buffer []byte, doChecksum bool) error {
181172
chunkSize := int(payloadSize)
182173
bufferLength := len(buffer)
183174

184-
if err := f.Erase(uint32(offset), uint32(bufferLength)); err != nil {
175+
if err := flasher.Erase(uint32(offset), uint32(bufferLength)); err != nil {
185176
return err
186177
}
187178

@@ -192,15 +183,15 @@ func flashChunk(offset int, buffer []byte, doChecksum bool) error {
192183
if end > bufferLength {
193184
end = bufferLength
194185
}
195-
if err := f.Write(uint32(offset+i), buffer[start:end]); err != nil {
186+
if err := flasher.Write(uint32(offset+i), buffer[start:end]); err != nil {
196187
return err
197188
}
198189
}
199190

200191
fmt.Println("")
201192

202193
if doChecksum {
203-
return f.Md5sum(buffer)
194+
return flasher.Md5sum(buffer)
204195
} else {
205196
return nil
206197
}

Diff for: modules/sara/main.go

+13-24
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,12 @@ var f *Flasher
3333
var payloadSize uint16
3434
var programmer context.Programmer
3535

36-
func Run(ctx context.Context) {
37-
38-
var err error
39-
programmer = &bossac.Bossac{}
36+
func Run(ctx *context.Context) {
37+
programmer := bossac.NewBossac(ctx)
4038

4139
if ctx.FWUploaderBinary != "" {
4240
log.Println("Flashing firmware uploader sara")
43-
if ctx.BinaryToRestore == "" {
44-
ctx.BinaryToRestore, err = programmer.DumpAndFlash(&ctx, ctx.FWUploaderBinary)
45-
} else {
46-
err = programmer.Flash(&ctx, ctx.FWUploaderBinary)
47-
}
48-
if err != nil {
41+
if err := programmer.Flash(ctx.FWUploaderBinary, nil); err != nil {
4942
log.Fatal(err)
5043
}
5144
}
@@ -56,7 +49,6 @@ func Run(ctx context.Context) {
5649
} else {
5750
f = _f
5851
}
59-
defer f.Close()
6052

6153
time.Sleep(2 * time.Second)
6254

@@ -68,42 +60,39 @@ func Run(ctx context.Context) {
6860

6961
// Check maximum supported payload size
7062
log.Println("Reading actual firmware version")
71-
fwVersion, err := f.GetFwVersion()
72-
if err != nil {
63+
64+
if fwVersion, err := f.GetFwVersion(); err != nil {
7365
log.Fatal(err)
7466
} else {
75-
payloadSize = 128
67+
log.Println("Initial firmware version: " + fwVersion)
7668
}
7769

78-
log.Println("Initial firmware version: " + fwVersion)
70+
payloadSize = 128
7971

8072
if ctx.FirmwareFile != "" {
8173
if err := flashFirmware(ctx); err != nil {
8274
log.Fatal(err)
8375
}
8476
}
8577

86-
fwVersion, err = f.GetFwVersion()
87-
if err != nil {
78+
if fwVersion, err := f.GetFwVersion(); err != nil {
8879
log.Fatal(err)
80+
} else {
81+
log.Println("After applying update firmware version: " + fwVersion)
8982
}
9083

91-
log.Println("After applying update firmware version: " + fwVersion)
84+
f.Close()
9285

9386
if ctx.BinaryToRestore != "" {
9487
log.Println("Restoring previous sketch")
95-
f.Close()
9688

97-
if err := programmer.Flash(&ctx, ctx.BinaryToRestore); err != nil {
89+
if err := programmer.Flash(ctx.BinaryToRestore, nil); err != nil {
9890
log.Fatal(err)
9991
}
100-
101-
// just to allow cleanup via defer()
102-
// f.port, _ = OpenSerial(ctx.PortName)
10392
}
10493
}
10594

106-
func flashFirmware(ctx context.Context) error {
95+
func flashFirmware(ctx *context.Context) error {
10796
FirmwareOffset := 0x0000
10897

10998
log.Printf("Flashing firmware from '%v'", ctx.FirmwareFile)

Diff for: modules/winc/main.go

+8-17
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,13 @@ import (
3535
var f *Flasher
3636
var payloadSize uint16
3737

38-
func Run(ctx context.Context) {
38+
func Run(ctx *context.Context) {
3939

40-
var err error
41-
programmer := &bossac.Bossac{}
40+
programmer := bossac.NewBossac(ctx)
4241

4342
if ctx.FWUploaderBinary != "" {
4443
log.Println("Flashing firmware uploader winc")
45-
if ctx.BinaryToRestore == "" {
46-
ctx.BinaryToRestore, err = programmer.DumpAndFlash(&ctx, ctx.FWUploaderBinary)
47-
} else {
48-
err = programmer.Flash(&ctx, ctx.FWUploaderBinary)
49-
}
50-
if err != nil {
44+
if err := programmer.Flash(ctx.FWUploaderBinary, nil); err != nil {
5145
log.Fatal(err)
5246
}
5347
}
@@ -58,7 +52,6 @@ func Run(ctx context.Context) {
5852
} else {
5953
f = _f
6054
}
61-
defer f.Close()
6255

6356
// Synchronize with programmer
6457
log.Println("Sync with programmer")
@@ -97,16 +90,14 @@ func Run(ctx context.Context) {
9790
}
9891
}
9992

93+
f.Close()
94+
10095
if ctx.BinaryToRestore != "" {
10196
log.Println("Restoring previous sketch")
102-
f.Close()
10397

104-
if err := programmer.Flash(&ctx, ctx.BinaryToRestore); err != nil {
98+
if err := programmer.Flash(ctx.BinaryToRestore, nil); err != nil {
10599
log.Fatal(err)
106100
}
107-
108-
// just to allow cleanup via defer()
109-
// f.port, _ = OpenSerial(ctx.PortName)
110101
}
111102
}
112103

@@ -121,7 +112,7 @@ func readAllFlash() error {
121112
return nil
122113
}
123114

124-
func flashCerts(ctx context.Context) error {
115+
func flashCerts(ctx *context.Context) error {
125116
CertificatesOffset := 0x4000
126117

127118
if ctx.RootCertDir != "" {
@@ -136,7 +127,7 @@ func flashCerts(ctx context.Context) error {
136127
return flashChunk(CertificatesOffset, certificatesData)
137128
}
138129

139-
func flashFirmware(ctx context.Context) error {
130+
func flashFirmware(ctx *context.Context) error {
140131
FirmwareOffset := 0x0000
141132

142133
log.Printf("Flashing firmware from '%v'", ctx.FirmwareFile)

0 commit comments

Comments
 (0)