Connector pinout — generated

What each module header pin and each bottom-slot breakout lead carries, and where the cat firmware reads or drives it, from firmware/cat/src/bin/main.rs (verified by tools/electronics/check_wiring_harness.py). A header's pins come from the board's netlist: its KiCad board once KiCad owns the board, the frozen baseline until then. Each wire leaves the main board from the pin named after its signal's GPIO, a rail from its slot's rail pin (below). The physical cable and wires are unknown until electronics/wiring-harness.toml says otherwise — the column is printed, never guessed. Regenerate with ./lx pcb pinout.

A signal is named by its function; silk is its compact alias, printed on the boards next to the header and carried by the frozen EasyEDA sources' nets; a bottom-slot signal's is the sensor's pin name. Matrix rows and columns count from 1; the firmware's index is one less. Directions are seen from the cat's microcontroller.

Signals

SignalSilkCat sideSlotFunction
FINGER_MATRIX_ROW_1FI1GPIO38fingersmatrix row 1 (firmware row 0), input, pull-up — physical bottom row
FINGER_MATRIX_ROW_2FI2GPIO37fingersmatrix row 2 (firmware row 1), input, pull-up
FINGER_MATRIX_ROW_3FI3GPIO36fingersmatrix row 3 (firmware row 2), input, pull-up
FINGER_MATRIX_ROW_4FI4GPIO35fingersmatrix row 4 (firmware row 3), input, pull-up — physical top row
FINGER_MATRIX_COLUMN_1FO1GPIO1fingersmatrix column 1 (firmware column 0), output — driven low to scan; index · outer
FINGER_MATRIX_COLUMN_2FO2GPIO2fingersmatrix column 2 (firmware column 1), output — index · inner
FINGER_MATRIX_COLUMN_3FO3GPIO42fingersmatrix column 3 (firmware column 2), output — middle; the left board's m0 is on column 1
FINGER_MATRIX_COLUMN_4FO4GPIO41fingersmatrix column 4 (firmware column 3), output — ring
FINGER_MATRIX_COLUMN_5FO5GPIO40fingersmatrix column 5 (firmware column 4), output — pinky · inner
FINGER_MATRIX_COLUMN_6FO6GPIO39fingersmatrix column 6 (firmware column 5), output — pinky · outer
FINGER_SCROLL_ENCODER_AWAGPIO43fingersscroll encoder channel A, input, pull-up — EVQWGD001; fkw only
FINGER_SCROLL_ENCODER_BWBGPIO44fingersscroll encoder channel B, input, pull-up — EVQWGD001; fkw only
THUMB_MATRIX_ROW_1TI1GPIO4thumbmatrix row 1 (firmware row 0), input, pull-up — physical bottom row
THUMB_MATRIX_ROW_2TI2GPIO5thumbmatrix row 2 (firmware row 1), input, pull-up; tk only — the joystick thumb (tkj) has no keys on rows 2 and 4: its stick's axes take their pins
THUMB_MATRIX_ROW_3TI3GPIO6thumbmatrix row 3 (firmware row 2), input, pull-up
THUMB_MATRIX_ROW_4TI4GPIO7thumbmatrix row 4 (firmware row 3), input, pull-up; tk only — physical top row
THUMB_MATRIX_COLUMN_1TO1GPIO18thumbmatrix column 1 (firmware column 0), output — arc positions 1–2: PCB columns a, b
THUMB_MATRIX_COLUMN_2TO2GPIO8thumbmatrix column 2 (firmware column 1), output — arc position 3: PCB column c, with the center key
THUMB_MATRIX_COLUMN_3TO3GPIO3thumbmatrix column 3 (firmware column 2), output — arc positions 4–5: PCB columns d, e
THUMB_LED_DATALED_DATAGPIO17thumbLED data, output — WS2812-protocol data to LED1 DIN (RMT channel 0)
THUMB_JOYSTICK_XJXGPIO5thumbjoystick axis X, analog input; tkj only — ADC1 channel 4: the stick's VR2 output through 1 kΩ, with 100 nF to ground at the header; row 2's pin
THUMB_JOYSTICK_YJYGPIO7thumbjoystick axis Y, analog input; tkj only — ADC1 channel 6: the stick's VR1 output through 1 kΩ, with 100 nF to ground at the header; row 4's pin
BOTTOM_SENSOR_SPI_CLOCKSCLKGPIO12bottomsensor SPI SCLK, output; bm-pmw3389, bm-pmw3610 only — SPI2 clock, idle high
BOTTOM_SENSOR_SPI_MOSIMOSIGPIO11bottomsensor SPI MOSI, output; bm-pmw3389, bm-pmw3610 only — SPI2 data out; the PMW3610's one half-duplex data line (SDIO) is this pin, then also an input
BOTTOM_SENSOR_SPI_MISOMISOGPIO13bottomsensor SPI MISO, input; bm-pmw3389 only — SPI2 data in
BOTTOM_SENSOR_SPI_SELECTNCSGPIO10bottomsensor SPI NCS, output; bm-pmw3389, bm-pmw3610 only — chip select, driven by software, idle high
BOTTOM_SENSOR_I2C_DATASDAGPIO11bottomsensor I2C SDA, bidirectional; bg only — I2C0 data, open drain; the breakout's own pull-ups hold it high
BOTTOM_SENSOR_I2C_CLOCKSCLGPIO12bottomsensor I2C SCL, output; bg only — I2C0 clock, open drain; the breakout's own pull-ups hold it high
BOTTOM_SENSOR_MOTIONMOTIONGPIO9bottomsensor interrupt, input, pull-up — active low: motion or data to read; wakes the sensor task. The gyro's INT, which its driver sets active low
BOTTOM_SENSOR_RESETNRESETGPIO46bottomsensor reset, output; bm-pmw3389 only — active low, idle high; a boot strap (Strapping pins)
BOTTOM_ADNS5050_SPI_CLOCKsclkGPIO14bottomsensor SPI SCLK, output; bm-adns5050 only — SPI2 clock, idle high; v3's pin, main-board pin 20. The main board's battery divider (470 kΩ / 470 kΩ) hangs on it: the module never has a battery
BOTTOM_ADNS5050_SPI_DATAsdioGPIO13bottomsensor SPI MOSI, bidirectional; bm-adns5050 only — the one half-duplex data line (SDIO), SPI2 SIO0; v3's pin, main-board pin 19
BOTTOM_ADNS5050_RESETnGPIO12bottomsensor reset, output; bm-adns5050 only — NRESET, active low, idle high; v3's pin, main-board pin 18
BOTTOM_ADNS5050_SPI_SELECTnscGPIO11bottomsensor SPI NCS, output; bm-adns5050 only — NCS, driven by software, idle high; v3's pin, main-board pin 17
BATTERY_VOLTAGE_SENSEBATTERY_VOLTAGE_SENSEGPIO14anybattery voltage, analog input; battery only — ADC2; the cell voltage through the BPI-Leaf-S3's own 470 kΩ / 470 kΩ divider (firmware/docs/battery-monitoring.md); the ADNS-5050's clock shares its pin, which build.toml [[rule]] battery-not-with-usb-only-sensor keeps apart
3V33V33.3 V railany3.3 V rail — supply of the thumbs' LEDs, the joystick thumb's stick and the bottom slot's sensor breakout (no GPIO can source it)
5V5V5 V railany5 V rail; bm-adns5050 only — the main board's USB VBUS: live only while USB is plugged in, never from the battery; supply of the ADNS-5050 module alone, so its hand has no battery (build.toml [[rule]] battery-not-with-usb-only-sensor)
GNDGNDgroundanyground — LED return, encoder common, sensor ground

