
Si468x
NightLaneOrg/nr-si468x-dev
Si468x-based DAB/FM receiver module (M.2 E-Key) with open hardware and Linux integration.

CMSIS-DAP SWD/JTAG & WCH-Link RVSWIO/RVSWD debug probe implementation for CH32X035 (PIOC)
ProPrj ch32 tapioca probe mini 2026-09-03 is an open-source printed circuit board by pierrejay, from the pierrejay/ch32-tapioca-probe repository on GitHub. It is a 4-layer board of 23.5 × 12.5 mm with 29 parts on 31 nets, routed with 235 tracks and 56 vias.
It is built around the CH32X035F8U6, RT9080-33GJ5 and TPD1E01B04DPYR, with the LESD5D5.0CT1G, A2501HWR-4P and KT-0603R among its other parts. Its parts include 10 diodes, 6 resistors, 5 capacitors, 3 ICs and 1 connector. It belongs with the sensors and measurement and interfaces and adapters boards of this library.
Two build-time USB debug-probe firmwares for CH32X035:
The ~€0.25 CH32X035 needs few external parts and fits in a 3 x 3 mm QFN; its PIOC coprocessor nicely handles the timing-critical single- and two-wire protocols, making it practical to embed the probe directly into a product.
The project is based on ch32fun and reuses the proven PIOC primitives from the sibling Tapioca project.
A reference design of a tiny <€6 probe PCB (debug/JTAG, UART bridge, switchable 3V3 output) is also provided with EasyEDA & KiCad source files.
| Family | Interface | Chips | Host tools |
|---|---|---|---|
| ARM | SWD (CMSIS-DAP) | STM32H523, STM32G431 | OpenOCD, probe-rs |
| ARM | JTAG (CMSIS-DAP) | STM32H523 | OpenOCD, probe-rs |
| CH32 | RVSWIO (1-wire) | CH32V003, CH32H417 | minichlink, probe-rs |
| CH32 | RVSWD (2-wire) | CH32X035, CH32V203, CH32V307 | minichlink, probe-rs |
PB0/TX, PB1/RX),
exposed as a second USB function, enabled with make UART_BRIDGE=1 and
configurable through the host serial port.PA3; host control is
currently available with the WCH-Link firmware.
Switching it off releases the WCH interface and parks UART pins, avoiding
parasitic powering of the DUT. With a self-powered DUT, 3V3 may remain
connected; keep target power switched on to retain WCH and UART functionality.The debug firmwares are host-driven transports: the probe executes the timing-critical wire transactions, while OpenOCD, probe-rs or minichlink owns the target-specific flash algorithm.
C251:F000)The firmware exposes one CMSIS-DAP v2 bulk interface for ARM SWD and JTAG
with OpenOCD and probe-rs. DAP_Connect(0) selects SWD by default; explicit
DAP_Connect(1) and DAP_Connect(2) select SWD and JTAG respectively.
The full firmware pinout supports complete SWJ-DP wiring; the minimal reference PCB routes only the shared SWD pins:
| Signal | Pin | Notes |
|---|---|---|
SWD SWCLK / JTAG TCK | PC18 (PIOC IO0) | |
SWD SWDIO / JTAG TMS | PC19 (PIOC IO1) | shared SWJ data |
JTAG TDI | PA7 | |
JTAG TDO | PA6 | |
nSRST / SWD nRESET | PA4 | optional recovery |
JTAG nTRST | PA5 | optional (needs JTAG_TRST=1); otherwise PA5 is free |
UART TX | PB0 | probe to target (needs UART_BRIDGE=1) |
UART RX | PB1 | target to probe (needs UART_BRIDGE=1) |
SWD runs a single fixed ~1 MHz profile (DAP_SWJ_Clock is accepted for host
compatibility but doesn't change it). The ARM SWD path is validated for
correctness, not tuned for speed; its throughput has not been benchmarked
against a commercial probe.
JTAG uses a GPIO engine and accepts host clock requests from 1 kHz to 2 MHz. Chain discovery, halt/run, reset and SRAM access were validated on STM32H523 with both OpenOCD and probe-rs, including concurrent UART traffic. Target programming was validated with probe-rs at roughly 12 KiB/s. This is modest, but still useful for troubleshooting and recovery.
Select the transport explicitly in the host (--protocol swd|jtag with
probe-rs, or transport select swd|jtag with OpenOCD). SWD remains the probe's
default when the host does not choose. On DAP_Connect(JTAG), the probe emits
the standard SWD-to-JTAG sequence so hosts such as OpenOCD 0.12 also work when
another tool left the target in normal SWD. This best-effort transition does
not wake a target left in the dormant state.
probe-rs info --protocol swd can pause for about ten seconds after finding a
valid DPv2 target because it deliberately probes two RP2040 multidrop
addresses. This is a probe-rs discovery quirk, not a Tapioca transport timeout;
normal target-specific attach and flashing are unaffected.
Full run-control debugging works with both SWD and JTAG, not just flashing.
RTT also works over SWD (OpenOCD rtt or defmt/probe-rs): it uses ordinary
target-memory access and needs no trace pin.
There is no SWO/ITM trace yet (no DAP_SWO_* commands), so printf-over-SWO and
instruction trace aren't available.
The CMSIS-DAP SWD and JTAG paths exercised by OpenOCD and probe-rs are implemented. Transfer value matching and the optional SWJ pin-wait behavior are not; unsupported features are not advertised as probe capabilities.
Example OpenOCD configs for driving targets through the probe are in
openocd/, including the validated STM32H523 JTAG chain.
1a86:8010)A WCH-LinkE-compatible probe for CH32 RISC-V, driven by stock minichlink or probe-rs 0.32+ where its target support is available.
The probe implements the WCH-Link direct-DMI passthrough only: the host owns the flash algorithm, the probe just runs the wire transactions. That is simple and enough for most flashing (which is why minichlink drives it), but it is not a full WCH-LinkE: tools that rely on the flash-programming logic built into a real probe are untested and likely won't work as-is.
probe-rs works through this direct-DMI path and has been exercised on all targets listed above. Support still depends on the target definitions and flash algorithms available upstream, so less mature targets may retain host-side quirks; for example, regular H417 flashing works, while full-chip erase awaits an upstream flash-algorithm fix.
One data line, plus a clock for the 2-wire parts:
| Signal | Pin | Notes |
|---|---|---|
SWCLK | PC18 (PIOC IO0) | 2-wire only |
SWDIO / SWIO | PC19 (PIOC IO1) | data (1- & 2-wire) |
UART TX | PB0 | probe to target (needs UART_BRIDGE=1) |
UART RX | PB1 | target to probe (needs UART_BRIDGE=1) |
PWREN | PA3 | target 3.3V load switch (optional, defaults on) |
Some MCUs (e.g. CH32V003 1-wire and CH32X035 2-wire) drive SWDIO open-drain and need an external ~4.7–10 kΩ pull-up to 3.3 V. Others (like CH32V203/V307) work without one. The reference board uses a 5.1 kΩ pull-up, which makes it universal.
On the same direct-DMI minichlink it flashes ~15 % faster than a genuine WCH-LinkE
R0-1v3 and reads ~30 % faster (CH32V203, 32 KB payload). Insignificant in practice, and not directly comparable with vendor algorithms (e.g. using wlink), but a good sign that the PIOC approach holds up. There is still plenty of headroom to optimise the USB link and flashing process.
Some older minichlink builds don't drive direct-DMI. make minichlink builds
the pinned version directly from the ch32fun submodule.
Target power is controlled with minichlink -k3 -C linke (on) and
minichlink -kt -C linke (off). The -k avoids probing an intentionally
unpowered target before applying the command. Power control is not yet exposed
by the CMSIS-DAP firmware.
Clone the SDK submodule and build both products with a WCH-capable GNU RISC-V
embedded toolchain supporting rv32imacxw (riscv-none-embed,
riscv-wch-elf, riscv-none-elf, or another compatible prefix):
git submodule update --init
makeThe Makefile uses an explicit RISCV_PREFIX first, then a toolchain installed
in sdk/toolchain/, then a compatible toolchain from PATH. For example, the
PlatformIO-distributed GCC 8.2.0 used to validate this project can be installed
directly in the repository without installing PlatformIO itself:
# macOS
git clone --depth 1 --branch 8.2.0 \
https://github.com/Community-PIO-CH32V/toolchain-riscv-mac.git sdk/toolchain
# Linux x86_64, including WSL2
git clone --depth 1 --branch 8.2.0 \
https://github.com/Community-PIO-CH32V/toolchain-riscv-linux.git sdk/toolchainIf the compiler has a different prefix,
pass it explicitly, for example make RISCV_PREFIX=riscv64-unknown-elf.
Both products flash through the CH32X035 USB ISP bootloader with
wchisp (hold BOOT while plugging in):
make flash-jtagswd # product 1: ARM SWD/JTAG (CMSIS-DAP v2)
make flash-wchlink # product 2: WCH-Link (auto RVSWIO/RVSWD)Firmware options and the product to flash can be selected in the same command,
for example make UART_BRIDGE=1 JTAG_TRST=1 flash-jtagswd.
make help lists every supported build option and tool override.
On Linux, install the included udev rules once to access the CH32X035 ROM USB
ISP bootloader and the CMSIS-DAP development identity without sudo (the user
must belong to the plugdev group):
sudo install -m 0644 udev/50-ch32-tapioca-probe.rules /etc/udev/rules.d/
sudo udevadm control --reload-rulesUnplug and reconnect the probe after installing the rules.
Run the native unit tests with make test. See make help for the common
targets. PC18/PC19 are the CH32X035's own SDI debug pins, so the probe itself is
flashed over USB ISP, not SWD.
The CMSIS-DAP firmware temporarily borrows C251:F000, the Keil/Arm identity
used by the CMSIS-DAP v2 example configuration.
It is not allocated to this project; CMSIS-DAP hosts identify the interface
through its CMSIS-DAP v2 string rather than a project-specific PID.
The WCH-Link firmware still borrows WCH-LinkE's 1a86:8010 identity so stock
minichlink can discover it. This is not an official WCH, Keil or Arm product.
A dedicated pid.codes allocation is planned. Replace these development identities before distributing anything built on this.
See THIRD_PARTY.md for detailed contributions.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 6 | TPD1E01B04DPYR | ProPrj_ch3-easyedapro:X1SON-2_L1.0-W0.6-P0.65-BI | D4, D5, D6, D7, D8, D9 |
| 5 | 5.1kΩ | ProPrj_ch3-easyedapro:R0402 | R1, R2, R24, R40, R41 |
| 3 | LESD5D5.0CT1G | ProPrj_ch3-easyedapro:SOD-523_L1.2-W0.8-LS1.6-BI | D1, D2, D3 |
| 2 | 10uF | ProPrj_ch3-easyedapro:C0603 | C1, C3 |
| 1 | 100nF | ProPrj_ch3-easyedapro:C0402 | C29 |
| 1 | 10uF | ProPrj_ch3-easyedapro:C0402 | C4 |
| 1 | 1kΩ | ProPrj_ch3-easyedapro:R0402 | R89 |
| 1 | 1uF | ProPrj_ch3-easyedapro:C0402 | C2 |
| 1 | A2501HWR-4P | ProPrj_ch3-easyedapro:CONN-TH_A2501HWR-4P | CN1 |
| 1 | AP2151WG-7 | ProPrj_ch3-easyedapro:SOT-25-5_L3.0-W1.8-P0.95-LS3.0-BR | U9 |
| 1 | CH32X035F8U6 | ProPrj_ch3-easyedapro:WQFN-20_L3.0-W3.0-P0.40-TL-EP1.7 | U4 |
| 1 | KT-0603R | ProPrj_ch3-easyedapro:LED-SMD_L1.6-W0.8-R-RD | LED4 |
| 1 | PZ254R-11-04P | ProPrj_ch3-easyedapro:HDR-TH_4P-P2.54-H-M-W10.4 | H1 |
| 1 | RT9080-33GJ5 | ProPrj_ch3-easyedapro:TSOT-23-5_L2.9-W1.6-P0.95-LS2.8-BL | U6 |
| 1 | TYPE-C 16PIN 2MD(073) | ProPrj_ch3-easyedapro:USB-C-SMD_TYPE-C-16PIN-2MD-073 | USB2 |
| 1 | TestPoint | ProPrj_ch3-easyedapro:Pad_e438 | TP2 |
| 1 | TestPoint | ProPrj_ch3-easyedapro:Pad_e437 | TP1 |
It measures 23.5 × 12.5 mm and has 4 copper layers, 1.6 mm thick.
29 parts, built around the CH32X035F8U6, RT9080-33GJ5, TPD1E01B04DPYR and LESD5D5.0CT1G. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the pierrejay/ch32-tapioca-probe repository on GitHub, at the commit this page was made from: the board is hardware/kicad/ProPrj_ch32_tapioca_probe_mini_2026-09-03.kicad_pcb and its schematic hardware/kicad/ProPrj_ch32_tapioca_probe_mini_2026-09-03.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask pierrejay before reusing the design.

NightLaneOrg/nr-si468x-dev
Si468x-based DAB/FM receiver module (M.2 E-Key) with open hardware and Linux integration.


golioth/tikk-hw
sensor/io front panel for low cost keyboard bluetooth breakout

alxgmpr/moisture-sensor
Indoor capacitive soil moisture sensor - nRF54L15 + nPM1300 + FDC1004, BTHome v2 over BLE



