Skip to the content
2 layers36 × 45.8 mmXiaomao, the printed circuit board in 3D

Xiǎomāo is a development board geared toward hardware hacking and hardware implant design that can safely interfacing with a wide range of logic levels

Size
36 × 45.8 mm
Copper layers
2
Thickness
1.6 mm
Parts
84
Nets
78
Pads
243
Tracks, vias
416, 48
Pours
2
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
10 Sep 2021
Updated
6 Oct 2026

Overview

Xiaomao is an open-source printed circuit board by tigard-tools, from the tigard-tools/xiaomao repository on GitHub, published under the CERN-OHL-S-2.0 licence. It is a 2-layer board of 36 × 45.8 mm with 84 parts on 78 nets, routed with 416 tracks and 48 vias.

It is built around the RP2040, ZD25Q128CWIGR and HE6206-33NR, with the TD-1183SN-1.7H-160, WS2812B and YSX321SL among its other parts. Its parts include 25 resistors, 16 capacitors, 5 connectors, 4 diodes and 3 ICs. It belongs with the microcontroller boards boards and the RP2040 boards of this library.

Main components

6

README

README.md

Xiǎomāo

Xiǎomāo PCB Photo

Xiǎomāo is a development board geared toward hardware hacking and hardware implant design that can safely interfacing with a wide range of logic levels

Xiǎomāo (小猫) means 'small cat' and gets its name from the original revision which used the the small Seeed Studio XIAO SAMD2 module with the catlike tigard-tools wiring harnesses. The current version, Xiǎomāo v2 is a redesign based on an RP2040 but the Xiǎomāo name stuck.

If you have an old Xiǎomāo v0.1 or 0.2, check the older version of this readme

Sample Use Cases

JTAG Searching

Xiǎomāo ships with a slightly modified JTAGScan. Both jtagenum and jtagscan allow you to search IO pins for JTAG interfaces. Jtagscan is a cleaner and quicker option, but has issues with more than 8 pins. Jtagenum has many more options but a difficult user interface. Xiǎomāo has been tested on 1.8, 3.3, and 5v targets.

text
> h
---------------------------------
-- JTAGscan Jtag Pinout Finder --
---------------------------------
 a - Automatically find all pins
 i - IDCODE search for pins
 b - BYPASS search for pins
 t - TDI-only BYPASS search
 d - set debug level. current: 0
 p - adjust # pins. current: 6
 h - print this help
---------------------------------
> a
     Automatically searching
--- Starting with IDCODE scan ---
| TCK | TMS | TDO |      IDCODE |
---------------------------------
|   0 |   3 |   2 |    974008ef |
------------ SUCCESS ------------
    TCK, TMS, and TDO found.
--- BYPASS searching, just TDI --
| TCK | TMS | TDO | TDI | Width |
---------------------------------
|   0 |   3 |   2 |   1 |    32 |
------------ SUCCESS ------------
> 

Implanting

Hecate is a CircuitPython-based UART implant development framework made for Xiǎomāo. It has the built in capability to log traffic or drop payloads over UART.

Arduino Examples -> 04.Communication -> AsciiPrint is a good starting point for using Xiǎomāo to drop a UART payload to a target, for example some console commands that would open up a network shell, or console commands that would write out a malicious binary to storage.

Implant-in-the-middle

Hecate also has advanced capabilities for manipulating UART data in flight.

Circuitpython-uart-passthrough is a standalone and fully featured UART passthrough script that works well with Xiǎomāo, and might also be a good starting point for modifiying UART traffic.

Arduino Examples -> 04.Communication -> SerialPassthrough is a good starting point for using Xiǎomāo to modify UART data on the fly. You can prototype looking at all the data over the USB connection, but when you have it working, you can use it standalone - Use the Tigard UART harness and connect VTGT, GND, TX and RX to have your implant read data on RX and output modified data on TX.

Working with Xiǎomāo

