0feece9036
Split the emulator script into an xteink package so the CLI and the new web UI share one QEMU driver. The web UI uploads firmware and an SD image, boots them, drives the buttons, and long-polls the panel frame generation so the screen updates on each e-ink refresh.
137 lines
4.0 KiB
Nix
137 lines
4.0 KiB
Nix
{
|
|
description = "Espressif QEMU fork with the xteink X3/X4 (ESP32-C3) machine and a wasm32 TCG backend";
|
|
|
|
inputs = {
|
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
|
flake-utils.url = "github:numtide/flake-utils";
|
|
};
|
|
|
|
outputs =
|
|
{ self
|
|
, nixpkgs
|
|
, flake-utils
|
|
,
|
|
}:
|
|
flake-utils.lib.eachDefaultSystem (
|
|
system:
|
|
let
|
|
pkgs = nixpkgs.legacyPackages.${system};
|
|
keycodemapdb = pkgs.fetchFromGitLab {
|
|
owner = "qemu-project";
|
|
repo = "keycodemapdb";
|
|
rev = "f5772a62ec52591ff6870b7e8ef32482371f22c6";
|
|
hash = "sha256-GbZ5mrUYLXMi0IX4IZzles0Oyc095ij2xAsiLNJwfKQ=";
|
|
};
|
|
qemu-native-xteink = pkgs.stdenv.mkDerivation {
|
|
pname = "qemu-native-xteink";
|
|
version = pkgs.lib.strings.trim (builtins.readFile ./VERSION);
|
|
src = pkgs.lib.cleanSource ./.;
|
|
|
|
nativeBuildInputs = with pkgs; [
|
|
bison
|
|
flex
|
|
meson
|
|
ninja
|
|
perl
|
|
pkg-config
|
|
python3
|
|
];
|
|
buildInputs = with pkgs; [
|
|
dtc
|
|
glib
|
|
gtk3
|
|
libgcrypt
|
|
libpng
|
|
libslirp
|
|
pixman
|
|
zlib
|
|
];
|
|
|
|
dontUseMesonConfigure = true;
|
|
|
|
postPatch = ''
|
|
cp -r ${keycodemapdb} subprojects/keycodemapdb
|
|
chmod -R u+w subprojects/keycodemapdb
|
|
sed -i "/subdir('fp')/d" tests/meson.build
|
|
substituteInPlace meson.build --replace-fail "static: true" "static: false"
|
|
'';
|
|
|
|
configurePhase = ''
|
|
runHook preConfigure
|
|
export PKG_CONFIG_PATH=${pkgs.libslirp}/lib/pkgconfig''${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}
|
|
./configure \
|
|
--prefix=$out \
|
|
--target-list=riscv32-softmmu \
|
|
--with-devices-riscv32=xteink \
|
|
--with-coroutine=ucontext \
|
|
--without-default-features \
|
|
--enable-system \
|
|
--enable-gcrypt \
|
|
--enable-gtk \
|
|
--enable-pixman \
|
|
--enable-png \
|
|
--enable-slirp \
|
|
--disable-werror \
|
|
--disable-docs \
|
|
--disable-tools
|
|
runHook postConfigure
|
|
'';
|
|
|
|
buildPhase = ''
|
|
runHook preBuild
|
|
ninja -C build qemu-system-riscv32
|
|
runHook postBuild
|
|
'';
|
|
|
|
installPhase = ''
|
|
runHook preInstall
|
|
ninja -C build install
|
|
runHook postInstall
|
|
'';
|
|
};
|
|
xteink-emu = pkgs.writeShellApplication {
|
|
name = "xteink-emu";
|
|
runtimeInputs = [ pkgs.uv ];
|
|
text = ''
|
|
export XTEINK_QEMU=${qemu-native-xteink}/bin/qemu-system-riscv32
|
|
export XTEINK_BIOS=${qemu-native-xteink}/share/qemu
|
|
export XTEINK_BOOTLOADER=${./scripts/assets/esp32c3-bootloader.bin}
|
|
export XTEINK_PARTITIONS=${./scripts/assets/xteink-partitions.bin}
|
|
exec uv run --script ${./scripts}/xteink-emu.py "$@"
|
|
'';
|
|
};
|
|
in
|
|
{
|
|
packages.qemu-native-xteink = qemu-native-xteink;
|
|
packages.xteink-emu = xteink-emu;
|
|
apps.xteink-emu = {
|
|
type = "app";
|
|
program = "${xteink-emu}/bin/xteink-emu";
|
|
};
|
|
|
|
# Native build/test shell. The wasm target is built by the parent
|
|
# xteink-web-emulator repo via its emsdk Docker toolchain, not here.
|
|
#
|
|
# nix develop
|
|
# ./configure --target-list=riscv32-softmmu --with-devices-riscv32=xteink \
|
|
# --enable-gcrypt && ninja -C build qemu-system-riscv32
|
|
devShells.default = pkgs.mkShell {
|
|
inputsFrom = [ pkgs.qemu ];
|
|
packages = with pkgs; [
|
|
dosfstools
|
|
git
|
|
gnumake
|
|
libgcrypt
|
|
libslirp
|
|
meson
|
|
mtools
|
|
ninja
|
|
pixman
|
|
pkg-config
|
|
uv
|
|
];
|
|
};
|
|
}
|
|
);
|
|
}
|