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.
This commit is contained in:
2026-06-13 16:19:53 -04:00
parent 4d8087badf
commit 0f765d99cb
5 changed files with 128 additions and 152 deletions

225
flake.nix
View File

@@ -12,8 +12,6 @@
url = "git+https://git.lix.systems/lix-project/lix?ref=main"; url = "git+https://git.lix.systems/lix-project/lix?ref=main";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
# uConsole CM5 — pinned nixpkgs for kernel patch compatibility
nixpkgs-uconsole.url = "github:NixOS/nixpkgs/nixos-25.11"; nixpkgs-uconsole.url = "github:NixOS/nixpkgs/nixos-25.11";
nixos-uconsole = { nixos-uconsole = {
url = "github:nixos-uconsole/nixos-uconsole/v1.1.0"; url = "github:nixos-uconsole/nixos-uconsole/v1.1.0";
@@ -23,8 +21,8 @@
nixos-raspberrypi = { nixos-raspberrypi = {
url = "github:gortium/nixos-raspberrypi/cm5-cross-v1"; url = "github:gortium/nixos-raspberrypi/cm5-cross-v1";
inputs.nixpkgs.follows = "nixpkgs-uconsole"; inputs.nixpkgs.follows = "nixpkgs-uconsole";
};
}; };
};
outputs = { self, nixpkgs, agenix, lix outputs = { self, nixpkgs, agenix, lix
, nixpkgs-uconsole, nixos-uconsole, nixos-raspberrypi , nixpkgs-uconsole, nixos-uconsole, nixos-raspberrypi
@@ -43,128 +41,115 @@
pkgs = import nixpkgs { pkgs = import nixpkgs {
inherit system overlays; inherit system overlays;
config.allowUnfree = true; config.allowUnfree = true;
config.permittedInsecurePackages = [ config.permittedInsecurePackages = [ "openclaw-2026.3.12" ];
"openclaw-2026.3.12"
];
}; };
devShell = import ./shells/nix_dev.nix { devShell = import ./shells/nix_dev.nix {
inherit pkgs system agenix; inherit pkgs system agenix;
}; };
in in {
{ nixosConfigurations = {
nixosConfigurations = { lazyworkhorse = nixpkgs.lib.nixosSystem {
lazyworkhorse = nixpkgs.lib.nixosSystem { specialArgs = { inherit system self keys paths inputs; };
specialArgs = { inherit system self keys paths inputs; }; modules = [
modules = [ {
{ nixpkgs.overlays = overlays;
nixpkgs.overlays = overlays; nixpkgs.config.allowUnfree = true;
nixpkgs.config.allowUnfree = true; nixpkgs.config.rocmSupport = true;
nixpkgs.config.rocmSupport = true; nixpkgs.config.permittedInsecurePackages = [ "openclaw-2026.3.12" ];
nixpkgs.config.permittedInsecurePackages = [ nix.package = lix.packages.${system}.default;
"openclaw-2026.3.12" }
]; agenix.nixosModules.default
nix.package = lix.packages.${system}.default; ./hosts/lazyworkhorse/configuration.nix
} ./hosts/lazyworkhorse/hardware-configuration.nix
agenix.nixosModules.default ./modules/nixos/filesystem/hoardingcow-mount.nix
./hosts/lazyworkhorse/configuration.nix ./modules/nixos/services/docker_manager.nix
./hosts/lazyworkhorse/hardware-configuration.nix ./modules/nixos/services/open_code_server.nix
./modules/nixos/filesystem/hoardingcow-mount.nix ./modules/nixos/services/ollama_init_custom_models.nix
./modules/nixos/services/docker_manager.nix ./modules/nixos/services/openclaw_node.nix
./modules/nixos/services/open_code_server.nix ./modules/nixos/security/ai-worker-restricted.nix
./modules/nixos/services/ollama_init_custom_models.nix ./users/gortium.nix
./modules/nixos/services/openclaw_node.nix ./users/ai-worker.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
];
};
}; };
devShells.${system}.default = devShell;
packages.${system} = { cyt-pi = nixpkgs.lib.nixosSystem {
# Image SD flashable pour uConsole CM5 (SSH + WiFi + clés) specialArgs = { inherit self keys paths inputs; };
# Usage : dd if=result of=/dev/sda bs=4M status=progress conv=fsync modules = [
uconsole-cm5-image = (nixos-raspberrypi.lib.nixosSystem { {
system = "aarch64-linux"; nixpkgs.overlays = overlays;
specialArgs = { nixpkgs.config.allowUnfree = true;
inherit self keys inputs; nixpkgs.hostPlatform = "aarch64-linux";
nixos-raspberrypi = nixos-raspberrypi; nix.package = lix.packages."aarch64-linux".default;
isCM4 = false; }
}; ./hosts/cyt-pi/configuration.nix
modules = [ ./hosts/cyt-pi/hardware-configuration.nix
{ ];
nixpkgs.buildPlatform = system; };
nixpkgs.hostPlatform = "aarch64-linux";
} uconsole-cm5 = nixpkgs-uconsole.lib.nixosSystem {
nixos-raspberrypi.nixosModules.nixpkgs-rpi system = "aarch64-linux";
nixos-raspberrypi.nixosModules.raspberry-pi-5.base specialArgs = {
nixos-raspberrypi.lib.inject-overlays-global inherit self keys paths inputs;
nixos-raspberrypi.nixosModules.sd-image nixos-raspberrypi = nixos-raspberrypi;
nixos-uconsole.nixosModules.kernel isCM4 = false;
(nixos-uconsole.nixosModules.cm { lib = nixpkgs-uconsole.lib; isCM4 = false; }) };
nixos-uconsole.nixosModules.base modules = [
agenix.nixosModules.default {
./hosts/uconsole-cm5/configuration.nix nixpkgs.buildPlatform = "x86_64-linux";
]; nixpkgs.hostPlatform = "aarch64-linux";
}).config.system.build.sdImage; 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;
};
};
} }

View File

@@ -26,13 +26,5 @@
# Firmware # Firmware
hardware.enableRedistributableFirmware = true; hardware.enableRedistributableFirmware = true;
# DSI burst mode fix: remove SYNC_PULSE flag from CWU50 panel driver # DSI display fix: le kernel patch est dans flake.nix (patches/0008-panel-cwu50-no-burst.patch)
# 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;
}
];
} }

View File

@@ -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)) {

View File

@@ -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)) {

View File

@@ -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)) {