This repository is a ZMK config plus a small repo-root module for Sofle/TPS65 shield wiring.
The actual IQS5xx trackpad driver is pulled in as an external ZMK module from
AYM1607/zmk-driver-azoteq-iqs5xx,
pinned in config/west.yml.
The sample build matrix is aimed at a Sofle using nice!nano controllers:
tps65_breadboard: single-board breadboard test target for a nice!nano-compatible Pro Micro nRF52840 and a TPS65.sofle_left tps65_central+sofle_right: trackpad mounted on the central half.sofle_left tps65_listener+sofle_right tps65_peripheral: trackpad mounted on the right peripheral half and forwarded to the central over ZMK input split.
The add-on shields assume the following defaults in
boards/shields/tps65_common/tps65_device.dtsi:
SDA: Pro MicroD2SCL: Pro MicroD3RDY: Pro MicroD8RST: Pro MicroD9VCC:3V3GND:GND
This is intentional:
- In the ZMK
nice_nanoboard definition used by this repo,pro_micro_i2cmaps toD2/D3. D8/D9are then a clean choice for the TPS65RDYandRSTlines.- The I2C bus is driven at
400 kHz, matching working IQS5xx examples.
If your wiring or physical orientation differs, adjust
boards/shields/tps65_common/tps65_device.dtsi:
- Change
rdy-gpios/reset-gpiosto match your wiring. - Add
flip-x;,flip-y;,switch-xy;,natural-scroll-x;, ornatural-scroll-y;on thetps65node if needed.
The pinned IQS5xx module supports:
- Trackpad movement.
- Single-finger tap as left click.
- Two-finger tap as right click.
- Press-and-hold for click-drag.
- Vertical and horizontal scroll.
The default node in this repo enables all of those except any axis inversion that depends on your physical mounting.
The shield configs also explicitly enable the required ZMK/Zephyr symbols for pointing devices:
CONFIG_ZMK_MOUSECONFIG_ZMK_POINTINGCONFIG_INPUTCONFIG_INPUT_AZOTEQ_IQS5XXCONFIG_I2C
For an initial breadboard test with a nice!nano-compatible V1940 ProMicro NRF52840:
- TPS65
VCC-> controller3V3 - TPS65
GND-> controllerGND - TPS65
SDA-> controllerD2 - TPS65
SCL-> controllerD3 - TPS65
RDY-> controllerD8 - TPS65
RST-> controllerD9
The single-board tps65_breadboard shield also defines one dummy key on D4 with an internal
pull-up. You do not need to wire anything to D4; it exists only so ZMK has a stable one-key
matrix while you test the trackpad.
For first bring-up, I recommend using the dedicated breadboard target:
- build:
tps65_breadboard
If you want to move on to a real Sofle half after that:
- left build:
sofle_left tps65_central - right build:
sofle_right
If you specifically want the trackpad on the right split peripheral, use:
west init -l config
west update
west zephyr-export
west build -s zmk/app -d build/sofle-left-rightpad -b nice_nano -- \
-DSHIELD="sofle_left tps65_listener" \
-DZMK_CONFIG="$PWD/config" \
-DZMK_EXTRA_MODULES="$PWD"
west build -s zmk/app -d build/sofle-right-rightpad -b nice_nano -- \
-DSHIELD="sofle_right tps65_peripheral" \
-DZMK_CONFIG="$PWD/config" \
-DZMK_EXTRA_MODULES="$PWD"For initial breadboard testing, ignore this section and use the dedicated tps65_breadboard
commands in Producing The UF2 below.
There are two practical ways to get the .uf2:
This is the easiest path if you do not already have the full ZMK toolchain installed.
- Put this repository on GitHub.
- Push to your branch.
- Open the Actions tab and run or wait for the
Build Firmwareworkflow in.github/workflows/build.yml. - Download the workflow artifact zip.
- Inside the zip, use the matching
.uf2file:tps65-breadboardfor the single-board breadboard testsofle-left-tps65-centralfor the left/central trackpad testsofle-right-no-trackpadfor the matching right half
The workflow creates the repo-root zephyr/module.yml file on the runner by calling
./scripts/prepare-module.sh, so you do not need to commit your local west update checkout.
If you want to build locally, install ZMK's normal local prerequisites first: west, cmake,
Python dependencies, Zephyr SDK/toolchain, etc.
Then run:
west init -l config
west update
west zephyr-export
west packages pip --install
sh ./scripts/prepare-module.sh
cd zephyr
west sdk install --toolchains arm-zephyr-eabi
cd ..
west build -s zmk/app -d build/breadboard -b nice_nano -- \
-DSHIELD="tps65_breadboard" \
-DZMK_CONFIG="$PWD/config" \
-DZMK_EXTRA_MODULES="$PWD"
west build -s zmk/app -d build/left -b nice_nano -- \
-DSHIELD="sofle_left tps65_central" \
-DZMK_CONFIG="$PWD/config" \
-DZMK_EXTRA_MODULES="$PWD"
west build -s zmk/app -d build/right -b nice_nano -- \
-DSHIELD="sofle_right" \
-DZMK_CONFIG="$PWD/config" \
-DZMK_EXTRA_MODULES="$PWD"The resulting files will be in:
build/breadboard/zephyr/zmk.uf2build/left/zephyr/zmk.uf2build/right/zephyr/zmk.uf2
To flash a nice!nano-compatible board, double-tap reset so it mounts as a UF2 drive, then copy the
appropriate zmk.uf2 onto it.
If west sdk install errors with ModuleNotFoundError: No module named 'patoolib', it means the
Zephyr Python requirements were not installed yet; run west packages pip --install first.
If your controller is a V1940 ProMicro NRF52840, it is typically a nice!nano-v2-compatible clone,
so this repo intentionally builds with board: nice_nano.