added bootloader packages for rg35xx

This commit is contained in:
Chad Nelson 2025-02-23 22:19:00 -07:00
parent 079b29cb21
commit 4351e1e25f
3 changed files with 2407 additions and 0 deletions

View file

@ -0,0 +1,554 @@
(define-module (skg packages bootloaders)
#:use-module (gnu packages)
#:use-module (gnu packages assembly)
#:use-module (gnu packages base)
#:use-module (gnu packages disk)
#:use-module (gnu packages bison)
#:use-module (gnu packages cdrom)
#:use-module (gnu packages check)
#:use-module (gnu packages compression)
#:use-module (gnu packages cross-base)
#:use-module (gnu packages disk)
#:use-module (skg packages firmware)
#:use-module (gnu packages flex)
#:use-module (gnu packages fontutils)
#:use-module (gnu packages gcc)
#:use-module (gnu packages gettext)
#:use-module (gnu packages guile)
#:use-module (gnu packages efi)
#:use-module (gnu packages linux)
#:use-module (gnu packages llvm)
#:use-module (gnu packages man)
#:use-module (gnu packages mtools)
#:use-module (gnu packages ncurses)
#:use-module (gnu packages ninja)
#:use-module (gnu packages package-management)
#:use-module (gnu packages perl)
#:use-module (gnu packages pkg-config)
#:use-module (gnu packages python)
#:use-module (gnu packages python-build)
#:use-module (gnu packages python-crypto)
#:use-module (gnu packages texinfo)
#:use-module (gnu packages tls)
#:use-module (gnu packages sdl)
#:use-module (gnu packages sphinx)
#:use-module (gnu packages serialization)
#:use-module (gnu packages swig)
#:use-module (gnu packages valgrind)
#:use-module (gnu packages version-control)
#:use-module (gnu packages virtualization)
#:use-module (gnu packages xorg)
#:use-module (gnu packages python-build)
#:use-module (gnu packages python-web)
#:use-module (gnu packages python-xyz)
#:use-module (guix build-system gnu)
#:use-module (guix build-system meson)
#:use-module (guix build-system pyproject)
#:use-module (guix build-system trivial)
#:use-module (guix download)
#:use-module (guix gexp)
#:use-module (guix git-download)
#:use-module ((guix licenses) #:prefix license:)
#:use-module (guix packages)
#:use-module (guix utils)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-26)
#:use-module (ice-9 optargs)
#:use-module (ice-9 match)
#:use-module (ice-9 regex))
(define-public dtc
(package
(name "dtc")
(version "1.7.0")
(source (origin
(method url-fetch)
(uri (string-append
"mirror://kernel.org/software/utils/dtc/"
"dtc-" version ".tar.gz"))
(sha256
(base32
"0cij9399snpn672pdbda8qbxljdkfg068kvv3g5811rz6yslx124"))
(patches
(search-patches "dtc-meson-cell-overflow.patch"))))
(build-system meson-build-system)
(arguments
(list
#:modules '((guix build meson-build-system)
(guix build utils)
(srfi srfi-26))
#:phases
#~(modify-phases %standard-phases
(add-after 'unpack 'preparations
(lambda _
;; The version string is usually derived via setuptools-scm, but
;; without the git metadata available this fails.
(setenv "SETUPTOOLS_SCM_PRETEND_VERSION" #$version)
;; Needed by setup.py.
(setenv "DESTDIR" "/")
;; Native gcc needed by run_test.sh.
(setenv "CC" "gcc")
;; /bin/fdt{get,overlay,put} need help finding libfdt.so.1.
(setenv "LDFLAGS"
(string-append "-Wl,-rpath=" #$output "/lib"))))
(add-after 'unpack 'install-doc
(lambda _
(with-directory-excursion "Documentation"
(for-each (cut install-file <> (string-append
#$output "/share/doc/dtc/"))
'("dts-format.txt"
"dt-object-internal.txt"
"manual.txt")))))
(add-after 'unpack 'patch-pkg-config
(lambda _
(substitute* '("tests/run_tests.sh")
(("pkg-config")
#$(pkg-config-for-target))))))))
(native-inputs
(append
(list bison
flex
libyaml
ninja
pkg-config
python
python-setuptools-scm
swig
which)
(if (member (%current-system) (package-supported-systems valgrind))
(list valgrind)
'())))
(inputs
(list python))
(home-page "https://www.devicetree.org")
(synopsis "Compiles device tree source files")
(description "@command{dtc} compiles
@uref{http://elinux.org/Device_Tree_Usage, device tree source files} to device
tree binary files. These are board description files used by Linux and BSD.")
(license license:gpl2+)))
(define u-boot
(package
(name "u-boot")
(version "2025.01")
(source
(origin
(method git-fetch)
(uri (git-reference
(url "https://source.denx.de/u-boot/u-boot.git")
(commit (string-append "v" version))))
(file-name (git-file-name name version))
(sha256
(base32 "1i1v86bnixh8hyqbwwr5iwdnnadmg2fqxw9g526fvclsbvl8lz0v"))
(patches (search-patches "u-boot-allow-disabling-openssl.patch"
"u-boot-rockchip-inno-usb.patch"))))
(build-system gnu-build-system)
(native-inputs
(list bison
dtc
gnutls
flex
lz4
ncurses/tinfo
perl
pkg-config ;for 'make menuconfig'
python
python-pyelftools
python-setuptools
python-wheel
swig
(list util-linux "lib")))
(home-page "https://www.denx.de/wiki/U-Boot/")
(synopsis "ARM bootloader")
(description "U-Boot is a bootloader used mostly for ARM boards. It
also initializes the boards (RAM etc).")
(license license:gpl2+)))
;;; This is very similar to the linux-libre-documentation package, since it
;;; reuses the same Makefile-based build system.
(define-public u-boot-documentation
(package
(inherit u-boot)
(name "u-boot-documentation")
(arguments
(list
#:make-flags #~(list "HOSTCC=gcc"
;; Avoid treating Sphinx warnings as errors.
"SPHINXOPTS=")
#:tests? #f
#:phases #~(modify-phases %standard-phases
(delete 'configure)
(replace 'build
(lambda* (#:key make-flags #:allow-other-keys)
(apply invoke "make" "infodocs" make-flags)))
(replace 'install
(lambda* (#:key make-flags #:allow-other-keys)
(let* ((info-dir (string-append #$output "/share/info"))
(info (string-append info-dir
"/DasUBoot.info.gz")))
(with-directory-excursion "doc/output"
(apply invoke "make" "-C" "texinfo" "install-info"
(string-append "infodir=" info-dir)
make-flags))))))))
(native-inputs
(modify-inputs (package-native-inputs u-boot)
(append fontconfig
python-sphinx
python-sphinx-prompt
texinfo
which)))
(synopsis "U-Boot documentation")
(description "This package provides the documentation for U-Boot, as an
Info manual.")))
(define-public u-boot-tools
(package
(inherit u-boot)
(name "u-boot-tools")
(native-inputs
(modify-inputs (package-native-inputs u-boot)
(prepend python-coverage
python-filelock
python-pycryptodomex
python-pytest
python-pytest-xdist)))
(arguments
`(#:make-flags '("HOSTCC=gcc")
#:test-target "tcheck"
#:phases
(modify-phases %standard-phases
(add-after 'unpack 'patch
(lambda* (#:key inputs #:allow-other-keys)
(substitute* "Makefile"
(("/bin/pwd") (which "pwd"))
(("/bin/false") (which "false")))
(substitute* "tools/dtoc/fdt_util.py"
(("'cc'") "'gcc'"))
(substitute* "tools/u_boot_pylib/test_util.py"
;; python3-coverage is simply called coverage in guix.
(("python3-coverage") "coverage")
;; Don't require 100% coverage since it's brittle and can
;; fail with newer versions of coverage or dependencies.
(("raise ValueError\\('Test coverage failure'\\)")
"print('Continuing anyway since Guix does not care :O')"))
(substitute* "test/run"
;; Make it easier to find test failures.
(("#!/bin/bash") "#!/bin/bash -x")
;; This test would require git.
(("\\./tools/patman/patman") (which "true"))
;; FIXME: test fails, needs further investiation
(("run_test \"binman\"") "# run_test \"binman\"")
;; FIXME: tests fail without kwbimage, i.e. openssl.
(("run_test \"sandbox_noinst\"")
"# run_test \"sandbox_noinst\"")
(("run_test \"sandbox_vpl\"")
"# run_test \"sandbox_vpl\"")
;; FIXME: code coverage not working
(("run_test \"binman code coverage\"")
"# run_test \"binman code coverage\"")
;; This test would require internet access.
(("\\./tools/buildman/buildman") (which "true")))
(substitute* "test/py/tests/test_sandbox_exit.py"
(("def test_ctrl_c")
"@pytest.mark.skip(reason='Guix has problems with SIGINT')
def test_ctrl_c"))
;; Test against the tools being installed rather than tools built
;; for "sandbox" target.
(substitute* "test/image/test-imagetools.sh"
(("BASEDIR=sandbox") "BASEDIR=."))
(for-each (lambda (file)
(substitute* file
;; Disable features that require OpenSSL due
;; to GPL/Openssl license incompatibilities.
;; See https://bugs.gnu.org/34717 for
;; details.
(("CONFIG_FIT_SIGNATURE=y")
"CONFIG_FIT_SIGNATURE=n
CONFIG_UT_LIB_ASN1=n
CONFIG_TOOLS_LIBCRYPTO=n
CONFIG_TOOLS_KWBIMAGE=n")
;; Catch instances of implied CONFIG_FIG_SIGNATURE
;; with VPL targets
(("CONFIG_SANDBOX_VPL=y")
"CONFIG_SANDBOX_VPL=y
CONFIG_FIT_SIGNATURE=n
CONFIG_VPL_FIT_SIGNATURE=n
CONFIG_TOOLS_LIBCRYPTO=n
CONFIG_TOOLS_KWBIMAGE=n")
;; This test requires a sound system, which is un-used
;; in u-boot-tools.
(("CONFIG_SOUND=y") "CONFIG_SOUND=n")))
(find-files "configs" "sandbox_.*defconfig$|tools-only_defconfig"))))
(replace 'configure
(lambda* (#:key make-flags #:allow-other-keys)
(apply invoke "make" "tools-only_defconfig" make-flags)))
(replace 'build
(lambda* (#:key inputs make-flags #:allow-other-keys)
(apply invoke "make" "tools-all" make-flags)))
(replace 'install
(lambda* (#:key outputs #:allow-other-keys)
(let* ((out (assoc-ref outputs "out"))
(bin (string-append out "/bin")))
(for-each (lambda (name)
(install-file name bin))
'("tools/netconsole"
"tools/jtagconsole"
"tools/gen_eth_addr"
"tools/gen_ethaddr_crc"
"tools/img2srec"
"tools/mkenvimage"
"tools/dumpimage"
"tools/mkimage"
"tools/kwboot"
"tools/proftool"
"tools/fdtgrep"
"tools/env/fw_printenv"
"tools/sunxi-spl-image-builder")))))
(delete 'check)
(add-after 'install 'check
(lambda* (#:key make-flags test-target tests? #:allow-other-keys)
(when tests?
(invoke "test/image/test-imagetools.sh"))))
;; Only run full test suite on x86_64 systems, as many tests
;; assume x86_64.
,@(if (string-match "^x86_64-linux"
(or (%current-target-system)
(%current-system)))
'((add-after 'check 'check-x86
(lambda* (#:key make-flags test-target tests? #:allow-other-keys)
(when tests?
(begin
(apply invoke "make" "mrproper" make-flags)
(setenv "SDL_VIDEODRIVER" "dummy")
(setenv "PAGER" "cat")
(apply invoke "make" test-target make-flags))))))
'()))))
(description (string-append
(package-description u-boot)
" This package provides board-independent tools "
"of U-Boot."))))
(define-public python-u-boot-pylib
(package
(inherit u-boot)
(name "python-u-boot-pylib")
(build-system pyproject-build-system)
(arguments
(list
#:phases
#~(modify-phases %standard-phases
(add-after 'unpack 'chdir
(lambda _
(chdir "tools/u_boot_pylib")))
(add-after 'chdir 'list-package
(lambda _
(let ((port (open-file "pyproject.toml" "a")))
(display "[tool.setuptools.packages.find]\n" port)
(display "where = [\"..\"]\n" port)
(display "include = [\"u_boot_pylib*\"]" port)
(close-port port))))
(replace 'check
(lambda* (#:key tests? #:allow-other-keys)
(when tests?
(invoke "./u_boot_pylib")))))))
(synopsis "U-Boot Python library")
(description "This package provides common Python code used by some of the
commands part of the U-Boot project, such as Patman.")))
;;; This is packaged separately, as it can be used in other contexts than for
;;; U-Boot development.
(define-public patman
(package
(inherit u-boot)
(name "patman")
(build-system pyproject-build-system)
(arguments
;; The test suite strongly relies on the git metadata being available (23
;; failed, 14 passed).
(list
#:tests? #f
#:phases
#~(modify-phases %standard-phases
;; Patman fails to run during 'sanity-check phase, as it needs to be
;; run within a git directory.
(delete 'sanity-check)
(add-after 'unpack 'chdir
(lambda _
(chdir "tools/patman")))
(add-after 'install 'wrap-script
(lambda* (#:key inputs #:allow-other-keys)
(wrap-script (string-append #$output "/bin/patman")
`("PATH" ":" prefix
(,(string-append #$(this-package-input "git") "/bin")))
`("GIT_EXEC_PATH" ":" prefix
(,(dirname (search-input-file
inputs "libexec/git-core/git-commit"))
,(dirname (search-input-file
inputs
"libexec/git-core/git-send-email"))))))))))
(inputs
(list git
`(,git "send-email")
guile-3.0/pinned ;for wrap-script
python-pygit2
python-requests
python-u-boot-pylib))
(synopsis "Patch automation tool")
(description "Patman is a patch automation script which:
@itemize
@item Creates patches directly from your branch
@item Cleans them up by removing unwanted tags
@item Inserts a cover letter with change lists
@item Runs the patches through automated checks
@item Optionally emails them out to selected people.
@end itemize")))
(define*-public (make-u-boot-package board triplet
#:key
defconfig
configs
name-suffix
append-description
(u-boot u-boot))
"Return a U-Boot package for BOARD cross-compiled for TRIPLET with the
optional DEFCONFIG file and optional configuration changes from CONFIGS.
TRIPLET may also be set to #f to disable cross-compilation. NAME-SUFFIX is
appended to the package name, while APPEND-DESCRIPTION is appended to the
package description. U-BOOT can be used when a fork or a different version of
U-Boot must be used."
(let ((native-build? (lambda ()
(or (not triplet) ;disable cross-compilation
(string=? (%current-system)
(gnu-triplet->nix-system triplet))))))
(package
(inherit u-boot)
(name (string-append (downstream-package-name "u-boot-" board)
(or name-suffix "")))
(description (if append-description
(string-append (package-description u-boot)
"\n\n" append-description)
(package-description u-boot)))
(build-system gnu-build-system)
(arguments
(substitute-keyword-arguments (package-arguments u-boot)
((#:target _ #f)
(and (not (native-build?)) triplet))
((#:modules modules '())
`((ice-9 ftw)
(srfi srfi-1)
(guix build gnu-build-system)
(guix build kconfig)
(guix build utils)
,@modules))
((#:imported-modules imported-modules '())
`((guix build kconfig)
,@%default-gnu-imported-modules
,@imported-modules))
((#:test-target _ "test")
"test")
((#:make-flags make-flags '())
#~(list "HOSTCC=gcc"
"KBUILD_VERBOSE=1"
#$@(if (not (native-build?))
(list (string-append "CROSS_COMPILE=" triplet "-"))
'())
#$@make-flags))
((#:phases phases '%standard-phases)
#~(modify-phases #$phases
(replace 'configure
(lambda* (#:key make-flags #:allow-other-keys)
(let* ((config-name (string-append #$board "_defconfig"))
(config-file (string-append "configs/" config-name))
(defconfig #$defconfig)
(configs '#$configs))
(when defconfig
;; Replace the board-specific defconfig with the given
;; one.
(copy-file defconfig config-file))
(if (file-exists? config-file)
(begin
(when configs
(modify-defconfig config-file configs))
(apply invoke "make" `(,@make-flags ,config-name))
(verify-config ".config" config-file))
(begin
(display "invalid board name; valid board names are:"
(current-error-port))
(let ((suffix-len (string-length "_defconfig"))
(entries (scandir "configs")))
(for-each (lambda (file-name)
(when (string-suffix? "_defconfig"
file-name)
(format (current-error-port)
"- ~A\n"
(string-drop-right
file-name suffix-len))))
(sort entries string-ci<)))
(error "invalid boardname ~s" #$board))))))
(add-after 'configure 'disable-tools-libcrypto
;; Disable libcrypto due to GPL and OpenSSL license
;; incompatibilities
(lambda _
(substitute* ".config"
(("CONFIG_TOOLS_LIBCRYPTO=.*$")
"CONFIG_TOOLS_LIBCRYPTO=n
CONFIG_TOOLS_KWBIMAGE=n"))))
(replace 'install
(lambda _
(let ((libexec (string-append #$output "/libexec"))
(uboot-files
(append
(remove
;; Those would not be reproducible
;; because of the randomness used to
;; produce them. It's expected that the
;; user will use u-boot-tools to generate
;; them instead.
(lambda (name)
(string-suffix?
"sunxi-spl-with-ecc.bin"
name))
(find-files "."
".*\\.(bin|efi|img|imx|spl|itb|dtb|rksd)$"))
(find-files "." "^(MLO|SPL)$"))))
(mkdir-p libexec)
(install-file ".config" libexec)
;; Useful for "qemu -kernel".
(install-file "u-boot" libexec)
(for-each
(lambda (file)
(let ((target-file (string-append libexec "/" file)))
(mkdir-p (dirname target-file))
(copy-file file target-file)))
uboot-files)))))))))))
(define*-public (make-u-boot-sunxi64-package board triplet ;;scp-firmware
#:key defconfig configs)
(let ((base (make-u-boot-package
board triplet #:defconfig defconfig #:configs configs)))
(package
(inherit base)
(arguments
(substitute-keyword-arguments (package-arguments base)
((#:phases phases)
#~(modify-phases #$phases
(add-after 'unpack 'set-environment
(lambda* (#:key native-inputs inputs #:allow-other-keys)
;;(setenv "SCP" (search-input-file
;; (or native-inputs inputs) "libexec/scp.bin"))
(setenv "BL31" (search-input-file inputs "bl31.bin"))))))))
;;(native-inputs
;; (modify-inputs (package-native-inputs base)
;; (append (force scp-firmware))))
(inputs
(modify-inputs (package-inputs base)
(append arm-trusted-firmware-sun50i-h616))))))
(define-public u-boot-rg35xx
(make-u-boot-sunxi64-package "anbernic_rg35xx_h700" "aarch64-linux-gnu"
))

1788
skg/packages/firmware.scm Normal file

File diff suppressed because it is too large Load diff

65
skg/packages/u-boot.scm Normal file
View file

@ -0,0 +1,65 @@
(define-module (skg packages u-boot)
#:use-module (gnu bootloader extlinux)
#:use-module (gnu bootloader)
#:use-module (skg packages bootloaders)
#:use-module (guix gexp)
#:use-module (ice-9 match)
#:export (u-boot-bootloader
u-boot-rg35xx-bootloader))
(define (make-u-boot-installer file)
(let ((file
(match file
((? string?)
(list #~(install-file (string-append bootloader #$file)
install-dir)))
((? file-like?) (list #~(install-file #$file install-dir)))
(#f '()))))
#~(lambda (bootloader device mount-point)
(let ((install-dir (string-append mount-point "/boot")))
#$@file))))
(define install-u-boot
#~(lambda (bootloader root-index image)
(if bootloader
(error "Failed to install U-Boot"))))
(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 u-boot-bootloader
(bootloader
(inherit extlinux-bootloader)
(name 'u-boot)
(package #f)
(installer #f)
(disk-image-installer install-u-boot)))
(define u-boot-allwinner-bootloader
(bootloader
(inherit u-boot-bootloader)
(disk-image-installer install-allwinner-u-boot)))
(define u-boot-allwinner64-bootloader
(bootloader
(inherit u-boot-bootloader)
(disk-image-installer install-allwinner64-u-boot)))
(define u-boot-rg35xx-bootloader
(bootloader
(inherit u-boot-allwinner64-bootloader)
(package u-boot-rg35xx)))