From 0f765d99cb06e49b0191af48618071f6e91bc96f Mon Sep 17 00:00:00 2001 From: Hermes Date: Sat, 13 Jun 2026 16:19:53 -0400 Subject: [PATCH] feat: add CWU50 display patch (no-burst) + fix flake syntax Remove extra '};' that broke flake.nix parsing. Apply kernel patch '0008-panel-cwu50-no-burst.patch' to remove MIPI_DSI_MODE_VIDEO_BURST flag in panel-cwu50.c. Switch nixos-uconsole module to consolidated uconsole-cm5 module. Keep patches/0008-panel-cwu50-remove-sync-pulse.patch as variant. --- flake.nix | 225 ++++++++---------- hosts/uconsole-cm5/configuration.nix | 10 +- .../patches/0008-dsi-burst-fix.patch | 23 -- patches/0008-panel-cwu50-no-burst.patch | 11 + .../0008-panel-cwu50-remove-sync-pulse.patch | 11 + 5 files changed, 128 insertions(+), 152 deletions(-) delete mode 100644 hosts/uconsole-cm5/patches/0008-dsi-burst-fix.patch create mode 100644 patches/0008-panel-cwu50-no-burst.patch create mode 100644 patches/0008-panel-cwu50-remove-sync-pulse.patch diff --git a/flake.nix b/flake.nix index 5038e6b..fc17993 100644 --- a/flake.nix +++ b/flake.nix @@ -12,8 +12,6 @@ url = "git+https://git.lix.systems/lix-project/lix?ref=main"; inputs.nixpkgs.follows = "nixpkgs"; }; - - # uConsole CM5 — pinned nixpkgs for kernel patch compatibility nixpkgs-uconsole.url = "github:NixOS/nixpkgs/nixos-25.11"; nixos-uconsole = { url = "github:nixos-uconsole/nixos-uconsole/v1.1.0"; @@ -23,8 +21,8 @@ nixos-raspberrypi = { url = "github:gortium/nixos-raspberrypi/cm5-cross-v1"; inputs.nixpkgs.follows = "nixpkgs-uconsole"; + }; }; -}; outputs = { self, nixpkgs, agenix, lix , nixpkgs-uconsole, nixos-uconsole, nixos-raspberrypi @@ -43,128 +41,115 @@ pkgs = import nixpkgs { inherit system overlays; config.allowUnfree = true; - config.permittedInsecurePackages = [ - "openclaw-2026.3.12" - ]; + config.permittedInsecurePackages = [ "openclaw-2026.3.12" ]; }; - devShell = import ./shells/nix_dev.nix { inherit pkgs system agenix; }; - in - { - nixosConfigurations = { - lazyworkhorse = nixpkgs.lib.nixosSystem { - specialArgs = { inherit system self keys paths inputs; }; - modules = [ - { - nixpkgs.overlays = overlays; - nixpkgs.config.allowUnfree = true; - nixpkgs.config.rocmSupport = true; - nixpkgs.config.permittedInsecurePackages = [ - "openclaw-2026.3.12" - ]; - nix.package = lix.packages.${system}.default; - } - agenix.nixosModules.default - ./hosts/lazyworkhorse/configuration.nix - ./hosts/lazyworkhorse/hardware-configuration.nix - ./modules/nixos/filesystem/hoardingcow-mount.nix - ./modules/nixos/services/docker_manager.nix - ./modules/nixos/services/open_code_server.nix - ./modules/nixos/services/ollama_init_custom_models.nix - ./modules/nixos/services/openclaw_node.nix - ./modules/nixos/security/ai-worker-restricted.nix - ./users/gortium.nix - ./users/ai-worker.nix - ]; - }; - - cyt-pi = nixpkgs.lib.nixosSystem { - specialArgs = { inherit self keys paths inputs; }; - modules = [ - { - nixpkgs.overlays = overlays; - nixpkgs.config.allowUnfree = true; - nixpkgs.hostPlatform = "aarch64-linux"; - nix.package = lix.packages."aarch64-linux".default; - } - ./hosts/cyt-pi/configuration.nix - ./hosts/cyt-pi/hardware-configuration.nix - ]; - }; - - # ============================================================ - # uConsole CM5 — cross-compilé (build sur x86_64, run sur ARM) - # Approche incrémentale pour fixer l'écran - # ============================================================ - uconsole-cm5 = nixpkgs-uconsole.lib.nixosSystem { - system = "aarch64-linux"; - specialArgs = { - inherit self keys paths inputs; - nixos-raspberrypi = nixos-raspberrypi; - isCM4 = false; - }; - modules = [ - { - # Cross-compile : build sur x86_64, run sur aarch64 - nixpkgs.buildPlatform = "x86_64-linux"; - nixpkgs.hostPlatform = "aarch64-linux"; - nixpkgs.config.allowUnfree = true; - boot.loader.raspberry-pi.bootloader = "kernel"; - } - # nixos-raspberrypi — pkgs.rpi + overlays standardisés - nixos-raspberrypi.nixosModules.nixpkgs-rpi - nixos-raspberrypi.nixosModules.raspberry-pi-5.base - nixos-raspberrypi.lib.inject-overlays - nixos-raspberrypi.lib.inject-overlays-global - # nixos-uconsole CM5 modules - nixos-uconsole.nixosModules.kernel - (nixos-uconsole.nixosModules.cm { lib = nixpkgs-uconsole.lib; isCM4 = false; }) - nixos-uconsole.nixosModules.base - # Lix cross-compilé (lix.packages.aarch64-linux est natif → QEMU) - ({ config, lib, pkgs, inputs, ... }: let - lix-cross = import inputs.nixpkgs-uconsole { - localSystem = { system = "x86_64-linux"; }; - crossSystem = { system = "aarch64-linux"; }; - overlays = [ inputs.lix.overlays.default ]; - }; - in { nix.package = lix-cross.lix; }) - # agenix - agenix.nixosModules.default - # Notre config - ./hosts/uconsole-cm5/configuration.nix - ./hosts/uconsole-cm5/hardware-configuration.nix - ]; - }; + in { + nixosConfigurations = { + lazyworkhorse = nixpkgs.lib.nixosSystem { + specialArgs = { inherit system self keys paths inputs; }; + modules = [ + { + nixpkgs.overlays = overlays; + nixpkgs.config.allowUnfree = true; + nixpkgs.config.rocmSupport = true; + nixpkgs.config.permittedInsecurePackages = [ "openclaw-2026.3.12" ]; + nix.package = lix.packages.${system}.default; + } + agenix.nixosModules.default + ./hosts/lazyworkhorse/configuration.nix + ./hosts/lazyworkhorse/hardware-configuration.nix + ./modules/nixos/filesystem/hoardingcow-mount.nix + ./modules/nixos/services/docker_manager.nix + ./modules/nixos/services/open_code_server.nix + ./modules/nixos/services/ollama_init_custom_models.nix + ./modules/nixos/services/openclaw_node.nix + ./modules/nixos/security/ai-worker-restricted.nix + ./users/gortium.nix + ./users/ai-worker.nix + ]; }; - devShells.${system}.default = devShell; - packages.${system} = { - # Image SD flashable pour uConsole CM5 (SSH + WiFi + clés) - # Usage : dd if=result of=/dev/sda bs=4M status=progress conv=fsync - uconsole-cm5-image = (nixos-raspberrypi.lib.nixosSystem { - system = "aarch64-linux"; - specialArgs = { - inherit self keys inputs; - nixos-raspberrypi = nixos-raspberrypi; - isCM4 = false; - }; - modules = [ - { - nixpkgs.buildPlatform = system; - nixpkgs.hostPlatform = "aarch64-linux"; - } - nixos-raspberrypi.nixosModules.nixpkgs-rpi - nixos-raspberrypi.nixosModules.raspberry-pi-5.base - nixos-raspberrypi.lib.inject-overlays-global - nixos-raspberrypi.nixosModules.sd-image - nixos-uconsole.nixosModules.kernel - (nixos-uconsole.nixosModules.cm { lib = nixpkgs-uconsole.lib; isCM4 = false; }) - nixos-uconsole.nixosModules.base - agenix.nixosModules.default - ./hosts/uconsole-cm5/configuration.nix - ]; - }).config.system.build.sdImage; + + cyt-pi = nixpkgs.lib.nixosSystem { + specialArgs = { inherit self keys paths inputs; }; + modules = [ + { + nixpkgs.overlays = overlays; + nixpkgs.config.allowUnfree = true; + nixpkgs.hostPlatform = "aarch64-linux"; + nix.package = lix.packages."aarch64-linux".default; + } + ./hosts/cyt-pi/configuration.nix + ./hosts/cyt-pi/hardware-configuration.nix + ]; + }; + + uconsole-cm5 = nixpkgs-uconsole.lib.nixosSystem { + system = "aarch64-linux"; + specialArgs = { + inherit self keys paths inputs; + nixos-raspberrypi = nixos-raspberrypi; + isCM4 = false; + }; + modules = [ + { + nixpkgs.buildPlatform = "x86_64-linux"; + nixpkgs.hostPlatform = "aarch64-linux"; + nixpkgs.config.allowUnfree = true; + boot.loader.raspberry-pi.bootloader = "kernel"; + } + # Kernel patch: SYNC_PULSE-only (remove BURST) + ({ lib, ... }: { + boot.kernelPatches = [{ + name = "panel-cwu50-no-burst"; + patch = ./patches/0008-panel-cwu50-no-burst.patch; + }]; + }) + nixos-raspberrypi.nixosModules.nixpkgs-rpi + nixos-raspberrypi.nixosModules.raspberry-pi-5.base + nixos-raspberrypi.lib.inject-overlays + nixos-raspberrypi.lib.inject-overlays-global + nixos-uconsole.nixosModules.uconsole-cm5 + ({ config, lib, pkgs, inputs, ... }: let + lix-cross = import inputs.nixpkgs-uconsole { + localSystem = { system = "x86_64-linux"; }; + crossSystem = { system = "aarch64-linux"; }; + overlays = [ inputs.lix.overlays.default ]; + }; + in { nix.package = lix-cross.lix; }) + agenix.nixosModules.default + ./hosts/uconsole-cm5/configuration.nix + ./hosts/uconsole-cm5/hardware-configuration.nix + ]; }; }; + + devShells.${system}.default = devShell; + + packages.${system} = { + uconsole-cm5-image = (nixos-raspberrypi.lib.nixosSystem { + system = "aarch64-linux"; + specialArgs = { + inherit self keys inputs; + nixos-raspberrypi = nixos-raspberrypi; + isCM4 = false; + }; + modules = [ + { + nixpkgs.buildPlatform = system; + nixpkgs.hostPlatform = "aarch64-linux"; + } + nixos-raspberrypi.nixosModules.nixpkgs-rpi + nixos-raspberrypi.nixosModules.raspberry-pi-5.base + nixos-raspberrypi.lib.inject-overlays-global + nixos-raspberrypi.nixosModules.sd-image + nixos-uconsole.nixosModules.uconsole-cm5 + agenix.nixosModules.default + ./hosts/uconsole-cm5/configuration.nix + ]; + }).config.system.build.sdImage; + }; + }; } diff --git a/hosts/uconsole-cm5/configuration.nix b/hosts/uconsole-cm5/configuration.nix index c5a7c6d..438578a 100644 --- a/hosts/uconsole-cm5/configuration.nix +++ b/hosts/uconsole-cm5/configuration.nix @@ -26,13 +26,5 @@ # Firmware hardware.enableRedistributableFirmware = true; - # DSI burst mode fix: remove SYNC_PULSE flag from CWU50 panel driver - # BURST and SYNC_PULSE are mutually exclusive per MIPI DSI spec; - # having both set causes display corruption on CM5 - boot.kernelPatches = lib.mkAfter [ - { - name = "0008-dsi-burst-fix"; - patch = ./patches/0008-dsi-burst-fix.patch; - } - ]; + # DSI display fix: le kernel patch est dans flake.nix (patches/0008-panel-cwu50-no-burst.patch) } diff --git a/hosts/uconsole-cm5/patches/0008-dsi-burst-fix.patch b/hosts/uconsole-cm5/patches/0008-dsi-burst-fix.patch deleted file mode 100644 index 03786ad..0000000 --- a/hosts/uconsole-cm5/patches/0008-dsi-burst-fix.patch +++ /dev/null @@ -1,23 +0,0 @@ -diff --git a/drivers/gpu/drm/panel/panel-cwu50.c b/drivers/gpu/drm/panel/panel-cwu50.c -index 1111111..2222222 100644 ---- a/drivers/gpu/drm/panel/panel-cwu50.c -+++ b/drivers/gpu/drm/panel/panel-cwu50.c -@@ -1072,7 +1072,7 @@ static int cwu50_probe(struct mipi_dsi_device *dsi) - - dsi->lanes = 4; - dsi->format = MIPI_DSI_FMT_RGB888; -- dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_VIDEO_SYNC_PULSE; -+ dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST; - - ctx->id_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_IN); - if (IS_ERR(ctx->id_gpio)) { -@@ -1706,7 +1706,7 @@ static int cwu50_cm3_probe(struct mipi_dsi_device *dsi) - dsi->lanes = 4; - dsi->format = MIPI_DSI_FMT_RGB888; - dsi->mode_flags = MIPI_DSI_MODE_VIDEO | -- MIPI_DSI_MODE_VIDEO_BURST | -- MIPI_DSI_MODE_VIDEO_SYNC_PULSE; -+ MIPI_DSI_MODE_VIDEO_BURST; - - ctx->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); - if (IS_ERR(ctx->reset_gpio)) { diff --git a/patches/0008-panel-cwu50-no-burst.patch b/patches/0008-panel-cwu50-no-burst.patch new file mode 100644 index 0000000..2109b0e --- /dev/null +++ b/patches/0008-panel-cwu50-no-burst.patch @@ -0,0 +1,11 @@ +--- a/drivers/gpu/drm/panel/panel-cwu50.c ++++ b/drivers/gpu/drm/panel/panel-cwu50.c +@@ -622,7 +622,7 @@ static int cwu50_probe(struct mipi_dsi_device *dsi) + + dsi->lanes = 4; + dsi->format = MIPI_DSI_FMT_RGB888; +- dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_VIDEO_SYNC_PULSE; ++ dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE; + + ctx->id_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_IN); + if (IS_ERR(ctx->id_gpio)) { diff --git a/patches/0008-panel-cwu50-remove-sync-pulse.patch b/patches/0008-panel-cwu50-remove-sync-pulse.patch new file mode 100644 index 0000000..b553fbb --- /dev/null +++ b/patches/0008-panel-cwu50-remove-sync-pulse.patch @@ -0,0 +1,11 @@ +--- a/drivers/gpu/drm/panel/panel-cwu50.c ++++ b/drivers/gpu/drm/panel/panel-cwu50.c +@@ -622,7 +622,7 @@ static int cwu50_probe(struct mipi_dsi_device *dsi) + + dsi->lanes = 4; + dsi->format = MIPI_DSI_FMT_RGB888; +- dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_VIDEO_SYNC_PULSE; ++ dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST; + + ctx->id_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_IN); + if (IS_ERR(ctx->id_gpio)) {