Skip to content

Commit

Permalink
Bunch of refactorings / Added support for Arduino Nano RP2040 Connect (
Browse files Browse the repository at this point in the history
…#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 <34278123+umbynos@users.noreply.github.com>
Co-authored-by: Umberto Baldi <u.baldi@arduino.cc>
  • Loading branch information
3 people committed Apr 23, 2021
1 parent cef9dfc commit 6e78509
Show file tree
Hide file tree
Showing 12 changed files with 209 additions and 147 deletions.
Binary file not shown.
7 changes: 4 additions & 3 deletions go.mod
Expand Up @@ -6,9 +6,10 @@ go 1.14
replace go.bug.st/serial => github.com/cmaglie/go-serial v0.0.0-20200923162623-b214c147e37e

require (
github.com/arduino/arduino-cli v0.0.0-20200924151007-69ac12c98b2b
github.com/arduino/go-paths-helper v1.3.2
github.com/arduino/arduino-cli v0.0.0-20210422154105-5aa424818026
github.com/arduino/go-paths-helper v1.4.0
github.com/imjasonmiller/godice v0.1.2 // indirect
github.com/pkg/errors v0.9.1
github.com/stretchr/testify v1.6.1
go.bug.st/serial v1.1.1
go.bug.st/serial v1.1.2
)
60 changes: 60 additions & 0 deletions go.sum

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion main.go
Expand Up @@ -15,7 +15,7 @@ import (
"github.com/arduino/FirmwareUploader/utils/context"
)

var ctx context.Context
var ctx = &context.Context{}

func init() {
flag.StringVar(&ctx.PortName, "port", "", "serial port to use for flashing")
Expand Down
53 changes: 22 additions & 31 deletions modules/nina/main.go
Expand Up @@ -28,24 +28,25 @@ import (
"strconv"
"strings"

"github.com/arduino/FirmwareUploader/programmers/rp2040load"
"github.com/arduino/FirmwareUploader/programmers/avrdude"
"github.com/arduino/FirmwareUploader/programmers/bossac"
"github.com/arduino/FirmwareUploader/utils/context"
)

var f *Flasher
var flasher *Flasher
var payloadSize uint16
var programmer context.Programmer

func Run(ctx context.Context) {

var err error
func Run(ctx *context.Context) {

if ctx.ProgrammerPath != "" {
if strings.Contains(filepath.Base(ctx.ProgrammerPath), "bossac") {
programmer = &bossac.Bossac{}
programmer = bossac.NewBossac(ctx)
} else if strings.Contains(filepath.Base(ctx.ProgrammerPath), "avrdude") {
programmer = &avrdude.Avrdude{}
programmer = avrdude.NewAvrdude(ctx)
} else if strings.Contains(filepath.Base(ctx.ProgrammerPath), "rp2040load") {
programmer = rp2040load.NewRP2040Load(ctx)
} else {
log.Fatal("Programmer path not specified correctly, programmer path set to: " + ctx.ProgrammerPath)
}
Expand All @@ -56,34 +57,27 @@ func Run(ctx context.Context) {
if programmer == nil {
log.Fatal("ERROR: You must specify a programmer!")
}
if ctx.BinaryToRestore == "" {
ctx.BinaryToRestore, err = programmer.DumpAndFlash(&ctx, ctx.FWUploaderBinary)
} else {
err = programmer.Flash(&ctx, ctx.FWUploaderBinary)
}
if err != nil {
if err := programmer.Flash(ctx.FWUploaderBinary, nil); err != nil {
log.Fatal(err)
}
}

log.Println("Connecting to programmer")
if _f, err := OpenFlasher(ctx.PortName); err != nil {
if f, err := OpenFlasher(ctx.PortName); err != nil {
log.Fatal(err)
} else {
f = _f
flasher = f
}
defer f.Close()

// Synchronize with programmer
log.Println("Sync with programmer")
if err := f.Hello(); err != nil {
if err := flasher.Hello(); err != nil {
log.Fatal(err)
}

// Check maximum supported payload size
log.Println("Reading max payload size")
_payloadSize, err := f.GetMaximumPayloadSize()
if err != nil {
if _payloadSize, err := flasher.GetMaximumPayloadSize(); err != nil {
log.Fatal(err)
} else {
payloadSize = _payloadSize
Expand Down Expand Up @@ -111,25 +105,22 @@ func Run(ctx context.Context) {
}
}

if ctx.BinaryToRestore != "" {
f.Close()
flasher.Close()

log.Println("Restoring previous sketch")
if ctx.BinaryToRestore != "" {
log.Println("Restoring binary")
if programmer == nil {
log.Fatal("ERROR: You must specify a programmer!")
}
if err := programmer.Flash(&ctx, ctx.BinaryToRestore); err != nil {
if err := programmer.Flash(ctx.BinaryToRestore, nil); err != nil {
log.Fatal(err)
}

// just to allow cleanup via defer()
// f.port, _ = OpenSerial(ctx.PortName)
}
}

func readAllFlash() error {
for i := 0; i < 256; i++ {
if data, err := f.Read(uint32(i*1024), 1024); err != nil {
if data, err := flasher.Read(uint32(i*1024), 1024); err != nil {
log.Fatal(err)
} else {
os.Stdout.Write(data)
Expand All @@ -138,7 +129,7 @@ func readAllFlash() error {
return nil
}

func flashCerts(ctx context.Context) error {
func flashCerts(ctx *context.Context) error {
CertificatesOffset := 0x10000

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

func flashFirmware(ctx context.Context) error {
func flashFirmware(ctx *context.Context) error {
FirmwareOffset := 0x0000

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

if err := f.Erase(uint32(offset), uint32(bufferLength)); err != nil {
if err := flasher.Erase(uint32(offset), uint32(bufferLength)); err != nil {
return err
}

Expand All @@ -192,15 +183,15 @@ func flashChunk(offset int, buffer []byte, doChecksum bool) error {
if end > bufferLength {
end = bufferLength
}
if err := f.Write(uint32(offset+i), buffer[start:end]); err != nil {
if err := flasher.Write(uint32(offset+i), buffer[start:end]); err != nil {
return err
}
}

fmt.Println("")

if doChecksum {
return f.Md5sum(buffer)
return flasher.Md5sum(buffer)
} else {
return nil
}
Expand Down
37 changes: 13 additions & 24 deletions modules/sara/main.go
Expand Up @@ -33,19 +33,12 @@ var f *Flasher
var payloadSize uint16
var programmer context.Programmer

func Run(ctx context.Context) {

var err error
programmer = &bossac.Bossac{}
func Run(ctx *context.Context) {
programmer := bossac.NewBossac(ctx)

if ctx.FWUploaderBinary != "" {
log.Println("Flashing firmware uploader sara")
if ctx.BinaryToRestore == "" {
ctx.BinaryToRestore, err = programmer.DumpAndFlash(&ctx, ctx.FWUploaderBinary)
} else {
err = programmer.Flash(&ctx, ctx.FWUploaderBinary)
}
if err != nil {
if err := programmer.Flash(ctx.FWUploaderBinary, nil); err != nil {
log.Fatal(err)
}
}
Expand All @@ -56,7 +49,6 @@ func Run(ctx context.Context) {
} else {
f = _f
}
defer f.Close()

time.Sleep(2 * time.Second)

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

// Check maximum supported payload size
log.Println("Reading actual firmware version")
fwVersion, err := f.GetFwVersion()
if err != nil {

if fwVersion, err := f.GetFwVersion(); err != nil {
log.Fatal(err)
} else {
payloadSize = 128
log.Println("Initial firmware version: " + fwVersion)
}

log.Println("Initial firmware version: " + fwVersion)
payloadSize = 128

if ctx.FirmwareFile != "" {
if err := flashFirmware(ctx); err != nil {
log.Fatal(err)
}
}

fwVersion, err = f.GetFwVersion()
if err != nil {
if fwVersion, err := f.GetFwVersion(); err != nil {
log.Fatal(err)
} else {
log.Println("After applying update firmware version: " + fwVersion)
}

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

if ctx.BinaryToRestore != "" {
log.Println("Restoring previous sketch")
f.Close()

if err := programmer.Flash(&ctx, ctx.BinaryToRestore); err != nil {
if err := programmer.Flash(ctx.BinaryToRestore, nil); err != nil {
log.Fatal(err)
}

// just to allow cleanup via defer()
// f.port, _ = OpenSerial(ctx.PortName)
}
}

func flashFirmware(ctx context.Context) error {
func flashFirmware(ctx *context.Context) error {
FirmwareOffset := 0x0000

log.Printf("Flashing firmware from '%v'", ctx.FirmwareFile)
Expand Down
25 changes: 8 additions & 17 deletions modules/winc/main.go
Expand Up @@ -35,19 +35,13 @@ import (
var f *Flasher
var payloadSize uint16

func Run(ctx context.Context) {
func Run(ctx *context.Context) {

var err error
programmer := &bossac.Bossac{}
programmer := bossac.NewBossac(ctx)

if ctx.FWUploaderBinary != "" {
log.Println("Flashing firmware uploader winc")
if ctx.BinaryToRestore == "" {
ctx.BinaryToRestore, err = programmer.DumpAndFlash(&ctx, ctx.FWUploaderBinary)
} else {
err = programmer.Flash(&ctx, ctx.FWUploaderBinary)
}
if err != nil {
if err := programmer.Flash(ctx.FWUploaderBinary, nil); err != nil {
log.Fatal(err)
}
}
Expand All @@ -58,7 +52,6 @@ func Run(ctx context.Context) {
} else {
f = _f
}
defer f.Close()

// Synchronize with programmer
log.Println("Sync with programmer")
Expand Down Expand Up @@ -97,16 +90,14 @@ func Run(ctx context.Context) {
}
}

f.Close()

if ctx.BinaryToRestore != "" {
log.Println("Restoring previous sketch")
f.Close()

if err := programmer.Flash(&ctx, ctx.BinaryToRestore); err != nil {
if err := programmer.Flash(ctx.BinaryToRestore, nil); err != nil {
log.Fatal(err)
}

// just to allow cleanup via defer()
// f.port, _ = OpenSerial(ctx.PortName)
}
}

Expand All @@ -121,7 +112,7 @@ func readAllFlash() error {
return nil
}

func flashCerts(ctx context.Context) error {
func flashCerts(ctx *context.Context) error {
CertificatesOffset := 0x4000

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

func flashFirmware(ctx context.Context) error {
func flashFirmware(ctx *context.Context) error {
FirmwareOffset := 0x0000

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

0 comments on commit 6e78509

Please sign in to comment.