summary refs log tree commit diff
path: root/gnu/packages/firmware.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/packages/firmware.scm')
-rw-r--r--gnu/packages/firmware.scm191
1 files changed, 114 insertions, 77 deletions
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index 75294fadf4..828bc7402a 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -1197,81 +1197,51 @@ such as:
           ;; 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)
-                  ;; TODO: Is there a use case for allowing this?
-                  (not (target-avr?))
-                  (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")))
-                (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
+(define make-crust-firmware
+  (mlambda (platform)
+    (package
+      (name (string-append "crust-"
+                           (string-replace-substring platform "_" "-")
+                           "-firmware"))
+      (version "0.6")
+      (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
+           "1blq6bi2rmg4qqwwr07pamv28b50mwcsybhpn9bws8vbzxa43afd"))))
+      (build-system gnu-build-system)
+      (arguments
+       (list
+        #:target "or1k-elf"
+        #:tests? #f                       ;no test suite
+        #:make-flags #~'("CROSS_COMPILE=or1k-elf-"
+                         "V=1"
+                         "HOSTAR=ar"
+                         "HOSTCC=gcc"
+                         "LEX=flex")
+        #:phases
+        #~(modify-phases %standard-phases
+            (delete 'configure)
+            (add-before 'build 'defconfig
+              (lambda* (#:key make-flags #:allow-other-keys)
+                (let ((config-name (string-append #$platform "_defconfig")))
+                  (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)$")))))))
+      (native-inputs (list bison flex))
+      (home-page "https://github.com/crust-firmware/crust")
+      (synopsis "Firmware for Allwinner sunxi SoCs")
+      (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
@@ -1280,8 +1250,75 @@ 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))))
+      ;; Most files are dual-licensed "BSD-3 OR GPL2", a few are GPL2 only.
+      (license (list license:bsd-3 license:gpl2)))))
+
+(define make-crust-tools
+  (mlambda (platform firmware)
+    (package
+      (inherit firmware)
+      (name (string-append "crust-"
+                           (string-replace-substring platform "_" "-")
+                           "-tools"))
+      (arguments
+       (list #:make-flags
+             #~(list "V=1"
+                     "LEX=flex"
+                     (string-append "HOSTAR=" #$(ar-for-target))
+                     (string-append "HOSTCC=" #$(cc-for-target)))
+             #: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") ""))))
+                 (replace 'configure
+                   (lambda* (#:key inputs native-inputs #:allow-other-keys)
+                     (copy-file (search-input-file inputs "/libexec/.config")
+                                ".config")))
+                 (replace 'build
+                   (lambda* (#:key make-flags parallel-build?
+                             #:allow-other-keys)
+                     (apply invoke "make" "tools"
+                            `(,@(if parallel-build?
+                                    `("-j"
+                                      ,(number->string (parallel-job-count)))
+                                     '())
+                              ,@make-flags))))
+                 (replace 'install
+                   (lambda _
+                     (install-file "build/tools/load"
+                                   (string-append #$output "/bin")))))))
+      (synopsis "Firmware for Allwinner sunxi SoCs (tools)")
+      (inputs (list firmware)))))
+
+(define make-crust-package
+  (mlambda (platform)
+    (let* ((firmware (make-crust-firmware platform))
+           (tools (make-crust-tools platform firmware)))
+      (package
+        (inherit firmware)
+        (name (string-append "crust-"
+                             (string-replace-substring platform "_" "-")))
+        (source #f)
+        (build-system trivial-build-system)
+        (arguments
+         (list #:modules '((guix build union))
+               #:builder
+               #~(begin
+                   (use-modules (ice-9 match)
+                                (guix build union))
+
+                   (match %build-inputs
+                     (((names . directory) ...)
+                      (union-build #$output directory))))))
+        (native-inputs '())
+        (inputs (list firmware tools))))))
 
 (define-public crust-pinebook
   (make-crust-package "pinebook"))