flash: support flashing boards using Mass Storage Device (MSD) operation for uf2 and daplink bootloaders
Signed-off-by: Ron Evans <ron@hybridgroup.com>
Этот коммит содержится в:
		
							родитель
							
								
									02facb8568
								
							
						
					
					
						коммит
						ba49148644
					
				
					 9 изменённых файлов: 122 добавлений и 37 удалений
				
			
		
							
								
								
									
										56
									
								
								main.go
									
										
									
									
									
								
							
							
						
						
									
										56
									
								
								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) { | ||||
|  |  | |||
|  | @ -47,6 +47,8 @@ type TargetSpec struct { | |||
| 	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 | ||||
|  | @ -242,6 +250,7 @@ func defaultTarget(goos, goarch, triple string) (*TargetSpec, error) { | |||
| 		GDB:         "gdb", | ||||
| 		GDBCmds:     []string{"run"}, | ||||
| 		PortReset:   "false", | ||||
| 		FlashMethod: "command", | ||||
| 	} | ||||
| 	if goos == "darwin" { | ||||
| 		spec.LDFlags = append(spec.LDFlags, "-Wl,-dead_strip") | ||||
|  |  | |||
|  | @ -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" | ||||
| } | ||||
|  |  | |||
|  | @ -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" | ||||
| } | ||||
|  |  | |||
|  | @ -3,5 +3,8 @@ | |||
| 	"build-tags": ["hifive1b"], | ||||
| 	"ldflags": [ | ||||
| 		"-T", "targets/hifive1b.ld" | ||||
| 	] | ||||
| 	], | ||||
| 	"flash": "{hex}", | ||||
| 	"flash-method": "msd", | ||||
|     "flash-msd-volume-name": "HiFive" | ||||
| } | ||||
|  |  | |||
|  | @ -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" | ||||
| } | ||||
|  |  | |||
|  | @ -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" | ||||
| } | ||||
|  |  | |||
|  | @ -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" | ||||
| } | ||||
|  |  | |||
|  | @ -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" | ||||
| } | ||||
|  |  | |||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче
	
	 Ron Evans
						Ron Evans