NixOS on ARM/Clockworkpi A06 uConsole

From NixOS Wiki

Status

Panel/Display works. Broadcom wifi works. System boots. All other features untested. These instructions are specific to the A06 version and will not work on the CM4. I don't have the version with the Qualcomm 4G extension board, so I cannot advise on how to get that running.

Modules / Drivers

I'm still figuring out the required module list, however the wifi chip uses a broadcom bcm43435, which is supported by brcmfmac.

Kernel

The device tree patches to make the panel/display work are currently only available as kernel patches. The official patches only support kernel 5.x, however there is a community patchset for kernel 6.5 available at [[1]]

These patches can be applied using the following nix snippet:

 boot.kernelPackages = pkgs.linuxPackages_6_5;
 boot.kernelPatches = [
   {
     name = "suspend";
     patch = fetchurl { url = https://raw.githubusercontent.com/Autianic/clockworkpi-linux-kernel/master/linux-clockworkpi-a06/00-rockchip-suspend.patch };
   }  
   {
     name = "a06";
     patch = fetchurl { url = https://raw.githubusercontent.com/Autianic/clockworkpi-linux-kernel/master/linux-clockworkpi-a06/01-clockworkpi-dts-a06.patch; };
   }  
   {
     name = "backlight";
     patch = fetchurl { url = https://raw.githubusercontent.com/Autianic/clockworkpi-linux-kernel/master/linux-clockworkpi-a06/02-backlight-ocp8178.patch; };
   }  
   {
     name = "cwd686";
     patch = fetchurl { url = https://raw.githubusercontent.com/Autianic/clockworkpi-linux-kernel/master/linux-clockworkpi-a06/02-panel-cwd686-driver.patch; };
   }  
   {
     name = "cwu50";
     patch = fetchurl { url = https://raw.githubusercontent.com/Autianic/clockworkpi-linux-kernel/master/linux-clockworkpi-a06/02-panel-cwu50-driver.patch; };
   }  
   {
     name = "uconsole";
     patch = fetchurl { url = https://raw.githubusercontent.com/Autianic/clockworkpi-linux-kernel/master/linux-clockworkpi-a06/03-clockworkpi-dts-uconsole.patch; };
   }  
   { 
     name = "power";
     patch = fetchurl { url = https://raw.githubusercontent.com/Autianic/clockworkpi-linux-kernel/master/linux-clockworkpi-a06/04-mfd-axp20x-add-clockworkpi-a06-power-support.patch; };
   }  
   {
     name = "extcart";
     patch = fetchurl { url = https://raw.githubusercontent.com/Autianic/clockworkpi-linux-kernel/master/linux-clockworkpi-a06/06-clockworkpi-a06-extcart.patch; };
   }  
 ];

NB: At time of writing, ZFS is marked broken for Kernel 6.5, so you will have to disable zfs to build this kernel with the following snippet

 nixpkgs.overlays = [(final: super: {     zfs = super.zfs.overrideAttrs(_: {       meta.platforms = [];     });   })];


Bootloader

At present I am not sure where the bootloader images used by the official/vendor supplied distro can be obtained. The easiest way to make any generated image bootable is to copy them from the official image available here: [[2]]


 $ sfdisk --dump uConsole_A06_v1.1e.img
 <...>
 uConsoleA06_v1.1e.img1 : start = 32768, size = 14942208, type=83
 
 $ sfdisk --dump your_nixos_image.img
 <...>
 your_nixos_image.img1 : start = 16384, size = 61440, type = b
 your_nixos_image.img2 : start = 77824, size = 15322384, type = 83, bootable
 
 $ dd if=uConsole_A06_v1.1e.img of=nixos_a06.img count=32768
 $ dd if=your_nixos_image.img skip=77824 of=nixos_a06.img seek=32768

The partition table for the resulting image will then be wrong, but we can fix that with fdisk by deleting our partition, and then recreating it.

 fdisk ./nixos_a06.img
 d
 n
 p
 1
 32768
 <Default should now be to end of file>
 Do you want to remove the signature? No
 w
 
 $ sfdisk --dump nixos_a06.img
 <...>
 nixos_a06.img1 start = 32768, size = 15322384, type=83

Your image should now be bootable.