Skip to content

Refactors and fix to serial write overrun #11

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Sep 29, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,11 @@ The full list of command line options can be obtained with the `-h` option: `./u

== How to build the tools from source file ==

go get github.com/arduino/FirmwareUpdater/cli
From the sources root directory run:

This will create a bin folder with `cli` executable in it.
go build -o updater

This will create the `updater` executable.

== License ==

Expand Down
32 changes: 16 additions & 16 deletions distrib.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/bin/bash
#!/bin/bash -ex

VERSION=`cd src/github.com/arduino/FirmwareUpdater/cli && git describe --tags`
VERSION=`git describe --tags`
FILENAME="FirmwareUpdater"

rm -rf distrib
Expand All @@ -13,22 +13,22 @@ mkdir -p distrib/windows

export CGO_ENABLED=0

GOOS=linux GOARCH=amd64 go build -o distrib/linux64/updater github.com/arduino/FirmwareUpdater/cli
GOOS=linux GOARCH=386 GO386=387 go build -o distrib/linux32/updater github.com/arduino/FirmwareUpdater/cli
GOOS=linux GOARCH=arm go build -o distrib/linuxarm/updater github.com/arduino/FirmwareUpdater/cli
GOOS=linux GOARCH=arm64 go build -o distrib/linuxarm64/updater github.com/arduino/FirmwareUpdater/cli
GOOS=windows GOARCH=386 GO386=387 go build -o distrib/windows/updater.exe github.com/arduino/FirmwareUpdater/cli
GOOS=linux GOARCH=amd64 go build -o distrib/linux64/updater
GOOS=linux GOARCH=386 GO386=387 go build -o distrib/linux32/updater
GOOS=linux GOARCH=arm go build -o distrib/linuxarm/updater
GOOS=linux GOARCH=arm64 go build -o distrib/linuxarm64/updater
GOOS=windows GOARCH=386 GO386=387 go build -o distrib/windows/updater.exe

#export CGO_ENABLED=1
# need osxcross in path
GOOS=darwin GOARCH=amd64 go build -o distrib/osx/updater github.com/arduino/FirmwareUpdater/cli
GOOS=darwin GOARCH=amd64 go build -o distrib/osx/updater

cp -r $GOPATH/src/github.com/arduino/FirmwareUpdater/firmwares distrib/linux64
cp -r $GOPATH/src/github.com/arduino/FirmwareUpdater/firmwares distrib/linux32
cp -r $GOPATH/src/github.com/arduino/FirmwareUpdater/firmwares distrib/linuxarm
cp -r $GOPATH/src/github.com/arduino/FirmwareUpdater/firmwares distrib/linuxarm64
cp -r $GOPATH/src/github.com/arduino/FirmwareUpdater/firmwares distrib/windows
cp -r $GOPATH/src/github.com/arduino/FirmwareUpdater/firmwares distrib/osx
cp -r firmwares distrib/linux64
cp -r firmwares distrib/linux32
cp -r firmwares distrib/linuxarm
cp -r firmwares distrib/linuxarm64
cp -r firmwares distrib/windows
cp -r firmwares distrib/osx

cd distrib/linux64 && tar cjf ../${FILENAME}-${VERSION}-linux64.tar.bz2 * && cd -
LINUX64_SHA=`sha256sum distrib/${FILENAME}-${VERSION}-linux64.tar.bz2 | cut -f1 -d " "`
Expand Down Expand Up @@ -59,7 +59,7 @@ echo "=============================="
echo "BOARD MANAGER SNIPPET"
echo "=============================="

cat $GOPATH/src/github.com/arduino/FirmwareUpdater/extras/package_index.json.template |
cat extras/package_index.json.template |
sed "s/%%VERSION%%/${VERSION}/" |
sed "s/%%FILENAME%%/${FILENAME}/" |
sed "s/%%LINUX64_SHA%%/${LINUX64_SHA}/" |
Expand All @@ -76,4 +76,4 @@ sed "s/%%WINDOWS_SHA%%/${WINDOWS_SHA}/" |
sed "s/%%WINDOWS_SIZE%%/${WINDOWS_SIZE}/"

# call the tool with something like
# ./linux64/updater -flasher firmwares/NINA/FirmwareUpdater.mkrwifi1010.ino.bin -firmware firmwares/NINA/1.2.1/NINA_W102.bin -port /dev/ttyACM0 -address arduino.cc:443 -restore_binary /tmp/arduino_build_619137/WiFiSSLClient.ino.bin -programmer {runtime.tools.bossac}/bossac
# ./linux64/updater -flasher firmwares/NINA/FirmwareUpdater.mkrwifi1010.ino.bin -firmware firmwares/NINA/1.2.1/NINA_W102.bin -port /dev/ttyACM0 -address arduino.cc:443 -restore_binary /tmp/arduino_build_619137/WiFiSSLClient.ino.bin -programmer {runtime.tools.bossac}/bossac
10 changes: 6 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ module github.com/arduino/FirmwareUpdater

go 1.14

// branch with support for serial timeouts
replace go.bug.st/serial => github.com/cmaglie/go-serial v0.0.0-20200923162623-b214c147e37e

require (
github.com/creack/goselect v0.0.0-20180501195510-58854f77ee8d // indirect
github.com/facchinm/go-serial v0.0.0-20190206110233-459a153afba0
go.bug.st/serial.v1 v0.0.0-20180827123349-5f7892a7bb45
golang.org/x/sys v0.0.0-20190411185658-b44545bcd369 // indirect
github.com/arduino/arduino-cli v0.0.0-20200924151007-69ac12c98b2b
github.com/pkg/errors v0.9.1
go.bug.st/serial v1.1.1
)
337 changes: 331 additions & 6 deletions go.sum

Large diffs are not rendered by default.

File renamed without changes.
26 changes: 19 additions & 7 deletions modules/nina/flasher.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,14 @@
package nina

import (
"bytes"
"crypto/md5"
"encoding/binary"
"github.com/arduino/FirmwareUpdater/utils"
"log"
"time"

serial "github.com/facchinm/go-serial"
"github.com/arduino/FirmwareUpdater/utils"
"go.bug.st/serial"
)

type FlasherError struct {
Expand Down Expand Up @@ -169,13 +170,14 @@ func (flasher *Flasher) serialFillBuffer(buffer []byte) error {
}

func (flasher *Flasher) sendCommand(command byte, address uint32, val uint32, payload []byte) error {
if err := binary.Write(flasher.port, binary.BigEndian, command); err != nil {
buff := new(bytes.Buffer)
if err := binary.Write(buff, binary.BigEndian, command); err != nil {
return err
}
if err := binary.Write(flasher.port, binary.BigEndian, address); err != nil {
if err := binary.Write(buff, binary.BigEndian, address); err != nil {
return err
}
if err := binary.Write(flasher.port, binary.BigEndian, val); err != nil {
if err := binary.Write(buff, binary.BigEndian, val); err != nil {
return err
}
var length uint16
Expand All @@ -184,13 +186,23 @@ func (flasher *Flasher) sendCommand(command byte, address uint32, val uint32, pa
} else {
length = uint16(len(payload))
}
if err := binary.Write(flasher.port, binary.BigEndian, length); err != nil {
if err := binary.Write(buff, binary.BigEndian, length); err != nil {
return err
}
if payload != nil {
if _, err := flasher.port.Write(payload); err != nil {
buff.Write(payload)
}
data := buff.Bytes()
for {
sent, err := flasher.port.Write(data)
if err != nil {
return err
}
if sent == len(data) {
break
}
// fmt.Println("HEY! sent", sent, "out of", len(data))
data = data[sent:]
}
return nil
}
Expand Down
16 changes: 11 additions & 5 deletions modules/sara/flasher.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,12 @@
package sara

import (
"github.com/arduino/FirmwareUpdater/utils"
serial "github.com/facchinm/go-serial"
"log"
"strings"
"time"
//"strconv"

"github.com/arduino/FirmwareUpdater/utils"
"go.bug.st/serial"
)

type FlasherError struct {
Expand Down Expand Up @@ -124,8 +124,14 @@ func (flasher *Flasher) serialFillBuffer(buffer []byte) error {

func (flasher *Flasher) sendCommand(payload []byte) error {
if payload != nil {
if _, err := flasher.port.Write(payload); err != nil {
return err
for {
if sent, err := flasher.port.Write(payload); err != nil {
return err
} else if sent < len(payload) {
payload = payload[sent:]
} else {
break
}
}
}
return nil
Expand Down
28 changes: 21 additions & 7 deletions modules/winc/flasher.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,13 @@
package winc

import (
"bytes"
"encoding/binary"
"github.com/arduino/FirmwareUpdater/utils"
serial "github.com/facchinm/go-serial"
"log"
"time"

"github.com/arduino/FirmwareUpdater/utils"
"go.bug.st/serial"
)

type FlasherError struct {
Expand Down Expand Up @@ -167,13 +169,14 @@ func (flasher *Flasher) serialFillBuffer(buffer []byte) error {
}

func (flasher *Flasher) sendCommand(command byte, address uint32, val uint32, payload []byte) error {
if err := binary.Write(flasher.port, binary.BigEndian, command); err != nil {
buff := new(bytes.Buffer)
if err := binary.Write(buff, binary.BigEndian, command); err != nil {
return err
}
if err := binary.Write(flasher.port, binary.BigEndian, address); err != nil {
if err := binary.Write(buff, binary.BigEndian, address); err != nil {
return err
}
if err := binary.Write(flasher.port, binary.BigEndian, val); err != nil {
if err := binary.Write(buff, binary.BigEndian, val); err != nil {
return err
}
var length uint16
Expand All @@ -182,13 +185,24 @@ func (flasher *Flasher) sendCommand(command byte, address uint32, val uint32, pa
} else {
length = uint16(len(payload))
}
if err := binary.Write(flasher.port, binary.BigEndian, length); err != nil {
if err := binary.Write(buff, binary.BigEndian, length); err != nil {
return err
}
if payload != nil {
if _, err := flasher.port.Write(payload); err != nil {
buff.Write(payload)
}

data := buff.Bytes()
for {
sent, err := flasher.port.Write(data)
if err != nil {
return err
}
if sent == len(data) {
break
}
// fmt.Println("HEY! sent", sent, "out of", len(data))
data = data[sent:]
}
return nil
}
Expand Down
8 changes: 4 additions & 4 deletions modules/winc/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,22 +23,22 @@ import (
"bytes"
"errors"
"fmt"
"github.com/arduino/FirmwareUpdater/programmers/bossac"
"github.com/arduino/FirmwareUpdater/utils/context"
"io/ioutil"
"log"
"os"
"strconv"

"github.com/arduino/FirmwareUpdater/programmers/bossac"
"github.com/arduino/FirmwareUpdater/utils/context"
)

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

func Run(ctx context.Context) {

var err error
programmer = &bossac.Bossac{}
programmer := &bossac.Bossac{}

if ctx.FWUploaderBinary != "" {
log.Println("Flashing firmware uploader winc")
Expand Down
Loading