Files
proxmark3/common_arm/gpio
iceman1001andClaude Opus 5 (1M context) 708d400c57 gpio: let an AT91 board without an FPGA power switch build
PLATFORM=PM3ICOPYX has not compiled at all -- it dies on obj/start.o,
before anything else is built:

    common_arm/gpio/gpio_hw_at91.h:77: error: 'GPIO_FPGA_ON' undeclared
        (first use in this function); did you mean 'GPIO_FPGA_DONE'?

PA26 has two different jobs depending on the FPGA, per
config_gpio_proxmark3.h:

    #if defined XC3
    #define GPIO_FPGA_SWITCH    AT91C_PIO_PA26
    #else
    #define GPIO_FPGA_ON        AT91C_PIO_PA26
    #endif

ICopyX has no FPGA power rail to switch; that pin selects the FPGA
instead. But Gpio_FPGA_ON_High(), Gpio_FPGA_ON_Low() and
gpio_fpga_on_setup() all referenced GPIO_FPGA_ON unconditionally, so the
symbol simply does not exist on XC3.

'This board has no FPGA power switch' is already a supported case: the
AT32 port stubs both accessors with a bare '// Unsupported' comment, and
PM5 depends on that, while Gpio_FPGA_SWITCH_High()/Low() two functions
further down in this same header are guarded with #ifdef for the mirror
case. The AT91 header just never grew the XC3 arm. All three now carry
the same guard.

fpga_loader.c calls Gpio_FPGA_ON_High() from shared code; on ICopyX that
compiles to nothing, which is correct -- the rail is always on.

Verified: fullimage builds for PM3ICOPYX (356832 bytes, with
PLATFORM_EXTRAS=FLASH), and for PM3RDV4, PM3GENERIC, PM3ULTIMATE and
PM5. For the boards that do have the pin the guard costs nothing -- the
.text section is byte-identical before and after, 289464 bytes on
PM3RDV4 and 243584 on PM3GENERIC; only the embedded build timestamp and
source hash move in the full ELF.

Co-Authored-By: Claude Opus 5 (1M context)
2026-09-14 18:20:35 +02:00
..
2026-08-19 15:51:54 +02:00