From 0b52df0caf5bc19122be44984c30aed233829f02 Mon Sep 17 00:00:00 2001 From: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com> Date: Mon, 19 Oct 2026 21:54:22 +0330 Subject: [PATCH] fix: disable Urclock metadata for adapter firmware writes --- .../internal/programmer/libavrdude_adapter.go | 2 +- .../programmer/libavrdude_adapter_test.go | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Tools/Controller/internal/programmer/libavrdude_adapter.go b/Tools/Controller/internal/programmer/libavrdude_adapter.go index 20d5fe49..09b4cdc2 100644 --- a/Tools/Controller/internal/programmer/libavrdude_adapter.go +++ b/Tools/Controller/internal/programmer/libavrdude_adapter.go @@ -172,7 +172,7 @@ func libavrdudeAdapterArguments(options Options, configuration, programmer strin switch options.Operation { case OperationWriteFlash: if programmer == "urclock" { - args = append(args, "--no-auto-erase") + args = append(args, "--no-auto-erase", "--extended", "nometadata") } update = "flash:w:" + options.HexPath + ":i" case OperationReadFlash: diff --git a/Tools/Controller/internal/programmer/libavrdude_adapter_test.go b/Tools/Controller/internal/programmer/libavrdude_adapter_test.go index 969fe0f8..afd699d8 100644 --- a/Tools/Controller/internal/programmer/libavrdude_adapter_test.go +++ b/Tools/Controller/internal/programmer/libavrdude_adapter_test.go @@ -124,3 +124,22 @@ func TestNonDefaultAVRRequiresExplicitGeometry(t *testing.T) { t.Fatalf("unexpected non-default AVR command: %s", joined) } } + +// The firmware identity occupies the end of application flash. Urclock metadata +// must not reserve its final byte; this must match the CLI uploader contract. +func TestLibavrdudeUrclockFlashDisablesMetadata(t *testing.T) { + for _, programmer := range []string{"urclock", "usbasp"} { + args, err := libavrdudeAdapterArguments(Options{ + MCU: "atmega328p", Operation: OperationWriteFlash, + HexPath: "firmware.hex", BaudRate: 115200, + }, "avrdude.conf", programmer) + if err != nil { + t.Fatal(err) + } + joined := strings.Join(args, " ") + got := strings.Contains(joined, "--extended nometadata") + if got != (programmer == "urclock") { + t.Fatalf("%s metadata policy: %s", programmer, joined) + } + } +}