flpr-host

M33-side companion to examples/hello-vpr.

  • Embeds the FLPR firmware blob in the M33 image’s .rodata via flpr-blob.h (generated by tools/flpr-blob-gen.py).

  • Performs the SPU + VPR boot dance to release the FLPR from reset (memcpy to 0x20028000, SPU PERIPH[12].PERM SECATTR=Secure, INITPC, CPURUN).

  • Polls the shared counter at 0x2003F000 every second and logs over UART.

  • Blinks LED1 (gpio1.10) at 2 Hz, distinct from the FLPR’s 1 Hz LED0.

Build / Flash

cd examples/flpr-host
gmake TARGET=nrf BOARD=nrf54l15/dk WERROR=0 flpr-host.flash

The Makefile rebuilds ../hello-vpr and regenerates flpr-blob.h automatically when needed.

Console

gmake TARGET=nrf BOARD=nrf54l15/dk WERROR=0 PORT=/dev/cu.usbmodem* login

Expected:

[INFO: flpr-host ] M33 boot complete, blob=N bytes
[INFO: flpr-host ] Blob memcpy'd to 0x20028000
[INFO: flpr-host ] SPU PERIPH[12] before=0x8001000a after=0x8001001a
[INFO: flpr-host ] M33 is in SECURE mode (SPU S access succeeded)
[INFO: flpr-host ] VPR_S after launch: INITPC=0x20028000 CPURUN=0x1
[INFO: flpr-host ] [FLPR] tick 2
[INFO: flpr-host ] [FLPR] tick 4
...

If you see [FLPR] counter 0xFA1100XX mepc=0xYYYYYYYY, the FLPR took a CPU exception. XX is mcause (5 = load access fault, 7 = store access fault, 2 = illegal instruction, …), and mepc is the faulting PC. The M33 keeps reading and printing both registers so faults aren’t silent.

See doc/platforms/nrf-vpr.md for the full port documentation.