diff --git a/main.go b/main.go index 3c169bf9..48a3a279 100644 --- a/main.go +++ b/main.go @@ -431,6 +431,26 @@ func Flash(pkgName, target, port string, config *BuildConfig) error { time.Sleep(3 * time.Second) } + // this flashing method copies the binary data to a Mass Storage Device (msd) + if spec.FlashMethod == "msd" { + switch fileExt { + case ".uf2": + err := flashUF2UsingMSD(spec.FlashVolume, tmppath) + if err != nil { + return &commandError{"failed to flash", tmppath, err} + } + return nil + case ".hex": + err := flashHexUsingMSD(spec.FlashVolume, tmppath) + if err != nil { + return &commandError{"failed to flash", tmppath, err} + } + return nil + default: + return errors.New("mass storage device flashing currently only supports uf2 and hex") + } + } + // Create the command. flashCmd := spec.Flasher fileToken := "{" + fileExt[1:] + "}" @@ -574,6 +594,42 @@ func touchSerialPortAt1200bps(port string) error { return nil } +func flashUF2UsingMSD(volume, tmppath string) error { + // find standard UF2 info path + infoPath := "/media/*/" + volume + "/INFO_UF2.TXT" + if runtime.GOOS == "darwin" { + infoPath = "/Volumes/" + volume + "/INFO_UF2.TXT" + } + + d, err := filepath.Glob(infoPath) + if err != nil { + return err + } + if d == nil { + return errors.New("unable to locate UF2 device:" + volume) + } + + return moveFile(tmppath, filepath.Dir(d[0])+"/flash.uf2") +} + +func flashHexUsingMSD(volume, tmppath string) error { + // find expected volume path + destPath := "/media/*/" + volume + if runtime.GOOS == "darwin" { + destPath = "/Volumes/" + volume + } + + d, err := filepath.Glob(destPath) + if err != nil { + return err + } + if d == nil { + return errors.New("unable to locate device:" + volume) + } + + return moveFile(tmppath, d[0]+"/flash.hex") +} + // parseSize converts a human-readable size (with k/m/g suffix) into a plain // number. func parseSize(s string) (int64, error) { diff --git a/target.go b/target.go index c3fea39f..69fde7d8 100644 --- a/target.go +++ b/target.go @@ -26,27 +26,29 @@ var TINYGOROOT string // https://doc.rust-lang.org/nightly/nightly-rustc/rustc_target/spec/struct.TargetOptions.html // https://github.com/shepmaster/rust-arduino-blink-led-no-core-with-cargo/blob/master/blink/arduino.json type TargetSpec struct { - Inherits []string `json:"inherits"` - Triple string `json:"llvm-target"` - CPU string `json:"cpu"` - Features []string `json:"features"` - GOOS string `json:"goos"` - GOARCH string `json:"goarch"` - BuildTags []string `json:"build-tags"` - GC string `json:"gc"` - Scheduler string `json:"scheduler"` - Compiler string `json:"compiler"` - Linker string `json:"linker"` - RTLib string `json:"rtlib"` // compiler runtime library (libgcc, compiler-rt) - CFlags []string `json:"cflags"` - LDFlags []string `json:"ldflags"` - ExtraFiles []string `json:"extra-files"` - Emulator []string `json:"emulator"` - Flasher string `json:"flash"` - OCDDaemon []string `json:"ocd-daemon"` - GDB string `json:"gdb"` - GDBCmds []string `json:"gdb-initial-cmds"` - PortReset string `json:"flash-1200-bps-reset"` + Inherits []string `json:"inherits"` + Triple string `json:"llvm-target"` + CPU string `json:"cpu"` + Features []string `json:"features"` + GOOS string `json:"goos"` + GOARCH string `json:"goarch"` + BuildTags []string `json:"build-tags"` + GC string `json:"gc"` + Scheduler string `json:"scheduler"` + Compiler string `json:"compiler"` + Linker string `json:"linker"` + RTLib string `json:"rtlib"` // compiler runtime library (libgcc, compiler-rt) + CFlags []string `json:"cflags"` + LDFlags []string `json:"ldflags"` + ExtraFiles []string `json:"extra-files"` + Emulator []string `json:"emulator"` + Flasher string `json:"flash"` + OCDDaemon []string `json:"ocd-daemon"` + GDB string `json:"gdb"` + GDBCmds []string `json:"gdb-initial-cmds"` + PortReset string `json:"flash-1200-bps-reset"` + FlashMethod string `json:"flash-method"` + FlashVolume string `json:"flash-msd-volume-name"` } // copyProperties copies all properties that are set in spec2 into itself. @@ -104,6 +106,12 @@ func (spec *TargetSpec) copyProperties(spec2 *TargetSpec) { if spec2.PortReset != "" { spec.PortReset = spec2.PortReset } + if spec2.FlashMethod != "" { + spec.FlashMethod = spec2.FlashMethod + } + if spec2.FlashVolume != "" { + spec.FlashVolume = spec2.FlashVolume + } } // load reads a target specification from the JSON in the given io.Reader. It @@ -233,15 +241,16 @@ func defaultTarget(goos, goarch, triple string) (*TargetSpec, error) { // No target spec available. Use the default one, useful on most systems // with a regular OS. spec := TargetSpec{ - Triple: triple, - GOOS: goos, - GOARCH: goarch, - BuildTags: []string{goos, goarch}, - Compiler: "clang", - Linker: "cc", - GDB: "gdb", - GDBCmds: []string{"run"}, - PortReset: "false", + Triple: triple, + GOOS: goos, + GOARCH: goarch, + BuildTags: []string{goos, goarch}, + Compiler: "clang", + Linker: "cc", + GDB: "gdb", + GDBCmds: []string{"run"}, + PortReset: "false", + FlashMethod: "command", } if goos == "darwin" { spec.LDFlags = append(spec.LDFlags, "-Wl,-dead_strip") diff --git a/targets/circuitplay-express.json b/targets/circuitplay-express.json index 1c052177..b4a1059c 100644 --- a/targets/circuitplay-express.json +++ b/targets/circuitplay-express.json @@ -1,5 +1,8 @@ { "inherits": ["atsamd21g18a"], "build-tags": ["sam", "atsamd21g18a", "circuitplay_express"], - "flash": "uf2conv.py {bin}" + "flash": "{uf2}", + "flash-1200-bps-reset": "true", + "flash-method": "msd", + "flash-msd-volume-name": "CPLAYBOOT" } diff --git a/targets/feather-m0.json b/targets/feather-m0.json index c0bf2924..5397fbfc 100644 --- a/targets/feather-m0.json +++ b/targets/feather-m0.json @@ -1,5 +1,8 @@ { "inherits": ["atsamd21g18a"], "build-tags": ["sam", "atsamd21g18a", "feather_m0"], - "flash": "bossac -d -i -e -w -v -R --port={port} --offset=0x2000 {hex}" + "flash": "{uf2}", + "flash-1200-bps-reset": "true", + "flash-method": "msd", + "flash-msd-volume-name": "FEATHERBOOT" } diff --git a/targets/hifive1b.json b/targets/hifive1b.json index 9161c77b..c0ab3aaf 100644 --- a/targets/hifive1b.json +++ b/targets/hifive1b.json @@ -3,5 +3,8 @@ "build-tags": ["hifive1b"], "ldflags": [ "-T", "targets/hifive1b.ld" - ] + ], + "flash": "{hex}", + "flash-method": "msd", + "flash-msd-volume-name": "HiFive" } diff --git a/targets/itsybitsy-m0.json b/targets/itsybitsy-m0.json index d5d25cc3..1f093685 100644 --- a/targets/itsybitsy-m0.json +++ b/targets/itsybitsy-m0.json @@ -1,5 +1,8 @@ { "inherits": ["atsamd21g18a"], "build-tags": ["sam", "atsamd21g18a", "itsybitsy_m0"], - "flash": "bossac -d -i -e -w -v -R --port={port} --offset=0x2000 {hex}" + "flash": "{uf2}", + "flash-1200-bps-reset": "true", + "flash-method": "msd", + "flash-msd-volume-name": "ITSYBOOT" } diff --git a/targets/itsybitsy-m4.json b/targets/itsybitsy-m4.json index 24e90187..152898a6 100644 --- a/targets/itsybitsy-m4.json +++ b/targets/itsybitsy-m4.json @@ -1,5 +1,8 @@ { "inherits": ["atsamd51g19a"], "build-tags": ["sam", "atsamd51g19a", "itsybitsy_m4"], - "flash": "bossac -d -i -e -w -v -R --offset=0x4000 {bin}" + "flash": "{uf2}", + "flash-1200-bps-reset": "true", + "flash-method": "msd", + "flash-msd-volume-name": "ITSYM4BOOT" } diff --git a/targets/microbit.json b/targets/microbit.json index d2cd698d..daf91a40 100644 --- a/targets/microbit.json +++ b/targets/microbit.json @@ -3,5 +3,7 @@ "build-tags": ["microbit"], "flash": "openocd -f interface/cmsis-dap.cfg -f target/nrf51.cfg -c 'program {hex} reset exit'", "ocd-daemon": ["openocd", "-f", "interface/cmsis-dap.cfg", "-f", "target/nrf51.cfg"], - "gdb-initial-cmds": ["target remote :3333", "monitor halt", "load", "monitor reset", "c"] + "gdb-initial-cmds": ["target remote :3333", "monitor halt", "load", "monitor reset", "c"], + "flash-method": "msd", + "flash-msd-volume-name": "MICROBIT" } diff --git a/targets/trinket-m0.json b/targets/trinket-m0.json index 7ab370cc..198cc873 100644 --- a/targets/trinket-m0.json +++ b/targets/trinket-m0.json @@ -1,5 +1,8 @@ { "inherits": ["atsamd21e18a"], "build-tags": ["sam", "atsamd21e18a", "trinket_m0"], - "flash": "bossac -d -i -e -w -v -R --port={port} --offset=0x2000 {hex}" + "flash": "{uf2}", + "flash-1200-bps-reset": "true", + "flash-method": "msd", + "flash-msd-volume-name": "TRINKETBOOT" }