NixOS on ARM/Raspberry Pi: Difference between revisions
imported>Bct Kernel selection |
Add Raspberry Pi 5 to tables (it's already described below) |
||
| (8 intermediate revisions by 7 users not shown) | |||
| Line 22: | Line 22: | ||
|- | |- | ||
!colspan="2" class="title"|Raspberry Pi 4 | !colspan="2" class="title"|Raspberry Pi 4 | ||
|- | |||
!Architecture | |||
|AArch64 + ARMv7 | |||
|- | |||
! colspan="2" |Raspberry Pi 5 | |||
|- | |- | ||
!Architecture | !Architecture | ||
| Line 83: | Line 88: | ||
| Raspberry Pi 4 Model B | | Raspberry Pi 4 Model B | ||
| AArch64<br /> ''+ armv7'' | | AArch64<br /> ''+ armv7'' | ||
| YES | | YES | ||
|- | |||
!colspan="3" style="text-align: left;"|Raspberry Pi 400 | |||
|- | |||
| Raspberry Pi 400 | |||
| AArch64<br /> ''+ armv7'' | |||
| Yes (only with kernel >= 6.1) | |||
|- | |||
! colspan="3" |Raspberry Pi 5 | |||
|- | |||
|Raspberry Pi 5 | |||
|AArch64<br /> ''+ armv7'' | |||
|C* | |||
|} | |} | ||
''Support'' | ''Support'' | ||
* YES: Supported architecture by Nixpkgs downstream and tested to be working. | * YES: Supported architecture by Nixpkgs downstream and tested to be working. | ||
* C: Community supported, and tested to be working. | * C: Community supported, and tested to be working. | ||
* C*: Community supported, unverified but should be working. | * C*: Community supported, unverified but should be working. | ||
| Line 149: | Line 165: | ||
</syntaxHighlight> | </syntaxHighlight> | ||
=== Raspberry | === Raspberry Pi 4 === | ||
''See'' [[NixOS on ARM/Raspberry Pi 4]] | |||
=== Raspberry Pi 5=== | |||
''See'' [[NixOS on ARM/Raspberry Pi 5]] | |||
== Audio == | |||
In addition to the usual config, it might be required to enable audio support explicitly in the firmwareConfig. | In addition to the usual config, it might be required to enable audio support explicitly in the firmwareConfig. | ||
| Line 326: | Line 298: | ||
=== Boot option 2: <code>boot.loader.raspberryPi</code> === | === Boot option 2: <code>boot.loader.raspberryPi</code> === | ||
{{warning| This option has been deprecated in https://github.com/NixOS/nixpkgs/pull/241534}} | |||
This configuration assumes that the VFAT firmware partition is mounted to /boot. If it isn't, options like <code>boot.loader.raspberryPi.firmwareConfig</code> will write their configuration to the wrong partition and have no effect. | This configuration assumes that the VFAT firmware partition is mounted to /boot. If it isn't, options like <code>boot.loader.raspberryPi.firmwareConfig</code> will write their configuration to the wrong partition and have no effect. | ||
| Line 340: | Line 314: | ||
Using the 3.3v serial port via the pin headers (exact location depends on hardware version) will get u-boot output and, when configured, a Linux kernel console. | Using the 3.3v serial port via the pin headers (exact location depends on hardware version) will get u-boot output and, when configured, a Linux kernel console. | ||
== Device trees == | |||
Raspberry Pi add-on hardware often requires a device tree overlay. On other OSes this is usually set up using a <code>dtoverlay=</code> option in config.txt on the firmware partition. This approach can be made to work on NixOS with some combination of bootloader and kernel, but it may be easier and more explicit to use NixOS' <code>hardware.deviceTree</code> option to compile the overlay directly into the device tree. | |||
A device tree config looks something like this: | |||
<syntaxhighlight lang="nix"> | |||
hardware.deviceTree = { | |||
enable = true; | |||
overlays = [ | |||
{ | |||
name = "hifiberry-dacplus"; | |||
dtsText = '' | |||
/dts-v1/; | |||
/plugin/; | |||
/ { | |||
compatible = "brcm,bcm2835"; | |||
// ... etc. | |||
''; | |||
}; | |||
]; | |||
}; | |||
</syntaxhighlight> | |||
This will apply the overlay to all <code>.dtb</code> files with a matching <code>compatible</code> line. | |||
After rebooting you can check if the overlay has been applied by looking for it in the output of <code>dtc --sort /proc/device-tree</code>. | |||
dtoverlay may fail with <code>FDT_ERR_NOTFOUND</code> on some Raspberry Pi device tree overlays. In this case dtmerge should be used instead. There is a Nix overlay to use dtmerge for applying device tree overlays: https://github.com/NixOS/nixos-hardware/blob/429f232fe1dc398c5afea19a51aad6931ee0fb89/raspberry-pi/4/apply-overlays-dtmerge.nix | |||
== Troubleshooting == | == Troubleshooting == | ||
| Line 345: | Line 350: | ||
=== Power issues === | === Power issues === | ||
Especially with the power-hungry Raspberry Pi 3, it is important to have a [https://www.raspberrypi.org/documentation/hardware/raspberrypi/power/README.md sufficient enough power supply] or | Especially with the power-hungry Raspberry Pi 3, it is important to have a [https://www.raspberrypi.org/documentation/hardware/raspberrypi/power/README.md sufficient enough power supply] or unexpected behaviour may occur; this may include: | ||
* Lightning bolt on HDMI output "breaking" the display. | * Lightning bolt on HDMI output "breaking" the display. | ||
| Line 352: | Line 357: | ||
* Random hangs | * Random hangs | ||
This | This is a hard problem. It is caused by the Raspberry Pi warning about power issues, but the current drivers (as of | ||
Linux 4.14) have a hard time dealing with it properly. If the power supply is rated properly AND the cable is not incurring too much power losses, it may be required to disable the lightning bolt indicator so the display driver isn't messed up.<ref>https://logs.nix.samueldr.com/nixos/2017-12-20#1513784657-1513784714;</ref> The lightning bolt indicator can be disabled by adding the line <code>avoid_warnings=1</code> in config.txt<ref>https://www.raspberrypi.org/documentation/configuration/config-txt/README.md</ref> | Linux 4.14) have a hard time dealing with it properly. If the power supply is rated properly AND the cable is not incurring too much power losses, it may be required to disable the lightning bolt indicator so the display driver isn't messed up.<ref>https://logs.nix.samueldr.com/nixos/2017-12-20#1513784657-1513784714;</ref> The lightning bolt indicator can be disabled by adding the line <code>avoid_warnings=1</code> in config.txt<ref>https://www.raspberrypi.org/documentation/configuration/config-txt/README.md</ref> | ||