Move raspi hardware config to modules/hardware
This commit is contained in:
parent
f845084405
commit
a14178fe84
|
@ -4,14 +4,19 @@ Do not import this module into the main `default.nix` file. Otherwise the other
|
|||
systems aren't buildable anymore because some options from the `nixos-hardware`
|
||||
input get applied immediately.
|
||||
|
||||
Just import it in any system you need with the following code:
|
||||
Just import it in any system you need with the following code where variant is
|
||||
either `ethernet` or `usb`. `ethernet` is for a Pi which is intended as a
|
||||
server and is connected with a fixed IP to the network. `usb` is for a
|
||||
Raspberry Pi which can be connected via USB-C to another device, e.g. an iPad.
|
||||
The ethernet port is configured to get its IP via DHCP and via uSB-C the Pi is
|
||||
reachable via the IP provided in the configuration.
|
||||
|
||||
```nix
|
||||
imports = [
|
||||
"${inputs.self}/modules/hardware/raspi4"
|
||||
"${inputs.self}/modules/hardware/raspi4-VARIANT"
|
||||
];
|
||||
hardware = {
|
||||
az-raspi4 = {
|
||||
az-raspi4-VARIANT = {
|
||||
enable = true;
|
||||
hostname = "some-hostname";
|
||||
ip = "10.7.89.150";
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
{ inputs, lib, pkgs, ... }:
|
||||
{
|
||||
imports = [
|
||||
inputs.nixos-hardware.nixosModules.raspberry-pi-4
|
||||
];
|
||||
|
||||
boot = {
|
||||
supportedFilesystems = lib.mkForce [ "f2fs" "ntfs" "cifs" "ext4" "vfat" "nfs" "nfs4" ];
|
||||
};
|
||||
fileSystems = {
|
||||
"/" = {
|
||||
device = "/dev/disk/by-label/NIXOS_SD";
|
||||
fsType = "ext4";
|
||||
options = [ "noatime" ];
|
||||
};
|
||||
};
|
||||
|
||||
hardware.raspberry-pi."4".fkms-3d.enable = true;
|
||||
hardware.raspberry-pi."4".audio.enable = true;
|
||||
hardware.pulseaudio.enable = true;
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
libraspberrypi
|
||||
raspberrypi-eeprom
|
||||
];
|
||||
|
||||
environment.shellAliases = {
|
||||
raspi-cpu = ''
|
||||
sudo vcgencmd get_throttled && sudo vcgencmd measure_temp
|
||||
'';
|
||||
raspi-firmware-update = ''
|
||||
sudo mkdir -p /mnt && \
|
||||
sudo mount /dev/disk/by-label/FIRMWARE /mnt && \
|
||||
BOOTFS=/mnt FIRMWARE_RELEASE_STATUS=stable sudo -E rpi-eeprom-update -d -a && \
|
||||
sudo umount /mnt
|
||||
'';
|
||||
};
|
||||
}
|
|
@ -1,78 +0,0 @@
|
|||
{ config, inputs, lib, pkgs, ... }:
|
||||
let
|
||||
cfg = config.hardware.az-raspi4;
|
||||
in
|
||||
{
|
||||
imports = [
|
||||
inputs.nixos-hardware.nixosModules.raspberry-pi-4
|
||||
];
|
||||
|
||||
options = {
|
||||
hardware.az-raspi4 = {
|
||||
enable = lib.mkEnableOption "Enable options required for Raspberry Pi 4.";
|
||||
hostname = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "The hostname of the system.";
|
||||
};
|
||||
ip = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "The IP of the system.";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
boot = {
|
||||
supportedFilesystems = lib.mkForce [ "f2fs" "ntfs" "cifs" "ext4" "vfat" "nfs" "nfs4" ];
|
||||
};
|
||||
fileSystems = {
|
||||
"/" = {
|
||||
device = "/dev/disk/by-label/NIXOS_SD";
|
||||
fsType = "ext4";
|
||||
options = [ "noatime" ];
|
||||
};
|
||||
};
|
||||
|
||||
hardware.raspberry-pi."4".fkms-3d.enable = true;
|
||||
hardware.raspberry-pi."4".audio.enable = true;
|
||||
hardware.pulseaudio.enable = true;
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
libraspberrypi
|
||||
raspberrypi-eeprom
|
||||
];
|
||||
|
||||
networking = {
|
||||
useDHCP = false;
|
||||
hostName = cfg.hostname;
|
||||
hosts = {
|
||||
"127.0.0.1" = [ "${cfg.hostname}.2li.local" ];
|
||||
ip = [ "${cfg.hostname}.2li.local" ];
|
||||
};
|
||||
defaultGateway = "10.7.89.1";
|
||||
nameservers = [ "10.7.89.1" ];
|
||||
interfaces.eth0.ipv4.addresses = [
|
||||
{
|
||||
address = cfg.ip;
|
||||
prefixLength = 24;
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
environment.shellAliases = {
|
||||
raspi-cpu = ''
|
||||
sudo vcgencmd get_throttled && sudo vcgencmd measure_temp
|
||||
'';
|
||||
raspi-firmware-update = ''
|
||||
sudo mkdir -p /mnt && \
|
||||
sudo mount /dev/disk/by-label/FIRMWARE /mnt && \
|
||||
BOOTFS=/mnt FIRMWARE_RELEASE_STATUS=stable sudo -E rpi-eeprom-update -d -a && \
|
||||
sudo umount /mnt
|
||||
'';
|
||||
};
|
||||
services = {
|
||||
az-log2ram.enable = true;
|
||||
az-syslog.enable = true;
|
||||
};
|
||||
};
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
{ config, lib, ... }:
|
||||
let
|
||||
cfg = config.hardware.az-raspi4-ethernet;
|
||||
in
|
||||
{
|
||||
imports = [
|
||||
./base.nix
|
||||
];
|
||||
|
||||
options = {
|
||||
hardware.az-raspi4-ethernet = {
|
||||
enable = lib.mkEnableOption "Enable options required for Raspberry Pi 4.";
|
||||
hostname = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "The hostname of the system.";
|
||||
};
|
||||
ip = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "The IP of the system.";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
networking = {
|
||||
useDHCP = false;
|
||||
hostName = cfg.hostname;
|
||||
hosts = {
|
||||
"127.0.0.1" = [ "${cfg.hostname}.2li.local" ];
|
||||
ip = [ "${cfg.hostname}.2li.local" ];
|
||||
};
|
||||
defaultGateway = "10.7.89.1";
|
||||
nameservers = [ "10.7.89.1" ];
|
||||
interfaces.eth0.ipv4.addresses = [
|
||||
{
|
||||
address = cfg.ip;
|
||||
prefixLength = 24;
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
services = {
|
||||
az-log2ram.enable = true;
|
||||
az-syslog.enable = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,109 @@
|
|||
{ config, lib, ... }:
|
||||
let
|
||||
cfg = config.hardware.az-raspi4-usb;
|
||||
in
|
||||
{
|
||||
imports = [
|
||||
./base.nix
|
||||
];
|
||||
|
||||
options = {
|
||||
hardware.az-raspi4-usb = {
|
||||
enable = lib.mkEnableOption "Enable options required for Raspberry Pi 4.";
|
||||
hostname = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "The hostname of the system.";
|
||||
};
|
||||
ip = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "The IP of the system.";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
hardware.raspberry-pi."4".dwc2.enable = true;
|
||||
|
||||
networking = {
|
||||
hostName = cfg.hostname;
|
||||
hosts = {
|
||||
"127.0.0.1" = [ "${cfg.hostname}.2li.local" ];
|
||||
ip = [ "${cfg.hostname}.2li.local" ];
|
||||
};
|
||||
interfaces.usb0.ipv4.addresses = [
|
||||
{
|
||||
address = cfg.ip;
|
||||
prefixLength = 24;
|
||||
}
|
||||
];
|
||||
wireless = {
|
||||
enable = true;
|
||||
userControlled.enable = true;
|
||||
interfaces = [ "wlan0" ];
|
||||
networks = {
|
||||
"Gröibschi" = {
|
||||
psk = "schottland";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
boot.loader.raspberryPi.firmwareConfig = "dtoverlay=dwc2";
|
||||
networking.dhcpcd.denyInterfaces = [ "usb0" ];
|
||||
|
||||
services.dhcpd4 = {
|
||||
enable = true;
|
||||
interfaces = [ "usb0" ];
|
||||
extraConfig = ''
|
||||
option domain-name "2li.mobile";
|
||||
option subnet-mask 255.255.255.0;
|
||||
option broadcast-address 10.213.0.255;
|
||||
option domain-name-servers 84.200.69.80, 84.200.70.40;
|
||||
subnet 10.213.0.0 netmask 255.255.255.0 {
|
||||
option routers ${cfg.ip};
|
||||
range 10.213.0.100 10.213.0.200;
|
||||
}
|
||||
'';
|
||||
};
|
||||
|
||||
systemd.services."usb-otg" = {
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
RemainAfterExit = true;
|
||||
};
|
||||
wantedBy = [ "default.target" ];
|
||||
script = ''
|
||||
mkdir -p /sys/kernel/config/usb_gadget/pi4
|
||||
cd /sys/kernel/config/usb_gadget/pi4
|
||||
echo 0x1d6b > idVendor # Linux Foundation
|
||||
echo 0x0104 > idProduct # Multifunction Composite Gadget
|
||||
echo 0x0100 > bcdDevice # v1.0.0
|
||||
echo 0x0200 > bcdUSB # USB2
|
||||
echo 0xEF > bDeviceClass
|
||||
echo 0x02 > bDeviceSubClass
|
||||
echo 0x01 > bDeviceProtocol
|
||||
mkdir -p /sys/kernel/config/usb_gadget/pi4/strings/0x409
|
||||
echo "fedcba9876543211" > strings/0x409/serialnumber
|
||||
echo "Nebucatnetzer" > strings/0x409/manufacturer
|
||||
echo "PI4 USB Device" > strings/0x409/product
|
||||
mkdir -p /sys/kernel/config/usb_gadget/pi4/configs/c.1/strings/0x409
|
||||
echo "Config 1: ECM network" > configs/c.1/strings/0x409/configuration
|
||||
echo 250 > configs/c.1/MaxPower
|
||||
# Add functions here
|
||||
# see gadget configurations below
|
||||
# End functions
|
||||
mkdir -p /sys/kernel/config/usb_gadget/pi4/functions/ecm.usb0
|
||||
HOST="00:dc:c8:f7:75:14" # "HostPC"
|
||||
SELF="00:dd:dc:eb:6d:a1" # "BadUSB"
|
||||
echo $HOST > functions/ecm.usb0/host_addr
|
||||
echo $SELF > functions/ecm.usb0/dev_addr
|
||||
ln -s functions/ecm.usb0 configs/c.1/
|
||||
udevadm settle -t 5 || :
|
||||
ls /sys/class/udc > UDC
|
||||
'';
|
||||
};
|
||||
systemd.services.dhcpd4.after = [ "usb-otg.service" ];
|
||||
systemd.services."network-addresses-usb0".after = [ "usb-otg.service" ];
|
||||
};
|
||||
}
|
||||
|
|
@ -4,10 +4,10 @@ let
|
|||
in
|
||||
{
|
||||
imports = [
|
||||
"${inputs.self}/modules/hardware/raspi4"
|
||||
"${inputs.self}/modules/hardware/raspi4/raspi-ethernet.nix"
|
||||
];
|
||||
hardware = {
|
||||
az-raspi4 = {
|
||||
az-raspi4-ethernet = {
|
||||
enable = true;
|
||||
hostname = hostname;
|
||||
ip = "10.7.89.109";
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
{ hostname }: { inputs, pkgs, ... }:
|
||||
{
|
||||
imports = [
|
||||
"${inputs.self}/modules/hardware/raspi4"
|
||||
"${inputs.self}/modules/hardware/raspi4/raspi-ethernet.nix"
|
||||
];
|
||||
hardware = {
|
||||
az-raspi4 = {
|
||||
az-raspi4-ethernet = {
|
||||
enable = true;
|
||||
hostname = hostname;
|
||||
ip = "10.7.89.10";
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
{ hostname }: { inputs, pkgs, ... }:
|
||||
{
|
||||
imports = [
|
||||
"${inputs.self}/modules/hardware/raspi4"
|
||||
"${inputs.self}/modules/hardware/raspi4/raspi-ethernet.nix"
|
||||
];
|
||||
hardware = {
|
||||
az-raspi4 = {
|
||||
az-raspi4-ethernet = {
|
||||
enable = true;
|
||||
hostname = hostname;
|
||||
ip = "10.7.89.123";
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{ hostname }: { inputs, ... }:
|
||||
{
|
||||
imports = [
|
||||
"${inputs.self}/modules/hardware/raspi4"
|
||||
"${inputs.self}/modules/hardware/raspi4/raspi-ethernet.nix"
|
||||
];
|
||||
fileSystems = {
|
||||
"/mnt/external" = {
|
||||
|
@ -12,7 +12,7 @@
|
|||
};
|
||||
|
||||
hardware = {
|
||||
az-raspi4 = {
|
||||
az-raspi4-ethernet = {
|
||||
enable = true;
|
||||
hostname = hostname;
|
||||
ip = "10.7.89.150";
|
||||
|
|
|
@ -1,131 +1,16 @@
|
|||
{ hostname }: { inputs, lib, pkgs, ... }:
|
||||
let
|
||||
ip = "10.213.0.1";
|
||||
in
|
||||
{
|
||||
imports = [
|
||||
inputs.nixos-hardware.nixosModules.raspberry-pi-4
|
||||
"${inputs.self}/modules/hardware/raspi4/raspi-usb.nix"
|
||||
];
|
||||
|
||||
boot = {
|
||||
supportedFilesystems = lib.mkForce [ "f2fs" "ntfs" "cifs" "ext4" "vfat" "nfs" "nfs4" ];
|
||||
kernelModules = [ "libcomposite" ];
|
||||
};
|
||||
fileSystems = {
|
||||
"/" = {
|
||||
device = "/dev/disk/by-label/NIXOS_SD";
|
||||
fsType = "ext4";
|
||||
options = [ "noatime" ];
|
||||
};
|
||||
};
|
||||
|
||||
hardware.raspberry-pi."4".fkms-3d.enable = true;
|
||||
hardware.raspberry-pi."4".audio.enable = true;
|
||||
hardware.raspberry-pi."4".dwc2.enable = true;
|
||||
hardware.pulseaudio.enable = true;
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
libraspberrypi
|
||||
raspberrypi-eeprom
|
||||
];
|
||||
|
||||
networking = {
|
||||
hostName = hostname;
|
||||
hosts = {
|
||||
"127.0.0.1" = [ "${hostname}.2li.local" ];
|
||||
ip = [ "${hostname}.2li.local" ];
|
||||
};
|
||||
interfaces.usb0.ipv4.addresses = [
|
||||
{
|
||||
address = ip;
|
||||
prefixLength = 24;
|
||||
}
|
||||
];
|
||||
wireless = {
|
||||
hardware = {
|
||||
az-raspi4-usb = {
|
||||
enable = true;
|
||||
userControlled.enable = true;
|
||||
interfaces = [ "wlan0" ];
|
||||
networks = {
|
||||
"Gröibschi" = {
|
||||
psk = "schottland";
|
||||
};
|
||||
};
|
||||
hostname = hostname;
|
||||
ip = "10.213.0.1";
|
||||
};
|
||||
};
|
||||
|
||||
boot.loader.raspberryPi.firmwareConfig = "dtoverlay=dwc2";
|
||||
networking.dhcpcd.denyInterfaces = [ "usb0" ];
|
||||
|
||||
services.dhcpd4 = {
|
||||
enable = true;
|
||||
interfaces = [ "usb0" ];
|
||||
extraConfig = ''
|
||||
option domain-name "2li.mobile";
|
||||
option subnet-mask 255.255.255.0;
|
||||
option broadcast-address 10.213.0.255;
|
||||
option domain-name-servers 84.200.69.80, 84.200.70.40;
|
||||
subnet 10.213.0.0 netmask 255.255.255.0 {
|
||||
option routers 10.213.0.1;
|
||||
range 10.213.0.100 10.213.0.200;
|
||||
}
|
||||
'';
|
||||
};
|
||||
|
||||
environment.shellAliases = {
|
||||
raspi-cpu = ''
|
||||
sudo vcgencmd get_throttled && sudo vcgencmd measure_temp
|
||||
'';
|
||||
raspi-firmware-update = ''
|
||||
sudo mkdir -p /mnt && \
|
||||
sudo mount /dev/disk/by-label/FIRMWARE /mnt && \
|
||||
BOOTFS=/mnt FIRMWARE_RELEASE_STATUS=stable sudo -E rpi-eeprom-update -d -a && \
|
||||
sudo umount /mnt
|
||||
'';
|
||||
};
|
||||
|
||||
systemd.services."usb-otg" = {
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
RemainAfterExit = true;
|
||||
};
|
||||
wantedBy = [ "default.target" ];
|
||||
script = ''
|
||||
mkdir -p /sys/kernel/config/usb_gadget/pi4
|
||||
cd /sys/kernel/config/usb_gadget/pi4
|
||||
echo 0x1d6b > idVendor # Linux Foundation
|
||||
echo 0x0104 > idProduct # Multifunction Composite Gadget
|
||||
echo 0x0100 > bcdDevice # v1.0.0
|
||||
echo 0x0200 > bcdUSB # USB2
|
||||
echo 0xEF > bDeviceClass
|
||||
echo 0x02 > bDeviceSubClass
|
||||
echo 0x01 > bDeviceProtocol
|
||||
mkdir -p /sys/kernel/config/usb_gadget/pi4/strings/0x409
|
||||
echo "fedcba9876543211" > strings/0x409/serialnumber
|
||||
echo "Nebucatnetzer" > strings/0x409/manufacturer
|
||||
echo "PI4 USB Device" > strings/0x409/product
|
||||
mkdir -p /sys/kernel/config/usb_gadget/pi4/configs/c.1/strings/0x409
|
||||
echo "Config 1: ECM network" > configs/c.1/strings/0x409/configuration
|
||||
echo 250 > configs/c.1/MaxPower
|
||||
# Add functions here
|
||||
# see gadget configurations below
|
||||
# End functions
|
||||
mkdir -p /sys/kernel/config/usb_gadget/pi4/functions/ecm.usb0
|
||||
HOST="00:dc:c8:f7:75:14" # "HostPC"
|
||||
SELF="00:dd:dc:eb:6d:a1" # "BadUSB"
|
||||
echo $HOST > functions/ecm.usb0/host_addr
|
||||
echo $SELF > functions/ecm.usb0/dev_addr
|
||||
ln -s functions/ecm.usb0 configs/c.1/
|
||||
udevadm settle -t 5 || :
|
||||
ls /sys/class/udc > UDC
|
||||
'';
|
||||
};
|
||||
systemd.services.dhcpd4.after = [ "usb-otg.service" ];
|
||||
systemd.services."network-addresses-usb0".after = [ "usb-otg.service" ];
|
||||
|
||||
services = {
|
||||
az-docker.enable = true;
|
||||
az-log2ram.enable = true;
|
||||
};
|
||||
programs = {
|
||||
az-nix-direnv.enable = true;
|
||||
az-tmux.enable = true;
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
{ hostname }: { inputs, pkgs, ... }:
|
||||
{
|
||||
imports = [
|
||||
"${inputs.self}/modules/hardware/raspi4"
|
||||
"${inputs.self}/modules/hardware/raspi4/raspi-ethernet.nix"
|
||||
];
|
||||
hardware = {
|
||||
az-raspi4 = {
|
||||
az-raspi4-ethernet = {
|
||||
enable = true;
|
||||
hostname = hostname;
|
||||
ip = "10.7.89.103";
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
{ hostname }: { inputs, pkgs, ... }:
|
||||
{
|
||||
imports = [
|
||||
"${inputs.self}/modules/hardware/raspi4"
|
||||
"${inputs.self}/modules/hardware/raspi4/raspi-ethernet.nix"
|
||||
];
|
||||
hardware = {
|
||||
az-raspi4 = {
|
||||
az-raspi4-ethernet = {
|
||||
enable = true;
|
||||
hostname = hostname;
|
||||
ip = "10.7.89.112";
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
{ hostname }: { inputs, pkgs, ... }:
|
||||
{
|
||||
imports = [
|
||||
"${inputs.self}/modules/hardware/raspi4"
|
||||
"${inputs.self}/modules/hardware/raspi4/raspi-ethernet.nix"
|
||||
];
|
||||
hardware = {
|
||||
az-raspi4 = {
|
||||
az-raspi4-ethernet = {
|
||||
enable = true;
|
||||
hostname = hostname;
|
||||
ip = "10.7.89.99";
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
{ hostname }: { inputs, pkgs, ... }:
|
||||
{
|
||||
imports = [
|
||||
"${inputs.self}/modules/hardware/raspi4"
|
||||
"${inputs.self}/modules/hardware/raspi4/raspi-ethernet.nix"
|
||||
];
|
||||
hardware = {
|
||||
az-raspi4 = {
|
||||
az-raspi4-ethernet = {
|
||||
enable = true;
|
||||
hostname = hostname;
|
||||
ip = "10.7.89.30";
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
{ hostname }: { inputs, pkgs, ... }:
|
||||
{
|
||||
imports = [
|
||||
"${inputs.self}/modules/hardware/raspi4"
|
||||
"${inputs.self}/modules/hardware/raspi4/raspi-ethernet.nix"
|
||||
];
|
||||
hardware = {
|
||||
az-raspi4 = {
|
||||
az-raspi4-ethernet = {
|
||||
enable = true;
|
||||
hostname = hostname;
|
||||
ip = "10.7.89.40";
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
{ hostname }: { inputs, pkgs, ... }:
|
||||
{
|
||||
imports = [
|
||||
"${inputs.self}/modules/hardware/raspi4"
|
||||
"${inputs.self}/modules/hardware/raspi4/raspi-ethernet.nix"
|
||||
];
|
||||
hardware = {
|
||||
az-raspi4 = {
|
||||
az-raspi4-ethernet = {
|
||||
enable = true;
|
||||
hostname = hostname;
|
||||
ip = "10.7.89.115";
|
||||
|
|
Loading…
Reference in New Issue