diff --git a/README.md b/README.md index cda62df5..17d60e8a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Firmware/Certificates updater for WINC and NINA Wifi module -Use this tool to update the firmware and/or add SSL certificates for any WINC, NINA or SARA module. +Use this tool to update the firmware and/or add SSL certificates for any WINC, NINA module. ## Install diff --git a/cli/certificates/flash.go b/cli/certificates/flash.go index 425b2262..03de824f 100644 --- a/cli/certificates/flash.go +++ b/cli/certificates/flash.go @@ -170,8 +170,6 @@ func run(cmd *cobra.Command, args []string) { switch moduleName { case "NINA": f, err = flasher.NewNinaFlasher(uploadPort) - case "SARA": - f, err = flasher.NewSaraFlasher(uploadPort) case "WINC1500": f, err = flasher.NewWincFlasher(uploadPort) default: diff --git a/cli/firmware/flash.go b/cli/firmware/flash.go index 2e7738bf..a5e41116 100644 --- a/cli/firmware/flash.go +++ b/cli/firmware/flash.go @@ -215,8 +215,6 @@ func updateFirmware(board *firmwareindex.IndexBoard, commandLine []string, modul switch moduleName { case "NINA": f, err = flasher.NewNinaFlasher(uploadPort) - case "SARA": - f, err = flasher.NewSaraFlasher(uploadPort) case "WINC1500": f, err = flasher.NewWincFlasher(uploadPort) default: diff --git a/firmwares/SARA/5.6A2_01/5.6A2.00-to-5.6A2.01.pkg b/firmwares/SARA/5.6A2_01/5.6A2.00-to-5.6A2.01.pkg deleted file mode 100644 index 6c96a7a2..00000000 Binary files a/firmwares/SARA/5.6A2_01/5.6A2.00-to-5.6A2.01.pkg and /dev/null differ diff --git a/firmwares/SARA/5.6A2_01/5.6A2_01_to_99.pkg b/firmwares/SARA/5.6A2_01/5.6A2_01_to_99.pkg deleted file mode 100644 index cae66b22..00000000 Binary files a/firmwares/SARA/5.6A2_01/5.6A2_01_to_99.pkg and /dev/null differ diff --git a/firmwares/SARA/5.6A2_01/99_to_5.6A2_01.pkg b/firmwares/SARA/5.6A2_01/99_to_5.6A2_01.pkg deleted file mode 100644 index ab0250d4..00000000 Binary files a/firmwares/SARA/5.6A2_01/99_to_5.6A2_01.pkg and /dev/null differ diff --git a/firmwares/SARA/SerialSARAPassthrough.ino.bin b/firmwares/SARA/SerialSARAPassthrough.ino.bin deleted file mode 100755 index 1e743cca..00000000 Binary files a/firmwares/SARA/SerialSARAPassthrough.ino.bin and /dev/null differ diff --git a/flasher/sara.go b/flasher/sara.go deleted file mode 100644 index b2d0b1b2..00000000 --- a/flasher/sara.go +++ /dev/null @@ -1,230 +0,0 @@ -/* - arduino-fwuploader - Copyright (c) 2021 Arduino LLC. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -package flasher - -import ( - "fmt" - "io" - "strconv" - "strings" - "time" - - "github.com/arduino/go-paths-helper" - "github.com/sirupsen/logrus" - "go.bug.st/serial" -) - -func NewSaraFlasher(portAddress string) (*SaraFlasher, error) { - port, err := openSerial(portAddress) - if err != nil { - logrus.Error(err) - return nil, err - } - // Magic numbers ¯\_(ツ)_/¯ - return &SaraFlasher{port: port, payloadSize: 128}, nil -} - -type SaraFlasher struct { - port serial.Port - payloadSize int -} - -func (f *SaraFlasher) FlashFirmware(firmwareFile *paths.Path, flasherOut io.Writer) error { - logrus.Infof("Flashing firmware %s", firmwareFile) - flasherOut.Write([]byte(fmt.Sprintf("Flashing firmware %s\n", firmwareFile))) - data, err := firmwareFile.ReadFile() - if err != nil { - logrus.Error(err) - return err - } - - _, err = f.expectMinBytes("AT+ULSTFILE", "+ULSTFILE:", 1000, 0) - if err != nil { - logrus.Error(err) - return err - } - - _, err = f.expectMinBytes("AT+UDWNFILE=\"UPDATE.BIN\","+strconv.Itoa(len(data))+",\"FOAT\"", ">", 20000, 0) - if err != nil { - logrus.Error(err) - return err - } - - firmwareOffset := 0x0000 - err = f.flashChunk(firmwareOffset, data) - if err != nil { - logrus.Error(err) - return err - } - - time.Sleep(1 * time.Second) - - _, err = f.expectMinBytes("", "OK", 1000, 0) - if err != nil { - logrus.Error(err) - return err - } - - _, err = f.expectMinBytes("AT+UFWINSTALL", "OK", 60000, 0) - if err != nil { - logrus.Error(err) - return err - } - - time.Sleep(10 * time.Second) - - // wait up to 20 minutes trying to ping the module. After 20 minutes signal the error - start := time.Now() - for time.Since(start) < time.Minute*20 { - err = f.hello() - if err == nil { - return nil - } - time.Sleep(1 * time.Second) - } - - if err != nil { - logrus.Error(err) - } - logrus.Infof("Flashed all the things") - flasherOut.Write([]byte("Flashed all the things\n")) - return nil -} - -func (f *SaraFlasher) FlashCertificates(certificatePaths *paths.PathList, URLs []string, _ io.Writer) error { - return fmt.Errorf("not supported by SaraFlasher") -} - -func (f *SaraFlasher) Close() error { - return f.port.Close() -} - -func (f *SaraFlasher) hello() error { - f.expectMinBytes("ATE0", "OK", 100, 0) - f.expectMinBytes("ATE0", "OK", 100, 0) - f.expectMinBytes("ATE0", "OK", 100, 0) - _, err := f.expectMinBytes("AT", "OK", 100, 0) - if err != nil { - logrus.Error(err) - } - return err -} - -func (f *SaraFlasher) write(address uint32, buffer []byte) error { - return f.sendCommand(CommandData{ - Payload: buffer, - }) -} - -func (f *SaraFlasher) flashChunk(offset int, buffer []byte) error { - bufferLength := len(buffer) - - for i := 0; i < bufferLength; i += f.payloadSize { - logrus.Debugf("Flashing chunk: %s%%", strconv.Itoa((i*100)/bufferLength)) - start := i - end := i + f.payloadSize - if end > bufferLength { - end = bufferLength - } - if err := f.write(uint32(offset+i), buffer[start:end]); err != nil { - logrus.Error(err) - return err - } - //time.Sleep(1 * time.Millisecond) - } - - return nil -} - -func (f *SaraFlasher) getMaximumPayloadSize() (uint16, error) { - return 0, fmt.Errorf("not supported by SaraFlasher") -} - -func (f *SaraFlasher) serialFillBuffer(buffer []byte) error { - read := 0 - for read < len(buffer) { - n, err := f.port.Read(buffer[read:]) - if err != nil { - logrus.Error(err) - return err - } - if n == 0 { - err = &FlasherError{err: "Serial port closed unexpectedly"} - logrus.Error(err) - return err - } - read += n - } - return nil -} - -func (f *SaraFlasher) sendCommand(data CommandData) error { - logrus.Debugf("sending command data %s", data) - if data.Payload != nil { - for { - if sent, err := f.port.Write(data.Payload); err != nil { - logrus.Error(err) - return err - } else if sent < len(data.Payload) { - data.Payload = data.Payload[sent:] - } else { - break - } - } - } - return nil -} - -func (f *SaraFlasher) expectMinBytes(buffer string, response string, timeout int, min_bytes int) (string, error) { - err := f.sendCommand(CommandData{ - Payload: []byte(buffer + "\r\n"), - }) - if err != nil { - logrus.Error(err) - return "", err - } - - // Receive response - var res []byte - n := 0 - - start := time.Now() - for (time.Since(start) < time.Duration(timeout)*time.Millisecond && !strings.Contains(string(res), response)) || (len(res) < min_bytes) { - data := 0 - partial := make([]byte, 65535) - data, err = f.port.Read(partial) - res = append(res, partial[:data]...) - n += data - if err != nil { - logrus.Error(err) - return "", err - } - } - - if !strings.Contains(string(res), response) { - err = FlasherError{err: fmt.Sprintf("Expected %s, got %s", response, res)} - logrus.Error(err) - return string(res), err - } - return string(res), nil -} -func (f *SaraFlasher) getFirmwareVersion() (string, error) { - return f.expectMinBytes("ATI9", "05.06,A.02.", 100, 25) -} diff --git a/generator/generator.py b/generator/generator.py index 1019c0f5..89536efa 100644 --- a/generator/generator.py +++ b/generator/generator.py @@ -13,7 +13,6 @@ "nano_33_iot": "arduino:samd:nano_33_iot", "mkrvidor4000": "arduino:samd:mkrvidor4000", "uno2018": "arduino:megaavr:uno2018", - "mkrnb1500": "arduino:samd:mkrnb1500", "nanorp2040connect": "arduino:mbed_nano:nanorp2040connect", } @@ -212,7 +211,6 @@ def generate_boards_json(input_data, arduino_cli_path): "firmware": [], }, "arduino:megaavr:uno2018": {"fqbn": "arduino:megaavr:uno2018", "firmware": []}, - "arduino:samd:mkrnb1500": {"fqbn": "arduino:samd:mkrnb1500", "firmware": []}, "arduino:mbed_nano:nanorp2040connect": { "fqbn": "arduino:mbed_nano:nanorp2040connect", "firmware": [], diff --git a/generator/raw_boards.json b/generator/raw_boards.json index 553d0434..36eb6e6c 100644 --- a/generator/raw_boards.json +++ b/generator/raw_boards.json @@ -473,40 +473,6 @@ } ] }, - "mkrnb1500": { - "firmwares/SARA": [ - { - "version": "SARA", - "Path": "firmwares/SARA/SerialSARAPassthrough.ino.bin", - "Name": "firmwares SARA", - "IsLoader": true - } - ], - "firmwares/SARA/5.6A2.00-to-5.6A2.01": [ - { - "version": "SARA/5.6A2.00-to-5.6A2.01", - "Path": "firmwares/SARA/5.6A2_01/5.6A2.00-to-5.6A2.01.pkg", - "Name": "SARA 5.6A2_01 (5.6A2.00-to-5.6A2.01.pkg)", - "IsLoader": false - } - ], - "firmwares/SARA/5.6A2_01_to_99": [ - { - "version": "SARA/5.6A2_01_to_99", - "Path": "firmwares/SARA/5.6A2_01/5.6A2_01_to_99.pkg", - "Name": "SARA 5.6A2_01 (5.6A2_01_to_99.pkg)", - "IsLoader": false - } - ], - "firmwares/SARA/99_to_5.6A2_01": [ - { - "version": "SARA/99_to_5.6A2_01", - "Path": "firmwares/SARA/5.6A2_01/99_to_5.6A2_01.pkg", - "Name": "SARA 5.6A2_01 (99_to_5.6A2_01.pkg)", - "IsLoader": false - } - ] - }, "nanorp2040connect": { "firmwares/NINA": [ { diff --git a/indexes/download/testdata/module_firmware_index.json b/indexes/download/testdata/module_firmware_index.json index 0cced4e7..a54a59fb 100644 --- a/indexes/download/testdata/module_firmware_index.json +++ b/indexes/download/testdata/module_firmware_index.json @@ -464,46 +464,6 @@ "linux": "\"{tool_dir}/bin/avrdude\" \"-C{tool_dir}/etc/avrdude.conf\" -v -patmega4809 -cxplainedmini_updi -Pusb -b115200 -e -D \"-Uflash:w:{loader.sketch}.hex:i\" \"-Ufuse2:w:0x01:m\" \"-Ufuse5:w:0xC9:m\" \"-Ufuse8:w:0x02:m\" " } }, - { - "fqbn": "arduino:samd:mkrnb1500", - "firmware": [ - { - "version": "5.6A2.00-to-5.6A2.01", - "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/SARA/5.6A2.00-to-5.6A2.01/5.6A2.00-to-5.6A2.01.pkg", - "checksum": "SHA-256:8f04bd7fa1833cf2d3762e086d79191e76bf66c6e108e852b5fe89ca4f2b72c9", - "size": "529880", - "module": "SARA" - }, - { - "version": "5.6A2_01_to_99", - "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/SARA/5.6A2_01_to_99/5.6A2_01_to_99.pkg", - "checksum": "SHA-256:abb947accdeb980d7aeafed45ac7ce797eb90445eeb8d0bd57ca5b3ad204dbf6", - "size": "1738", - "module": "SARA" - }, - { - "version": "99_to_5.6A2_01", - "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/SARA/99_to_5.6A2_01/99_to_5.6A2_01.pkg", - "checksum": "SHA-256:81618148c677d8c36df5089c931b46476f4a78fd9d9fd231fee0a9dbb38aa970", - "size": "1724", - "module": "SARA" - } - ], - "loader_sketch": { - "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/loader/arduino.samd.mkrnb1500/loader.bin", - "checksum": "SHA-256:a627ff76588626eacaaec2a2f5719e3fcf069fda2b32f8ace4f2703f1768f142", - "size": "11312" - }, - "module": "SARA", - "name": "Arduino MKR NB 1500", - "uploader": "arduino:bossac@1.7.0-arduino3", - "upload.use_1200bps_touch": true, - "upload.wait_for_upload_port": true, - "uploader.command": { - "linux": "\"{tool_dir}/bossac\" -i -d --port={serial.port.file} -U true -i -e -w -v \"{loader.sketch}.bin\" -R", - "windows": "\"{tool_dir}\\bossac.exe\" -i -d --port={serial.port.file} -U true -i -e -w -v \"{loader.sketch}.bin\" -R" - } - }, { "fqbn": "arduino:mbed_nano:nanorp2040connect", "firmware": [ @@ -517,8 +477,8 @@ ], "loader_sketch": { "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/loader/arduino.mbed_nano.nanorp2040connect/loader.elf", - "checksum": "SHA-256:263fe2389f9a4ee3ba5938f2115faad3bbb9c775821a598a66f0f1708e64fc01", - "size": "1649504" + "checksum": "SHA-256:4b67381122df67a210c29d01f01153f34cdeea77593f7e5e12259e3c85b472f0", + "size": "1639020" }, "module": "NINA", "name": "Arduino Nano RP2040 Connect", diff --git a/indexes/download/testdata/module_firmware_index.json.sig b/indexes/download/testdata/module_firmware_index.json.sig index 7cd3f151..e408a2ad 100644 Binary files a/indexes/download/testdata/module_firmware_index.json.sig and b/indexes/download/testdata/module_firmware_index.json.sig differ diff --git a/indexes/firmwareindex/firmwareindex.go b/indexes/firmwareindex/firmwareindex.go index d66106b5..673ac571 100644 --- a/indexes/firmwareindex/firmwareindex.go +++ b/indexes/firmwareindex/firmwareindex.go @@ -120,10 +120,6 @@ func LoadIndexNoSign(jsonIndexFile *paths.Path) (*Index, error) { // Determine latest firmware for each board for _, board := range index.Boards { - if board.Module == "SARA" { - // TODO implement?? by default you have to specify the version - continue - } for _, firmware := range board.Firmwares { if board.LatestFirmware == nil || firmware.Version.GreaterThan(board.LatestFirmware.Version) { board.LatestFirmware = firmware diff --git a/indexes/firmwareindex/testdata/module_firmware_index.json b/indexes/firmwareindex/testdata/module_firmware_index.json index 0cced4e7..a54a59fb 100644 --- a/indexes/firmwareindex/testdata/module_firmware_index.json +++ b/indexes/firmwareindex/testdata/module_firmware_index.json @@ -464,46 +464,6 @@ "linux": "\"{tool_dir}/bin/avrdude\" \"-C{tool_dir}/etc/avrdude.conf\" -v -patmega4809 -cxplainedmini_updi -Pusb -b115200 -e -D \"-Uflash:w:{loader.sketch}.hex:i\" \"-Ufuse2:w:0x01:m\" \"-Ufuse5:w:0xC9:m\" \"-Ufuse8:w:0x02:m\" " } }, - { - "fqbn": "arduino:samd:mkrnb1500", - "firmware": [ - { - "version": "5.6A2.00-to-5.6A2.01", - "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/SARA/5.6A2.00-to-5.6A2.01/5.6A2.00-to-5.6A2.01.pkg", - "checksum": "SHA-256:8f04bd7fa1833cf2d3762e086d79191e76bf66c6e108e852b5fe89ca4f2b72c9", - "size": "529880", - "module": "SARA" - }, - { - "version": "5.6A2_01_to_99", - "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/SARA/5.6A2_01_to_99/5.6A2_01_to_99.pkg", - "checksum": "SHA-256:abb947accdeb980d7aeafed45ac7ce797eb90445eeb8d0bd57ca5b3ad204dbf6", - "size": "1738", - "module": "SARA" - }, - { - "version": "99_to_5.6A2_01", - "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/SARA/99_to_5.6A2_01/99_to_5.6A2_01.pkg", - "checksum": "SHA-256:81618148c677d8c36df5089c931b46476f4a78fd9d9fd231fee0a9dbb38aa970", - "size": "1724", - "module": "SARA" - } - ], - "loader_sketch": { - "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/loader/arduino.samd.mkrnb1500/loader.bin", - "checksum": "SHA-256:a627ff76588626eacaaec2a2f5719e3fcf069fda2b32f8ace4f2703f1768f142", - "size": "11312" - }, - "module": "SARA", - "name": "Arduino MKR NB 1500", - "uploader": "arduino:bossac@1.7.0-arduino3", - "upload.use_1200bps_touch": true, - "upload.wait_for_upload_port": true, - "uploader.command": { - "linux": "\"{tool_dir}/bossac\" -i -d --port={serial.port.file} -U true -i -e -w -v \"{loader.sketch}.bin\" -R", - "windows": "\"{tool_dir}\\bossac.exe\" -i -d --port={serial.port.file} -U true -i -e -w -v \"{loader.sketch}.bin\" -R" - } - }, { "fqbn": "arduino:mbed_nano:nanorp2040connect", "firmware": [ @@ -517,8 +477,8 @@ ], "loader_sketch": { "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/loader/arduino.mbed_nano.nanorp2040connect/loader.elf", - "checksum": "SHA-256:263fe2389f9a4ee3ba5938f2115faad3bbb9c775821a598a66f0f1708e64fc01", - "size": "1649504" + "checksum": "SHA-256:4b67381122df67a210c29d01f01153f34cdeea77593f7e5e12259e3c85b472f0", + "size": "1639020" }, "module": "NINA", "name": "Arduino Nano RP2040 Connect", diff --git a/indexes/firmwareindex/testdata/module_firmware_index.json.sig b/indexes/firmwareindex/testdata/module_firmware_index.json.sig index 7cd3f151..e408a2ad 100644 Binary files a/indexes/firmwareindex/testdata/module_firmware_index.json.sig and b/indexes/firmwareindex/testdata/module_firmware_index.json.sig differ