From 27ce61ae4e144d617269dc5b1142fd4ab119ced7 Mon Sep 17 00:00:00 2001 From: Daniel Barlow Date: Fri, 24 Nov 2023 23:29:12 +0000 Subject: [PATCH] add bootable config for Turris Omnia --- devices/turris-omnia/default.nix | 114 +++++++++++++++++++++++++++++++ examples/turris.nix | 48 +++++++++++++ modules/tftpboot.nix | 2 +- 3 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 devices/turris-omnia/default.nix create mode 100644 examples/turris.nix diff --git a/devices/turris-omnia/default.nix b/devices/turris-omnia/default.nix new file mode 100644 index 0000000..6e01d6e --- /dev/null +++ b/devices/turris-omnia/default.nix @@ -0,0 +1,114 @@ +{ + description = '' + Turris Omnia + ************ + ''; + + system = { + crossSystem = { + config = "armv7l-unknown-linux-musleabihf"; + }; + }; + + module = {pkgs, config, lib, lim, ... }: + let openwrt = pkgs.openwrt; in { + imports = [ ../../modules/arch/arm.nix ]; + kernel = { + src = pkgs.pkgsBuildBuild.fetchurl { + name = "linux.tar.gz"; + url = "https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.71.tar.gz"; + hash = "sha256-yhO2cXIeIgUxkSZf/4aAsF11uxyh+UUZu6D1h92vCD8="; + }; + extraPatchPhase = '' + ${pkgs.openwrt.applyPatches.mvebu} + ''; + config = { + PCI = "y"; + OF = "y"; + MEMORY = "y"; # for MVEBU_DEVBUS + DMADEVICES = "y"; # for MV_XOR + CPU_V7 = "y"; + ARCH_MULTIPLATFORM = "y"; + ARCH_MVEBU = "y"; + ARCH_MULTI_V7= "y"; + PCI_MVEBU = "y"; + AHCI_MVEBU = "y"; + MACH_ARMADA_38X = "y"; + SMP = "y"; + # this is disabled for the moment because it relies on a GCC + # plugin that requires gmp.h to build, and I can't see right now + # how to confgure it to find gmp + STACKPROTECTOR_PER_TASK = "n"; + NR_CPUS = "4"; + VFP = "y"; + NEON= "y"; + + # WARNING: unmet direct dependencies detected for ARCH_WANT_LIBATA_LEDS + ATA = "y"; + + # switch is DSA + # CONFIG_NET_DSA_MV88E6060=y + # CONFIG_NET_DSA_MV88E6XXX=y + # CONFIG_NET_DSA_MV88E6XXX_GLOBAL2=y + + # CONFIG_REGMAP=y + # CONFIG_REGMAP_I2C=y + # CONFIG_REGMAP_SPI=y + # CONFIG_REGMAP_MMIO=y + + PSTORE = "y"; + PSTORE_RAM = "y"; + PSTORE_CONSOLE = "y"; + PSTORE_DEFLATE_COMPRESS = "n"; + + SERIAL_8250 = "y"; + SERIAL_8250_CONSOLE = "y"; + SERIAL_OF_PLATFORM="y"; + SERIAL_MVEBU_UART = "y"; + SERIAL_MVEBU_CONSOLE = "y"; + + SERIAL_8250_DMA= "y"; + SERIAL_8250_DW= "y"; + SERIAL_8250_EXTENDED= "y"; + SERIAL_8250_MANY_PORTS= "y"; + SERIAL_8250_SHARE_IRQ= "y"; + OF_ADDRESS= "y"; + OF_MDIO= "y"; + + MVEBU_DEVBUS = "y"; # "Device Bus controller ... flash devices such as NOR, NAND, SRAM, and FPGA" + MVMDIO = "y"; + MVNETA = "y"; + MVNETA_BM = "y"; + MVNETA_BM_ENABLE = "y"; + MVPP2 = "y"; + MV_XOR = "y"; + }; + }; + boot = { + commandLine = [ "console=ttyS0,115200" ]; + imageFormat = "fit"; + }; + + hardware = { + defaultOutput = "flashimage"; + loadAddress = lim.parseInt "0x00008000"; + entryPoint = lim.parseInt "0x00008000"; + rootDevice = "/dev/mtdblock0"; + dts = { + src = "${config.system.outputs.kernel.modulesupport}/arch/arm/boot/dts/armada-385-turris-omnia.dts"; + includes = [ + "${config.system.outputs.kernel.modulesupport}/arch/arm/boot/dts/" + ]; + }; + flash.eraseBlockSize = 65536; # only used for tftpboot + networkInterfaces = + let + inherit (config.system.service.network) link; + inherit (config.system.service) bridge; + in rec { + lan = link.build { ifname = "eth0"; }; + }; + }; + + }; +} diff --git a/examples/turris.nix b/examples/turris.nix new file mode 100644 index 0000000..1d4070b --- /dev/null +++ b/examples/turris.nix @@ -0,0 +1,48 @@ +{ config, pkgs, lib, lim, ... } : +let + inherit (pkgs) serviceFns; + svc = config.system.service; + +in rec { + imports = [ + ../modules/network + ../modules/ssh + ../modules/vlan + + ../modules/ext4fs.nix + ../modules/tftpboot.nix + ]; + + rootfsType = "ext4"; + + boot.tftp = { + # IP addresses to use in the boot monitor when flashing/ booting + # over TFTP. If you are flashing using the stock firmware's Web UI + # then these dummy values are fine + ipaddr = "10.0.0.8"; # my address + serverip = "10.0.0.1"; # build machine or other tftp server + loadAddress = lim.parseInt "0x40000800"; + }; + + hostname = "hello"; + + services.dhcpc = svc.network.dhcp.client.build { + interface = config.hardware.networkInterfaces.lan; + + # don't start DHCP until the hostname is configured, + # so it can identify itself to the DHCP server + dependencies = [ config.services.hostname ]; + }; + + services.sshd = svc.ssh.build { }; + + users.root = { + # the password is "secret". Use mkpasswd -m sha512crypt to + # create this hashed password string + passwd = "$6$y7WZ5hM6l5nriLmo$5AJlmzQZ6WA.7uBC7S8L4o19ESR28Dg25v64/vDvvCN01Ms9QoHeGByj8lGlJ4/b.dbwR9Hq2KXurSnLigt1W1"; + }; + + defaultProfile.packages = with pkgs; [ + figlet + ]; +} diff --git a/modules/tftpboot.nix b/modules/tftpboot.nix index 70bcae0..2e7a685 100644 --- a/modules/tftpboot.nix +++ b/modules/tftpboot.nix @@ -90,7 +90,7 @@ in { setenv ipaddr ${cfg.ipaddr} setenv bootargs 'liminix ${cmdline} $cmd' tftpboot 0x${lib.toHexString cfg.loadAddress} result/uimage ; tftpboot 0x$(printf %x $rootfsStart) result/rootfs ; tftpboot 0x$dtbStart result/dtb - bootm 0x$${lib.toHexString cfg.loadAddress} - 0x$dtbStart + bootm 0x${lib.toHexString cfg.loadAddress} - 0x$dtbStart EOF ''; };