From fd1a86960331433545d23160ba6259110a747c0c Mon Sep 17 00:00:00 2001 From: Van Tuan Vo Date: Mon, 21 Mar 2022 17:50:08 +0100 Subject: klipper-firmware: init at klipper.version - Add `klipper-genconf` helper to generate firmware configs - Add `klipper-flash` helper to flash firmware to microcontroller By default, klipper-firmware is built with a simulator config. Override `firmwareConfig` with a generated config from `klipper-genconf`. To flash the firmware, override `flashDevice` in `klipper-flash`. --- pkgs/servers/klipper/klipper-firmware.nix | 66 +++++++++++++++++++++++++++++++ pkgs/servers/klipper/klipper-flash.nix | 42 ++++++++++++++++++++ pkgs/servers/klipper/klipper-genconf.nix | 22 +++++++++++ pkgs/servers/klipper/simulator.cfg | 23 +++++++++++ 4 files changed, 153 insertions(+) create mode 100644 pkgs/servers/klipper/klipper-firmware.nix create mode 100644 pkgs/servers/klipper/klipper-flash.nix create mode 100644 pkgs/servers/klipper/klipper-genconf.nix create mode 100644 pkgs/servers/klipper/simulator.cfg (limited to 'pkgs/servers/klipper') diff --git a/pkgs/servers/klipper/klipper-firmware.nix b/pkgs/servers/klipper/klipper-firmware.nix new file mode 100644 index 0000000000000..832886c13fe70 --- /dev/null +++ b/pkgs/servers/klipper/klipper-firmware.nix @@ -0,0 +1,66 @@ +{ stdenv +, lib +, pkg-config +, pkgsCross +, bintools-unwrapped +, libffi +, libusb1 +, wxGTK +, python2 +, python3 +, gcc-arm-embedded +, klipper +, avrdude +, stm32flash +, mcu ? "mcu" +, firmwareConfig ? ./simulator.cfg +, flashDevice ? null +}: stdenv.mkDerivation rec { + name = "klipper-firmware-${mcu}-${version}"; + version = klipper.version; + src = klipper.src; + + nativeBuildInputs = [ + python2 + python3 + pkgsCross.avr.stdenv.cc + gcc-arm-embedded + bintools-unwrapped + libffi + libusb1 + avrdude + stm32flash + pkg-config + wxGTK # Required for bossac + ]; + + preBuild = "cp ${firmwareConfig} ./.config"; + + postPatch = '' + patchShebangs . + ''; + + makeFlags = [ + "V=1" + "KCONFIG_CONFIG=${firmwareConfig}" + ]; + + installPhase = '' + mkdir -p $out + cp ./.config $out/config + cp -r out/* $out + + if ${lib.boolToString (!isNull flashDevice)}; then + make FLASH_DEVICE=${toString flashDevice} OUT=$out/ KCONFIG_CONFIG=$out/config flash + fi + ''; + + dontFixup = true; + + meta = { + inherit (klipper.meta) homepage license; + description = "Firmware part of Klipper"; + maintainers = with lib.maintainers; [ vtuan10 ]; + platforms = lib.platforms.linux; + }; +} diff --git a/pkgs/servers/klipper/klipper-flash.nix b/pkgs/servers/klipper/klipper-flash.nix new file mode 100644 index 0000000000000..c81485115cc88 --- /dev/null +++ b/pkgs/servers/klipper/klipper-flash.nix @@ -0,0 +1,42 @@ +{ lib +, writeShellApplication +, gnumake +, pkgsCross +, klipper +, klipper-firmware +, python2 +, avrdude +, stm32flash +, mcu ? "mcu" +, flashDevice ? "/dev/null" +}: +let + firmwareConfig = builtins.readFile "${klipper-firmware}/config"; + isNotSupported = with builtins; isNull (match ''^.*CONFIG_BOARD_DIRECTORY="(avr|stm32|lpc176x)".*$'' firmwareConfig); + isNotStm = with builtins; isNull (match ''^.*CONFIG_BOARD_DIRECTORY="(stm32)".*$'' firmwareConfig); +in +writeShellApplication { + name = "klipper-flash-${mcu}"; + runtimeInputs = [ + python2 + avrdude + stm32flash + pkgsCross.avr.stdenv.cc + ]; + text = '' + NOT_SUPPORTED=${lib.boolToString isNotSupported} + NOT_STM=${lib.boolToString isNotStm} + if $NOT_SUPPORTED; then + printf "Flashing Klipper firmware to your board is not supported yet.\n" + printf "Please use the compiled firmware at ${klipper-firmware} and flash it using the tools provided for your microcontroller." + exit 1 + fi + pushd ${klipper.src} + if $NOT_STM; then + ${gnumake}/bin/make FLASH_DEVICE="${toString flashDevice}" OUT="${klipper-firmware}/" KCONFIG_CONFIG="${klipper-firmware}/config" flash + else + ${gnumake}/bin/make FLASH_DEVICE="${toString flashDevice}" OUT="${klipper-firmware}/" KCONFIG_CONFIG="${klipper-firmware}/config" serialflash + fi + popd + ''; +} diff --git a/pkgs/servers/klipper/klipper-genconf.nix b/pkgs/servers/klipper/klipper-genconf.nix new file mode 100644 index 0000000000000..52c0d1e142169 --- /dev/null +++ b/pkgs/servers/klipper/klipper-genconf.nix @@ -0,0 +1,22 @@ +{ writeShellApplication +, klipper +, python2 +, gnumake +, pkgsCross +}: writeShellApplication { + name = "klipper-genconf"; + runtimeInputs = [ + python2 + pkgsCross.avr.stdenv.cc + ]; + text = '' + CURRENT_DIR=$(pwd) + TMP=$(mktemp -d) + pushd ${klipper.src} + ${gnumake}/bin/make OUT="$TMP" KCONFIG_CONFIG="$CURRENT_DIR/config" menuconfig + popd + rm -rf "$TMP" config.old + printf "\nYour firmware configuration for klipper:\n\n" + cat config + ''; +} diff --git a/pkgs/servers/klipper/simulator.cfg b/pkgs/servers/klipper/simulator.cfg new file mode 100644 index 0000000000000..4dc19b1e40ffb --- /dev/null +++ b/pkgs/servers/klipper/simulator.cfg @@ -0,0 +1,23 @@ +# CONFIG_LOW_LEVEL_OPTIONS is not set +# CONFIG_MACH_AVR is not set +# CONFIG_MACH_ATSAM is not set +# CONFIG_MACH_ATSAMD is not set +# CONFIG_MACH_LPC176X is not set +# CONFIG_MACH_STM32 is not set +# CONFIG_MACH_RP2040 is not set +# CONFIG_MACH_PRU is not set +# CONFIG_MACH_LINUX is not set +CONFIG_MACH_SIMU=y +CONFIG_BOARD_DIRECTORY="simulator" +CONFIG_CLOCK_FREQ=20000000 +CONFIG_SERIAL=y +CONFIG_SIMULATOR_SELECT=y +CONFIG_SERIAL_BAUD=250000 +CONFIG_USB_VENDOR_ID=0x1d50 +CONFIG_USB_DEVICE_ID=0x614e +CONFIG_USB_SERIAL_NUMBER="12345" +CONFIG_HAVE_GPIO=y +CONFIG_HAVE_GPIO_ADC=y +CONFIG_HAVE_GPIO_SPI=y +CONFIG_HAVE_GPIO_HARD_PWM=y +CONFIG_INLINE_STEPPER_HACK=y -- cgit 1.4.1 From c49f15e87b09fc26b6150dbf48e26d1381460f74 Mon Sep 17 00:00:00 2001 From: Van Tuan Vo Date: Mon, 21 Mar 2022 21:04:23 +0100 Subject: klipper-firmware: Fix IFD error and minor refactoring --- nixos/modules/services/misc/klipper.nix | 1 + pkgs/servers/klipper/klipper-firmware.nix | 12 ++++-------- pkgs/servers/klipper/klipper-flash.nix | 13 ++++++------- pkgs/servers/klipper/klipper-genconf.nix | 5 ++--- pkgs/top-level/all-packages.nix | 8 ++------ 5 files changed, 15 insertions(+), 24 deletions(-) (limited to 'pkgs/servers/klipper') diff --git a/nixos/modules/services/misc/klipper.nix b/nixos/modules/services/misc/klipper.nix index 6a22d34e708fb..4e7b4e9c8f75f 100644 --- a/nixos/modules/services/misc/klipper.nix +++ b/nixos/modules/services/misc/klipper.nix @@ -153,6 +153,7 @@ in mcu = lib.strings.sanitizeDerivationName mcu; klipper-firmware = firmware; flashDevice = cfg.settings."${mcu}".serial; + firmwareConfig = cfg.firmware."${mcu}".firmwareConfig; }) firmwares; in diff --git a/pkgs/servers/klipper/klipper-firmware.nix b/pkgs/servers/klipper/klipper-firmware.nix index 832886c13fe70..ccff83d9d58a7 100644 --- a/pkgs/servers/klipper/klipper-firmware.nix +++ b/pkgs/servers/klipper/klipper-firmware.nix @@ -49,18 +49,14 @@ mkdir -p $out cp ./.config $out/config cp -r out/* $out - - if ${lib.boolToString (!isNull flashDevice)}; then - make FLASH_DEVICE=${toString flashDevice} OUT=$out/ KCONFIG_CONFIG=$out/config flash - fi - ''; + '' + lib.optionalString (flashDevice != null) "make FLASH_DEVICE=${toString flashDevice} OUT=$out/ KCONFIG_CONFIG=$out/config flash"; dontFixup = true; - meta = { + meta = with lib; { inherit (klipper.meta) homepage license; description = "Firmware part of Klipper"; - maintainers = with lib.maintainers; [ vtuan10 ]; - platforms = lib.platforms.linux; + maintainers = with maintainers; [ vtuan10 ]; + platforms = platforms.linux; }; } diff --git a/pkgs/servers/klipper/klipper-flash.nix b/pkgs/servers/klipper/klipper-flash.nix index c81485115cc88..a9c6ecdac4062 100644 --- a/pkgs/servers/klipper/klipper-flash.nix +++ b/pkgs/servers/klipper/klipper-flash.nix @@ -9,11 +9,11 @@ , stm32flash , mcu ? "mcu" , flashDevice ? "/dev/null" +, firmwareConfig ? ./simulator.cfg }: let - firmwareConfig = builtins.readFile "${klipper-firmware}/config"; - isNotSupported = with builtins; isNull (match ''^.*CONFIG_BOARD_DIRECTORY="(avr|stm32|lpc176x)".*$'' firmwareConfig); - isNotStm = with builtins; isNull (match ''^.*CONFIG_BOARD_DIRECTORY="(stm32)".*$'' firmwareConfig); + isNotSupported = with builtins; isNull (match ''^.*CONFIG_BOARD_DIRECTORY="(avr|stm32|lpc176x)".*$'' (readFile firmwareConfig)); + isNotStm = with builtins; isNull (match ''^.*CONFIG_BOARD_DIRECTORY="(stm32)".*$'' (readFile firmwareConfig)); in writeShellApplication { name = "klipper-flash-${mcu}"; @@ -22,6 +22,7 @@ writeShellApplication { avrdude stm32flash pkgsCross.avr.stdenv.cc + gnumake ]; text = '' NOT_SUPPORTED=${lib.boolToString isNotSupported} @@ -31,12 +32,10 @@ writeShellApplication { printf "Please use the compiled firmware at ${klipper-firmware} and flash it using the tools provided for your microcontroller." exit 1 fi - pushd ${klipper.src} if $NOT_STM; then - ${gnumake}/bin/make FLASH_DEVICE="${toString flashDevice}" OUT="${klipper-firmware}/" KCONFIG_CONFIG="${klipper-firmware}/config" flash + make -C ${klipper.src} FLASH_DEVICE="${toString flashDevice}" OUT="${klipper-firmware}/" KCONFIG_CONFIG="${klipper-firmware}/config" flash else - ${gnumake}/bin/make FLASH_DEVICE="${toString flashDevice}" OUT="${klipper-firmware}/" KCONFIG_CONFIG="${klipper-firmware}/config" serialflash + make -C ${klipper.src} FLASH_DEVICE="${toString flashDevice}" OUT="${klipper-firmware}/" KCONFIG_CONFIG="${klipper-firmware}/config" serialflash fi - popd ''; } diff --git a/pkgs/servers/klipper/klipper-genconf.nix b/pkgs/servers/klipper/klipper-genconf.nix index 52c0d1e142169..42eb519e8c196 100644 --- a/pkgs/servers/klipper/klipper-genconf.nix +++ b/pkgs/servers/klipper/klipper-genconf.nix @@ -8,13 +8,12 @@ runtimeInputs = [ python2 pkgsCross.avr.stdenv.cc + gnumake ]; text = '' CURRENT_DIR=$(pwd) TMP=$(mktemp -d) - pushd ${klipper.src} - ${gnumake}/bin/make OUT="$TMP" KCONFIG_CONFIG="$CURRENT_DIR/config" menuconfig - popd + make -C ${klipper.src} OUT="$TMP" KCONFIG_CONFIG="$CURRENT_DIR/config" menuconfig rm -rf "$TMP" config.old printf "\nYour firmware configuration for klipper:\n\n" cat config diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 4e607e9b66320..04fb2e0521989 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -3422,13 +3422,9 @@ with pkgs; klipper = callPackage ../servers/klipper { }; - klipper-firmware = callPackage ../servers/klipper/klipper-firmware.nix { - inherit libusb1; - }; + klipper-firmware = callPackage ../servers/klipper/klipper-firmware.nix { }; - klipper-flash = callPackage ../servers/klipper/klipper-flash.nix { - inherit klipper-firmware; - }; + klipper-flash = callPackage ../servers/klipper/klipper-flash.nix { }; klipper-genconf = callPackage ../servers/klipper/klipper-genconf.nix { }; -- cgit 1.4.1 From 2da038a900f36ee75847f717fa447c02fd4c2df2 Mon Sep 17 00:00:00 2001 From: Van Tuan Vo Date: Tue, 22 Mar 2022 01:48:17 +0100 Subject: klipper-firmware: Make runtimeInput conditional --- pkgs/servers/klipper/klipper-flash.nix | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) (limited to 'pkgs/servers/klipper') diff --git a/pkgs/servers/klipper/klipper-flash.nix b/pkgs/servers/klipper/klipper-flash.nix index a9c6ecdac4062..fedc477c27617 100644 --- a/pkgs/servers/klipper/klipper-flash.nix +++ b/pkgs/servers/klipper/klipper-flash.nix @@ -12,30 +12,27 @@ , firmwareConfig ? ./simulator.cfg }: let - isNotSupported = with builtins; isNull (match ''^.*CONFIG_BOARD_DIRECTORY="(avr|stm32|lpc176x)".*$'' (readFile firmwareConfig)); - isNotStm = with builtins; isNull (match ''^.*CONFIG_BOARD_DIRECTORY="(stm32)".*$'' (readFile firmwareConfig)); + supportedArches = [ "avr" "stm32" "lpc176x" ]; + matchBoard = with builtins; match ''^.*CONFIG_BOARD_DIRECTORY="([a-zA-Z0-9_]+)".*$'' (readFile firmwareConfig); + boardArch = if matchBoard == null then null else builtins.head matchBoard; in writeShellApplication { name = "klipper-flash-${mcu}"; runtimeInputs = [ python2 - avrdude - stm32flash pkgsCross.avr.stdenv.cc gnumake - ]; + ] ++ lib.optionals (boardArch == "avr") [ avrdude ] ++ lib.optionals (boardArch == "stm32") [ stm32flash ]; text = '' - NOT_SUPPORTED=${lib.boolToString isNotSupported} - NOT_STM=${lib.boolToString isNotStm} - if $NOT_SUPPORTED; then + if ${lib.boolToString (!builtins.elem boardArch supportedArches)}; then printf "Flashing Klipper firmware to your board is not supported yet.\n" printf "Please use the compiled firmware at ${klipper-firmware} and flash it using the tools provided for your microcontroller." exit 1 fi - if $NOT_STM; then - make -C ${klipper.src} FLASH_DEVICE="${toString flashDevice}" OUT="${klipper-firmware}/" KCONFIG_CONFIG="${klipper-firmware}/config" flash - else + if ${lib.boolToString (boardArch == "stm32")}; then make -C ${klipper.src} FLASH_DEVICE="${toString flashDevice}" OUT="${klipper-firmware}/" KCONFIG_CONFIG="${klipper-firmware}/config" serialflash + else + make -C ${klipper.src} FLASH_DEVICE="${toString flashDevice}" OUT="${klipper-firmware}/" KCONFIG_CONFIG="${klipper-firmware}/config" flash fi ''; } -- cgit 1.4.1 From b391d98a710378a6f930877adb5fa6433ae71928 Mon Sep 17 00:00:00 2001 From: Van Tuan Vo Date: Tue, 22 Mar 2022 11:23:40 +0100 Subject: nixos/klipper: Remove automatic flashing option `flashing.enable` --- nixos/modules/services/misc/klipper.nix | 19 ++++++++----------- pkgs/servers/klipper/klipper-firmware.nix | 3 +-- 2 files changed, 9 insertions(+), 13 deletions(-) (limited to 'pkgs/servers/klipper') diff --git a/nixos/modules/services/misc/klipper.nix b/nixos/modules/services/misc/klipper.nix index cd9cb7de8725c..fee7779141cdd 100644 --- a/nixos/modules/services/misc/klipper.nix +++ b/nixos/modules/services/misc/klipper.nix @@ -76,11 +76,9 @@ in type = with types; attrsOf (submodule { options = { - flashing.enable = mkEnableOption '' - automatic flashing of firmware to microcontroller - - WARNING: Be careful with this option. Enabling this will automatically flash your microcontroller on e.g. nixos-rebuild. - This can potentially brick your microcontroller. Alternatively, use `klipper-flash-$mcu` to flash manually. + enable = mkEnableOption '' + building of firmware and addition of klipper-flash tools for manual flashing. + This will add `klipper-flash-$mcu` scripts to your environment which can be called to flash the firmware. ''; configFile = mkOption { type = path; @@ -143,15 +141,14 @@ in environment.systemPackages = with pkgs; let - firmwares = mapAttrs - (mcu: { flashing, configFile }: pkgs.klipper-firmware.override { - flashDevice = if flashing.enable then cfg.settings."${mcu}".serial else null; + firmwares = filterAttrs (n: v: v!= null) (mapAttrs + (mcu: { enable, configFile }: if enable then pkgs.klipper-firmware.override { mcu = lib.strings.sanitizeDerivationName mcu; firmwareConfig = configFile; - }) - cfg.firmwares; + } else null) + cfg.firmwares); firmwareFlasher = mapAttrsToList - (mcu: firmware: pkgs.callPackage pkgs.klipper-flash.override { + (mcu: firmware: pkgs.klipper-flash.override { mcu = lib.strings.sanitizeDerivationName mcu; klipper-firmware = firmware; flashDevice = cfg.settings."${mcu}".serial; diff --git a/pkgs/servers/klipper/klipper-firmware.nix b/pkgs/servers/klipper/klipper-firmware.nix index ccff83d9d58a7..f80cec0b687ed 100644 --- a/pkgs/servers/klipper/klipper-firmware.nix +++ b/pkgs/servers/klipper/klipper-firmware.nix @@ -14,7 +14,6 @@ , stm32flash , mcu ? "mcu" , firmwareConfig ? ./simulator.cfg -, flashDevice ? null }: stdenv.mkDerivation rec { name = "klipper-firmware-${mcu}-${version}"; version = klipper.version; @@ -49,7 +48,7 @@ mkdir -p $out cp ./.config $out/config cp -r out/* $out - '' + lib.optionalString (flashDevice != null) "make FLASH_DEVICE=${toString flashDevice} OUT=$out/ KCONFIG_CONFIG=$out/config flash"; + ''; dontFixup = true; -- cgit 1.4.1