summary refs log tree commit diff
path: root/gnu/packages/raspberry-pi.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/packages/raspberry-pi.scm')
-rw-r--r--gnu/packages/raspberry-pi.scm344
1 files changed, 342 insertions, 2 deletions
diff --git a/gnu/packages/raspberry-pi.scm b/gnu/packages/raspberry-pi.scm
index bb38b8b218..4c7da7376b 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, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -17,18 +19,31 @@
 ;;; 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 pkg-config)
+  #:use-module (gnu packages qt)
+  #:use-module (gnu packages tls)
+  #:use-module (guix build-system cmake)
+  #: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 +55,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 +253,325 @@ 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 raspberrypi-userland
+  ;; There are no release nor tag; use the latest commit.
+  (let ((revision "0")
+        (commit "54fd97ae4066a10b6b02089bc769ceed328737e0"))
+    (package
+      (name "raspberrypi-userland")
+      (version (git-version "0.0.0" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/raspberrypi/userland")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "01853x2kx36vcm1wd0p20v72kw2p4xhnzp36jivh06mhma9b3h2v"))))
+      (build-system cmake-build-system)
+      (arguments
+       (list
+        #:tests? #f                     ;no test suite
+        #:configure-flags #~(list (string-append "-DVMCS_INSTALL_PREFIX="
+                                                 #$output))
+        #:phases
+        #~(modify-phases %standard-phases
+            (add-after 'unpack 'patch-paths
+              (lambda _
+                (substitute* "interface/khronos/ext/egl_khr_image_client.c"
+                  (("/opt/vc/lib/libvcsm.so")
+                   (string-append #$output "/lib/libvcsm.so")))))
+            (add-after 'unpack 'disable-hello_pi
+              (lambda _
+                ;; Do not build hello_pi, which installs 32 MiB of binaries
+                ;; and source files to src/.
+                (substitute* "host_applications/linux/CMakeLists.txt"
+                  ((".*add_subdirectory\\(apps/hello_pi).*")
+                   ""))
+                (substitute* "makefiles/cmake/vmcs.cmake"
+                  (("install.*host_applications/linux/apps/hello_pi" all)
+                   (string-append "# " all))
+                  ((".*DESTINATION \\$\\{VMCS_INSTALL_PREFIX}/src)" all)
+                   (string-append "# " all))))))))
+      (native-inputs (list pkg-config))
+      (home-page "https://github.com/raspberrypi/userland/")
+      (supported-systems (list "armhf-linux" "aarch64-linux"))
+      (synopsis "Raspberry Pi GPU-related libraries")
+      (description "This package package contains libraries to interface to
+EGL, mmal, GLESv2, vcos, openmaxil, vchiq_arm, bcm_host, VFC and OpenVG.  It
+also provides the @command{dtmerge}, @command{dtoverlay}, @command{dtparam},
+@command{raspivid} and @command{tvservice} commands, among others.")
+      (license license:bsd-3))))
+
+(define-public rpi-fbcp
+  ;; There are no release nor tag; use the latest commit.
+  (let ((revision "0")
+        (commit "af8d32246c23cb23e4030e6588668a14341f5ddc"))
+    (package
+      (name "rpi-fbcp")
+      (version (git-version "0.0.0" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/tasanakorn/rpi-fbcp")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "10wym2jckicxm5iwqgby6gbhkznyi1q8x41v0qahzv71x85xpsl5"))))
+      (build-system cmake-build-system)
+      (arguments
+       (list
+        #:tests? #f                     ;no test suite
+        #:phases
+        #~(modify-phases %standard-phases
+            (replace 'install
+              ;; There is no installation target.
+              (lambda _
+                (install-file "fbcp" (string-append #$output "/bin")))))))
+      (inputs (list raspberrypi-userland))
+      (home-page "https://github.com/tasanakorn/rpi-fbcp")
+      (synopsis "Mirror primary to secondary frame buffer on Raspberry Pi")
+      (description "The @command{fbcp} command provided by this package can be
+used to copy the primary frame buffer to the secondary frame buffer of a
+Raspberry Pi.  It can for example mirror the primary HDMI output to a
+secondary LCD display connected to the Raspberry Pi board.")
+      (license license:expat))))
+
+(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)))
+
+(define-public waveshare-dtoverlays
+  (let ((commit "6ea99d4afb4776fdb008708f3f30df1de6fc24e3")
+        (revision "0"))
+    (package
+      (name "waveshare-dtoverlays")
+      (version (git-version "0.0.0" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/swkim01/waveshare-dtoverlays")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (modules '((guix build utils)))
+                ;; Delete pre-compiled device tree overlay binary files.
+                (snippet '(for-each delete-file (find-files "." "\\.dtbo$")))
+                (sha256
+                 (base32
+                  "1c30wnlinicwlivlri25wns6x8nx7asf5fh2zqxkzr9h1jsxbzwz"))))
+      (build-system gnu-build-system)
+      (arguments (list #:tests? #f      ;no test suite
+                       #:make-flags #~(list (string-append "PREFIX="
+                                                           #$output))
+                       #:phases #~(modify-phases %standard-phases
+                                    (delete 'configure))))
+      (native-inputs (list dtc))
+      (home-page "https://github.com/swkim01/waveshare-dtoverlays/")
+      (synopsis "Device tree overlays for WaveShare SpotPear TFT LCDs")
+      (description "This package contains device tree overlay binaries to
+support the WaveShare SpotPear @acronym{TFT, Thin-Film Transistor}
+@acronym{LCDs, Liquid Crystal Display} on the Raspberry Pi.")
+      (license license:gpl3+))))