diff --git a/doc/guix.texi b/doc/guix.texi index 005455edba..388d601e61 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -2666,11 +2666,13 @@ If you build a disk image and the bootloader is not available otherwise includes the bootloader, specifically: @example -guix system image --system=armhf-linux -e '((@@ (gnu system install) os-with-u-boot) (@@ (gnu system install) installation-os) "A20-OLinuXino-Lime2")' +guix system image --system=armhf-linux -e '(@ (gnu system install) beaglebone-black-installation-os)' @end example -@code{A20-OLinuXino-Lime2} is the name of the board. If you specify an invalid -board, a list of possible boards will be printed. +@code{beaglebone-black} is the name of the board. Similar +@code{installation-os} variables exist for most other supported boards. +Otherwise, you can use @code{embedded-installation-os}, passing it a u-boot +bootloader and the desired console tty. @c ********************************************************************* diff --git a/gnu/bootloader/u-boot.scm b/gnu/bootloader/u-boot.scm index 7fd7288854..2d351c9dc2 100644 --- a/gnu/bootloader/u-boot.scm +++ b/gnu/bootloader/u-boot.scm @@ -7,6 +7,7 @@ ;;; Copyright © 2023 Efraim Flashner ;;; Copyright © 2023-2024 Herman Rimm ;;; Copyright © 2024 Zheng Junjie <873216071@qq.com> +;;; Copyright © 2024 Lilah Tascheter ;;; ;;; This file is part of GNU Guix. ;;; @@ -24,12 +25,11 @@ ;;; along with GNU Guix. If not, see . (define-module (gnu bootloader u-boot) - #:use-module (gnu bootloader extlinux) #:use-module (gnu bootloader) + #:use-module (gnu bootloader extlinux) #:use-module (gnu packages bootloaders) #:use-module (guix gexp) - #:export (u-boot-bootloader - u-boot-a20-olinuxino-lime-bootloader + #:export (u-boot-a20-olinuxino-lime-bootloader u-boot-a20-olinuxino-lime2-bootloader u-boot-a20-olinuxino-micro-bootloader u-boot-bananapi-m2-ultra-bootloader @@ -55,321 +55,179 @@ (define-module (gnu bootloader u-boot) u-boot-ts7970-q-2g-1000mhz-c-bootloader u-boot-wandboard-bootloader)) -(define install-u-boot - #~(lambda (bootloader root-index image) - (if bootloader - (error "Failed to install U-Boot")))) +(define (make-install-u-boot firmware installers) + (lambda* (#:key bootloader-config #:allow-other-keys . args) + (with-targets (bootloader-configuration-targets bootloader-config) + ('extlinux (apply install-extlinux-config args)) + (('install => (path :path)) #~(let ((path #$path)) #$firmware)) + (('disk => (disk :device)) #~(let ((disk #$disk)) #f #$@installers))))) -(define install-beaglebone-black-u-boot - ;; http://wiki.beyondlogic.org/index.php?title=BeagleBoneBlack_Upgrading_uBoot - ;; This first stage bootloader called MLO (U-Boot SPL) is expected at - ;; 0x20000 by BBB ROM code. The second stage bootloader will be loaded by - ;; the MLO and is expected at 0x60000. Write both first stage ("MLO") and - ;; second stage ("u-boot.img") images, read in BOOTLOADER directory, to the - ;; specified DEVICE. - #~(lambda (bootloader root-index image) - (let ((mlo (string-append bootloader "/libexec/MLO")) - (u-boot (string-append bootloader "/libexec/u-boot.img"))) - (write-file-on-device mlo (* 256 512) - image (* 256 512)) - (write-file-on-device u-boot (* 1024 512) - image (* 768 512))))) - -(define install-allwinner-u-boot - #~(lambda (bootloader root-index image) - (let ((u-boot (string-append bootloader - "/libexec/u-boot-sunxi-with-spl.bin"))) - (write-file-on-device u-boot (stat:size (stat u-boot)) - image (* 8 1024))))) - -(define install-allwinner64-u-boot - #~(lambda (bootloader root-index image) - (let ((spl (string-append bootloader "/libexec/u-boot-sunxi-with-spl.bin")) - (u-boot (string-append bootloader "/libexec/u-boot-sunxi-with-spl.fit.itb"))) - (write-file-on-device spl (stat:size (stat spl)) - image (* 8 1024)) - (write-file-on-device u-boot (stat:size (stat u-boot)) - image (* 40 1024))))) - -(define install-imx-u-boot - #~(lambda (bootloader root-index image) - (let ((spl (string-append bootloader "/libexec/SPL")) - (u-boot (string-append bootloader "/libexec/u-boot.img"))) - (write-file-on-device spl (stat:size (stat spl)) - image (* 1 1024)) - (write-file-on-device u-boot (stat:size (stat u-boot)) - image (* 69 1024))))) - -(define install-nanopi-r4s-rk3399-u-boot - #~(lambda (bootloader root-index image) - (let ((spl (string-append bootloader "/libexec/idbloader.img")) - (u-boot (string-append bootloader "/libexec/u-boot.itb"))) - (write-file-on-device spl (stat:size (stat spl)) - image (* 64 512)) - (write-file-on-device u-boot (stat:size (stat u-boot)) - image (* 16384 512))))) - -(define install-orangepi-r1-plus-lts-rk3328-u-boot - #~(lambda (bootloader root-index image) - (let ((idb (string-append bootloader "/libexec/idbloader.img")) - (u-boot (string-append bootloader "/libexec/u-boot.itb"))) - (write-file-on-device idb (stat:size (stat idb)) - image (* 64 512)) - (write-file-on-device u-boot (stat:size (stat u-boot)) - image (* 16384 512))))) - -(define install-puma-rk3399-u-boot - #~(lambda (bootloader root-index image) - (let ((spl (string-append bootloader "/libexec/idbloader.img")) - (u-boot (string-append bootloader "/libexec/u-boot.itb"))) - (write-file-on-device spl (stat:size (stat spl)) - image (* 64 512)) - (write-file-on-device u-boot (stat:size (stat u-boot)) - image (* 512 512))))) - -(define install-firefly-rk3399-u-boot - #~(lambda (bootloader root-index image) - (let ((idb (string-append bootloader "/libexec/idbloader.img")) - (u-boot (string-append bootloader "/libexec/u-boot.itb"))) - (write-file-on-device idb (stat:size (stat idb)) - image (* 64 512)) - (write-file-on-device u-boot (stat:size (stat u-boot)) - image (* 16384 512))))) - -(define install-rock64-rk3328-u-boot - #~(lambda (bootloader root-index image) - (let ((idb (string-append bootloader "/libexec/idbloader.img")) - (u-boot (string-append bootloader "/libexec/u-boot.itb"))) - (write-file-on-device idb (stat:size (stat idb)) - image (* 64 512)) - (write-file-on-device u-boot (stat:size (stat u-boot)) - image (* 16384 512))))) - -(define install-rockpro64-rk3399-u-boot - #~(lambda (bootloader root-index image) - (let ((idb (string-append bootloader "/libexec/idbloader.img")) - (u-boot (string-append bootloader "/libexec/u-boot.itb"))) - (write-file-on-device idb (stat:size (stat idb)) - image (* 64 512)) - (write-file-on-device u-boot (stat:size (stat u-boot)) - image (* 16384 512))))) - -(define install-pinebook-pro-rk3399-u-boot install-rockpro64-rk3399-u-boot) - -(define install-u-boot-ts7970-q-2g-1000mhz-c-u-boot - #~(lambda (bootloader device mount-point) - (let ((u-boot.imx (string-append bootloader "/libexec/u-boot.imx")) - (install-dir (string-append mount-point "/boot"))) - (install-file u-boot.imx install-dir)))) - -(define install-sifive-unmatched-u-boot - #~(lambda (bootloader root-index image) - (let ((spl (string-append bootloader "/libexec/spl/u-boot-spl.bin")) - (u-boot (string-append bootloader "/libexec/u-boot.itb"))) - (write-file-on-device spl (stat:size (stat spl)) - image (* 34 512)) - (write-file-on-device u-boot (stat:size (stat u-boot)) - image (* 2082 512))))) - -(define install-starfive-visionfive2-u-boot - #~(lambda (bootloader root-index image) - (let ((spl (string-append - bootloader "/libexec/spl/u-boot-spl.bin.normal.out")) - (u-boot (string-append bootloader "/libexec/u-boot.itb"))) - (write-file-on-device spl (stat:size (stat spl)) - image (* 34 512)) - (write-file-on-device u-boot (stat:size (stat u-boot)) - image (* 2082 512))))) - -(define install-starfive-visionfive2-uEnv.txt - #~(lambda (bootloader device mount-point) - (mkdir-p (string-append mount-point "/boot")) - (call-with-output-file (string-append mount-point "/boot/uEnv.txt") - (lambda (port) - (format port - ;; if board SPI use vender's u-boot, will find - ;; ""starfive/starfive_visionfive2.dtb"", We cannot guarantee - ;; that users will update this u-boot, so set it. - "fdtfile=starfive/jh7110-starfive-visionfive-2-v1.3b.dtb~%"))))) - -(define install-qemu-riscv64-u-boot - #~(lambda (bootloader device mount-point) - (let ((u-boot.bin (string-append bootloader "/libexec/u-boot.bin")) - (install-dir (string-append mount-point "/boot"))) - (install-file u-boot.bin install-dir)))) +(define-syntax-rule (define-u-bootloader def-name package firmware + (file size doffset) ...) + "Defines a U-Boot installer DEF-NAME, using u-boot PACKAGE. Installs +each given FILE of SIZE (or #f to autodetect) to the targeted disk at +OFFSET. FIRMWARE is ran on the U-Boot firmware directory to install +supporting files, with the directory path as the local variable 'path'." + (define def-name + (bootloader + (name 'u-boot) + (default-targets (list (bootloader-target + (type 'install) + (offset 'root) + (path "boot")) + (bootloader-target + (type 'extlinux) + (offset 'install) + (path "extlinux")))) + (installer + (make-install-u-boot + firmware + (list #~(let ((fw #$(file-append package "/libexec/" file))) + (write-file-on-device fw + #$(or size #~(stat:size (stat fw))) + disk #$doffset)) ...)))))) - ;;; ;;; Bootloader definitions. ;;; -(define u-boot-bootloader - (bootloader - (inherit extlinux-bootloader) - (name 'u-boot) - (package #f) - (installer #f) - (disk-image-installer install-u-boot))) +(define-u-bootloader u-boot-beaglebone-black-bootloader + u-boot-am335x-boneblack #f + ;; http://wiki.beyondlogic.org/index.php?title=BeagleBoneBlack_Upgrading_uBoot + ;; This first stage bootloader called MLO (U-Boot SPL) is expected at + ;; 0x20000 by BBB ROM code. The second stage bootloader will be loaded by + ;; the MLO and is expected at 0x60000. Write both first stage ("MLO") and + ;; second stage ("u-boot.img") images to the target. + ("MLO" (* 256 512) (* 256 512)) + ("u-boot.img" (* 1024 512) (* 768 512))) -(define u-boot-beaglebone-black-bootloader - (bootloader - (inherit u-boot-bootloader) - (package u-boot-am335x-boneblack) - (disk-image-installer install-beaglebone-black-u-boot))) +(define-u-bootloader u-boot-sifive-unmatched-bootloader + u-boot-sifive-unmatched #f + ("spl/u-boot-spl.bin" #f (* 34 512)) + ("u-boot.itb" #f (* 2082 512))) -(define u-boot-allwinner-bootloader - (bootloader - (inherit u-boot-bootloader) - (disk-image-installer install-allwinner-u-boot))) +(define-u-bootloader u-boot-starfive-visionfive2-bootloader + u-boot-starfive-visionfive2 + #~(begin (mkdir-p path) + (call-with-output-file (string-append path "/uEnv.txt") + (lambda (port) + (format port + ;; if board SPI use vender's u-boot, will find + ;; ""starfive/starfive_visionfive2.dtb"", We cannot guarantee + ;; that users will update this u-boot, so set it. + "fdtfile=starfive/jh7110-starfive-visionfive-2-v1.3b.dtb~%")))) + ("spl/u-boot-spl.bin.normal.out" #f (* 34 512)) + ("u-boot.itb" #f (* 2082 512))) -(define u-boot-allwinner64-bootloader - (bootloader - (inherit u-boot-bootloader) - (disk-image-installer install-allwinner64-u-boot))) + +;;; +;;; Allwinner bootloader definitions. +;;; +(define-syntax-rule (define-u-bootloader-allwinner def-name package) + (define-u-bootloader def-name package #f + ("u-boot-sunxi-with-spl.bin" #f (* 8 1024)))) -(define u-boot-imx-bootloader - (bootloader - (inherit u-boot-bootloader) - (disk-image-installer install-imx-u-boot))) -(define u-boot-nintendo-nes-classic-edition-bootloader - (bootloader - (inherit u-boot-allwinner-bootloader) - (package u-boot-nintendo-nes-classic-edition))) +(define-u-bootloader-allwinner u-boot-nintendo-nes-classic-edition-bootloader + u-boot-nintendo-nes-classic-edition) -(define u-boot-a20-olinuxino-lime-bootloader - (bootloader - (inherit u-boot-allwinner-bootloader) - (package u-boot-a20-olinuxino-lime))) +(define-u-bootloader-allwinner u-boot-a20-olinuxino-lime-bootloader + u-boot-a20-olinuxino-lime) -(define u-boot-a20-olinuxino-lime2-bootloader - (bootloader - (inherit u-boot-allwinner-bootloader) - (package u-boot-a20-olinuxino-lime2))) +(define-u-bootloader-allwinner u-boot-a20-olinuxino-lime2-bootloader + u-boot-a20-olinuxino-lime2) -(define u-boot-a20-olinuxino-micro-bootloader - (bootloader - (inherit u-boot-allwinner-bootloader) - (package u-boot-a20-olinuxino-micro))) +(define-u-bootloader-allwinner u-boot-a20-olinuxino-micro-bootloader + u-boot-a20-olinuxino-micro) -(define u-boot-bananapi-m2-ultra-bootloader - (bootloader - (inherit u-boot-allwinner-bootloader) - (package u-boot-bananapi-m2-ultra))) +(define-u-bootloader-allwinner u-boot-bananapi-m2-ultra-bootloader + u-boot-bananapi-m2-ultra) -(define u-boot-cubietruck-bootloader - (bootloader - (inherit u-boot-allwinner-bootloader) - (package u-boot-cubietruck))) +(define-u-bootloader-allwinner u-boot-cubietruck-bootloader u-boot-cubietruck) -(define u-boot-firefly-rk3399-bootloader +(define-u-bootloader-allwinner u-boot-pine64-lts-bootloader u-boot-pine64-lts) + +(define-u-bootloader-allwinner u-boot-orangepi-zero2w-bootloader + u-boot-orangepi-zero2w) + + +;;; +;;; Allwinner64 bootloader definitions. +;;; +(define-syntax-rule (define-u-bootloader-allwinner64 def-name package) + (define-u-bootloader def-name package #f + ("u-boot-sunxi-with-spl.bin" #f (* 8 1024)) + ("u-boot-sunxi-with-spl.fit.itb" #f (* 40 1024)))) + +(define-u-bootloader-allwinner64 u-boot-pine64-plus-bootloader + u-boot-pine64-plus) + +(define-u-bootloader-allwinner64 u-boot-pinebook-bootloader u-boot-pinebook) + + +;;; +;;; IMX bootloader definitions. +;;; +(define-syntax-rule (define-u-bootloader-imx def-name package) + (define-u-bootloader def-name package #f + ("SPL" #f (* 8 1024)) + ("u-boot.img" #f (* 40 1024)))) + + +(define-u-bootloader-imx u-boot-mx6cuboxi-bootloader u-boot-mx6cuboxi) + +(define-u-bootloader-imx u-boot-wandboard-bootloader u-boot-wandboard) + +(define-u-bootloader-imx u-boot-novena-bootloader u-boot-novena) + + +;;; +;;; Rockchip bootloader definitions. +;;; +(define-syntax-rule (define-u-bootloader-rockchip def-name package) ;; SD and eMMC use the same format - (bootloader - (inherit u-boot-bootloader) - (package u-boot-firefly-rk3399) - (disk-image-installer install-firefly-rk3399-u-boot))) + (define-u-bootloader def-name package #f + ("idbloader.img" #f (* 64 512)) + ("u-boot.itb" #f (* 16384 512)))) -(define u-boot-mx6cuboxi-bootloader - (bootloader - (inherit u-boot-imx-bootloader) - (package u-boot-mx6cuboxi))) +(define-u-bootloader-rockchip u-boot-firefly-rk3399-bootloader + u-boot-firefly-rk3399) -(define u-boot-wandboard-bootloader - (bootloader - (inherit u-boot-imx-bootloader) - (package u-boot-wandboard))) +(define-u-bootloader-rockchip u-boot-nanopi-r4s-rk3399-bootloader + u-boot-nanopi-r4s-rk3399) -(define u-boot-novena-bootloader - (bootloader - (inherit u-boot-imx-bootloader) - (package u-boot-novena))) +(define-u-bootloader-rockchip u-boot-orangepi-r1-plus-lts-rk3328-bootloader + u-boot-orangepi-r1-plus-lts-rk3328) -(define u-boot-nanopi-r4s-rk3399-bootloader - (bootloader - (inherit u-boot-bootloader) - (package u-boot-nanopi-r4s-rk3399) - (disk-image-installer install-nanopi-r4s-rk3399-u-boot))) +(define-u-bootloader-rockchip u-boot-rock64-rk3328-bootloader + u-boot-rock64-rk3328) -(define u-boot-orangepi-r1-plus-lts-rk3328-bootloader - (bootloader - (inherit u-boot-bootloader) - (package u-boot-orangepi-r1-plus-lts-rk3328) - (disk-image-installer install-orangepi-r1-plus-lts-rk3328-u-boot))) +(define-u-bootloader-rockchip u-boot-rockpro64-rk3399-bootloader + u-boot-rockpro64-rk3399) -(define u-boot-orangepi-zero2w-bootloader - (bootloader - (inherit u-boot-allwinner-bootloader) - (package u-boot-orangepi-zero2w))) +(define-u-bootloader-rockchip u-boot-pinebook-pro-rk3399-bootloader + u-boot-pinebook-pro-rk3399) -(define u-boot-pine64-plus-bootloader - (bootloader - (inherit u-boot-allwinner64-bootloader) - (package u-boot-pine64-plus))) +(define-u-bootloader u-boot-puma-rk3399-bootloader u-boot-puma-rk3399 #f + ("idbloader.img" #f (* 64 512)) + ("u-boot.itb" #f (* 512 512))) -(define u-boot-pine64-lts-bootloader - (bootloader - (inherit u-boot-allwinner-bootloader) - (package u-boot-pine64-lts))) + +;;; +;;; Copy-only bootloader definitions. +;;; -(define u-boot-pinebook-bootloader - (bootloader - (inherit u-boot-allwinner64-bootloader) - (package u-boot-pinebook))) +;; These bootloaders don't really need to be installed, as they are read from +;; an SPI memory chip or directly from the FS, not the disk. +(define-syntax-rule (define-u-bootloader-copy def-name package file) + (define-u-bootloader def-name package + #~(install-file #$(file-append package "/libexec/" file) path))) -(define u-boot-puma-rk3399-bootloader - (bootloader - (inherit u-boot-bootloader) - (package u-boot-puma-rk3399) - (disk-image-installer install-puma-rk3399-u-boot))) +;; user should manually install this to SPI flash +;; TODO: write directly to SPI flash? unless wear issues are a problem. +(define-u-bootloader-copy u-boot-ts7970-q-2g-1000mhz-c-bootloader + u-boot-ts7970-q-2g-1000mhz-c "u-boot.imx") -(define u-boot-rock64-rk3328-bootloader - ;; SD and eMMC use the same format - (bootloader - (inherit u-boot-bootloader) - (package u-boot-rock64-rk3328) - (disk-image-installer install-rock64-rk3328-u-boot))) - -(define u-boot-rockpro64-rk3399-bootloader - ;; SD and eMMC use the same format - (bootloader - (inherit u-boot-bootloader) - (package u-boot-rockpro64-rk3399) - (disk-image-installer install-rockpro64-rk3399-u-boot))) - -(define u-boot-pinebook-pro-rk3399-bootloader - ;; SD and eMMC use the same format - (bootloader - (inherit u-boot-bootloader) - (package u-boot-pinebook-pro-rk3399) - (disk-image-installer install-pinebook-pro-rk3399-u-boot))) - -(define u-boot-ts7970-q-2g-1000mhz-c-bootloader - ;; This bootloader doesn't really need to be installed, as it is read from - ;; an SPI memory chip, not the SD card. It is copied to /boot/u-boot.imx - ;; for convenience and should be manually flashed at the U-Boot prompt. - (bootloader - (inherit u-boot-bootloader) - (package u-boot-ts7970-q-2g-1000mhz-c) - (installer install-u-boot-ts7970-q-2g-1000mhz-c-u-boot) - (disk-image-installer #f))) - -(define u-boot-sifive-unmatched-bootloader - (bootloader - (inherit u-boot-bootloader) - (package u-boot-sifive-unmatched) - (disk-image-installer install-sifive-unmatched-u-boot))) - -(define u-boot-starfive-visionfive2-bootloader - (bootloader - (inherit u-boot-bootloader) - (package u-boot-starfive-visionfive2) - (installer install-starfive-visionfive2-uEnv.txt) - (disk-image-installer install-starfive-visionfive2-u-boot))) - -(define u-boot-qemu-riscv64-bootloader - (bootloader - (inherit u-boot-bootloader) - (package u-boot-qemu-riscv64) - (installer install-qemu-riscv64-u-boot) - (disk-image-installer #f))) +(define-u-bootloader-copy u-boot-qemu-riscv64-bootloader + u-boot-qemu-riscv64 "u-boot.bin") diff --git a/gnu/system/install.scm b/gnu/system/install.scm index 2d0c9875fb..82f2c451dd 100644 --- a/gnu/system/install.scm +++ b/gnu/system/install.scm @@ -78,8 +78,7 @@ (define-module (gnu system install) rock64-installation-os rockpro64-installation-os rk3399-puma-installation-os - wandboard-installation-os - os-with-u-boot)) + wandboard-installation-os)) ;;; Commentary: ;;; @@ -555,19 +554,6 @@ (define installation-os %installer-disk-utilities %base-packages)))) -(define* (os-with-u-boot os board #:key (bootloader-target "/dev/mmcblk0") - (triplet "arm-linux-gnueabihf")) - "Given OS, amend it with the u-boot bootloader for BOARD, -installed to BOOTLOADER-TARGET (a drive), compiled for TRIPLET. - -If you want a serial console, make sure to specify one in your -operating-system's kernel-arguments (\"console=ttyS0\" or similar)." - (operating-system (inherit os) - (bootloader (bootloader-configuration - (bootloader (bootloader (inherit u-boot-bootloader) - (package (make-u-boot-package board triplet)))) - (targets (list bootloader-target)))))) - (define* (embedded-installation-os bootloader #:optional (tty "ttyS0") (extra-modules '())