Main board: BPI-Leaf-S3 (ESP32-S3)

Pins are electronics/lib/parts.toml BPI-Leaf-S3's: 1–22 the 3V3 row (J1), 23–44 the row that starts with GND (J3), each counted from the antenna end; the silkscreen names them. A rail has several pins, so each slot's rail wire has its own:

SlotRailMain-board pin
thumb3V31 (3V3, J1·1)
thumbGND44 (GND, J3·22)
fingersGND23 (GND, J3·1)
bottom3V32 (3V3, J1·2)
bottom5V21 (5V, J1·21)
bottomGND22 (GND, J1·22)

The rail pins are a proposal: not confirmed until a cat has been wired this way.

The battery plugs into its own socket, CN1, a 2-pin MX 1.25 mm socket on the top face beside the USB-C end: pin 1 +, pin 2 -. No module wire goes to it. Source: Banana Pi's schematic (contacts) and dimension drawing (position), measured off the drawing, ±0.3 mm.

The battery's own lead (2-pin JST 1.25 mm plug) runs through the power switch (build.toml power-switch, pins 1 throw, 2 common, 3 throw, 4.7 mm pitch):

CarriesLeadFromTo
+redbattery +switch 2
+redswitch 1socket 1
-blackbattery -socket 2

The plug's polarity is not verified: measure which contact is + before plugging it in.

