NixOS on ARM/Raspberry Pi 4: Difference between revisions

Rin (talk | contribs)
Troubleshooting: Added touch screen fix
Mmxgn (talk | contribs)
m remove extra whitespace
 
(24 intermediate revisions by 8 users not shown)
Line 47: Line 47:
Using <code>nixos-generate-config</code> will generate the required minimal configuration.
Using <code>nixos-generate-config</code> will generate the required minimal configuration.


For better GPU support and some deviceTree quirks add the nixos-hardware channel:
Raspberry Pi 4 is well-supported on modern kernels. However, if you encounter issues with GPU support or other deviceTree quirks, you may wish to add the nixos-hardware channel:


<code>
<code>
Line 75: Line 75:
     raspberrypi-eeprom
     raspberrypi-eeprom
   ];
   ];
   system.stateVersion = "23.11";
   system.stateVersion = "24.11";
}
}
</nowiki>}}
</nowiki>}}
=== <code>config.txt</code> ===
{{warning|Since 24.11, the option <code>boot.loader.raspberrypi</code> which included <code>firmwareConfig</code> is removed from <code>nixpkgs</code>, therefore changes have to be written to <code>config.txt</code> directly<ref>https://github.com/NixOS/nixpkgs/pull/241534</ref>}}
To edit options only available through <code>config.txt</code>, as of May 12, 2025, you can only do so non-declaratively:
{{commands|<nowiki>
$ sudo mount /dev/disk/by-label/FIRMWARE /mnt
$ sudo vim /mnt/config.txt # <-- make changes here
</nowiki>}}
For example, [https://www.raspberrypi-spy.co.uk/2020/11/overclocking-the-raspberry-pi-400/ overclocking] the Raspberry Pi 400 can be done by adding the following:
{{file|config.txt|text|<nowiki>
arm_freq=2000
over_voltage=6
</nowiki>}}
=== USB boot ===
=== USB boot ===


Line 135: Line 152:


{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
   sound.enable = true;
{
   hardware.pulseaudio.enable = true;
  # Enable audio devices
   hardware.raspberry-pi."4".audio.enable = true;
   boot.kernelParams = [ "snd_bcm2835.enable_hdmi=1" "snd_bcm2835.enable_headphones=1" ];
}
</nowiki>}}
{{file|config.txt|txt|<nowiki>
dtparam=audio=on
</nowiki>}}
 
If you're running headless, you can also disable HDMI audio and force use of the headphones jack by adding <code>hdmi_ignore_edid_audio=1</code> on a line below <code>dtparam=audio=on</code>.
 
=== Networking ===
 
Ethernet and wifi interfaces should work out of the box. In addition to normal network configuration, consider disabling wifi powersaving if you experience slowness or issues with the host becoming unreachable on the network shortly after boot. For NetworkManager, the following configuration is sufficient:
 
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{
   # Basic networking
  networking.networkmanager.enable = true;
   # Prevent host becoming unreachable on wifi after some time.
  networking.networkmanager.wifi.powersave = false;
}
</nowiki>}}
</nowiki>}}


Line 173: Line 209:


To enable the SPI, you would normally add <code>dtparam=spi=on</code> to <code>/boot/config.txt</code>.
To enable the SPI, you would normally add <code>dtparam=spi=on</code> to <code>/boot/config.txt</code>.
This is not possbible on NixOS, and instead you have to apply a device tree overlay.
This is not possible on NixOS, and instead you have to apply a device tree overlay.
For this we use the <code>hardware.deviceTree.overlays</code> option.
For this we use the <code>hardware.deviceTree.overlays</code> option.
After applying the overlay, we add an <code>spi</code> group and change the owner of the <code>spidev</code> device to it, similarly to [[#Using GPIO pins as non root |GPIO]].
After applying the overlay, we add an <code>spi</code> group and change the owner of the <code>spidev</code> device to it, similarly to [[#Using GPIO pins as non root |GPIO]].


<syntaxHighlight lang="nix">
<syntaxhighlight lang="nix">
hardware.raspberry-pi."4".apply-overlays-dtmerge.enable = true;
hardware.raspberry-pi."4".apply-overlays-dtmerge.enable = true;
hardware.deviceTree = {
hardware.deviceTree = {
Line 185: Line 221:
     {
     {
       name = "spi";
       name = "spi";
       dtsoFile = ./spi0-0cd.dtso;
       dtboFile = ./spi0-0cs.dtbo;
     }
     }
   ];
   ];
Line 195: Line 231:
   SUBSYSTEM=="spidev", KERNEL=="spidev0.0", GROUP="spi", MODE="0660"
   SUBSYSTEM=="spidev", KERNEL=="spidev0.0", GROUP="spi", MODE="0660"
'';
'';
</syntaxHighlight>
</syntaxhighlight>


The the <code>spi0-0cd.dtso</code> file can be downloaded [https://github.com/raspberrypi/firmware/blob/master/boot/overlays/spi0-0cs.dtbo here].
The the <code>spi0-0cd.dtso</code> file can be downloaded [https://github.com/raspberrypi/firmware/blob/master/boot/overlays/spi0-0cs.dtbo here].
Line 254: Line 290:
}
}
</nowiki>}}
</nowiki>}}
=== Enabling Bluetooth ===
One might get bluetooth to work with this in the configuration file:
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
  systemd.services.btattach = {
    before = [ "bluetooth.service" ];
    after = [ "dev-ttyAMA0.device" ];
    wantedBy = [ "multi-user.target" ];
    serviceConfig = {
      ExecStart = "${pkgs.bluez}/bin/btattach -B /dev/ttyAMA0 -P bcm -S 3000000";
    };
  };
</nowiki>}}
== Customizing & Generating SD image without installation step ==
There's a nix-community project to support fine-grained kernel & config.txt, and generate the image directly:
[https://github.com/nix-community/raspberry-pi-nix/ nix-community/raspberry-pi-nix]


== Notes about the boot process ==
== Notes about the boot process ==