Files
qemu-xteink/README.xteink.md
T
evan 1174ef0e5d feat(xteink): manage the emulator SD card from the web UI
Browse, edit, upload, and delete files on the FAT32 image with mtools,
mirroring the wasm emulator's Files tab. Mutations stop the emulator
first because QEMU caches the card, so host writes to a live image would
be lost.
2026-07-26 11:36:37 -04:00

2.6 KiB
Raw Blame History

xteink QEMU fork

Espressif's QEMU fork carrying the xteink X3/X4 (ESP32-C3) machine model and a wasm32 TCG backend (ported from ktock/qemu-wasm), used by xteink-web-emulator to run CrossPoint firmware in the browser.

Branch

  • main — the working branch. Base is Espressif's esp-develop-9.2.2-20260417 (40edccac).

Remotes

Building

Native (parity check — authoritative)

nix develop
./configure --target-list=riscv32-softmmu --with-devices-riscv32=xteink --enable-gcrypt
ninja -C build qemu-system-riscv32

Or build the native xteink target into dist/qemu-native for direct script use:

make xteink
uv run --script scripts/xteink-emu.py --help

Agent emulator

nix run .#xteink-emu -- start --firmware firmware.bin --sdcard sdcard.img
nix run .#xteink-emu -- interactive --firmware firmware.bin --sdcard sdcard.img
nix run .#xteink-emu -- wait --timeout 30 --match 'ready'
nix run .#xteink-emu -- button bottom-2 --hold-ms 100
nix run .#xteink-emu -- screenshot --output screen.png
nix run .#xteink-emu -- stop
nix run .#xteink-emu -- web --host 127.0.0.1 --port 8080

The code lives in scripts/xteink/ (emu.py drives QEMU, cli.py is the command line, web/ is the browser UI); scripts/xteink-emu.py is the entry point. web serves a page that uploads firmware and an SD image, boots them, drives the buttons, streams the panel and serial log, and browses or edits the SD card through mtools. Card edits stop the emulator first, since QEMU caches the image; use Apply & Reboot to bring it back. The screen redraws off the panel's frame-generation counter, so it updates on each real e-ink refresh rather than on a timer.

State defaults to /tmp/xteink-emu-$UID; pass --state-dir to any subcommand for parallel instances. interactive opens the display and maps Left/Right, 14, and P to the matching device buttons. Hold P for a long power press and close the window to stop. wait advances a persistent log cursor after each match. The emulator exposes the open Wi-Fi network qemu; guest traffic uses QEMU's user-mode NAT.

WebAssembly

Driven by the parent repo, not here:

cd ../xteink-web-emulator
make web-dev     # incremental build straight from this tree

The parent's scripts/build-qemu-wasm.sh compiles this checkout inside the emsdk Docker image defined in xteink-web-emulator/qemu/wasm/Dockerfile.