aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnu/packages/bootstrap.scm1
-rw-r--r--gnu/packages/firmware.scm92
2 files changed, 93 insertions, 0 deletions
diff --git a/gnu/packages/bootstrap.scm b/gnu/packages/bootstrap.scm
index 5f6a3acc83..602d8f26c5 100644
--- a/gnu/packages/bootstrap.scm
+++ b/gnu/packages/bootstrap.scm
@@ -328,6 +328,7 @@ or false to signal an error."
((string=? system "arm-eabi") "no-ld.so")
((string=? system "avr") "no-ld.so")
((string=? system "i686-mingw") "no-ld.so")
+ ((string=? system "or1k-elf") "no-ld.so")
((string=? system "x86_64-mingw") "no-ld.so")
((string-suffix? "-elf" system) "no-ld.so")
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index c3e877cfbf..c3ffcb1d0a 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -1109,3 +1109,95 @@ such as:
((#:make-flags flags ''())
;; Adding debug symbols causes the size to exceed limits.
#~(delete "DEBUG=1" #$flags)))))))
+
+(define (make-crust-package platform)
+ (package
+ (name (string-append "crust-"
+ (string-replace-substring platform "_" "-")))
+ (version "0.5")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ ;; There are only GitHub generated release snapshots.
+ (url "https://github.com/crust-firmware/crust")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name "crust" version))
+ (sha256
+ (base32
+ "0xgbbhifg3miwd3yp6jq9kp7nqgz5gzy00w95vba45j8jk5vjvvz"))))
+ (build-system gnu-build-system)
+ (arguments
+ (list
+ #:tests? #f ;no test suite
+ #:make-flags
+ (let ((triplet-without-vendor
+ (and (%current-target-system)
+ (match (string-split (nix-system->gnu-triplet
+ (%current-target-system)) #\-)
+ ((arch vendor os ..1)
+ (string-join `(,arch ,@os) "-"))))))
+ #~(list "CROSS_COMPILE=or1k-elf-"
+ "V=1"
+ #$@(if triplet-without-vendor
+ ;; We are cross-compiling the tools, intended to be
+ ;; executable for the target system.
+ (list (string-append "HOSTAR=" triplet-without-vendor
+ "-ar")
+ (string-append "HOSTCC=" triplet-without-vendor
+ "-gcc"))
+ ;; Not cross-compiling.
+ (list "HOSTAR=ar"
+ "HOSTCC=gcc"))
+ "LEX=flex"))
+ #:phases
+ #~(modify-phases %standard-phases
+ (add-after 'unpack 'do-not-build-tests
+ (lambda _
+ ;; Attempting to build the tools test binary on a non-aarch64
+ ;; architecture fails with: "No cache cleaning implementation
+ ;; available for this architecture". Avoid building it (see:
+ ;; https://github.com/crust-firmware/crust/issues/182).
+ (substitute* "tools/Makefile"
+ (("tools-y \\+= test") ""))))
+ (delete 'configure)
+ (add-before 'build 'defconfig
+ (lambda* (#:key make-flags #:allow-other-keys)
+ (let ((config-name (string-append #$platform "_defconfig")))
+ (pk 'MAKE-FLAGS: make-flags)
+ ; (error 's)
+ (apply invoke "make" (cons config-name make-flags)))))
+ (replace 'install
+ (lambda _
+ (for-each (lambda (file)
+ (install-file file (string-append #$output
+ "/libexec")))
+ (find-files "." "(scp\\.bin|\\.config)$"))
+ (install-file "build/tools/load"
+ (string-append #$output "/bin")))))))
+ ;; The firmware is cross-compiled using a "bare bones" compiler (no libc).
+ ;; Use our own tool chain for that.
+ (native-inputs
+ (list bison
+ (cross-gcc "or1k-elf")
+ (cross-binutils "or1k-elf")
+ flex))
+ (home-page "https://github.com/crust-firmware/crust")
+ (synopsis "System control processor firmware for Allwinner sunxi boards")
+ (description "Crust improves battery life and thermal performance by
+implementing a deep sleep state. During deep sleep, the CPU cores, the DRAM
+controller, and most onboard peripherals are powered down, reducing power
+consumption by 80% or more compared to an idle device. On boards without a
+PMIC, Crust is also responsible for orderly power-off and power-on of the
+device. For this to work, Crust runs outside the main CPU and DRAM, on a
+dedicated always-on microprocessor called a System Control Processor (SCP).
+Crust is designed to run on a specific SCP implementation, Allwinner's
+AR100.")
+ ;; Most files are dual-licensed "BSD-3 OR GPL2", a few are GPL2 only.
+ (license (list license:bsd-3 license:gpl2))))
+
+(define-public crust-pinebook
+ (make-crust-package "pinebook"))
+
+(define-public crust-pine64-plus
+ (make-crust-package "pine64_plus"))