Skip to content

Add RP2350 port (Intech Studio Grid RP2350) - #12

Open
SukuWc wants to merge 3 commits into
masterfrom
rp2350-port
Open

SukuWc wants to merge 3 commits into
masterfrom
rp2350-port

Conversation

@SukuWc

@SukuWc SukuWc commented Nov 11, 2026

Copy link
Copy Markdown
Member

Summary

Adds an RP2350 port (Arm secure) built on pico-sdk, with one board: intechstudio_grid_rp2350 (16 WS2812 on GPIO6, 32 KB bootloader region).

  • Mass storage DFU, UF2 family 0xe48bff59. Writes are limited to the application area (0x10008000 and up); a 4 KB sector is only erased when a block does not fit in blank flash.
  • Double tap of reset, application validity check and jump, board_reboot_to_bootloader().
  • Self-update (update-tinyuf2.uf2): invalidates the IMAGE_DEF first and rewrites it last, so an interrupted update leaves the bootrom's USB bootloader as recovery.
  • blinky and update-tinyuf2 applications.
  • The port is registered in tools/get_deps.py (pico-sdk 2.3.1, pinned), build.yml, check_build.py, test_build.py, README.md and supported_boards.md; port documentation is in ports/rp2350/README.md.

Two commits: the port itself, then its registration.

Verified on hardware (Grid RP2350 board)

  • USB enumeration, drive contents, serial number from the bootrom chip info
  • UF2 writes of 40 KB and 1 MB (all pages read back identical), overwrite with different data, same file written again
  • A UF2 targeting the bootloader area is refused and the bootloader keeps running
  • Jump to the application, double tap of the reset button into the bootloader
  • Self-update from one bootloader build to another (new product string in USB and INFO_UF2.TXT; the updater erased itself)

Verified by building

  • Build the way build_util.yml does: pinned SDK fetched by get_deps.py, no PICO_SDK_PATH, MinSizeRel, Arm GNU 13.3
  • samd51 intech_grid still builds with the edited family_support.cmake
  • Agent-skill tests: the same 32 failures as clean master (missing agentrc/HIL modules in my environment), none new. supported_boards.md, codespell, YAML and whitespace hooks pass.

Things to know

  • ports/family_support.cmake is touched (it forwards LD_FLASH_BOOT_SIZE and the SDK variables to applications), so CI builds every port for this change.
  • supported_boards.md is generated; it also gains two Espressif Intech boards that were already missing on master.
  • pico-sdk's own TinyUSB support is switched off in family.cmake (its glue redefines family_support.cmake functions); CMake prints a warning about that. PICO_NO_PICOTOOL is set so CI does not build picotool.
  • The image is about 17 KB, so 16 KB was not reached (LTO does not link with Arm GNU 13.3 or Debian's 14.2).

Not done

  • Flash write protection: board_flash_protect_bootloader() is a stub, pending the flash chip's block-protect bits.
  • BOARD_FLASH_SIZE is an assumed 2 MB (marked TODO in board.cmake); the USB VID 0x2e8a is Raspberry Pi's, so check the allocation before shipping.
  • Not tested: a power cut during self-update, downgrade, a corrupted update image, or an actual GitHub Actions run.
  • No HIL roster entry.

🤖 Generated with Claude Code

SukuWc and others added 3 commits November 11, 2026 17:02
Port for the RP2350 (Arm secure) built on pico-sdk, started by the bootrom from
an IMAGE_DEF in the first sector of flash:

- mass storage DFU with 256 byte UF2 payloads in family 0xe48bff59; writes are
  limited to the application area and a sector is only erased when needed
- bootloader in the first 32 KB, application linked at 0x10008000
- double tap of reset through POWMAN's DOUBLE_TAP flag: RAM and the POWMAN
  scratch registers do not survive a RUN pin reset
- self-update that invalidates the IMAGE_DEF first and rewrites it last, so an
  interrupted update leaves the bootrom's USB bootloader as recovery
- WS2812 indicator on PIO, serial number from the bootrom chip info
- blinky and update-tinyuf2 applications

pico-sdk's own TinyUSB support is switched off because its glue redefines the
family_support.cmake functions, and pico_override_flash_size() is not used
because the PICO_FLASH_SIZE_BYTES it defines makes every application write
hard_assert in flash_range_erase/program.

family_add_app() also forwards LD_FLASH_BOOT_SIZE and the pico-sdk variables to
the applications.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- tools/get_deps.py: pin pico-sdk 2.3.1 for the rp2350 family
- build.yml and check_build.py: build intechstudio_grid_rp2350 with the ARM jobs
- test_build.py: rp2350 also compiles apps/blinky
- README.md and supported_boards.md: list the RP2350 port. The generated
  supported_boards.md also gains the two Espressif Intech boards that were
  missing from it on master.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Same hardware and USB IDs as intechstudio_grid_rp2350, with its own product
string, board ID and volume label (WRIDRP2350) to tell the two bootloaders
apart, like intech_grid and intech_wrid on the SAMD51.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Hardware-in-the-loop (HIL) Test Report

ci.json (ci.lan)

PR head 6e2d337 · tested 435d423 · run 43056589417, attempt 1

Every roster board: the HIL runner or a roster changed (8 boards).

HIL report unavailable: the run ended without a summary (run incomplete).

Not covered on this rig:

  • intechstudio_grid_rp2350: ports/rp2350/boards/intechstudio_grid_rp2350/board.h: intechstudio_grid_rp2350 is not in test/hil/ci.json
  • intechstudio_wrid_rp2350: ports/rp2350/boards/intechstudio_wrid_rp2350/board.h: intechstudio_wrid_rp2350 is not in test/hil/ci.json
  • kinetis_k32l2: core change: no test/hil/ci.json board for kinetis_k32l2
  • ports/rp2350/CMakeLists.txt: no test/hil/ci.json board builds ports/rp2350/CMakeLists.txt
  • ports/rp2350/app.cmake: no test/hil/ci.json board builds ports/rp2350/app.cmake
  • ports/rp2350/boards/intechstudio_grid_rp2350/board.cmake: no test/hil/ci.json board builds ports/rp2350/boards/intechstudio_grid_rp2350/board.cmake
  • ports/rp2350/boards/intechstudio_wrid_rp2350/board.cmake: no test/hil/ci.json board builds ports/rp2350/boards/intechstudio_wrid_rp2350/board.cmake
  • ports/rp2350/family.cmake: no test/hil/ci.json board builds ports/rp2350/family.cmake
  • rp2350: ports/rp2350/ws2812.pio: no test/hil/ci.json board for rp2350
  • stm32f3: core change: no test/hil/ci.json board for stm32f3
  • stm32h5: core change: no test/hil/ci.json board for stm32h5
  • stm32l4: core change: no test/hil/ci.json board for stm32l4

Records, reports and logs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant