From 4f32e8d7cc35fa76933a5fc69e584dbc7033e9fc Mon Sep 17 00:00:00 2001 From: Vagrant Cascadian Date: Tue, 11 May 2021 20:57:50 +0000 Subject: [PATCH] gnu: Add crust-pinebook and crust-pine64-plus. * gnu/packages/bootstrap.scm (glibc-dynamic-linker): Add or1k-elf. gnu/packages/firmware.scm (make-crust-package, crust-pinebook) (crust-pine64-plus): New variables. Signed-off-by: Maxim Cournoyer Reviewed-by: Maxime Devos Co-authored-by: Maxim Cournoyer --- gnu/packages/bootstrap.scm | 1 + gnu/packages/firmware.scm | 92 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) 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 @@ (define* (glibc-dynamic-linker ((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 @@ (define-public arm-trusted-firmware-imx8mq ((#: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"))