Strapping pins

ESP32-S3 strapping pins the cat wires. The chip latches a strap while it is held in reset, before any firmware runs: what counts is the level the hardware holds the line at then.

PinStrapWired toNoteVerified
GPIO46boot mode, with GPIO0 (weak pull-down by default); gates the ROM boot log only if the UART_PRINT_CONTROL eFuse is burntBOTTOM_SENSOR_RESETPMW3389 NRESET, bm-pmw3389. The breakout's NRESET pull-up holds GPIO46 at 1 during reset. A normal boot (GPIO0 = 1) ignores GPIO46, but holding BOOT (GPIO0 = 0) with GPIO46 = 1 is the combination the datasheet calls invalid, so the manual BOOT-button download may fail with a PMW3389 fitted. If it does, disconnecting the sensor's NRESET lead for the download should restore it. Whether the automatic USB reset into download mode is affected is untested as well.no — bench check pending
GPIO3JTAG signal source; read only if the STRAP_JTAG_SEL eFuse is burnt (not by default)THUMB_MATRIX_COLUMN_3no boot effect with default eFusesno — bench check pending

Left finger module, 21 keys (left-F21) — J1

PH2.54-1X10P-H25 (LCSC C42431810), 1×10 vertical 2.54 mm, bottom side. KiCad project electronics/boards/left-finger-module-21-keys/left-finger-module-21-keys.kicad_pro. Pins from the frozen baseline electronics/baseline/F21-left/netlist.json (source designator H4), which owns this board until its review.

PinSignalSilkFunctionCat sideMain-board pinCable
1FINGER_MATRIX_COLUMN_1FO1matrix column 1 (firmware column 0), output — driven low to scan; index · outerGPIO126 (GPIO1, J3·4)unknown
2FINGER_MATRIX_COLUMN_2FO2matrix column 2 (firmware column 1), output — index · innerGPIO227 (GPIO2, J3·5)unknown
3FINGER_MATRIX_COLUMN_3FO3matrix column 3 (firmware column 2), output — middle; the left board's m0 is on column 1GPIO4228 (GPIO42, J3·6)unknown
4FINGER_MATRIX_COLUMN_4FO4matrix column 4 (firmware column 3), output — ringGPIO4129 (GPIO41, J3·7)unknown
5FINGER_MATRIX_COLUMN_5FO5matrix column 5 (firmware column 4), output — pinky · innerGPIO4030 (GPIO40, J3·8)unknown
6FINGER_MATRIX_COLUMN_6FO6matrix column 6 (firmware column 5), output — pinky · outerGPIO3931 (GPIO39, J3·9)unknown
7FINGER_MATRIX_ROW_1FI1matrix row 1 (firmware row 0), input, pull-up — physical bottom rowGPIO3832 (GPIO38, J3·10)unknown
8FINGER_MATRIX_ROW_2FI2matrix row 2 (firmware row 1), input, pull-upGPIO3733 (GPIO37, J3·11)unknown
9FINGER_MATRIX_ROW_3FI3matrix row 3 (firmware row 2), input, pull-upGPIO3634 (GPIO36, J3·12)unknown
10FINGER_MATRIX_ROW_4FI4matrix row 4 (firmware row 3), input, pull-up — physical top rowGPIO3535 (GPIO35, J3·13)unknown

Right finger module, 20 keys + scroll wheel (right-F20W) — J1

KH-2.54PH180-1X13P-L11.5 (LCSC C2932703), 1×13 vertical 2.54 mm, bottom side. KiCad project electronics/boards/right-finger-module-20-keys-scroll-wheel/right-finger-module-20-keys-scroll-wheel.kicad_pro. Pins from the frozen baseline electronics/baseline/F20w-right/netlist.json (source designator H8), which owns this board until its review. Note: the source board labels pin 9 'Fo9'; it is FO6, and the KiCad redraw labels every pin with its signal's alias.

