NixOS on ARM/Raspberry Pi 4: Difference between revisions
Tags: Reverted Visual edit |
Tags: Reverted Visual edit |
||
Line 148: | Line 148: | ||
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>. | 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>. | ||
=== | === 网络配置 === | ||
以太网和wifi接口应该开箱即用。除了正常的网络配置外,如果您在启动后不久遇到速度慢或主机在网络上无法访问的问题,请考虑禁用wifi省电。对于NetworkManager,以下配置就足够了: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> | {{file|/etc/nixos/configuration.nix|nix|<nowiki> |
Revision as of 05:16, 11 January 2025
Raspberry Pi 4 Family | |
---|---|
Manufacturer | Raspberry Pi Foundation |
Architecture | AArch64 |
Bootloader | Custom or U-Boot |
Boot order | Configurable; SD, USB, Netboot |
Maintainer | |
Raspberry Pi 4B | |
SoC | BCM2711 |
Raspberry Pi系列设备是由Raspberry Pi基金会制造的一系列单板计算机。它们都基于Broadcom片上系统(SoC)。
状态
Raspberry Pi 4家族仅支持AArch64。社区支持使用armv7。
Board-specific 安装说明
首先按照 generic installation steps 获取安装程序映像,并使用 installation and configuration steps.
Raspberry Pi 4B可与 generic SD image配合使用.
nix.dev上提供了在Raspberry Pi上安装NixOS的示例说明。installing NixOS on a Raspberry Pi
配置
使用nixos-generate-config将生成所需的最小配置。
Raspberry Pi 4在现代内核上得到了很好的支持。但是,如果您遇到GPU支持或其他deviceTree怪癖的问题,您可能希望添加nixos硬件通道: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:
nix-channel --add https://github.com/NixOS/nixos-hardware/archive/master.tar.gz nixos-hardware
nix-channel --update
/etc/nixos/configuration.nix
{ config, pkgs, lib, ... }:
{
imports =
[
<nixos-hardware/raspberry-pi/4>
./hardware-configuration.nix
];
hardware = {
raspberry-pi."4".apply-overlays-dtmerge.enable = true;
deviceTree = {
enable = true;
filter = "*rpi-4-*.dtb";
};
};
console.enable = false;
environment.systemPackages = with pkgs; [
libraspberrypi
raspberrypi-eeprom
];
system.stateVersion = "24.11";
}
USB boot
For USB booting to work properly, a firmware update might be needed:
$ nix-shell -p raspberrypi-eeprom $ rpi-eeprom-update -d -a
Now reboot the device so it can update the firmware from the boot partition.
GPU支持
以下配置示例是基于将其添加到已工作的配置中的假设而构建的。它们不是完整的配置。The following configuration samples are built on the assumption that they are added to an already working configuration. They are not complete configurations.
Without GPU
/etc/nixos/configuration.nix
{
services.xserver = {
enable = true;
displayManager.lightdm.enable = true;
desktopManager.gnome.enable = true;
videoDrivers = [ "fbdev" ];
};
}
With GPU
In nixos-hardware#261 an option has been added to use the fkms-3d
(modesetting) overlay which uses the V3D renderer. This will only work with the vendor kernel, which is the default in NixOS.
/etc/nixos/configuration.nix
{ pkgs, ... }:
{
imports = [
.../nixos-hardware/raspberry-pi/4
];
hardware.raspberry-pi."4".fkms-3d.enable = true;
services.xserver = {
enable = true;
displayManager.lightdm.enable = true;
desktopManager.gnome.enable = true;
};
}
Tools
The raspberry tools are available in the libraspberrypi
package and include commands like vcgencmd
to measure temperature and CPU frequency.
Audio
In addition to the usual config, you will need to enable hardware audio support:
/etc/nixos/configuration.nix
{
# Enable audio devices
boot.kernelParams = [ "snd_bcm2835.enable_hdmi=1" "snd_bcm2835.enable_headphones=1" ];
boot.loader.raspberryPi.firmwareConfig = ''
dtparam=audio=on
'';
}
If you're running headless, you can also disable HDMI audio and force use of the headphones jack by adding hdmi_ignore_edid_audio=1
on a line below dtparam=audio=on
.
网络配置
以太网和wifi接口应该开箱即用。除了正常的网络配置外,如果您在启动后不久遇到速度慢或主机在网络上无法访问的问题,请考虑禁用wifi省电。对于NetworkManager,以下配置就足够了: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:
/etc/nixos/configuration.nix
{
# Basic networking
networking.networkmanager.enable = true;
# Prevent host becoming unreachable on wifi after some time.
networking.networkmanager.wifi.powersave = false;
}
Using GPIO pins as non-root
By default, the GPIO pins are enabled, but can only be accessed by the root user.
This can be addressed by adding a udev rule to your configuration that changes the ownership of /dev/gpiomem
and the other required devices.
The following code adds a group gpio
and adds the user mygpiouser
to that group. You probably want to put your own user name here.
The extraRules
changes the owner of gpiomem
and all other files needed for GPIO to work to root:gpio
and changes the permissions to 0660
.
Therefore, the root user and anyone in the gpio group can now access the GPIO pins.
# Create gpio group
users.groups.gpio = {};
# Change permissions gpio devices
services.udev.extraRules = ''
SUBSYSTEM=="bcm2835-gpiomem", KERNEL=="gpiomem", GROUP="gpio",MODE="0660"
SUBSYSTEM=="gpio", KERNEL=="gpiochip*", ACTION=="add", RUN+="${pkgs.bash}/bin/bash -c 'chown root:gpio /sys/class/gpio/export /sys/class/gpio/unexport ; chmod 220 /sys/class/gpio/export /sys/class/gpio/unexport'"
SUBSYSTEM=="gpio", KERNEL=="gpio*", ACTION=="add",RUN+="${pkgs.bash}/bin/bash -c 'chown root:gpio /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value ; chmod 660 /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value'"
'';
# Add user to group
users = {
users.mygpiouser = {
extraGroups = [ "gpio" ... ];
....
};
};
Enabling the SPI
To enable the SPI, you would normally add dtparam=spi=on
to /boot/config.txt
.
This is not possible on NixOS, and instead you have to apply a device tree overlay.
For this we use the hardware.deviceTree.overlays
option.
After applying the overlay, we add an spi
group and change the owner of the spidev
device to it, similarly to GPIO.
hardware.raspberry-pi."4".apply-overlays-dtmerge.enable = true;
hardware.deviceTree = {
enable = true;
filter = "*-rpi-*.dtb";
overlays = [
{
name = "spi";
dtboFile = ./spi0-0cs.dtbo;
}
];
};
users.groups.spi = {};
services.udev.extraRules = ''
SUBSYSTEM=="spidev", KERNEL=="spidev0.0", GROUP="spi", MODE="0660"
'';
The the spi0-0cd.dtso
file can be downloaded here.
You might have to change the compatible
field to "raspberrypi" in the dtbo file.
HDMI-CEC
A few bits and pieces for using HDMI-CEC on the Pi4:
/etc/nixos/configuration.nix
{ pkgs, ... }:
{
# an overlay to enable raspberrypi support in libcec, and thus cec-client
nixpkgs.overlays = [
# nixos-22.05
# (self: super: { libcec = super.libcec.override { inherit (self) libraspberrypi; }; })
# nixos-22.11
(self: super: { libcec = super.libcec.override { withLibraspberrypi = true; }; })
];
# install libcec, which includes cec-client (requires root or "video" group, see udev rule below)
# scan for devices: `echo 'scan' | cec-client -s -d 1`
# set pi as active source: `echo 'as' | cec-client -s -d 1`
environment.systemPackages = with pkgs; [
libcec
];
services.udev.extraRules = ''
# allow access to raspi cec device for video group (and optionally register it as a systemd device, used below)
KERNEL=="vchiq", GROUP="video", MODE="0660", TAG+="systemd", ENV{SYSTEMD_ALIAS}="/dev/vchiq"
'';
# optional: attach a persisted cec-client to `/run/cec.fifo`, to avoid the CEC ~1s startup delay per command
# scan for devices: `echo 'scan' > /run/cec.fifo ; journalctl -u cec-client.service`
# set pi as active source: `echo 'as' > /run/cec.fifo`
systemd.sockets."cec-client" = {
after = [ "dev-vchiq.device" ];
bindsTo = [ "dev-vchiq.device" ];
wantedBy = [ "sockets.target" ];
socketConfig = {
ListenFIFO = "/run/cec.fifo";
SocketGroup = "video";
SocketMode = "0660";
};
};
systemd.services."cec-client" = {
after = [ "dev-vchiq.device" ];
bindsTo = [ "dev-vchiq.device" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
ExecStart = ''${pkgs.libcec}/bin/cec-client -d 1'';
ExecStop = ''/bin/sh -c "echo q > /run/cec.fifo"'';
StandardInput = "socket";
StandardOutput = "journal";
Restart="no";
};
}
Enabling Bluetooth
One might get bluetooth to work with this in the configuration file:
/etc/nixos/configuration.nix
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";
};
};
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:
nix-community/raspberry-pi-nix
Notes about the boot process
Unless using an extremely early WIP image, the Raspberry Pi 4B boots using the U-Boot platform firmware.
Updating U-Boot/Firmware
$ nix-shell -p raspberrypi-eeprom $ sudo mount /dev/disk/by-label/FIRMWARE /mnt $ sudo BOOTFS=/mnt FIRMWARE_RELEASE_STATUS=stable rpi-eeprom-update -d -a
Troubleshooting
Audio not playing and Bluetooth: no controller available
On the Raspberry Pi kernel, the jack may never play audio, and no Bluetooth devices may ever be found. To get this to work, it is recommended to switch to the mainline kernel. See nixpkgs#123725 for more info.
Touch screen not working
You have to declare this in your configuration.nix
[1]:
hardware.raspberry-pi."4" = {
touch-ft5406.enable = true;
};