Programming

  • Xiǎomāo is fully supported by CircuitPython. Pin names in CircuitPython match the labels on the board.
  • If you prefer to use Arduino, we recommend Arduino-Pico, and choosing "Raspberry Pi Pico" as your board type. Use the RP2040 pin names, not the labels on the board.

'JTAG' header

8-pin header for use with Tigard's jtag harness, and usable as a JTAG implant with the wires as labeled

Header PinBoard labelrp2040 pinWire LabelColor
1PWRVINRed
2GNDGNDBlack
3D0GPIO0TCKWhite
4D1GPIO1TDI/COPI/SDAGrey
5D2GPIO2TDO/CIPO/--Purple
6D3GPIO3TMS/SS/--Blue
7D4GPIO4TRST/--/--Green
8D5GPIO5SRST/--/--Yellow

'UART' header

9-pin header for use with Tigard's uart harness. Ships with only first 4 wires installed, and usable as a UART implant with the wires as labeled

Header PinBoard Labelrp2040 pinWire LabelColor
1PWRVINRed
2GNDGNDBlack
3TXGPIO16TXGreen
4RXGPIO17RXWhite
5CTSGPIO18Grey
6RTSGPIO19Purple
7TX1GPIO20Blue
8RX1GPIO21Yellow
9CTS1GPIO22Orange

Other controllable pins

While not broken out on a header, the following pins are also in use:

CircuitPython Namerp2040 pinPurpose
NEOPIXEL_POWERGPIO6set to '1' to power on Neopixels
NEOPIXELGPIO7Neopixel data
LEDGPI27set to '1' to turn on the LED
BTNGPI28reads '0' when pressed
VBUS_DETGPI29reads '1' when usb power present

'SWD' connector

5-pin header is unpopulated and gives access to the programming pins on the bottom of XIAO.

Header Pinrp2040 Pin
1SWDIO
2GND
3SWCLK
4NC
5/RESET

Background and Objectives

Design Objectives

Xiǎomāo fits under the tigard-tools umbrella because it repurposes Tigard's wiring harnesses and complement's Tigards features by providing a wide-Vio-range programmable device. It was designed to fill gaps in what Tigard was able to do for some of the labs in Applied Physical Attacks #2: Hardware Pentesting. Xiǎomāo should be well suited for:

  1. Bitbanging protocols, even those with bidirectional pins
  2. Standalone operation, such as dropping a protocol payload on a target
  3. Implant-in-the middle attacks on various protocols

Electrical Objectives

While unidirectional level shifting works well on Tigard, bidirection level shifting is cursed and should be avoided whenever possible. On a general-purpose microcontroller board, we don't know ahead of time which pins will be used as inputs or outputs.
Xiǎomāo is intended to be a very cheap module with 'just enough' protection to not damage most targets:

  • Sensing low-voltage high signals: The RP2040 on Xiǎomāo is nominally running at 3.3V, and per spec Vih = 2V, but in practice, this is good enough for us to discern high and low voltages from 1.8V output pins.
  • Tolerating high and low voltage on I/O pins: Xiǎomāo adds 200 ohm resistors in series on each gpio pin, and the ATSAMD can tolerate IOVDD+0.5v on the I/O pins. If 5V are applied to a pin, the microcontroller would only need to sink about 5 mA to drop the voltage into a safe range. While a larger resistor would be ideal, it would limit the low-voltage sensitivity of the pins.
  • Operating in wide voltage ranges: Vcc pins on the headers connect to the 3.3v regulator. Voltages over 3.3v will be regulated to 3.3v, and voltages lower than 3.3v will only drop about 50mv through the regulator. This means Xiǎomāo should work at as low as 1.84v, although USB may not function below 3.3v
  • ESD/TVS: Modern ICs have at least minimal ESD protection. Additional ESD protection would increase the size and cost of the device, which is intended to be low cost and consumable, and would be of limited benefit to the target device. For this reason, ESD/TVS protection is skipped on Xiǎomāo.