PinSignalSilkFunctionCat sideMain-board pinCable
1GNDGNDground — LED return, encoder common, sensor groundground23 (GND, J3·1)unknown
2FINGER_SCROLL_ENCODER_AWAscroll encoder channel A, input, pull-up — EVQWGD001; fkw onlyGPIO4324 (GPIO43, J3·2)unknown
3FINGER_SCROLL_ENCODER_BWBscroll encoder channel B, input, pull-up — EVQWGD001; fkw onlyGPIO4425 (GPIO44, J3·3)unknown
4FINGER_MATRIX_COLUMN_1FO1matrix column 1 (firmware column 0), output — driven low to scan; index · outerGPIO126 (GPIO1, J3·4)unknown
5FINGER_MATRIX_COLUMN_2FO2matrix column 2 (firmware column 1), output — index · innerGPIO227 (GPIO2, J3·5)unknown
6FINGER_MATRIX_COLUMN_3FO3matrix column 3 (firmware column 2), output — middle; the left board's m0 is on column 1GPIO4228 (GPIO42, J3·6)unknown
7FINGER_MATRIX_COLUMN_4FO4matrix column 4 (firmware column 3), output — ringGPIO4129 (GPIO41, J3·7)unknown
8FINGER_MATRIX_COLUMN_5FO5matrix column 5 (firmware column 4), output — pinky · innerGPIO4030 (GPIO40, J3·8)unknown
9FINGER_MATRIX_COLUMN_6FO6matrix column 6 (firmware column 5), output — pinky · outerGPIO3931 (GPIO39, J3·9)unknown
10FINGER_MATRIX_ROW_1FI1matrix row 1 (firmware row 0), input, pull-up — physical bottom rowGPIO3832 (GPIO38, J3·10)unknown
11FINGER_MATRIX_ROW_2FI2matrix row 2 (firmware row 1), input, pull-upGPIO3733 (GPIO37, J3·11)unknown
12FINGER_MATRIX_ROW_3FI3matrix row 3 (firmware row 2), input, pull-upGPIO3634 (GPIO36, J3·12)unknown
13FINGER_MATRIX_ROW_4FI4matrix row 4 (firmware row 3), input, pull-up — physical top rowGPIO3535 (GPIO35, J3·13)unknown

Left thumb module, 11 keys (left-T11) — J1

PH2.54-1X10P-H25 (LCSC C42431810), 1×10 vertical 2.54 mm, bottom side. KiCad project electronics/boards/left-thumb-module-11-keys/left-thumb-module-11-keys.kicad_pro. Pins from the KiCad board, which owns this board; the frozen source called the header H3.

PinSignalSilkFunctionCat sideMain-board pinCable
1GNDGNDground — LED return, encoder common, sensor groundground44 (GND, J3·22)unknown
23V33V33.3 V rail — supply of the thumbs' LEDs, the joystick thumb's stick and the bottom slot's sensor breakout (no GPIO can source it)3.3 V rail1 (3V3, J1·1)unknown
3THUMB_LED_DATALED_DATALED data, output — WS2812-protocol data to LED1 DIN (RMT channel 0)GPIO1710 (GPIO17, J1·10)unknown
4THUMB_MATRIX_COLUMN_1TO1matrix column 1 (firmware column 0), output — arc positions 1–2: PCB columns a, bGPIO1811 (GPIO18, J1·11)unknown
5THUMB_MATRIX_COLUMN_2TO2matrix column 2 (firmware column 1), output — arc position 3: PCB column c, with the center keyGPIO812 (GPIO8, J1·12)unknown
6THUMB_MATRIX_COLUMN_3TO3matrix column 3 (firmware column 2), output — arc positions 4–5: PCB columns d, eGPIO313 (GPIO3, J1·13)unknown
7THUMB_MATRIX_ROW_1TI1matrix row 1 (firmware row 0), input, pull-up — physical bottom rowGPIO44 (GPIO4, J1·4)unknown
8THUMB_MATRIX_ROW_2TI2matrix row 2 (firmware row 1), input, pull-up; tk only — the joystick thumb (tkj) has no keys on rows 2 and 4: its stick's axes take their pinsGPIO55 (GPIO5, J1·5)unknown
9THUMB_MATRIX_ROW_3TI3matrix row 3 (firmware row 2), input, pull-upGPIO66 (GPIO6, J1·6)unknown
10THUMB_MATRIX_ROW_4TI4matrix row 4 (firmware row 3), input, pull-up; tk only — physical top rowGPIO77 (GPIO7, J1·7)unknown

