FujiCard Hardware Notes - FujiNetWIFI/fujinet-firmware GitHub Wiki
One Intellivision cartridge containing an RP2350 (cart bus emulation, board name fujicard,
a fork of Minty) and an ESP32-S3-WROOM-1-N16R8 (FujiNet
client), linked internally over USB instead of an external cable, with a single USB-C port for
flashing the ESP32-S3. This page was previously "PiRTOβIIβFuji Hardware Notes"; it's renamed
because the board is no longer a PiRTO II derivative β see Licensing below for why
that distinction matters.
Design notes and BOM live in ~/Workspace/PiRTOII-Fuji/ (HARDWARE.md,
HARDWARE-PROVENANCE.md) β that directory name is a holdover from before the Minty switch and is
itself stale relative to this page in places (see Known gaps); this wiki
page is the corrected version. Firmware lives in
pico/intellivision/firmware/, board files at
boards/fujicard.h / boards/fujicard.cmake.
Status
Firmware compiles and links for fujicard; no hardware testing has been performed yet β see
Known gaps. Schematic/PCB/enclosure design has not started in the
KiCad/FreeCAD GUI.
Revision note (still applies from the pre-Minty design): the RP2350 has no dedicated
flashing port. It's put into BOOTSEL programmatically (reset_usb_boot()) via a mailbox
doorbell in normal operation, and β for recovery when firmware is bricked or hung β the ESP32-S3
can force it into BOOTSEL in hardware by pulling QSPI_SS low and pulsing RUN#. The RP2350 is
then flashed over its internal USB link by a PICOBOOT client running on the S3. One connector,
one fewer failure mode, smaller shell.
Components
- RP2350 (RP2354A) β cart bus emulation (CP-1610), running the
fujicardMinty fork. 2 MB flash (PICO_FLASH_SIZE_BYTES 2097152, W25Q16JVWI part,PICO_BOOT_STAGE2_CHOOSE_W25Q080,PICO_FLASH_SPI_CLKDIV 2). - ESP32-S3-WROOM-1-N16R8 β FujiNet client, runs
fujiversal-rs232.
RP2350 pin map (boards/fujicard.h)
This table replaces the RP2040-era pin map this page previously carried (BDIR on GPIO16, BC2 on GPIO17, BC1 on GPIO18, MSYNC on GPIO19, selftest trigger on GPIO22, debug UART TX on GPIO28).
fujicard.hexplicitly retracts that map β it was for the original PiRTO II-derived pinout, which this board does not use.fujicardinherits its bus/control pinout frompintycardinstead, its immediate Minty-side starting point.
| GPIO | Function | Notes |
|---|---|---|
| 0-15 | D0-D15 | CP-1610 data bus, bidirectional (MI_AD0_PIN base = GPIO0) |
| 20 | RST | MI_RST_PIN |
| 21 | MSYNC | MI_MSYNC_PIN |
| 22 | BDIR | MI_BDIR_PIN β not GPIO16 as on the old PiRTO-II-derived map |
| 23 | FUJI_SELFTEST_TRIGGER | FUJI_SELFTEST_TRIGGER_PIN; ground at power-on to run fujibus_selftest() β declared but not currently read by the firmware, see Known gaps |
| 24 | Debug UART1 TX | MI_DBG_UART_TX_PIN; TX-only, Debug builds only |
| 25 | LED | MI_LED_PIN β onboard indicator; also the reset_usb_boot() activity pin |
| 26 | BC1 | MI_BC1_PIN |
| 27 | BC2 | MI_BC2_PIN |
| β | USB D+/D- | native RP2350 USB PHY β permanently wired to ESP32-S3 (host) |
| β | RUN# | driven low by an S3-controlled transistor to reset the RP2350 (hardware BOOTSEL forcing) β RP2040-era design, not yet re-verified for RP2350 BOOTSEL/PICOBOOT differences |
| β | QSPI_SS (BOOTSEL) | pulled low by a second S3-controlled transistor, mimicking the BOOTSEL button β same caveat |
| β | SWCLK/SWDIO/GND | bring to exposed pads/Tag-Connect footprint; last-resort recovery path |
There is no SD card on this board (CONFIG_SD_STORAGE 0 in fujicard.cmake) β game/config
storage is LittleFS in the RP2350's internal flash (CONFIG_FLASH_LFS_STORAGE ON). Drop any
earlier "on-board microSD slot" claim for this board.
Source of truth for the pinout is boards/fujicard.h, not this table β check it directly before
any layout change.
ESP32-S3 pin map
| Signal | GPIO | Source |
|---|---|---|
| SD_CS | 41 | reused verbatim from Freenove pinmap |
| SD_SCK | 39 | " |
| SD_MISO | 40 | " |
| SD_MOSI | 38 | " |
| UART0_TX (to CH343P) | 43 | " |
| UART0_RX (to CH343P) | 44 | " |
| USB host D- | 19 | " (permanent internal connection to the RP2350, not a cable) |
| USB host D+ | 20 | " |
| Status LED (WS2812) | 48 | " |
| RP2350_RUN# (new) | TBD, pick from 4-18 | fujiversal-intv.h pinmap |
| RP2350_BOOTSEL (new) | TBD, pick from 4-18 | fujiversal-intv.h pinmap |
Freenove-reused rows: include/pinmap/fujiversal-rs232.h. The two new rows need their own
pinmap variant (fujiversal-intv.h) since the reference fujiversal-rs232.h has no
RP2350-control signals. GPIO33-37 are consumed by octal PSRAM on the N16R8 part and must be left
unconnected/unrouted under the module. GPIO26-32 are the S3's own flash pins β also unrouted.
Avoid strapping pins 0/3/45/46 for the two new signals. Card-detect (PIN_CARD_DETECT) is
GPIO_NUM_NC in firmware β do not wire a CD switch.
USB / flashing topology
USB-C (single port) ββCC pulldownsββ> SRV05-4 ββ> CH343P ββ> ESP32-S3 UART0 (GPIO43/44)
DTR/RTS -> EN/GPIO0 autoreset
(S3 native USB stays permanently in HOST mode)
RP2350 D+/D- βββββββββββββββββββββββββββββββββββββββββββββββ> S3 GPIO19/20 (host, permanent)
S3 GPIO (RP2350_RUN#) ββ1 transistorββ> RP2350 RUN, active low, Hi-Z when idle
S3 GPIO (RP2350_BOOTSEL) ββ1 transistorββ> RP2350 QSPI_SS, active low, Hi-Z when idle
- ESP32-S3 flashing: the one USB-C port, via the CH343P bridge β standard
pio run -t upload. - RP2350 flashing: no external port at all. Two paths:
- In-band doorbell (normal path) β poke
$B5into the mailbox'sBOOTSEL_DOORBELLcell ($9C1B, see Fujinet Intellivision Mailbox Protocol); the RP2350 sees it infuji_mailbox_service()and callsreset_usb_boot(), rebooting straight into BOOTSEL/PICOBOOT over the existing internal USB link. Cooperative β requires working RP2350 firmware. - Hardware forcing (recovery path) β the S3 drives
RP2350_BOOTSELlow, pulsesRP2350_RUN#low then releases both. Works even if the RP2350 is bricked or hung.
- In-band doorbell (normal path) β poke
- Once in BOOTSEL, a PICOBOOT client on the S3 (
lib/hardware/PicobootClient.{h,cpp}, a secondusb_hostclient alongsideACMChannel) writes a raw.binread from SD/TNFS, then issues REBOOT. The existing"ACM-reconnect"task inACMChannel.cppreopens the CDC link automatically afterward. - No VBUS crosses the RP2350βS3 internal link β attach detection is via the RP2350's D+ pull-up, same as any USB device/host pair.
Power
console +5V (cart pin 43) ββ
USB-C VBUS βββββββββββββββββββΌβ Schottky OR β> VIN (470uF) β> 3.3V buck (>=1.5A) β> 3V3 rail
(220uF + 10uF + 100nF at S3 VDD)
Preserves the original PiRTO II design intent (the OR diode's job: no back-feed into the console) while the one remaining USB leg keeps the board alive on the bench.
Open item β must be measured before finalizing regulator/cap sizing: console 5V rail headroom under load, on each target console variant. Estimated draw ~80 mA average / ~400 mA peak at 5V (WiFi TX bursts dominate); not yet verified against real hardware.
Enclosure
Two zones: the lower insertion tongue is dimensionally frozen at the upstream PiRTO II profile (58.19 x 77.54 mm board, 44-pin edge at the same origin); the upper body grows to clear the second MCU and the single USB-C connector across both PCB faces (no SD slot to clear on this board, unlike the earlier PiRTO-II-derived design). Exact growth is gated by a console cart-bay clearance measurement, not yet taken.
Build
cd pico/intellivision/firmware
cmake -B build -DPICO_BOARD=fujicard -DCMAKE_BUILD_TYPE=Release -G Ninja
ninja -C build
# -> build/Minty_fujicard.uf2 -- flash it in BOOTSEL mode
Notes:
- pico-sdk 2.2.0 (
toolchainVersion 14_2_Rel1,picotoolVersion 2.2.0-a4), set via$PICO_SDK_PATHor the vendoredpico_sdk_import.cmake. fujicard.cmakeforcesCONFIG_USB_DEVICE 1even in Release builds β unlikepintycard, where it's a Debug-only convenience, the USB CDC link to the ESP32-S3 is this board's whole purpose.MAX_ROM_SIZEis trimmed to ~430 KB in both configs to pay for the always-on USB device stack.- JLP is on (
CONFIG_JLP ON); ECS audio and Intellivoice emulation are off (CONFIG_ECS_AUDIO OFF,CONFIG_INTELLIVOICE OFF) βfujicardhas no audio-mod pin defined. - ESP32-S3 side:
./build.sh -e fujiversal-rs232for the generic firmware, or-e fujiversal-intvfor the board-specific pinmap variant withPIN_RP2040_RUN/PIN_RP2040_BOOTSELwired up (include/pinmap/fujiversal-intv.h).
Licensing
Per pico/intellivision/PROVENANCE.md: the vendored firmware is a fork of Minty
(Gennaro Tortone, GPLv3, https://github.com/gtortone/Minty), which itself refactors
PiRTO II (Andrea Ottaviani, https://github.com/aotta/PiRTOII); PiRTO II's storage layer in
turn traces to A8PicoCart (Robin Edwards, https://github.com/robinhedwards/A8PicoCart). The
Minty GPLv3 grant is what makes vendoring the firmware possible β it resolves the earlier
licensing blocker that stalled the previous PiRTO-II-based prototype (that grant is Tortone's for
his own refactor, not retroactive licensing of PiRTO II or A8PicoCart).
The cartridge PCB, board outline, 44-pin edge connector, and enclosure are a separate matter and remain unlicensed. They derive from PiRTO II's own schematic/board files, and neither upstream repo grants a hardware license. Do not publish gerbers, BOM, or STL files for this board until a separate grant is obtained from Andrea Ottaviani. This is presently moot in practice since the PCB never got past schematic planning (see Status above), but it governs what can be shared once it does.
Known gaps / status
fujicardis missing from CI. The vendoredfirmware/.github/workflows/build.ymlmatrix (pintycard, pirto_ii_default, pirto_ii_duo, pirto_ii_sd, pirto) andscripts/build-board.sh/build-all.sh's board allowlist don't includefujicardβ./scripts/build-board.sh fujicardcurrently fails withboard fujicard not available.- The five boards CI does build no longer link. Minty's own launcher UI
(
src/launcher.c,RunLauncher()) was removed as part of vendoring this fork for FujiNet, butsrc/cartridge.cstill callsRunLauncher()in the non-CONFIG_FUJINETbranch. Onlyfujicard(the sole board definingCONFIG_FUJINET) takes theRunFujiConfig()branch and actually links. FUJI_SELFTEST_TRIGGER_PIN(GPIO23) is declared but not wired up in firmware β nothing currently reads it at runtime;fujibus_selftest()is only invoked fromhost_test/test_fujibus.con the desktop, not from the board boot path. Don't treat it as a working feature yet.- The two RP2350-control GPIOs' schematic wiring (transistors for RUN#/BOOTSEL forcing) doesn't
exist yet β the ESP32-S3 pinmap numbers above are placeholders, not schematic-verified.
PicobootClienthas not been tested against a real RP2350 in BOOTSEL. - Console 5V headroom and cart-bay clearance are unmeasured (physical hardware required).
- Schematic/PCB/enclosure: not started in KiCad/FreeCAD.
- Nothing in this stack β mailbox, boot-mapping, BOOTSEL doorbell, PicobootClient β has run on real silicon yet.
See also
- Fujinet Intellivision Mailbox Protocol β the RP2350βIntellivisionβESP32-S3 protocol this board implements.
pico/intellivision/PROVENANCE.md/pico/intellivision/README.mdβ upstream lineage, architecture, and build notes in-tree.