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.scm237
1 files changed, 237 insertions, 0 deletions
diff --git a/gnu/packages/raspberry-pi.scm b/gnu/packages/raspberry-pi.scm
new file mode 100644
index 0000000000..cdea392fc7
--- /dev/null
+++ b/gnu/packages/raspberry-pi.scm
@@ -0,0 +1,237 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2020 Danny Milosavljevic <dannym@scratchpost.org>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu packages raspberry-pi)
+  #:use-module (gnu packages)
+  #:use-module (gnu packages admin)
+  #:use-module (gnu packages algebra)
+  #:use-module (gnu packages base)
+  #:use-module (gnu packages bash)
+  #:use-module (gnu packages commencement)
+  #:use-module (gnu packages cross-base)
+  #:use-module (gnu packages documentation)
+  #:use-module (gnu packages file)
+  #:use-module (gnu packages gcc)
+  #:use-module (gnu packages embedded)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix download)
+  #:use-module (guix git-download)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix packages)
+  #:use-module (guix gexp)
+  #:use-module (guix store)
+  #:use-module (guix monads)
+  #:use-module (guix utils)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-2)
+  #:use-module (srfi srfi-26)
+  #:use-module (ice-9 match))
+
+(define-public bcm2835
+  (package
+    (name "bcm2835")
+    (version "1.64")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "http://www.airspayce.com/mikem/bcm2835/bcm2835-"
+                    version ".tar.gz"))
+              (sha256
+               (base32
+                "06s81540iz4vsh0cm6jwah2x0hih79v42pfa4pgr8kcbv56158h6"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f))    ; Would need to be root
+    ;; doc/html docs would not be installed anyway.
+    ;(native-inputs
+    ; `(("doxygen", doxygen)))
+    (synopsis "C library for Broadcom BCM 2835 as used in Raspberry Pi")
+    (description "This package provides a C library for Broadcom BCM 2835 as
+used in the Raspberry Pi")
+    (home-page "http://www.airspayce.com/mikem/bcm2835/")
+    (supported-systems '("armhf-linux" "aarch64-linux"))
+    (license license:gpl3)))
+
+(define raspi-gpio
+  (let ((commit "6d0769ac04760b6e9f33b4aa1f11c682237bf368")
+        (revision "1"))
+    (package
+      (name "raspi-gpio")
+      (version (git-version "0.1" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/RPi-Distro/raspi-gpio")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "1fia1ma586hwhpda0jz86j6i55andq0wncbhzhzvhf7yc773cpi4"))))
+      (build-system gnu-build-system)
+      (synopsis "State dumper for BCM270x GPIOs")
+      (description "Tool to help debug / hack at the BCM283x GPIO. You can dump
+  the state of a GPIO or (all GPIOs). You can change a GPIO mode and pulls (and
+  level if set as an output).  Beware this tool writes directly to the BCM283x
+  GPIO reisters, ignoring anything else that may be using them (like Linux
+  drivers).")
+      (home-page "https://github.com/RPi-Distro/raspi-gpio")
+      (supported-systems '("armhf-linux" "aarch64-linux"))
+      (license license:bsd-3))))
+
+(define %rpi-open-firmware-version "0.1")
+(define %rpi-open-firmware-origin
+  (origin
+   (method git-fetch)
+   (uri (git-reference
+         (url "https://github.com/librerpi/rpi-open-firmware")
+         (commit "6be45466e0be437a1b0b3512a86f3d9627217006")))
+   (file-name "rpi-open-firmware-checkout")
+   (sha256
+    (base32 "1wyxvv62i3rjicg4hd94pzbgpadinnrgs27sk39md706mm0qixbh"))))
+
+(define-public raspi-arm-chainloader
+  (package
+    (name "raspi-arm-chainloader")
+    (version %rpi-open-firmware-version)
+    (source %rpi-open-firmware-origin)
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f                   ; No tests exist
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure)
+         (add-before 'build 'setenv
+           (lambda _
+             (setenv "CC" "arm-none-eabi-gcc")
+             (setenv "CXX" "arm-none-eabi-g++")
+             (setenv "AS" "arm-none-eabi-as")
+             (setenv "OBJCOPY" "arm-none-eabi-objcopy")
+             (setenv "BAREMETAL" "1")
+             #t))
+         (add-after 'setenv 'build-tlsf
+           (lambda _
+             (with-directory-excursion "tlsf"
+               ;; Note: Adding "-I../common -I../notc/include".
+               (invoke "make"
+                       "CFLAGS=-mtune=arm1176jzf-s -march=armv6zk -mfpu=vfp -mfloat-abi=softfp -I../common -I../notc/include"))))
+         (add-after 'build-tlsf 'build-common
+           (lambda _
+             (with-directory-excursion "common"
+               (invoke "make"
+                       ;; Note: Adding "-I.. -I../notc/include".
+                       "ARMCFLAGS=-mtune=arm1176jzf-s -march=armv6zk -marm -I.. -I../notc/include"))))
+         (add-after 'build-common 'build-notc
+           (lambda _
+             (with-directory-excursion "notc"
+               (invoke "make"))))
+         (add-after 'build-notc 'chdir
+           (lambda _
+             (chdir "arm_chainloader")
+             (substitute* "Makefile"
+              (("-I[.][.]/")
+               "-I../common -I../common/include -I../notc/include -I../")
+              (("-ltlsf")
+               "-L../common -L../notc -L../tlsf -ltlsf"))
+             #t))
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (libexec (string-append out "/libexec")))
+               (mkdir-p libexec)
+               (install-file "build/arm_chainloader.elf" libexec)
+               (install-file "build/arm_chainloader.map" libexec)
+               (install-file "build/arm_chainloader.bin" libexec)
+               #t))))))
+    (native-inputs
+     `(("binutils" ,(cross-binutils "arm-none-eabi"))
+       ("gcc" ,gcc-arm-none-eabi-6)))
+    (inputs
+     `())
+    (synopsis "Raspberry Pi ARM bootloader")
+    (description "This package provides a bootloader for the ARM part of a
+Raspberry Pi.  Note: It does not work on Raspberry Pi 1.")
+    (home-page "https://github.com/librerpi/rpi-open-firmware/")
+    (license license:gpl2+)))
+
+(define-public raspi-arm64-chainloader
+  (package
+    (inherit raspi-arm-chainloader)
+    (name "raspi-arm64-chainloader")
+    ;; These native-inputs especially don't contain a libc.
+    (native-inputs
+     `(("bash" ,bash)
+       ("binutils" ,binutils)
+       ("coreutils" ,coreutils)
+       ("file" ,file)
+       ("ld-wrapper" ,ld-wrapper)
+       ("make" ,gnu-make)
+       ("gcc" ,gcc-6)
+       ("locales" ,glibc-utf8-locales)))
+    (inputs
+     `())
+    (arguments
+     `(#:implicit-inputs? #f
+       ,@(substitute-keyword-arguments (package-arguments raspi-arm-chainloader)
+         ((#:phases phases)
+          `(modify-phases ,phases
+             (replace 'setenv
+               (lambda _
+                 (setenv "AS" "as") ; TODO: as-for-target
+                 (setenv "OBJCOPY" "objcopy")
+                 (setenv "CC" ,(cc-for-target))
+                 (setenv "CXX" ,(cc-for-target))
+                 (setenv "BAREMETAL" "1")
+                 #t))
+             (add-after 'setenv 'build-tlsf
+               (lambda _
+                 (with-directory-excursion "tlsf"
+                   (invoke "make"
+                           "CFLAGS=-I../common -I../notc/include"))))
+             (replace 'build-common
+               (lambda _
+                 (with-directory-excursion "common"
+                   ;; Autodetection uses the CC filename for detecting the architecture.
+                   ;; Since we are not using a cross-compiler, we side-step that.
+                   (invoke "make"
+                           "CFLAGS=-Ilib -I. -Iinclude -ffunction-sections -Wall -g -nostdlib -nostartfiles -ffreestanding -DBAREMETAL"))))
+             (replace 'build-notc
+               (lambda _
+                 (with-directory-excursion "notc"
+                   ;; Autodetection uses the CC filename for detecting the architecture.
+                   ;; Since we are not using a cross-compiler, we side-step that.
+                   (invoke "make"
+                           "CFLAGS=-Iinclude -g"))))
+             (replace 'chdir
+               (lambda _
+                 (chdir "arm64")
+                 (substitute* "Makefile"
+                  (("CFLAGS =")
+                   "CFLAGS = -I../common -I../common/include -I../notc/include -I.. -DBAREMETAL")
+                  (("-lcommon")
+                   "-L../common -L../notc -lcommon"))
+                 #t))
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (libexec (string-append out "/libexec")))
+               (mkdir-p libexec)
+               (install-file "arm64.elf" libexec)
+               (install-file "arm64.map" libexec)
+               (install-file "arm64.bin" libexec)
+               #t))))))))
+    (supported-systems '("aarch64-linux"))))