Left thumb module, 4 keys + joystick (left-T4J) — J1

PH2.54-1X10P-H25 (LCSC C42431810), 1×10 vertical 2.54 mm, bottom side. KiCad project electronics/boards/left-thumb-module-4-keys-joystick/left-thumb-module-4-keys-joystick.kicad_pro. Pins from the KiCad board, where the board was drawn (no frozen source).

PinSignalSilkFunctionCat sideMain-board pinCable
1GNDGNDground — LED return, encoder common, sensor groundground44 (GND, J3·22)unknown
23V33V33.3 V rail — supply of the thumbs' LEDs, the joystick thumb's stick and the bottom slot's sensor breakout (no GPIO can source it)3.3 V rail1 (3V3, J1·1)unknown
3THUMB_LED_DATALED_DATALED data, output — WS2812-protocol data to LED1 DIN (RMT channel 0)GPIO1710 (GPIO17, J1·10)unknown
4THUMB_MATRIX_COLUMN_1TO1matrix column 1 (firmware column 0), output — arc positions 1–2: PCB columns a, bGPIO1811 (GPIO18, J1·11)unknown
5THUMB_MATRIX_COLUMN_2TO2matrix column 2 (firmware column 1), output — arc position 3: PCB column c, with the center keyGPIO812 (GPIO8, J1·12)unknown
6THUMB_MATRIX_COLUMN_3TO3matrix column 3 (firmware column 2), output — arc positions 4–5: PCB columns d, eGPIO313 (GPIO3, J1·13)unknown
7THUMB_MATRIX_ROW_1TI1matrix row 1 (firmware row 0), input, pull-up — physical bottom rowGPIO44 (GPIO4, J1·4)unknown
8THUMB_JOYSTICK_XJXjoystick axis X, analog input; tkj only — ADC1 channel 4: the stick's VR2 output through 1 kΩ, with 100 nF to ground at the header; row 2's pinGPIO55 (GPIO5, J1·5)unknown
9THUMB_MATRIX_ROW_3TI3matrix row 3 (firmware row 2), input, pull-upGPIO66 (GPIO6, J1·6)unknown
10THUMB_JOYSTICK_YJYjoystick axis Y, analog input; tkj only — ADC1 channel 6: the stick's VR1 output through 1 kΩ, with 100 nF to ground at the header; row 4's pinGPIO77 (GPIO7, J1·7)unknown

Right thumb module, 11 keys (right-T11) — J1

A2541WV-10P (LCSC C225485), 1×10 vertical 2.54 mm, bottom side. KiCad project electronics/boards/right-thumb-module-11-keys/right-thumb-module-11-keys.kicad_pro. Pins from the KiCad board, which owns this board; the frozen source called the header H2.

PinSignalSilkFunctionCat sideMain-board pinCable
1THUMB_MATRIX_ROW_4TI4matrix row 4 (firmware row 3), input, pull-up; tk only — physical top rowGPIO77 (GPIO7, J1·7)unknown
2THUMB_MATRIX_ROW_3TI3matrix row 3 (firmware row 2), input, pull-upGPIO66 (GPIO6, J1·6)unknown
3THUMB_MATRIX_ROW_2TI2matrix row 2 (firmware row 1), input, pull-up; tk only — the joystick thumb (tkj) has no keys on rows 2 and 4: its stick's axes take their pinsGPIO55 (GPIO5, J1·5)unknown
4THUMB_MATRIX_ROW_1TI1matrix row 1 (firmware row 0), input, pull-up — physical bottom rowGPIO44 (GPIO4, J1·4)unknown
5THUMB_MATRIX_COLUMN_3TO3matrix column 3 (firmware column 2), output — arc positions 4–5: PCB columns d, eGPIO313 (GPIO3, J1·13)unknown
6THUMB_MATRIX_COLUMN_2TO2matrix column 2 (firmware column 1), output — arc position 3: PCB column c, with the center keyGPIO812 (GPIO8, J1·12)unknown
7THUMB_MATRIX_COLUMN_1TO1matrix column 1 (firmware column 0), output — arc positions 1–2: PCB columns a, bGPIO1811 (GPIO18, J1·11)unknown
8THUMB_LED_DATALED_DATALED data, output — WS2812-protocol data to LED1 DIN (RMT channel 0)GPIO1710 (GPIO17, J1·10)unknown
93V33V33.3 V rail — supply of the thumbs' LEDs, the joystick thumb's stick and the bottom slot's sensor breakout (no GPIO can source it)3.3 V rail1 (3V3, J1·1)unknown
10GNDGNDground — LED return, encoder common, sensor groundground44 (GND, J3·22)unknown

