Boot reason via watchdog scratch register, reboot/picoboot CLI commands, enum msgpack support

This commit is contained in:
Ian Gulliver
2026-04-12 08:17:22 +09:00
parent 9b7362c460
commit 6c3e0757f9
8 changed files with 110 additions and 6 deletions

View File

@@ -113,7 +113,7 @@ func closeTargets(targets []target) {
func main() {
if len(os.Args) < 2 {
slog.Error("usage: picomap <info|load|log|test> [args...]")
fmt.Fprintf(os.Stderr, "usage: picomap <command> [args...]\n\ncommands:\n info\n load\n log\n reboot\n picoboot\n test\n")
os.Exit(1)
}
cmd := os.Args[1]
@@ -127,10 +127,14 @@ func main() {
err = cmdLoad(args)
case "log":
err = cmdLog(args)
case "reboot":
err = cmdReboot(args)
case "picoboot":
err = cmdPICOBOOT(args)
case "test":
err = cmdTestGroup(args)
default:
slog.Error("usage: picomap <info|load|log|test> [args...]")
fmt.Fprintf(os.Stderr, "usage: picomap <command> [args...]\n\ncommands:\n info\n load\n log\n reboot\n picoboot\n test\n")
os.Exit(1)
}
if err != nil {
@@ -145,7 +149,8 @@ func printInfo(via string, info *client.ResponseInfo) {
"board_id", hex.EncodeToString(info.BoardID[:]),
"mac", net.HardwareAddr(info.MAC[:]).String(),
"ip", net.IP(info.IP[:]).String(),
"firmware", info.FirmwareName)
"firmware", info.FirmwareName,
"boot", info.Boot.String())
}
func cmdInfo(args []string) error {
@@ -199,6 +204,48 @@ func cmdLog(args []string) error {
return nil
}
func cmdReboot(args []string) error {
fs := flag.NewFlagSet("reboot", flag.ExitOnError)
tf := addTargetFlags(fs)
fs.Parse(args)
targets, err := tf.connect(500 * time.Millisecond)
if err != nil {
return err
}
defer closeTargets(targets)
for _, t := range targets {
if err := t.client.Reboot(); err != nil {
slog.Error("reboot error", "via", t.name, "err", err)
continue
}
slog.Info("rebooted", "via", t.name)
}
return nil
}
func cmdPICOBOOT(args []string) error {
fs := flag.NewFlagSet("picoboot", flag.ExitOnError)
tf := addTargetFlags(fs)
fs.Parse(args)
targets, err := tf.connect(500 * time.Millisecond)
if err != nil {
return err
}
defer closeTargets(targets)
for _, t := range targets {
if err := t.client.PICOBOOT(); err != nil {
slog.Error("picoboot error", "via", t.name, "err", err)
continue
}
slog.Info("picoboot", "via", t.name)
}
return nil
}
func boardSerial(id [8]byte) string {
return fmt.Sprintf("%02X%02X%02X%02X%02X%02X%02X%02X",
id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7])