summaryrefslogtreecommitdiff
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..7700c26d06
--- /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.git")
+ (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.git")
+ (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"))))