Right thumb module, 4 keys + joystick (right-T4J) — J1

A2541WV-10P (LCSC C225485), 1×10 vertical 2.54 mm, bottom side. KiCad project electronics/boards/right-thumb-module-4-keys-joystick/right-thumb-module-4-keys-joystick.kicad_pro. Pins from the KiCad board, where the board was drawn (no frozen source).

PinSignalSilkFunctionCat sideMain-board pinCable
1THUMB_JOYSTICK_YJYjoystick axis Y, analog input; tkj only — ADC1 channel 6: the stick's VR1 output through 1 kΩ, with 100 nF to ground at the header; row 4's pinGPIO77 (GPIO7, J1·7)unknown
2THUMB_MATRIX_ROW_3TI3matrix row 3 (firmware row 2), input, pull-upGPIO66 (GPIO6, J1·6)unknown
3THUMB_JOYSTICK_XJXjoystick axis X, analog input; tkj only — ADC1 channel 4: the stick's VR2 output through 1 kΩ, with 100 nF to ground at the header; row 2's pinGPIO55 (GPIO5, J1·5)unknown
4THUMB_MATRIX_ROW_1TI1matrix row 1 (firmware row 0), input, pull-up — physical bottom rowGPIO44 (GPIO4, J1·4)unknown
5THUMB_MATRIX_COLUMN_3TO3matrix column 3 (firmware column 2), output — arc positions 4–5: PCB columns d, eGPIO313 (GPIO3, J1·13)unknown
6THUMB_MATRIX_COLUMN_2TO2matrix column 2 (firmware column 1), output — arc position 3: PCB column c, with the center keyGPIO812 (GPIO8, J1·12)unknown
7THUMB_MATRIX_COLUMN_1TO1matrix column 1 (firmware column 0), output — arc positions 1–2: PCB columns a, bGPIO1811 (GPIO18, J1·11)unknown
8THUMB_LED_DATALED_DATALED data, output — WS2812-protocol data to LED1 DIN (RMT channel 0)GPIO1710 (GPIO17, J1·10)unknown
93V33V33.3 V rail — supply of the thumbs' LEDs, the joystick thumb's stick and the bottom slot's sensor breakout (no GPIO can source it)3.3 V rail1 (3V3, J1·1)unknown
10GNDGNDground — LED return, encoder common, sensor groundground44 (GND, J3·22)unknown

Bottom slot: sensor breakouts

A bottom module is a purchased breakout, wired lead by lead to the main board: no module header. Leads are named by the sensor pin the firmware driver's wiring table uses. One variant is fitted per cat (LYNXware.toml); the pins are shared, so the variants are alternatives, never together.

bm-pmw3389 — build.toml part pmw3389-breakout

The breakout makes the sensor's 1.9 V VDD itself; VDDIO takes the 3.3 V rail, so the sensor runs on battery.

Its header, pin 1 first: 1 VIN (VDDIO), 2 MISO, 3 MOSI, 4 SCK (SCLK), 5 SS (NCS), 6 MT (MOTION), 7 GND, 8 RST (NRESET). Source: the sellers' product photos on Tindie: one row, pin 1 the square pad at VIN (citizenjoe/pmw3389-motion-sensor); the original JACK Enterprises board has the same order, labelled VI, MI, MO, SC, SS, MT, GD, RS (jkicklighter/pmw3389-motion-sensor). The pitch is not stated.