Xiǎomāo V1 used the Seeed Studio XIAO SAMD21 because it was small, cheap, 1.8v sensitive, usb-c, easily supported in arduino and circuitpython, and readily available in September 2021.

Xiǎomāo V2 uses the RP2040 for greater capabilities, similar I/O, lower cost, and greater availability.

Alternatives

Depending on the usage, there are a wide variety of alternatives. Xiǎomāo was designed with lots of tradeoffs in mind - some of these alternatives are going to be better for certain uses.

  • The JTAGULATOR is far more robust than any other option for seeking out JTAG interfaces - especially when you're dealing with irreplaceable targets that you really don't want to brick.
  • Glasgow has robust, direction-switchable level shifting in additon to massively configurable I/O, but too large, expensive, and power-hungry for implant-style use.
  • The Teensy family far exceeds the I/O and computational performance of the other options. Teensy V3.2 is 5v tolerant and would be the best alternative
  • The Arduino Pro Mini (ATMega328p) is very cheap and operates at a wide voltage range, but requires a UART programmer
  • The Arduino Pro Micro (ATMega32U4) is also inexpensive and capable, but doesn't work on as wide a range as the Mini

Assembly

Xiǎomāo was designed for automated assembly.

Debugging

The RP2040 used on XIAO supports debugging over the SWD pins. Xiǎomāo makes these pins accessible on the SWD header. To set up Tigard, OpenOCD, and GDB to work with Xiǎomāo:

  1. Connect the first 4 pins of the JTAG header to the SWD header on Xiǎomāo. That's VTGT, GND, TCK and TDI
  2. Set Tigard's VTGT switch to 3.3v and mode switch to 'SWD/I2C'
  3. Connect Tigard to your computer via USB
  4. Run OpenOCD: openocd -f tigard-swd.cfg -f target/rp2040.cfg
  5. Start GDB: gdb-multiarch
  6. Connect to OpenOCD: set arch arm; target remote localhost:3333

Parts

84
QtyValueFootprintReferences
15200rhais_rcl:R0402R2, R6, R9, R10, R11, R12, R13, R14, R15, R16, R17, R18, R19, R20, R24
10100nrhais_rcl:C0402C4, C6, C7, C9, C11, C12, C13, C14, C15, C19
410urhais_rcl:C0402C8, C10, C16, C22
427rhais_rcl:R0402R4, R5, R21, R22
31krhais_rcl:R0402R1, R3, R25
35k1rhais_rcl:R0402R7, R8, R23
3TD-1183SN-1.7H-160rhais_button-smd:B3U-1000PSW1, SW2, SW3
222prhais_rcl:C0402C1, C2
2G***kibuzzard-69E92C52kibuzzard-69E92C52, kibuzzard-69E92C52
2G***kibuzzard-69E92C43kibuzzard-69E92C43, kibuzzard-69E92C43
2WS2812Bxiaomao:LED_WS2812B_PLCC4_1x1mmD1, D2
1600Rrhais_rcl:L0603FB1
1D_SchottkyDiode_SMD:D_SOD-523D4
1G***kibuzzard-69E92DE3kibuzzard-69E92DE3
1G***kibuzzard-69E92D56kibuzzard-69E92D56
1G***kibuzzard-69E92D4Ckibuzzard-69E92D4C
1G***kibuzzard-69E92995kibuzzard-69E92995
1G***kibuzzard-69E92DF2kibuzzard-69E92DF2
1G***kibuzzard-69E92DD4kibuzzard-69E92DD4
1G***kibuzzard-69E93065kibuzzard-69E93065
1G***kibuzzard-69E92B07kibuzzard-69E92B07
1G***kibuzzard-69E934F5kibuzzard-69E934F5
1G***kibuzzard-69E92DDCkibuzzard-69E92DDC
1G***kibuzzard-69E92B95kibuzzard-69E92B95
1G***kibuzzard-69E92CD4kibuzzard-69E92CD4
1G***kibuzzard-69E9307Bkibuzzard-69E9307B
1G***kibuzzard-69E931DFkibuzzard-69E931DF
1G***kibuzzard-69E92DB0kibuzzard-69E92DB0
1G***kibuzzard-69E92A7Dkibuzzard-69E92A7D
1G***kibuzzard-69E929A9kibuzzard-69E929A9
1G***kibuzzard-69E92BA0kibuzzard-69E92BA0
1G***kibuzzard-69E934DDkibuzzard-69E934DD
1G***kibuzzard-69E92DE9kibuzzard-69E92DE9
1HE6206-33NRrhais_package-smd:SOT-23U1
1JTAGrhais_connector-pinheader:PinHeader_1x08_P2.54mm_Horizontal_SMDJ5
1LEDrhais_rcl:L0402D3
1LOGOface:catfaceG***
1RP2040Package_DFN_QFN:QFN-56-1EP_7x7mm_P0.4mm_EP3.2x3.2mmU3
1SWDrhais_connector-pinheader:PinHeader_1x05_P1.27mm_VerticalJ2
1UARTrhais_connector-pinheader:PinHeader_1x09_P2.54mm_Horizontal_SMDJ6
1USBrhais_connector-pinheader:PinHeader_1x04_P1.27mm_VerticalJ1
1USB_C_Receptacle_USB2.0rhais_usb:USB_C_Receptacle_HRO_TYPE-C-31-M-12J4
1YSX321SLrhais_osc:SMD3225Y1
1ZD25Q128CWIGRrhais_package-qfn:UDFN-8-1EP_6x5mm_P1.27mm_EP3.4x4mmU2

