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

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";
@@ -43,16 +41,12 @@
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; };
@@ -61,9 +55,7 @@
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 = [ nixpkgs.config.permittedInsecurePackages = [ "openclaw-2026.3.12" ];
"openclaw-2026.3.12"
];
nix.package = lix.packages.${system}.default; nix.package = lix.packages.${system}.default;
} }
agenix.nixosModules.default agenix.nixosModules.default
@@ -94,10 +86,6 @@
]; ];
}; };
# ============================================================
# uConsole CM5 — cross-compilé (build sur x86_64, run sur ARM)
# Approche incrémentale pour fixer l'écran
# ============================================================
uconsole-cm5 = nixpkgs-uconsole.lib.nixosSystem { uconsole-cm5 = nixpkgs-uconsole.lib.nixosSystem {
system = "aarch64-linux"; system = "aarch64-linux";
specialArgs = { specialArgs = {
@@ -107,22 +95,23 @@
}; };
modules = [ modules = [
{ {
# Cross-compile : build sur x86_64, run sur aarch64
nixpkgs.buildPlatform = "x86_64-linux"; nixpkgs.buildPlatform = "x86_64-linux";
nixpkgs.hostPlatform = "aarch64-linux"; nixpkgs.hostPlatform = "aarch64-linux";
nixpkgs.config.allowUnfree = true; nixpkgs.config.allowUnfree = true;
boot.loader.raspberry-pi.bootloader = "kernel"; boot.loader.raspberry-pi.bootloader = "kernel";
} }
# nixos-raspberrypi — pkgs.rpi + overlays standardisés # 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.nixpkgs-rpi
nixos-raspberrypi.nixosModules.raspberry-pi-5.base nixos-raspberrypi.nixosModules.raspberry-pi-5.base
nixos-raspberrypi.lib.inject-overlays nixos-raspberrypi.lib.inject-overlays
nixos-raspberrypi.lib.inject-overlays-global nixos-raspberrypi.lib.inject-overlays-global
# nixos-uconsole CM5 modules nixos-uconsole.nixosModules.uconsole-cm5
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 ({ config, lib, pkgs, inputs, ... }: let
lix-cross = import inputs.nixpkgs-uconsole { lix-cross = import inputs.nixpkgs-uconsole {
localSystem = { system = "x86_64-linux"; }; localSystem = { system = "x86_64-linux"; };
@@ -130,18 +119,16 @@
overlays = [ inputs.lix.overlays.default ]; overlays = [ inputs.lix.overlays.default ];
}; };
in { nix.package = lix-cross.lix; }) in { nix.package = lix-cross.lix; })
# agenix
agenix.nixosModules.default agenix.nixosModules.default
# Notre config
./hosts/uconsole-cm5/configuration.nix ./hosts/uconsole-cm5/configuration.nix
./hosts/uconsole-cm5/hardware-configuration.nix ./hosts/uconsole-cm5/hardware-configuration.nix
]; ];
}; };
}; };
devShells.${system}.default = devShell; devShells.${system}.default = devShell;
packages.${system} = { 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 { uconsole-cm5-image = (nixos-raspberrypi.lib.nixosSystem {
system = "aarch64-linux"; system = "aarch64-linux";
specialArgs = { specialArgs = {
@@ -158,9 +145,7 @@
nixos-raspberrypi.nixosModules.raspberry-pi-5.base nixos-raspberrypi.nixosModules.raspberry-pi-5.base
nixos-raspberrypi.lib.inject-overlays-global nixos-raspberrypi.lib.inject-overlays-global
nixos-raspberrypi.nixosModules.sd-image nixos-raspberrypi.nixosModules.sd-image
nixos-uconsole.nixosModules.kernel nixos-uconsole.nixosModules.uconsole-cm5
(nixos-uconsole.nixosModules.cm { lib = nixpkgs-uconsole.lib; isCM4 = false; })
nixos-uconsole.nixosModules.base
agenix.nixosModules.default agenix.nixosModules.default
./hosts/uconsole-cm5/configuration.nix ./hosts/uconsole-cm5/configuration.nix
]; ];

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