LeadSignalFunctionCat sideMain-board pinWire
SCLKBOTTOM_SENSOR_SPI_CLOCKsensor SPI SCLK, output; bm-pmw3389, bm-pmw3610 only — SPI2 clock, idle highGPIO1218 (GPIO12, J1·18)unknown
MOSIBOTTOM_SENSOR_SPI_MOSIsensor SPI MOSI, output; bm-pmw3389, bm-pmw3610 only — SPI2 data out; the PMW3610's one half-duplex data line (SDIO) is this pin, then also an inputGPIO1117 (GPIO11, J1·17)unknown
MISOBOTTOM_SENSOR_SPI_MISOsensor SPI MISO, input; bm-pmw3389 only — SPI2 data inGPIO1319 (GPIO13, J1·19)unknown
NCSBOTTOM_SENSOR_SPI_SELECTsensor SPI NCS, output; bm-pmw3389, bm-pmw3610 only — chip select, driven by software, idle highGPIO1016 (GPIO10, J1·16)unknown
MOTIONBOTTOM_SENSOR_MOTIONsensor interrupt, input, pull-up — active low: motion or data to read; wakes the sensor task. The gyro's INT, which its driver sets active lowGPIO915 (GPIO9, J1·15)unknown
NRESETBOTTOM_SENSOR_RESETsensor reset, output; bm-pmw3389 only — active low, idle high; a boot strap (Strapping pins)GPIO4614 (GPIO46, J1·14)unknown
VDDIO3V33.3 V rail — supply of the thumbs' LEDs, the joystick thumb's stick and the bottom slot's sensor breakout (no GPIO can source it)3.3 V rail2 (3V3, J1·2)unknown
GNDGNDground — LED return, encoder common, sensor groundground22 (GND, J1·22)unknown

bm-pmw3610 — build.toml part pmw3610-breakout

3-wire SPI: SDIO is the one data line; the breakout regulates the sensor's core supply. Driver compile-checked only, not yet brought up on hardware.

Its header, pin 1 first, 2.54 mm pitch: 1 VIN (VDD), 2 GND, 3 SDIO, 4 SCLK, 5 CS (NCS), 6 MOT, 7 RST (open). Source: siderakb's pmw3610-pcb rev 2.1 (github.com/siderakb/pmw3610-pcb, J1 1×7): the design randware builds, its shipped revision unconfirmed. RST (the sensor's NRESET) stays open: the driver does not wire it.

LeadSignalFunctionCat sideMain-board pinWire
SCLKBOTTOM_SENSOR_SPI_CLOCKsensor SPI SCLK, output; bm-pmw3389, bm-pmw3610 only — SPI2 clock, idle highGPIO1218 (GPIO12, J1·18)unknown
SDIOBOTTOM_SENSOR_SPI_MOSIsensor SPI MOSI, output; bm-pmw3389, bm-pmw3610 only — SPI2 data out; the PMW3610's one half-duplex data line (SDIO) is this pin, then also an inputGPIO1117 (GPIO11, J1·17)unknown
NCSBOTTOM_SENSOR_SPI_SELECTsensor SPI NCS, output; bm-pmw3389, bm-pmw3610 only — chip select, driven by software, idle highGPIO1016 (GPIO10, J1·16)unknown
MOTBOTTOM_SENSOR_MOTIONsensor interrupt, input, pull-up — active low: motion or data to read; wakes the sensor task. The gyro's INT, which its driver sets active lowGPIO915 (GPIO9, J1·15)unknown
VDD3V33.3 V rail — supply of the thumbs' LEDs, the joystick thumb's stick and the bottom slot's sensor breakout (no GPIO can source it)3.3 V rail2 (3V3, J1·2)unknown
GNDGNDground — LED return, encoder common, sensor groundground22 (GND, J1·22)unknown

bm-adns5050 — build.toml part adns5050-module

3-wire SPI: SDIO is the one data line, as the PMW3610's. VDD5 takes the main board's 5 V pin, which only USB powers: the sensor is dead on battery. v3 bit-banged these pins; the SPI2 driver is compile-checked only.

Its header, pin 1 first, 2.54 mm pitch: 1 GND, 2 V (VDD5), 3 sclk (SCLK), 4 sdio (SDIO), 5 n (NRESET), 6 nsc (NCS). Source: the v3 board (EasyEDA PCB_PCB_adns5050, 2026-10-16), header H1: pin 1 the square pad, its nets and the silkscreen beside each pin; electronics/boards/bottom-module-mouse-sensor-adns5050 draws it 1:1, the header as J1.

