Merge branch 'master' into core-updates
[jackhill/guix/guix.git] / gnu / packages / firmware.scm
1 ;;; GNU Guix --- Functional package management for GNU
2 ;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
3 ;;; Copyright © 2016 Eric Bavier <bavier@member.fsf.org>
4 ;;; Copyright © 2017 David Craven <david@craven.ch>
5 ;;; Copyright © 2017, 2018 Efraim Flashner <efraim@flashner.co.il>
6 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
7 ;;; Copyright © 2018 Vagrant Cascadian <vagrant@debian.org>
8 ;;; Copyright © 2019 Mathieu Othacehe <m.othacehe@gmail.com>
9 ;;; Copyright © 2020 Marius Bakke <mbakke@fastmail.com>
10 ;;;
11 ;;; This file is part of GNU Guix.
12 ;;;
13 ;;; GNU Guix is free software; you can redistribute it and/or modify it
14 ;;; under the terms of the GNU General Public License as published by
15 ;;; the Free Software Foundation; either version 3 of the License, or (at
16 ;;; your option) any later version.
17 ;;;
18 ;;; GNU Guix is distributed in the hope that it will be useful, but
19 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
20 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 ;;; GNU General Public License for more details.
22 ;;;
23 ;;; You should have received a copy of the GNU General Public License
24 ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
25
26 (define-module (gnu packages firmware)
27 #:use-module ((guix licenses) #:prefix license:)
28 #:use-module (guix packages)
29 #:use-module (guix download)
30 #:use-module (guix utils)
31 #:use-module (guix git-download)
32 #:use-module (guix build-system gnu)
33 #:use-module (gnu packages)
34 #:use-module (gnu packages admin)
35 #:use-module (gnu packages assembly)
36 #:use-module (gnu packages base)
37 #:use-module (gnu packages bison)
38 #:use-module (gnu packages cmake)
39 #:use-module (gnu packages cross-base)
40 #:use-module (gnu packages flex)
41 #:use-module (gnu packages gcc)
42 #:use-module (gnu packages linux)
43 #:use-module (gnu packages perl)
44 #:use-module (gnu packages python))
45
46 (define-public ath9k-htc-firmware
47 (package
48 (name "ath9k-htc-firmware")
49 (version "1.4.0")
50 (source (origin
51 (method git-fetch)
52 (uri (git-reference
53 (url "https://github.com/qca/open-ath9k-htc-firmware.git")
54 (commit version)))
55 (sha256
56 (base32
57 "16jbj8avg5jkgvq5lxm0hdxxn4c3zn7fx8b4nxllvr024apk9w23"))
58 (file-name (git-file-name name version))
59 (patches (search-patches "ath9k-htc-firmware-objcopy.patch"))))
60 (build-system gnu-build-system)
61 (arguments
62 '(#:phases
63 (modify-phases %standard-phases
64 (add-before 'configure 'pre-configure
65 (lambda* (#:key inputs native-inputs #:allow-other-keys)
66 (chdir "target_firmware")
67
68 ;; 'configure' is a simple script that runs 'cmake' with
69 ;; the right flags.
70 (substitute* "configure"
71 (("^TOOLCHAIN=.*$")
72 (string-append "TOOLCHAIN="
73 (assoc-ref (or native-inputs inputs) "cross-gcc")
74 "\n")))
75 #t))
76 (replace 'install
77 (lambda* (#:key outputs #:allow-other-keys)
78 (let* ((out (assoc-ref outputs "out"))
79 (fw-dir (string-append out "/lib/firmware")))
80 (for-each (lambda (file)
81 (install-file file fw-dir))
82 (find-files "." "\\.fw$"))
83 #t))))
84 #:tests? #f))
85
86 ;; The firmware is cross-compiled using a "bare bones" compiler (no libc.)
87 ;; Use our own tool chain for that.
88 (native-inputs `(("cross-gcc" ,(cross-gcc
89 "xtensa-elf"
90 #:xbinutils (cross-binutils "xtensa-elf"
91 binutils-2.33)))
92 ("cross-binutils" ,(cross-binutils "xtensa-elf" binutils-2.33))
93 ("cmake" ,cmake-minimal)
94 ("perl" ,perl)))
95 (home-page "http://wireless.kernel.org/en/users/Drivers/ath9k_htc")
96 (synopsis "Firmware for the Atheros AR7010 and AR9271 USB 802.11n NICs")
97 (description
98 "This is the firmware for the Qualcomm Atheros AR7010 and AR9271 USB
99 802.11n NICs (aka Wi-Fi USB dongles). It is used by the ath9k driver of
100 Linux-libre.")
101 (license (license:non-copyleft "http://directory.fsf.org/wiki/License:ClearBSD"))))
102
103 (define-public b43-tools
104 (let ((commit "27892ef741e7f1d08cb939744f8b8f5dac7b04ae")
105 (revision "1"))
106 (package
107 (name "b43-tools")
108 (version (git-version "0.0.0" revision commit))
109 (source
110 (origin
111 (method git-fetch)
112 (uri (git-reference
113 (url "http://git.bues.ch/git/b43-tools.git")
114 (commit commit)))
115 (file-name (git-file-name name version))
116 (sha256
117 (base32
118 "1wgmj4d65izbhprwb5bcwimc2ryv19b9066lqzy4sa5m6wncm9cn"))))
119 (build-system gnu-build-system)
120 (native-inputs
121 `(("flex" ,flex)
122 ("bison" ,bison)))
123 (arguments
124 `(#:modules ((srfi srfi-1)
125 (guix build gnu-build-system)
126 (guix build utils))
127 #:tests? #f ; no tests
128 #:phases
129 (let ((subdirs '("assembler" "disassembler")))
130 (modify-phases %standard-phases
131 (delete 'configure) ; no configure script
132 (add-before 'build 'patch-/bin/true
133 (lambda _
134 (substitute* (find-files "." "Makefile")
135 (("/bin/true") ":"))
136 #t))
137 (replace 'build
138 (lambda _
139 (for-each (lambda (dir)
140 (invoke "make" "-C" dir "CC=gcc"))
141 subdirs)
142 #t))
143 (replace 'install
144 (lambda* (#:key outputs #:allow-other-keys)
145 (let ((out (assoc-ref outputs "out")))
146 (mkdir-p (string-append out "/bin"))
147 (for-each (lambda (dir)
148 (invoke "make" "-C" dir
149 (string-append "PREFIX=" out)
150 "install"))
151 subdirs)
152 #t)))))))
153 (home-page
154 "https://bues.ch/cms/hacking/misc.html#linux_b43_driver_firmware_tools")
155 (synopsis "Collection of tools for the b43 wireless driver")
156 (description
157 "The b43 firmware tools is a collection of firmware extractor,
158 assembler, disassembler, and debugging tools for the Linux kernel b43 wireless
159 driver.")
160 (license license:gpl2))))
161
162 (define-public openfwwf-firmware
163 (package
164 (name "openfwwf-firmware")
165 (version "5.2")
166 (source
167 (origin
168 (method url-fetch)
169 (uri (string-append "http://netweb.ing.unibs.it/~openfwwf/firmware/"
170 "openfwwf-" version ".tar.gz"))
171 (sha256
172 (base32
173 "1p60gdi7w88s7qw82d3g9v7mk887mhvidf4l5q5hh09j10h37q4x"))))
174 (build-system gnu-build-system)
175 (native-inputs
176 `(("b43-tools" ,b43-tools)))
177 (arguments
178 `(#:make-flags (list (string-append "PREFIX="
179 (assoc-ref %outputs "out")
180 "/lib/firmware/b43-open"))
181 #:tests? #f ;no tests
182 #:phases (modify-phases %standard-phases
183 (delete 'configure))))
184 (home-page "http://netweb.ing.unibs.it/~openfwwf/")
185 (synopsis "Firmware for BCM43xx devices")
186 (description
187 "This is firmware from Open FirmWare for WiFi networks (OpenFWWF) for the
188 Broadcom/AirForce chipset BCM43xx with Wireless-Core Revision 5. It is used
189 by the b43-open driver of Linux-libre.")
190 (license license:gpl2)))
191
192 (define* (make-opensbi-package platform variant #:optional (arch "riscv64"))
193 (package
194 (name (string-replace-substring
195 (string-append "opensbi-" platform "-" variant)
196 "_" "-"))
197 (version "0.6")
198 (source
199 (origin
200 (method git-fetch)
201 (uri (git-reference
202 (url "https://github.com/riscv/opensbi.git")
203 (commit (string-append "v" version))))
204 (file-name (git-file-name name version))
205 (sha256
206 (base32 "129ypdga0fzn657n2f42g2a1vx3hf8x7sd78h06d35pgkry0jkl7"))))
207 (build-system gnu-build-system)
208 (native-inputs
209 `(,@(if (and (not (string-prefix? "riscv64" (%current-system)))
210 (string-prefix? "riscv64" arch))
211 `(("cross-gcc" ,(cross-gcc "riscv64-linux-gnu" #:xgcc gcc-7))
212 ("cross-binutils" ,(cross-binutils "riscv64-linux-gnu")))
213 '())))
214 (arguments
215 `(#:tests? #f ; no check target
216 #:make-flags (list (string-append "PLATFORM=" ,platform "/" ,variant)
217 ,@(if (and (not (string-prefix? "riscv64"
218 (%current-system)))
219 (string-prefix? "riscv64" arch))
220 `("CROSS_COMPILE=riscv64-linux-gnu-")
221 '())
222 "FW_PAYLOAD=n"
223 "V=1")
224 #:phases
225 (modify-phases %standard-phases
226 (delete 'configure)
227 (replace 'install
228 (lambda* (#:key outputs #:allow-other-keys)
229 (let ((out (assoc-ref outputs "out"))
230 (bin (find-files "." ".*fw_.*.elf$")))
231 (for-each
232 (lambda (file)
233 (install-file file out))
234 bin))
235 #t)))))
236 (home-page "https://github.com/riscv/opensbi")
237 (synopsis "RISC-V Open Source Supervisor Binary Interface")
238 (description "A reference implementation of the RISC-V SBI specifications
239 for platform-specific firmwares executing in M-mode.")
240 (license (list license:bsd-2
241 ;; lib/utils/libfdt/* is dual licensed under bsd-2 and gpl2+.
242 license:gpl2+
243 ;; platform/ariane-fpga/* is gpl2.
244 license:gpl2))))
245
246 (define-public opensbi-qemu-virt
247 (make-opensbi-package "qemu" "virt"))
248
249 (define-public opensbi-sifive-fu540
250 (make-opensbi-package "sifive" "fu540"))
251
252 (define-public opensbi-qemu-sifive-u
253 ;; Dropped upstream, as all functionality is present in the sifive-fu540
254 ;; target for recent versions of qemu, u-boot and linux.
255 (deprecated-package "opensbi-qemu-sifive-u" opensbi-sifive-fu540))
256
257 (define-public seabios
258 (package
259 (name "seabios")
260 (version "1.13.0")
261 (source
262 (origin
263 (method git-fetch)
264 (uri (git-reference
265 (url "https://review.coreboot.org/seabios.git")
266 (commit (string-append "rel-" version))))
267 (file-name (git-file-name name version))
268 (sha256
269 (base32 "1n1bd6msfs7xn8844sz2qnm7hb5x2qfl3zb06kp4bx9vdc3i6619"))))
270 (build-system gnu-build-system)
271 (native-inputs
272 `(("python" ,python-wrapper)))
273 (arguments
274 `(#:tests? #f ; no check target
275 #:phases
276 (modify-phases %standard-phases
277 (replace 'configure
278 (lambda _
279 (setenv "CC" "gcc")
280 #t))
281 (replace 'install
282 (lambda* (#:key outputs #:allow-other-keys)
283 (let* ((out (assoc-ref outputs "out"))
284 (fmw (string-append out "/share/firmware")))
285 (mkdir-p fmw)
286 (copy-file "out/bios.bin" (string-append fmw "/bios.bin"))
287 #t))))))
288 (home-page "https://www.seabios.org/SeaBIOS")
289 (synopsis "x86 BIOS implementation")
290 (description "SeaBIOS is an implementation of a 16bit x86 BIOS. SeaBIOS
291 can run in an emulator or it can run natively on X86 hardware with the use of
292 coreboot.")
293 ;; Dual licensed.
294 (license (list license:gpl3+ license:lgpl3+
295 ;; src/fw/acpi-dsdt.dsl is lgpl2
296 license:lgpl2.1
297 ;; src/fw/lzmadecode.c and src/fw/lzmadecode.h are lgpl3+ and
298 ;; cpl with a linking exception.
299 license:cpl1.0))))
300
301 ;; OVMF is part of the edk2 source tree.
302 (define edk2-commit "13a50a6fe1dcfa6600c38456ee24e0f9ecf51b5f")
303 (define edk2-version (git-version "20170116" "1" edk2-commit))
304 (define edk2-origin
305 (origin
306 (method git-fetch)
307 (uri (git-reference
308 (url "https://github.com/tianocore/edk2")
309 (commit edk2-commit)))
310 (file-name (git-file-name "edk2" edk2-version))
311 (sha256
312 (base32
313 "1gy2332kdqk8bjzpcsripx10896rbvgl0ic7r344kmpiwdgm948b"))))
314
315 (define-public ovmf
316 (package
317 (name "ovmf")
318 (version edk2-version)
319 (source edk2-origin)
320 (build-system gnu-build-system)
321 (native-inputs
322 `(("acpica" ,acpica)
323 ("gcc" ,gcc-5)
324 ("nasm" ,nasm)
325 ("python-2" ,python-2)
326 ("util-linux" ,util-linux "lib")))
327 (arguments
328 `(#:tests? #f ; No check target.
329 #:phases
330 (modify-phases %standard-phases
331 (replace 'configure
332 (lambda _
333 (let* ((cwd (getcwd))
334 (tools (string-append cwd "/BaseTools"))
335 (bin (string-append tools "/BinWrappers/PosixLike")))
336 (setenv "WORKSPACE" cwd)
337 (setenv "EDK_TOOLS_PATH" tools)
338 (setenv "PATH" (string-append (getenv "PATH") ":" bin))
339 ; FIXME: The below script errors out. When using 'invoke' instead
340 ; of 'system*' this causes the build to fail.
341 (system* "bash" "edksetup.sh")
342 (substitute* "Conf/target.txt"
343 (("^TARGET[ ]*=.*$") "TARGET = RELEASE\n")
344 (("^MAX_CONCURRENT_THREAD_NUMBER[ ]*=.*$")
345 (format #f "MAX_CONCURRENT_THREAD_NUMBER = ~a~%"
346 (number->string (parallel-job-count)))))
347 ;; Build build support.
348 (setenv "BUILD_CC" "gcc")
349 (invoke "make" "-C" tools)
350 #t)))
351 (replace 'build
352 (lambda _
353 (invoke "build" "-a" "IA32" "-t" "GCC49"
354 "-p" "OvmfPkg/OvmfPkgIa32.dsc")))
355 ,@(if (string=? "x86_64-linux" (%current-system))
356 '((add-after 'build 'build-x64
357 (lambda _
358 (invoke "build" "-a" "X64" "-t" "GCC49"
359 "-p" "OvmfPkg/OvmfPkgX64.dsc"))))
360 '())
361 (replace 'install
362 (lambda* (#:key outputs #:allow-other-keys)
363 (let* ((out (assoc-ref outputs "out"))
364 (fmw (string-append out "/share/firmware")))
365 (mkdir-p fmw)
366 (copy-file "Build/OvmfIa32/RELEASE_GCC49/FV/OVMF.fd"
367 (string-append fmw "/ovmf_ia32.bin"))
368 ,@(if (string=? "x86_64-linux" (%current-system))
369 '((copy-file "Build/OvmfX64/RELEASE_GCC49/FV/OVMF.fd"
370 (string-append fmw "/ovmf_x64.bin")))
371 '()))
372 #t)))))
373 (supported-systems '("x86_64-linux" "i686-linux"))
374 (home-page "https://www.tianocore.org")
375 (synopsis "UEFI firmware for QEMU")
376 (description "OVMF is an EDK II based project to enable UEFI support for
377 Virtual Machines. OVMF contains a sample UEFI firmware for QEMU and KVM.")
378 (license (list license:expat
379 license:bsd-2 license:bsd-3 license:bsd-4))))
380
381 (define-public ovmf-aarch64
382 (package
383 (inherit ovmf)
384 (name "ovmf-aarch64")
385 (native-inputs
386 `(,@(package-native-inputs ovmf)
387 ,@(if (not (string-prefix? "aarch64" (%current-system)))
388 `(("cross-gcc" ,(cross-gcc "aarch64-linux-gnu"))
389 ("cross-binutils" ,(cross-binutils "aarch64-linux-gnu")))
390 '())))
391 (arguments
392 (substitute-keyword-arguments (package-arguments ovmf)
393 ((#:phases phases)
394 `(modify-phases ,phases
395 (add-before 'configure 'set-env
396 (lambda _
397 ,@(if (not (string-prefix? "aarch64" (%current-system)))
398 `((setenv "GCC49_AARCH64_PREFIX" "aarch64-linux-gnu-"))
399 '())
400 #t))
401 (replace 'build
402 (lambda _
403 (invoke "build" "-a" "AARCH64" "-t" "GCC49"
404 "-p" "ArmVirtPkg/ArmVirtQemu.dsc")))
405 (delete 'build-x64)
406 (replace 'install
407 (lambda* (#:key outputs #:allow-other-keys)
408 (let* ((out (assoc-ref outputs "out"))
409 (fmw (string-append out "/share/firmware")))
410 (mkdir-p fmw)
411 (copy-file "Build/ArmVirtQemu-AARCH64/RELEASE_GCC49/FV/QEMU_EFI.fd"
412 (string-append fmw "/ovmf_aarch64.bin"))
413 #t)))))))
414 (supported-systems %supported-systems)))
415
416 (define-public ovmf-arm
417 (package
418 (inherit ovmf)
419 (name "ovmf-arm")
420 (native-inputs
421 `(,@(package-native-inputs ovmf)
422 ,@(if (not (string-prefix? "armhf" (%current-system)))
423 `(("cross-gcc" ,(cross-gcc "arm-linux-gnueabihf"))
424 ("cross-binutils" ,(cross-binutils "arm-linux-gnueabihf")))
425 '())))
426 (arguments
427 (substitute-keyword-arguments (package-arguments ovmf)
428 ((#:phases phases)
429 `(modify-phases ,phases
430 (add-before 'configure 'set-env
431 (lambda _
432 ,@(if (not (string-prefix? "armhf" (%current-system)))
433 `((setenv "GCC49_ARM_PREFIX" "arm-linux-gnueabihf-"))
434 '())
435 #t))
436 (replace 'build
437 (lambda _
438 (invoke "build" "-a" "ARM" "-t" "GCC49"
439 "-p" "ArmVirtPkg/ArmVirtQemu.dsc")))
440 (delete 'build-x64)
441 (replace 'install
442 (lambda* (#:key outputs #:allow-other-keys)
443 (let* ((out (assoc-ref outputs "out"))
444 (fmw (string-append out "/share/firmware")))
445 (mkdir-p fmw)
446 (copy-file "Build/ArmVirtQemu-ARM/RELEASE_GCC49/FV/QEMU_EFI.fd"
447 (string-append fmw "/ovmf_arm.bin"))
448 #t)))))))
449 (supported-systems %supported-systems)))
450
451 (define* (make-arm-trusted-firmware platform #:optional (arch "aarch64"))
452 (package
453 (name (string-append "arm-trusted-firmware-" platform))
454 (version "2.2")
455 (source
456 (origin
457 (method git-fetch)
458 (uri (git-reference
459 ;; There are only GitHub generated release snapshots.
460 (url "https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/")
461 (commit (string-append "v" version))))
462 (file-name (git-file-name "arm-trusted-firmware" version))
463 (patches (search-patches
464 "arm-trusted-firmware-disable-hdcp.patch"))
465 (sha256
466 (base32
467 "03fjl5hy1bqlya6fg553bqz7jrvilzrzpbs87cv6jd04v8qrvry8"))))
468 (build-system gnu-build-system)
469 (arguments
470 `(#:phases
471 (modify-phases %standard-phases
472 (delete 'configure) ; no configure script
473 ;; Remove binary blobs which do not contain source or proper license.
474 (add-after 'unpack 'remove-binary-blobs
475 (lambda _
476 (for-each (lambda (file)
477 (delete-file file))
478 (find-files "." ".*\\.bin$"))))
479 (replace 'install
480 (lambda* (#:key outputs #:allow-other-keys)
481 (let ((out (assoc-ref outputs "out"))
482 (bin (find-files "." ".*\\.(bin|elf)$")))
483 (for-each
484 (lambda (file)
485 (install-file file out))
486 bin))
487 #t)))
488 #:make-flags (list (string-append "PLAT=" ,platform)
489 ,@(if (and (not (string-prefix? "aarch64"
490 (%current-system)))
491 (string-prefix? "aarch64" arch))
492 `("CROSS_COMPILE=aarch64-linux-gnu-")
493 '())
494 ,@(if (and (not (string-prefix? "armhf"
495 (%current-system)))
496 (string-prefix? "armhf" arch))
497 `("CROSS_COMPILE=arm-linux-gnueabihf-")
498 '())
499 "DEBUG=1")
500 #:tests? #f)) ; no tests
501 (native-inputs
502 `(,@(if (and (not (string-prefix? "aarch64" (%current-system)))
503 (string-prefix? "aarch64" arch))
504 ;; gcc-7 since it is used for u-boot, which needs gcc-7.
505 `(("cross-gcc" ,(cross-gcc "aarch64-linux-gnu" #:xgcc gcc-7))
506 ("cross-binutils" ,(cross-binutils "aarch64-linux-gnu")))
507 '())
508 ,@(if (and (not (string-prefix? "armhf" (%current-system)))
509 (string-prefix? "armhf" arch))
510 ;; gcc-7 since it is used for u-boot, which needs gcc-7.
511 `(("cross-gcc" ,(cross-gcc "arm-linux-gnueabihf" #:xgcc gcc-7))
512 ("cross-binutils" ,(cross-binutils "arm-linux-gnueabihf")))
513 '())
514 ))
515 (home-page "https://www.trustedfirmware.org/")
516 (synopsis "Implementation of \"secure world software\"")
517 (description
518 "ARM Trusted Firmware provides a reference implementation of secure world
519 software for ARMv7A and ARMv8-A, including a Secure Monitor executing at
520 @dfn{Exception Level 3} (EL3). It implements various ARM interface standards,
521 such as:
522 @enumerate
523 @item The Power State Coordination Interface (PSCI)
524 @item Trusted Board Boot Requirements (TBBR, ARM DEN0006C-1)
525 @item SMC Calling Convention
526 @item System Control and Management Interface
527 @item Software Delegated Exception Interface (SDEI)
528 @end enumerate\n")
529 (license (list license:bsd-3
530 license:bsd-2)))) ; libfdt
531
532 (define-public arm-trusted-firmware-sun50i-a64
533 (let ((base (make-arm-trusted-firmware "sun50i_a64")))
534 (package
535 (inherit base)
536 (name "arm-trusted-firmware-sun50i-a64"))))
537
538 (define-public arm-trusted-firmware-rk3328
539 (make-arm-trusted-firmware "rk3328"))
540
541 (define-public arm-trusted-firmware-puma-rk3399
542 (let ((base (make-arm-trusted-firmware "rk3399"))
543 ;; Vendor's arm trusted firmware branch hasn't been upstreamed yet.
544 (commit "d71e6d83612df896774ec4c03d49500312d2c324")
545 (revision "1"))
546 (package
547 (inherit base)
548 (name "arm-trusted-firmware-puma-rk3399")
549 (version (git-version "1.3" revision commit))
550 (source
551 (origin
552 (method git-fetch)
553 (uri (git-reference
554 (url "https://git.theobroma-systems.com/arm-trusted-firmware.git")
555 (commit commit)))
556 (file-name (git-file-name name version))
557 (sha256
558 (base32
559 "0vqhwqqh8h9qlkpybg2v94911091c1418bc4pnzq5fd7zf0fjkf8")))))))
560
561 (define-public arm-trusted-firmware-rk3399
562 (let ((base (make-arm-trusted-firmware "rk3399")))
563 (package
564 (inherit base)
565 (name "arm-trusted-firmware-rk3399")
566 (native-inputs
567 `(("cross32-gcc" ,(cross-gcc "arm-none-eabi"))
568 ("cross32-binutils", (cross-binutils "arm-none-eabi"))
569 ,@(package-native-inputs base))))))
570
571 (define-public rk3399-cortex-m0
572 (package
573 (name "rk3399-cortex-m0")
574 (version "1")
575 (source
576 (origin
577 (method git-fetch)
578 (uri (git-reference
579 (url "https://git.theobroma-systems.com/rk3399-cortex-m0.git")
580 (commit (string-append "v" version))))
581 (file-name (git-file-name "rk3399-cortex-m0" version))
582 (sha256
583 (base32
584 "02wz1vkf4j3zc8rx289z76xhrf71jhb2p05lvmygky393a9gjh9w"))))
585 (home-page "https://git.theobroma-systems.com/rk3399-cortex-m0.git/about/")
586 (synopsis "PMU Cortex M0 firmware for RK3399 Q7 (Puma)")
587 (description
588 "Cortex-M0 firmware used with the RK3399 to implement
589 power-management functionality and helpers (e.g. DRAM frequency
590 switching support).\n")
591 (license license:bsd-3)
592 (build-system gnu-build-system)
593 (arguments
594 `(#:phases
595 (modify-phases %standard-phases
596 (delete 'configure)
597 (delete 'check)
598 (replace 'install
599 (lambda* (#:key outputs #:allow-other-keys)
600 (let ((out (assoc-ref outputs "out"))
601 (mzerofiles (find-files "." "rk3399m0.(elf|bin)$")))
602 (for-each
603 (lambda (file)
604 (install-file file out))
605 mzerofiles))
606 #t))
607 (add-before 'build 'setenv
608 (lambda* (#:key inputs #:allow-other-keys)
609 (setenv "CROSS_COMPILE" "arm-none-eabi-")
610 #t)))))
611 (native-inputs `(("cross-gcc" ,(cross-gcc "arm-none-eabi" #:xgcc gcc-7))
612 ("cross-binutils" ,(cross-binutils "arm-none-eabi"))))))