From 00ab432a72b3a6a8621298a6853b69febf0fe395 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Mon, 6 Apr 2026 17:20:13 +0900 Subject: [PATCH] Add IPv6 link-local address to net_init and info response, use WaitGroup.Go --- cmd/info/main.go | 14 ++++++-------- cmd/load/main.go | 24 ++++++++---------------- firmware/firmware.cpp | 1 + firmware/include/wire.h | 5 +++-- firmware/lib/net.cpp | 12 ++++++++++++ firmware/test.cpp | 1 + lib/client/types.go | 5 +++-- 7 files changed, 34 insertions(+), 28 deletions(-) diff --git a/cmd/info/main.go b/cmd/info/main.go index d573d7e..3232741 100644 --- a/cmd/info/main.go +++ b/cmd/info/main.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "net" "os" "sync" "time" @@ -34,10 +35,8 @@ func run() error { results := make([]deviceResult, len(devs)) var wg sync.WaitGroup for i, dev := range devs { - wg.Add(1) - go func() { - defer wg.Done() - results[i].dev = dev + results[i].dev = dev + wg.Go(func() { c, err := client.NewSerial(dev, 2*time.Second) if err != nil { results[i].err = err @@ -47,7 +46,7 @@ func run() error { c.Close() results[i].info = info results[i].err = err - }() + }) } wg.Wait() @@ -60,9 +59,8 @@ func run() error { fmt.Printf(" Board ID: %02X%02X%02X%02X%02X%02X%02X%02X\n", r.info.BoardID[0], r.info.BoardID[1], r.info.BoardID[2], r.info.BoardID[3], r.info.BoardID[4], r.info.BoardID[5], r.info.BoardID[6], r.info.BoardID[7]) - fmt.Printf(" MAC: %02X:%02X:%02X:%02X:%02X:%02X\n", - r.info.MAC[0], r.info.MAC[1], r.info.MAC[2], - r.info.MAC[3], r.info.MAC[4], r.info.MAC[5]) + fmt.Printf(" MAC: %s\n", net.HardwareAddr(r.info.MAC[:])) + fmt.Printf(" Link-Local: %s\n", net.IP(r.info.LinkLocal[:])) } return nil diff --git a/cmd/load/main.go b/cmd/load/main.go index 69a5865..ac2684d 100644 --- a/cmd/load/main.go +++ b/cmd/load/main.go @@ -68,9 +68,7 @@ func run(buildDir string) error { var wg sync.WaitGroup for i := range 2 { - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { c, err := client.NewSerial(devs[i], 2*time.Second) if err != nil { errs[i] = err @@ -83,7 +81,7 @@ func run(buildDir string) error { return } serials[i] = boardSerial(info.BoardID) - }() + }) } wg.Wait() for i, err := range errs { @@ -94,9 +92,7 @@ func run(buildDir string) error { fmt.Println("Sending PICOBOOT requests...") for i := range 2 { - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { c, err := client.NewSerial(devs[i], 2*time.Second) if err != nil { errs[i] = err @@ -107,7 +103,7 @@ func run(buildDir string) error { if err != nil { errs[i] = fmt.Errorf("PICOBOOT %s: %w", devs[i], err) } - }() + }) } wg.Wait() for _, err := range errs { @@ -117,11 +113,9 @@ func run(buildDir string) error { } for i := range 2 { - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { errs[i] = picotool.WaitForBootsel(serials[i], 10*time.Second) - }() + }) } wg.Wait() for i, err := range errs { @@ -137,11 +131,9 @@ func run(buildDir string) error { fmt.Println("Loading firmware...") for i := range 2 { - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { errs[i] = picotool.Load(uf2s[i], serials[i]) - }() + }) } wg.Wait() for i, err := range errs { diff --git a/firmware/firmware.cpp b/firmware/firmware.cpp index 75af9b0..81be4dc 100644 --- a/firmware/firmware.cpp +++ b/firmware/firmware.cpp @@ -51,6 +51,7 @@ int main() { std::copy(uid.id, uid.id + 8, resp.board_id.begin()); auto ninfo = w6300::get_net_info(); resp.mac = ninfo.mac; + resp.link_local = ninfo.lla; usb.send(encode_response(msg->message_id, resp)); break; } diff --git a/firmware/include/wire.h b/firmware/include/wire.h index 703b268..3bfb7f0 100644 --- a/firmware/include/wire.h +++ b/firmware/include/wire.h @@ -47,8 +47,9 @@ struct ResponseInfo { static constexpr int8_t ext_id = 5; std::array board_id; std::array mac; - auto as_tuple() const { return std::tie(board_id, mac); } - auto as_tuple() { return std::tie(board_id, mac); } + std::array link_local; + auto as_tuple() const { return std::tie(board_id, mac, link_local); } + auto as_tuple() { return std::tie(board_id, mac, link_local); } }; static constexpr uint8_t hash_key[8] = {}; diff --git a/firmware/lib/net.cpp b/firmware/lib/net.cpp index 94415e0..61d979b 100644 --- a/firmware/lib/net.cpp +++ b/firmware/lib/net.cpp @@ -18,6 +18,18 @@ bool net_init() { info.mac[3] = uid.id[3]; info.mac[4] = uid.id[4]; info.mac[5] = uid.id[5]; + + info.lla[0] = 0xfe; + info.lla[1] = 0x80; + info.lla[8] = info.mac[0] ^ 0x02; + info.lla[9] = info.mac[1]; + info.lla[10] = info.mac[2]; + info.lla[11] = 0xff; + info.lla[12] = 0xfe; + info.lla[13] = info.mac[3]; + info.lla[14] = info.mac[4]; + info.lla[15] = info.mac[5]; + w6300::init_net(info); return true; diff --git a/firmware/test.cpp b/firmware/test.cpp index 3a109b2..71799a2 100644 --- a/firmware/test.cpp +++ b/firmware/test.cpp @@ -47,6 +47,7 @@ int main() { std::copy(uid.id, uid.id + 8, resp.board_id.begin()); auto ninfo = w6300::get_net_info(); resp.mac = ninfo.mac; + resp.link_local = ninfo.lla; usb.send(encode_response(msg->message_id, resp)); break; } diff --git a/lib/client/types.go b/lib/client/types.go index dd790b7..2127387 100644 --- a/lib/client/types.go +++ b/lib/client/types.go @@ -7,8 +7,9 @@ type ResponsePICOBOOT struct{} type RequestInfo struct{} type ResponseInfo struct { - BoardID [8]byte - MAC [6]byte + BoardID [8]byte + MAC [6]byte + LinkLocal [16]byte } type DeviceError struct {