diff options
Diffstat (limited to 'gnu/packages/raspberry-pi.scm')
-rw-r--r-- | gnu/packages/raspberry-pi.scm | 224 |
1 files changed, 222 insertions, 2 deletions
diff --git a/gnu/packages/raspberry-pi.scm b/gnu/packages/raspberry-pi.scm index bb38b8b218..c0a2cb5bf2 100644 --- a/gnu/packages/raspberry-pi.scm +++ b/gnu/packages/raspberry-pi.scm @@ -1,5 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2020 Danny Milosavljevic <dannym@scratchpost.org> +;;; Copyright © 2021 Stefan <stefan-guix@vodafonemail.de> +;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com> ;;; ;;; This file is part of GNU Guix. ;;; @@ -17,18 +19,29 @@ ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. (define-module (gnu packages raspberry-pi) + #:use-module (gnu bootloader) + #:use-module (gnu bootloader grub) #:use-module (gnu packages) #:use-module (gnu packages admin) #:use-module (gnu packages algebra) + #:use-module (gnu packages backup) #:use-module (gnu packages base) #:use-module (gnu packages bash) + #:use-module (gnu packages bootloaders) #:use-module (gnu packages commencement) #:use-module (gnu packages cross-base) + #:use-module (gnu packages curl) #:use-module (gnu packages documentation) + #:use-module (gnu packages embedded) #:use-module (gnu packages file) #:use-module (gnu packages gcc) - #:use-module (gnu packages embedded) + #:use-module (gnu packages guile) + #:use-module (gnu packages linux) + #:use-module (gnu packages qt) + #:use-module (gnu packages tls) + #:use-module (guix build-system copy) #:use-module (guix build-system gnu) + #:use-module (guix build-system qt) #:use-module (guix download) #:use-module (guix git-download) #:use-module ((guix licenses) #:prefix license:) @@ -40,7 +53,10 @@ #:use-module (srfi srfi-1) #:use-module (srfi srfi-2) #:use-module (srfi srfi-26) - #:use-module (ice-9 match)) + #:use-module (ice-9 match) + #:export (make-raspi-bcm28-dtbs + raspi-config-file + raspi-custom-txt)) (define-public bcm2835 (package @@ -235,3 +251,207 @@ Raspberry Pi. Note: It does not work on Raspberry Pi 1.") (install-file "arm64.bin" libexec) #t)))))))) (supported-systems '("aarch64-linux")))) + +(define (raspi-config-file name content) + "Make a configuration file like config.txt for the Raspberry Pi firmware. +CONTENT can be a list of strings, which are concatenated with a newline +character. Alternatively CONTENT can be a string with the full file content." + (plain-file + name + (if (list? content) + (string-join content "\n" 'suffix) + content))) + +(define-public %raspi-config-txt + ;; A config.txt file to start the ARM cores up in 64-bit mode if necessary + ;; and to include a dtb.txt, bootloader.txt, and a custom.txt, each with + ;; separated configurations for the Raspberry Pi firmware. + (raspi-config-file + "config.txt" + `("# See https://www.raspberrypi.org/documentation/configuration/config-txt/README.md for details." + "" + ,(string-append "arm_64bit=" (if (target-aarch64?) "1" "0")) + "include dtb.txt" + "include bootloader.txt" + "include custom.txt"))) + +(define-public %raspi-bcm27-dtb-txt + ;; A dtb.txt file to be included by the config.txt to ensure that the + ;; downstream device tree files bcm27*.dtb will be used. + (raspi-config-file + "dtb.txt" + "upstream_kernel=0")) + +(define-public %raspi-bcm28-dtb-txt + ;; A dtb.txt file to be included by the config.txt to ensure that the + ;; upstream device tree files bcm28*.dtb will be used. + ;; This also implies the use of the dtoverlay=upstream. + (raspi-config-file + "dtb.txt" + "upstream_kernel=1")) + +(define-public %raspi-u-boot-bootloader-txt + ;; A bootloader.txt file to be included by the config.txt to load the + ;; U-Boot bootloader. + (raspi-config-file + "bootloader.txt" + '("dtoverlay=upstream" + "enable_uart=1" + "kernel=u-boot.bin"))) + +(define (raspi-custom-txt content) + "Make a custom.txt file for the Raspberry Pi firmware. +CONTENT can be a list of strings, which are concatenated with a newline +character. Alternatively CONTENT can be a string with the full file content." + (raspi-config-file "custom.txt" content)) + +(define (make-raspi-bcm28-dtbs linux) + "Make a package with the device-tree files for Raspberry Pi models from the +kernel LINUX." + (package + (inherit linux) + (name "raspi-bcm28-dtbs") + (source #f) + (build-system copy-build-system) + (arguments + #~(list + #:phases #~(modify-phases %standard-phases (delete 'unpack)) + #:install-plan + (list (list (search-input-directory %build-inputs + "lib/dtbs/broadcom/") + "." #:include-regexp '("/bcm....-rpi.*\\.dtb"))))) + (inputs (list linux)) + (synopsis "Device-tree files for a Raspberry Pi") + (description + (format #f "The device-tree files for Raspberry Pi models from ~a." + (package-name linux))))) + +(define-public grub-efi-bootloader-chain-raspi-64 + ;; A bootloader capable to boot a Raspberry Pi over network via TFTP or from + ;; a local storage like a micro SD card. It neither installs firmware nor + ;; device-tree files for the Raspberry Pi. It just assumes them to be + ;; existing in boot/efi in the same way that some UEFI firmware with ACPI + ;; data is usually assumed to be existing on PCs. It creates firmware + ;; configuration files and a bootloader-chain with U-Boot to provide an EFI + ;; API for the final GRUB bootloader. It also serves as a blue-print to + ;; create an a custom bootloader-chain with firmware and device-tree + ;; packages or files. + (efi-bootloader-chain grub-efi-netboot-removable-bootloader + #:packages (list u-boot-rpi-arm64-efi-bin) + #:files (list %raspi-config-txt + %raspi-bcm27-dtb-txt + %raspi-u-boot-bootloader-txt))) + +(define (make-raspi-defconfig arch defconfig sha256-as-base32) + "Make for the architecture ARCH a file-like object from the DEFCONFIG file +with the hash SHA256-AS-BASE32. This object can be used as the #:defconfig +argument of the function (modify-linux)." + (make-defconfig + (string-append + ;; This is from commit 7838840 on branch rpi-5.18.y, + ;; see https://github.com/raspberrypi/linux/tree/rpi-5.18.y/ + ;; and https://github.com/raspberrypi/linux/commit/7838840b5606a2051b31da4c598466df7b1c3005 + "https://raw.githubusercontent.com/raspberrypi/linux/7838840b5606a2051b31da4c598466df7b1c3005/arch/" + arch "/configs/" defconfig) + sha256-as-base32)) + +(define-public %bcm2709-defconfig + (make-raspi-defconfig + "arm" "bcm2709_defconfig" + "1hcxmsr131f92ay3bfglrggds8ajy904yj3vw7c42i4c66256a79")) + +(define-public %bcm2711-defconfig + (make-raspi-defconfig + "arm" "bcm2711_defconfig" + "1n7g5yq0hdp8lh0x6bfxph2ff8yn8zisdj3qg0gbn83j4v8i1zbd")) + +(define-public %bcm2711-defconfig-64 + (make-raspi-defconfig + "arm64" "bcm2711_defconfig" + "0k9q7qvw826v2hrp49xnxnw93pnnkicwx869chvlf7i57461n4i7")) + +(define-public %bcmrpi3-defconfig + (make-raspi-defconfig + "arm64" "bcmrpi3_defconfig" + "1bfnl4p0ddx3200dg91kmh2pln36w95y05x1asc312kixv0jgd81")) + +(define-public rpi-imager + (package + (name "rpi-imager") + (version "1.7.3") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/raspberrypi/rpi-imager") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (modules '((guix build utils) + (ice-9 ftw) + (srfi srfi-26))) + (snippet '(begin + ;; Remove all but the following bundled libraries, + ;; which are not yet packaged in Guix. + (define keep '("." ".." + "drivelist" + "mountutils" + "sha256crypt")) + (with-directory-excursion "src/dependencies" + (for-each delete-file-recursively + (scandir "." (negate + (cut member <> keep))))))) + (sha256 + (base32 + "0i7r1myhinhlgispq92nzvrjvbc48l87z8xfwc038l44qj1lsq8g")))) + (build-system qt-build-system) + (arguments + (list + #:tests? #f ;no test suite + #:configure-flags #~(list "-DENABLE_TELEMETRY=OFF") + #:phases + #~(modify-phases %standard-phases + (add-after 'unpack 'chdir + (lambda _ + (chdir "src"))) + (add-after 'chdir 'customize-os-list.json + ;; The default operating system JSON list contains non-FSDG + ;; systems. + (lambda _ + (let* ((datadir (string-append #$output + "/share/rpi-imager")) + (os-list.json (string-append datadir "/os-list.json"))) + (mkdir-p datadir) + #$(with-extensions (list guile-json-4) + #~(begin + (use-modules (json)) + (call-with-output-file os-list.json + ;; TODO: Register FSDG and RPi compatible OS + ;; images here. + (lambda (port) + (scm->json '() port))))) + (substitute* "config.h" + (("#define OSLIST_URL.*") + (string-append "#define OSLIST_URL \"file:///" + os-list.json "\"\n")))))) + (add-after 'chdir 'patch-cmake + (lambda _ + (substitute* "CMakeLists.txt" + ;; lsblk expects to have access to /sys/dev/block, + ;; which doesn't exist in the build container; + ;; prevent the check to fail the build. + (("ret EQUAL \"1\"") + "FALSE"))))))) + (inputs + (list gnutls + curl + libarchive + qtdeclarative-5 + qtquickcontrols2-5 + qtsvg-5 + qttools-5 + util-linux)) + (home-page "https://github.com/raspberrypi/rpi-imager/") + (synopsis "Raspberry Pi Imaging Utility") + (description "rpi-imager is graphical utility to easily provision and +flash a memory card with an operating system image suitable for the Raspberry +Pi single board computer.") + (license license:asl2.0))) |