The 83 most common of 84 parts.

Similar boards

  • 2 layers66.7 × 85.7 mmOpentaxus, the printed circuit board in 3D

    Opentaxus

    OpenTaxus/opentaxus

    Opentaxus is a permissively licensed set of hardware, software, and tooling to help as a starting point for customized conference badges.

    54 parts19
  • 2 layers50 × 114.5 mmHecate target, the printed circuit board in 3D

    Hecate target

    tigard-tools/hecate

    Hecate: A Trivial UART tool

    47 parts8
  • 2 layers293.1 × 126.5 mmKeyboard, the printed circuit board in 3D

    Keyboard

    sagarreddypatil/keyboard

    It's a keyboard

    170 parts
  • 4 layers42.8 × 36.8 mmDriver board, the printed circuit board in 3D

    Driver board

    blazer82/FT81x_Arduino_Driver

    FT81x on ST7701S Arduino Driver

    49 parts59MIT
  • 2 layers161.3 × 106.7 mmTemplates, the printed circuit board in 3D

    Templates

    DuRuofu/Kicad_Library

    团队共享kicad库

    44 parts
  • 2 layers96 × 70 mmEEE3088F HAT, the printed circuit board in 3D

    EEE3088F HAT

    rb-jones/EEE3088F_HAT

    See a 3D render of the PCB from KiCad below,

    84 partsCC-BY-4.0
  • 2 layers80 × 99.8 mmOcelot vA4, the printed circuit board in 3D

    Ocelot vA4

    turboedge/SpeedyBoards

    EMS boards powered by Speeduino

    207 parts110GPL-2.0
  • 2 layers227 × 75.4 mmChoccy47, the printed circuit board in 3D

    Choccy47

    leenknegt-eu/choccy47

    47 key planck-style layout layer switching mechanical keyboard for use with Gateron KS-33 low profile switches

    116 parts

Questions

How big is the Xiaomao PCB?

It measures 36 × 45.8 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Xiaomao use?

84 parts, built around the RP2040, ZD25Q128CWIGR, HE6206-33NR and TD-1183SN-1.7H-160. 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.

Where can I download the Xiaomao KiCad files?

From the tigard-tools/xiaomao repository on GitHub, at the commit this page was made from: the board is xiaomao.kicad_pcb and its schematic xiaomao.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Xiaomao design in my own project?

Its repository publishes it under the CERN-OHL-S-2.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).