LeadSignalFunctionCat sideMain-board pinWire
SCLKBOTTOM_ADNS5050_SPI_CLOCKsensor SPI SCLK, output; bm-adns5050 only — SPI2 clock, idle high; v3's pin, main-board pin 20. The main board's battery divider (470 kΩ / 470 kΩ) hangs on it: the module never has a batteryGPIO1420 (GPIO14, J1·20)unknown
SDIOBOTTOM_ADNS5050_SPI_DATAsensor SPI MOSI, bidirectional; bm-adns5050 only — the one half-duplex data line (SDIO), SPI2 SIO0; v3's pin, main-board pin 19GPIO1319 (GPIO13, J1·19)unknown
NCSBOTTOM_ADNS5050_SPI_SELECTsensor SPI NCS, output; bm-adns5050 only — NCS, driven by software, idle high; v3's pin, main-board pin 17GPIO1117 (GPIO11, J1·17)unknown
NRESETBOTTOM_ADNS5050_RESETsensor reset, output; bm-adns5050 only — NRESET, active low, idle high; v3's pin, main-board pin 18GPIO1218 (GPIO12, J1·18)unknown
VDD55V5 V rail; bm-adns5050 only — the main board's USB VBUS: live only while USB is plugged in, never from the battery; supply of the ADNS-5050 module alone, so its hand has no battery (build.toml [[rule]] battery-not-with-usb-only-sensor)5 V rail21 (5V, J1·21)unknown
GNDGNDground — LED return, encoder common, sensor groundground22 (GND, J1·22)unknown

bg — build.toml part mpu-6050-breakout

The GY-521's own regulator makes the MPU-6050's supply from VCC (3.3 to 5 V; from the 3.3 V rail it drops a little, inside the chip's 2.375 to 3.46 V), and its own pull-ups hold SDA and SCL. AD0's pull-down sets the address 0x68. No driver yet.

Its header, pin 1 first, 2.54 mm pitch: 1 VCC, 2 GND, 3 SCL, 4 SDA, 5 XDA (open), 6 XCL (open), 7 AD0 (open), 8 INT. Source: Fritzing's GY-521 part (fritzing-parts, core/InvenSense_MPU6050.fzp; the board gyro_ref.py draws): one row, pin 1 VCC, the order of the board's silkscreen. XDA and XCL (the MPU-6050's auxiliary I2C) and AD0 stay open.

LeadSignalFunctionCat sideMain-board pinWire
SDABOTTOM_SENSOR_I2C_DATAsensor I2C SDA, bidirectional; bg only — I2C0 data, open drain; the breakout's own pull-ups hold it highGPIO1117 (GPIO11, J1·17)unknown
SCLBOTTOM_SENSOR_I2C_CLOCKsensor I2C SCL, output; bg only — I2C0 clock, open drain; the breakout's own pull-ups hold it highGPIO1218 (GPIO12, J1·18)unknown
INTBOTTOM_SENSOR_MOTIONsensor interrupt, input, pull-up — active low: motion or data to read; wakes the sensor task. The gyro's INT, which its driver sets active lowGPIO915 (GPIO9, J1·15)unknown
VCC3V33.3 V rail — supply of the thumbs' LEDs, the joystick thumb's stick and the bottom slot's sensor breakout (no GPIO can source it)3.3 V rail2 (3V3, J1·2)unknown
GNDGNDground — LED return, encoder common, sensor groundground22 (GND, J1·22)unknown

Provenance

  • electronics/wiring-harness.toml sha256 0985ced98b402be8…
  • firmware/cat/src/bin/main.rs pin assignments (check_wiring_harness.firmware_map) sha256 4c693529ce1f3801…
  • electronics/lib/parts.toml BPI-Leaf-S3 pins sha256 b5f220238e2207a7…
  • electronics/baseline/F21-left/netlist.json H4 pin → net sha256 f2d4384fe3bd7bfc…
  • electronics/baseline/F20w-right/netlist.json H8 pin → net sha256 6ba9386f0652cb58…
  • electronics/boards/left-thumb-module-11-keys/left-thumb-module-11-keys.kicad_pcb J1 pin → net sha256 78d13bf845ee2d0e…
  • electronics/boards/left-thumb-module-4-keys-joystick/left-thumb-module-4-keys-joystick.kicad_pcb J1 pin → net sha256 44a96e81c31bdbbd…
  • electronics/boards/right-thumb-module-11-keys/right-thumb-module-11-keys.kicad_pcb J1 pin → net sha256 38651e03ef8d303c…
  • electronics/boards/right-thumb-module-4-keys-joystick/right-thumb-module-4-keys-joystick.kicad_pcb J1 pin → net sha256 5d4ad4a2363863bd…
  • command: python3 tools/electronics/pinout.py