From 89ab0d27c99ce4899829ab45001c0955db1149ab Mon Sep 17 00:00:00 2001 From: Denis 'GNUtoo' Carikli Date: Thu, 7 Jan 2021 00:56:11 +0100 Subject: libre: uboot4extlinux-sunxi: lower maintenance costs - We can now do cross builds of u-boot: - We can now more easily work on the package as we don't need an ARM computer for that anymore. - It also enable people already using Parabola on x86 to more easily install, test, or repair u-boot for an ARM computer as users can simply install it on microSD cards without needing to use ARM chroots. - There is now an install script to install u-boot: - It makes things easier for users as it is more similar to grub-install than dd commands. - It also does many checks at the same time to avoid data loss. - The commands to split packages are now shared between all package_ functions. This lower maintenance. - How to add a new board has been made more clear. Comparison with other distributions (for consistency): - u-boot doesn't have anything to handle the installation and update of u-boot binaries if UEFI is not used. - Debian has an u-boot-install-sunxi script which handles way more cases than what I wrote (it even handles GPT and so on and even has a manual), but there seems to be no tools to update u-boot. - Openembedded doesn't seem to have anything special in the u-boot recipe in openembedded-core Signed-off-by: Denis 'GNUtoo' Carikli --- .../0001-Add-tool-to-dump-sunxi-images.patch | 85 +++ libre/uboot4extlinux-sunxi/PKGBUILD | 600 +++++++++++++-------- libre/uboot4extlinux-sunxi/TODO.txt | 39 ++ .../generate-uboot4extlinux-sunxi-install-text.sh | 141 +++++ .../install-uboot4extlinux.sh.in | 88 +++ .../uboot4extlinux-sunxi.hook.in | 11 + .../uboot4extlinux-sunxi.install | 35 -- 7 files changed, 734 insertions(+), 265 deletions(-) create mode 100644 libre/uboot4extlinux-sunxi/0001-Add-tool-to-dump-sunxi-images.patch create mode 100644 libre/uboot4extlinux-sunxi/TODO.txt create mode 100644 libre/uboot4extlinux-sunxi/generate-uboot4extlinux-sunxi-install-text.sh create mode 100644 libre/uboot4extlinux-sunxi/install-uboot4extlinux.sh.in create mode 100644 libre/uboot4extlinux-sunxi/uboot4extlinux-sunxi.hook.in delete mode 100644 libre/uboot4extlinux-sunxi/uboot4extlinux-sunxi.install diff --git a/libre/uboot4extlinux-sunxi/0001-Add-tool-to-dump-sunxi-images.patch b/libre/uboot4extlinux-sunxi/0001-Add-tool-to-dump-sunxi-images.patch new file mode 100644 index 000000000..ee89767f2 --- /dev/null +++ b/libre/uboot4extlinux-sunxi/0001-Add-tool-to-dump-sunxi-images.patch @@ -0,0 +1,85 @@ +From b4e67c5112b8d8ec8f9255af057c3515c5ea71c1 Mon Sep 17 00:00:00 2001 +From: Denis 'GNUtoo' Carikli +Date: Sat, 29 May 2021 19:14:22 +0200 +Subject: [PATCH] Add tool to dump sunxi images + + $./tools/dumpimage -l ~/work/temp/lime1.img + Allwinner eGON image, size: 24576 bytes + SPL header version 0.2 + DT name: sun7i-a20-olinuxino-lime2-emmc + $ ./tools/dumpimage -l ~/work/temp/parabola.img + Allwinner eGON image, size: 24576 bytes + SPL header version 0.2 + DT name: sun7i-a20-olinuxino-lime2-emmc + +TODO: +- why do we have the lime2 dt detected above? is the + env a leftover from the previous image somehow? +- Handle block devices: + $ sudo ./tools/dumpimage -l /dev/sdb + Image Type: MVEBU Boot from (null) Image + Image version:0 + Data Size: -4 Bytes = 4194304.00 KiB = 4096.00 MiB + Load Address: 00000000 + Entry Point: 00000000 +- Make it easily parsable by tools +- Force type to sunxi_egon + +Signed-off-by: Denis 'GNUtoo' Carikli +--- + tools/dumpimage.c | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +diff --git a/tools/dumpimage.c b/tools/dumpimage.c +index e5481435a7..9d0d0c448b 100644 +--- a/tools/dumpimage.c ++++ b/tools/dumpimage.c +@@ -71,6 +71,9 @@ int main(int argc, char **argv) + char *ptr; + int retval = EXIT_SUCCESS; + struct image_type_params *tparams = NULL; ++ off_t offset = 0; ++ ++ offset = 8192; /* Allwinner SOCs */ + + params.cmdname = *argv; + +@@ -159,6 +162,14 @@ int main(int argc, char **argv) + exit(EXIT_FAILURE); + } + ++ /* Handle block devices */ ++ if (sbuf.st_size == 0) { ++ /* 1M should be sufficient as we have the first partition that ++ * is typically aligned at 1M for MBR partitioning. ++ */ ++ sbuf.st_size = 1024*1024; ++ } ++ + if ((uint32_t)sbuf.st_size < tparams->header_size) { + fprintf(stderr, "%s: Bad size: \"%s\" is not valid image\n", + params.cmdname, params.imagefile); +@@ -182,7 +193,7 @@ int main(int argc, char **argv) + * Extract the data files from within the matched + * image type. Returns the error code if not matched + */ +- retval = dumpimage_extract_subimage(tparams, ptr, &sbuf); ++ retval = dumpimage_extract_subimage(tparams, ptr + offset, &sbuf); + if (retval) + fprintf(stderr, "%s: Can't extract subimage from %s\n", + params.cmdname, params.imagefile); +@@ -191,10 +202,9 @@ int main(int argc, char **argv) + * Print the image information for matched image type + * Returns the error code if not matched + */ +- retval = imagetool_verify_print_header(ptr, &sbuf, tparams, ++ retval = imagetool_verify_print_header(ptr + offset, &sbuf, tparams, + ¶ms); + } +- + (void)munmap((void *)ptr, sbuf.st_size); + (void)close(ifd); + +-- +2.31.1 + diff --git a/libre/uboot4extlinux-sunxi/PKGBUILD b/libre/uboot4extlinux-sunxi/PKGBUILD index f3d069855..a9577d4d3 100644 --- a/libre/uboot4extlinux-sunxi/PKGBUILD +++ b/libre/uboot4extlinux-sunxi/PKGBUILD @@ -2,9 +2,38 @@ # Maintainer: Isaac David # Contributor: AndrĂ© Silva # Contributor: Timothy Redaelli +# Contributor: Denis 'GNUtoo' Carikli + +# To add a new board (that uses an Allwinner System On a Chip) you need: +# - The package name. Example: uboot4extlinux-a20-olinuxino_micro +# - The u-boot configuration. Example: A20-OLinuXino_MICRO_defconfig +# - The name of the board(s). Example: A20 OLinuXino Micro +# A single package / u-boot configuration sometimes support multiple +# boards and the configuration name doesn't always have the boards names +# in it. Example: uboot4extlinux-am335x_bone supports various BeagleBones, +# the AM335x GP EVM and the EVM SK all in one u-boot binary and package. +# - If relevant, the packages it replaces, if there are older u-boot packages +# also supporting that board. Example:uboot-a20-olinuxino-micro +# +# Ideally we'd like to enable people to only add these 4 variables in this +# package to add a new board. These 4 variables could go in something like +# a CVS file that is parsed, but that would require to be able to dynamically +# define packages, but even if eval package_{$_pkgname}() { [...] } works, +# it doesn't make that package function visible to makepkg. +# +# Because of that, contributors wanting to add new boards will have to search +# for example of the information mentioned above and add it in the PKGBUILD +# for their boards. +# +# After adding a new board in this PKGBUILD, to get the board officially +# supported by Parabola.you also need to create a page for it in the +# Parabola wiki for that board and update the ARM installation guide to +# point to it when relevant. Examples of that are available for other +# boards in the ARM installation guide. pkgbase=uboot4extlinux-sunxi -pkgname=('uboot4extlinux-a10-olinuxino-lime' +pkgname=("${pkgbase}" + 'uboot4extlinux-a10-olinuxino-lime' 'uboot4extlinux-a10s-olinuxino-m' 'uboot4extlinux-a13-olinuxino' 'uboot4extlinux-a13-olinuxinom' @@ -25,330 +54,441 @@ pkgname=('uboot4extlinux-a10-olinuxino-lime' 'uboot4extlinux-orangepi_one' 'uboot4extlinux-orangepi_pc' 'uboot4extlinux-orangepi_plus') + pkgver=2020.04 pkgrel=1 -arch=('armv7h') +arch=('armv7h' 'i686' 'ppc64le' 'x86_64') url="http://git.denx.de/u-boot.git/" license=('GPL') makedepends=('bc' 'dtc' 'python' 'python2' 'swig') -backup=(boot/extlinux/extlinux.conf) +makedepends_i686+=('arm-none-eabi-gcc') +makedepends_ppc64le+=('arm-none-eabi-gcc') +makedepends_x86_64+=('arm-none-eabi-gcc') source=("ftp://ftp.denx.de/pub/u-boot/u-boot-${pkgver}.tar.bz2" - 'extlinux.conf') + 'extlinux.conf' + "${pkgbase}.hook.in" + 'install-uboot4extlinux.sh.in' + "generate-${pkgbase}-install-text.sh") sha256sums=('fe732aaf037d9cc3c0909bad8362af366ae964bbdac6913a34081ff4ad565372' + 'SKIP' + 'SKIP' + 'SKIP' 'SKIP') -boards=('A10-OLinuXino-Lime' - 'A10s-OLinuXino-M' - 'A13-OLinuXino' - 'A13-OLinuXinoM' - 'A20-OLinuXino-Lime' - 'A20-OLinuXino-Lime2' - 'A20-OLinuXino-Lime2-eMMC' - 'A20-OLinuXino_MICRO' - 'Bananapi' - 'Bananapro' - 'CHIP' - 'Cubieboard' - 'Cubieboard2' - 'Cubietruck' - 'Linksprite_pcDuino' - 'Linksprite_pcDuino3' - 'Linksprite_pcDuino3_Nano' - 'orangepi_2' - 'orangepi_one' - 'orangepi_pc' - 'orangepi_plus') - -build() { - cd u-boot-${pkgver} +_defconfigs=('A10-OLinuXino-Lime_defconfig' + 'A10s-OLinuXino-M_defconfig' + 'A13-OLinuXino_defconfig' + 'A13-OLinuXinoM_defconfig' + 'A20-OLinuXino-Lime_defconfig' + 'A20-OLinuXino-Lime2_defconfig' + 'A20-OLinuXino-Lime2-eMMC_defconfig' + 'A20-OLinuXino_MICRO_defconfig' + 'Bananapi_defconfig' + 'Bananapro_defconfig' + 'CHIP_defconfig' + 'Cubieboard_defconfig' + 'Cubieboard2_defconfig' + 'Cubietruck_defconfig' + 'Linksprite_pcDuino_defconfig' + 'Linksprite_pcDuino3_defconfig' + 'Linksprite_pcDuino3_Nano_defconfig' + 'orangepi_2_defconfig' + 'orangepi_one_defconfig' + 'orangepi_pc_defconfig' + 'orangepi_plus_defconfig') + +# Offset at which to install u-boot +u_boot_with_spl_offset=8192 + +case "$CARCH" in + armv7h) ARCH=arm;; + i686|ppc64le|x86_64) ARCH=arm;CROSS_COMPILE=arm-none-eabi-;; +esac + +_nr_targets=0 +for _defconfig in ${_defconfigs[@]}; do + _nr_targets=$(expr ${_nr_targets} + 1) +done + +_get_target_name() +{ + _defconfig="$1" + + echo ${_defconfig} | \ + sed 's/_defconfig$//' | \ + awk '{print tolower($0)}' +} + +_get_target_destdir() +{ + _defconfig="$1" + + _target_name="$(_get_target_name ${_defconfig})" + + echo "build/uboot4extlinux-${_target_name}" +} + +_build_uboot_target() +{ + _defconfig="$1" + + _destdir="$(_get_target_destdir ${_defconfig})" + _target_name="$(_get_target_name ${_defconfig})" - unset CFLAGS CXXFLAGS LDFLAGS + unset CFLAGS CXXFLAGS LDFLAGS + + make "ARCH=${ARCH}" distclean + make "ARCH=${ARCH}" ${_defconfig} - for i in ${boards[@]}; do - mkdir -p ../bin_${i} - make distclean - make ${i}_defconfig echo 'CONFIG_IDENT_STRING=" Parabola GNU/Linux-libre"' >> .config - make EXTRAVERSION=-${pkgrel} - mv -f u-boot-sunxi-with-spl.bin ../bin_${i} + + if [ "$CARCH" = "armv7h" ]; then + make "ARCH=${ARCH}" EXTRAVERSION=-${pkgrel} + else + make "ARCH=${ARCH}" "CROSS_COMPILE=${CROSS_COMPILE}" \ + EXTRAVERSION=-${pkgrel} + fi + + echo "==> Installing ${_target_name} to ${_destdir}" + install -d ${_destdir} + mv -f u-boot-sunxi-with-spl.bin "${_destdir}" + +} + +build() +{ + cd u-boot-${pkgver} + + _target_nr=0 + for _defconfig in ${_defconfigs[@]}; do + _target_nr=$(expr ${_target_nr} + 1) + _target_name="$(_get_target_name ${_defconfig})" + + echo "==> Building ${_target_name} " \ + "[${_target_nr} of ${_nr_targets} targets]" + + _build_uboot_target "${_defconfig}" + done +} + +_check_uboot_target() +{ + _defconfig="$1" + + _image="$(_get_target_destdir ${_defconfig})/u-boot-sunxi-with-spl.bin" + _image_size="$(du --bytes --apparent-size ${_image} | awk '{print $1}')" + _offset="${u_boot_with_spl_offset}" + + _image_end=$(expr ${_image_size} + ${_offset}) + + # This test comes from install-uboot4extlinux.sh.in + if [ ${_image_end} -gt $(expr 1024 \* 1024) ] ; then + echo "Error: ${_image} is too big:" + echo " offset: ${_offset}" + echo " size: ${_image_size}" + echo " By default, "\ + "partitioing tools makes the first partition start at 1MiB" + echo " Instaling ${_image} "\ + "would overwrite that first partition (if it's present)." + + false # Fail the test + fi +} + +check() +{ + cd u-boot-${pkgver} + + _target_nr=0 + for _defconfig in ${_defconfigs[@]}; do + _target_nr=$(expr ${_target_nr} + 1) + _target_name="$(_get_target_name ${_defconfig})" + + echo "==> Testing target ${_target_name} " \ + "[${_target_nr} of ${_nr_targets} targets]" + _check_uboot_target "${_defconfig}" done + } -package_uboot4extlinux-a10-olinuxino-lime() { - pkgdesc="U-Boot with Extlinux support for A10 OLinuXino Lime" - install=${pkgbase}.install - provides=('uboot4extlinux-sunxi') - conflicts=('uboot-sunxi' 'uboot4extlinux-sunxi' 'uboot4grub-sunxi') +_make_uboot_package() +{ + _pkgname="$1" + + if [ -n "${pkgdir}" ] ; then + cd "u-boot-${pkgver}" + + # Install the u-boot binary + install -d "${pkgdir}/usr/lib/u-boot/${_pkgname}/" + install -Dm644 "build/${_pkgname}/u-boot-sunxi-with-spl.bin" \ + "${pkgdir}/usr/lib/u-boot/${_pkgname}" + + # Install the u-boot installation script + sed < "${srcdir}/install-uboot4extlinux.sh.in" > \ + "${pkgdir}/usr/lib/u-boot/${_pkgname}/install-uboot4extlinux.sh" \ + -e "s|@u_boot_with_spl[@]|/usr/lib/u-boot/${_pkgname}/u-boot-sunxi-with-spl.bin|g" \ + -e "s|@u_boot_with_spl_offset[@]|${u_boot_with_spl_offset}|g" + + chmod +x \ + "${pkgdir}/usr/lib/u-boot/${_pkgname}/install-uboot4extlinux.sh" + + # Install what is required for the pacman hook + install -d "${pkgdir}/usr/share/libalpm/hooks/" + sed < "${srcdir}/${pkgbase}.hook.in" > \ + "${pkgdir}/usr/share/libalpm/hooks/${_pkgname}.hook" \ + -e "s|@pkgname[@]|${_pkgname}|g" + + install -d "${pkgdir}/usr/share/doc/u-boot/${_pkgname}/" + # If we install several uboot4extlinux, we need a way to clearly + # separate each postinstall message. To do that we wrapped the + # text in an ASCII art square, but doing that is complicated when + # using sed as the package name as well as the installation script + # path both have variable length. + sh "${srcdir}/generate-${pkgbase}-install-text.sh" \ + "${_pkgname}" \ + "${pkgbase}" \ + "/usr/lib/u-boot/${_pkgname}/install-uboot4extlinux.sh" > \ + "${pkgdir}/usr/share/doc/u-boot/${_pkgname}/install-uboot4extlinux.txt" + fi +} + +_make_pkgdesc() +{ + board_name="$1" + echo "U-Boot with Extlinux support for ${board_name}" +} - install -d "${pkgdir}"/boot/extlinux - install -d "${pkgdir}"/boot/u-boot/images/ - install -Dm644 bin_A10-OLinuXino-Lime/u-boot-sunxi-with-spl.bin "${pkgdir}"/boot/u-boot/images/ +package_uboot4extlinux-sunxi() +{ + pkgdesc="Scripts for managing U-Boot installations for computers with Allwinner System On a Chip" - install -Dm644 extlinux.conf "${pkgdir}"/boot/extlinux + depends=('uboot-tools') + + # Users are expected to use this as a base for /boot/extlinux/extlinux.conf + install -d "${pkgdir}/usr/lib/u-boot/${pkgname}/" + install -Dm644 \ + "${srcdir}/extlinux.conf" \ + "${pkgdir}/usr/lib/u-boot/${pkgname}/" } -package_uboot4extlinux-a10s-olinuxino-m() { - pkgdesc="U-Boot with Extlinux support for A10s OLinuXino Micro" - install=${pkgbase}.install - provides=('uboot4extlinux-sunxi') - conflicts=('uboot-sunxi' 'uboot4extlinux-sunxi' 'uboot4grub-sunxi') - replaces=('uboot4extlinux-a10s-olinuxino-micro') +package_uboot4extlinux-a10-olinuxino-lime() +{ + pkgdesc=$(_make_pkgdesc "A10 OLinuXino Lime") - install -d "${pkgdir}"/boot/extlinux - install -d "${pkgdir}"/boot/u-boot/images/ - install -Dm644 bin_A10s-OLinuXino-M/u-boot-sunxi-with-spl.bin "${pkgdir}"/boot/u-boot/images/ + # util-linux is needed for blkid for install-uboot4extlinux.sh + depends=("${pkgbase}" 'util-linux') - install -Dm644 extlinux.conf "${pkgdir}"/boot/extlinux + _make_uboot_package "${pkgname}" } -package_uboot4extlinux-a13-olinuxino() { - pkgdesc="U-Boot with Extlinux support for A13 OLinuXino" - install=${pkgbase}.install - provides=('uboot4extlinux-sunxi') - conflicts=('uboot-sunxi' 'uboot4extlinux-sunxi' 'uboot4grub-sunxi') +package_uboot4extlinux-a10s-olinuxino-m() +{ + pkgdesc=$(_make_pkgdesc "A10s OLinuXino Micro") + + replaces=('uboot4extlinux-a10s-olinuxino-micro') - install -d "${pkgdir}"/boot/extlinux - install -d "${pkgdir}"/boot/u-boot/images/ - install -Dm644 bin_A13-OLinuXino/u-boot-sunxi-with-spl.bin "${pkgdir}"/boot/u-boot/images/ + # util-linux is needed for blkid for install-uboot4extlinux.sh + depends=("${pkgbase}" 'util-linux') - install -Dm644 extlinux.conf "${pkgdir}"/boot/extlinux + _make_uboot_package "${pkgname}" } -package_uboot4extlinux-a13-olinuxinom() { - pkgdesc="U-Boot with Extlinux support for A13 OLinuXino Micro" - install=${pkgbase}.install - provides=('uboot4extlinux-sunxi') - conflicts=('uboot-sunxi' 'uboot4extlinux-sunxi' 'uboot4grub-sunxi') - replaces=('uboot4extlinux-a13-olinuxino-micro') +package_uboot4extlinux-a13-olinuxino() +{ + pkgdesc=$(_make_pkgdesc "A13 OLinuXino") - install -d "${pkgdir}"/boot/extlinux - install -d "${pkgdir}"/boot/u-boot/images/ - install -Dm644 bin_A13-OLinuXinoM/u-boot-sunxi-with-spl.bin "${pkgdir}"/boot/u-boot/images/ + # util-linux is needed for blkid for install-uboot4extlinux.sh + depends=("${pkgbase}" 'util-linux') - install -Dm644 extlinux.conf "${pkgdir}"/boot/extlinux + _make_uboot_package "${pkgname}" } -package_uboot4extlinux-a20-olinuxino-lime() { - pkgdesc="U-Boot with Extlinux support for A20 OLinuXino Lime" - install=${pkgbase}.install - provides=('uboot4extlinux-sunxi') - conflicts=('uboot-sunxi' 'uboot4extlinux-sunxi' 'uboot4grub-sunxi') +package_uboot4extlinux-a13-olinuxinom() +{ + pkgdesc=$(_make_pkgdesc "uboot4extlinux-a13-olinuxino-micro") + + replaces=('uboot4extlinux-a13-olinuxino-micro') - install -d "${pkgdir}"/boot/extlinux - install -d "${pkgdir}"/boot/u-boot/images/ - install -Dm644 bin_A20-OLinuXino-Lime/u-boot-sunxi-with-spl.bin "${pkgdir}"/boot/u-boot/images/ + # util-linux is needed for blkid for install-uboot4extlinux.sh + depends=("${pkgbase}" 'util-linux') - install -Dm644 extlinux.conf "${pkgdir}"/boot/extlinux + _make_uboot_package "${pkgname}" } -package_uboot4extlinux-a20-olinuxino-lime2() { - pkgdesc="U-Boot with Extlinux support for A20 OLinuXino Lime2" - install=${pkgbase}.install - provides=('uboot4extlinux-sunxi') - conflicts=('uboot-sunxi' 'uboot4extlinux-sunxi' 'uboot4grub-sunxi') +package_uboot4extlinux-a20-olinuxino-lime() +{ + pkgdesc=$(_make_pkgdesc "A20 OLinuXino Lime") - install -d "${pkgdir}"/boot/extlinux - install -d "${pkgdir}"/boot/u-boot/images/ - install -Dm644 bin_A20-OLinuXino-Lime2/u-boot-sunxi-with-spl.bin "${pkgdir}"/boot/u-boot/images/ + # util-linux is needed for blkid for install-uboot4extlinux.sh + depends=("${pkgbase}" 'util-linux') - install -Dm644 extlinux.conf "${pkgdir}"/boot/extlinux + _make_uboot_package "${pkgname}" } -package_uboot4extlinux-a20-olinuxino-lime2-emmc() { - pkgdesc="U-Boot with Extlinux support for A20 OLinuXino Lime2 with eMMC" - install=${pkgbase}.install - provides=('uboot4extlinux-sunxi') - conflicts=('uboot-sunxi' 'uboot4extlinux-sunxi' 'uboot4grub-sunxi') +package_uboot4extlinux-a20-olinuxino-lime2() +{ + pkgdesc=$(_make_pkgdesc "A20 OLinuXino Lime2") - install -d "${pkgdir}"/boot/extlinux - install -d "${pkgdir}"/boot/u-boot/images/ - install -Dm644 bin_A20-OLinuXino-Lime2-eMMC/u-boot-sunxi-with-spl.bin "${pkgdir}"/boot/u-boot/images/ + # util-linux is needed for blkid for install-uboot4extlinux.sh + depends=("${pkgbase}" 'util-linux') - install -Dm644 extlinux.conf "${pkgdir}"/boot/extlinux + _make_uboot_package "${pkgname}" } -package_uboot4extlinux-a20-olinuxino_micro() { - pkgdesc="U-Boot with Extlinux support for A20 OLinuXino Micro" - install=${pkgbase}.install - provides=('uboot4extlinux-sunxi') - conflicts=('uboot-sunxi' 'uboot4extlinux-sunxi' 'uboot4grub-sunxi') - replaces=('uboot-a20-olinuxino-micro') +package_uboot4extlinux-a20-olinuxino-lime2-emmc() +{ + pkgdesc=$(_make_pkgdesc "A20 OLinuXino Lime2 with eMMC") - install -d "${pkgdir}"/boot/extlinux - install -d "${pkgdir}"/boot/u-boot/images/ - install -Dm644 bin_A20-OLinuXino_MICRO/u-boot-sunxi-with-spl.bin "${pkgdir}"/boot/u-boot/images/ + # util-linux is needed for blkid for install-uboot4extlinux.sh + depends=("${pkgbase}" 'util-linux') - install -Dm644 extlinux.conf "${pkgdir}"/boot/extlinux + _make_uboot_package "${pkgname}" } -package_uboot4extlinux-bananapi() { - pkgdesc="U-Boot with Extlinux support for Banana Pi" - install=${pkgbase}.install - provides=('uboot4extlinux-sunxi') - conflicts=('uboot-sunxi' 'uboot4extlinux-sunxi' 'uboot4grub-sunxi') +package_uboot4extlinux-a20-olinuxino_micro() +{ + pkgdesc=$(_make_pkgdesc "uboot-a20-olinuxino-micro") - install -d "${pkgdir}"/boot/extlinux - install -d "${pkgdir}"/boot/u-boot/images/ - install -Dm644 bin_Bananapi/u-boot-sunxi-with-spl.bin "${pkgdir}"/boot/u-boot/images/ + replaces=('uboot-a20-olinuxino-micro') - install -Dm644 extlinux.conf "${pkgdir}"/boot/extlinux + # util-linux is needed for blkid for install-uboot4extlinux.sh + depends=("${pkgbase}" 'util-linux') + + _make_uboot_package "${pkgname}" } -package_uboot4extlinux-bananapro() { - pkgdesc="U-Boot with Extlinux support for Banana Pro" - install=${pkgbase}.install - provides=('uboot4extlinux-sunxi') - conflicts=('uboot-sunxi' 'uboot4extlinux-sunxi' 'uboot4grub-sunxi') +package_uboot4extlinux-bananapi() +{ + pkgdesc=$(_make_pkgdesc "Banana Pi") - install -d "${pkgdir}"/boot/extlinux - install -d "${pkgdir}"/boot/u-boot/images/ - install -Dm644 bin_Bananapro/u-boot-sunxi-with-spl.bin "${pkgdir}"/boot/u-boot/images/ + # util-linux is needed for blkid for install-uboot4extlinux.sh + depends=("${pkgbase}" 'util-linux') - install -Dm644 extlinux.conf "${pkgdir}"/boot/extlinux + _make_uboot_package "${pkgname}" } -package_uboot4extlinux-chip() { - pkgdesc="U-Boot with Extlinux support for C.H.I.P" - install=${pkgbase}.install - provides=('uboot4extlinux-sunxi') - conflicts=('uboot-sunxi' 'uboot4extlinux-sunxi' 'uboot4grub-sunxi') +package_uboot4extlinux-bananapro() +{ + pkgdesc=$(_make_pkgdesc "Banana Pro") - install -d "${pkgdir}"/boot/extlinux - install -d "${pkgdir}"/boot/u-boot/images/ - install -Dm644 bin_CHIP/u-boot-sunxi-with-spl.bin "${pkgdir}"/boot/u-boot/images/ + # util-linux is needed for blkid for install-uboot4extlinux.sh + depends=("${pkgbase}" 'util-linux') - install -Dm644 extlinux.conf "${pkgdir}"/boot/extlinux + _make_uboot_package "${pkgname}" } -package_uboot4extlinux-cubieboard() { - pkgdesc="U-Boot with Extlinux support for Cubieboard" - install=${pkgbase}.install - provides=('uboot4extlinux-sunxi') - conflicts=('uboot-sunxi' 'uboot4extlinux-sunxi' 'uboot4grub-sunxi') +package_uboot4extlinux-chip() +{ + PKGDESC=$(_make_pkgdesc "C.H.I.P") - install -d "${pkgdir}"/boot/extlinux - install -d "${pkgdir}"/boot/u-boot/images/ - install -Dm644 bin_Cubieboard/u-boot-sunxi-with-spl.bin "${pkgdir}"/boot/u-boot/images/ + # util-linux is needed for blkid for install-uboot4extlinux.sh + depends=("${pkgbase}" 'util-linux') - install -Dm644 extlinux.conf "${pkgdir}"/boot/extlinux + _make_uboot_package "${pkgname}" } -package_uboot4extlinux-cubieboard2() { - pkgdesc="U-Boot with Extlinux support for Cubieboard 2" - install=${pkgbase}.install - provides=('uboot4extlinux-sunxi') - conflicts=('uboot-sunxi' 'uboot4extlinux-sunxi' 'uboot4grub-sunxi') +package_uboot4extlinux-cubieboard() +{ + pkgdesc=$(_make_pkgdesc "Cubieboard") - install -d "${pkgdir}"/boot/extlinux - install -d "${pkgdir}"/boot/u-boot/images/ - install -Dm644 bin_Cubieboard2/u-boot-sunxi-with-spl.bin "${pkgdir}"/boot/u-boot/images/ + # util-linux is needed for blkid for install-uboot4extlinux.sh + depends=("${pkgbase}" 'util-linux') - install -Dm644 extlinux.conf "${pkgdir}"/boot/extlinux + _make_uboot_package "${pkgname}" } -package_uboot4extlinux-cubietruck() { - pkgdesc="U-Boot with Extlinux support for Cubietruck" - install=${pkgbase}.install - provides=('uboot4extlinux-sunxi') - conflicts=('uboot-sunxi' 'uboot4extlinux-sunxi' 'uboot4grub-sunxi') +package_uboot4extlinux-cubieboard2() +{ + pkgdesc=$(_make_pkgdesc "Cubieboard 2") - install -d "${pkgdir}"/boot/extlinux - install -d "${pkgdir}"/boot/u-boot/images/ - install -Dm644 bin_Cubietruck/u-boot-sunxi-with-spl.bin "${pkgdir}"/boot/u-boot/images/ + # util-linux is needed for blkid for install-uboot4extlinux.sh + depends=("${pkgbase}" 'util-linux') - install -Dm644 extlinux.conf "${pkgdir}"/boot/extlinux + _make_uboot_package "${pkgname}" } -package_uboot4extlinux-linksprite_pcduino() { - pkgdesc="U-Boot with Extlinux support for pcDuino" - install=${pkgbase}.install - provides=('uboot4extlinux-sunxi') - conflicts=('uboot-sunxi' 'uboot4extlinux-sunxi' 'uboot4grub-sunxi') - replaces=('uboot4extlinux-pcduino') +package_uboot4extlinux-cubietruck() +{ + pkgdesc=$(_make_pkgdesc "Cubietruck") - install -d "${pkgdir}"/boot/extlinux - install -d "${pkgdir}"/boot/u-boot/images/ - install -Dm644 bin_Linksprite_pcDuino/u-boot-sunxi-with-spl.bin "${pkgdir}"/boot/u-boot/images/ + # util-linux is needed for blkid for install-uboot4extlinux.sh + depends=("${pkgbase}" 'util-linux') - install -Dm644 extlinux.conf "${pkgdir}"/boot/extlinux + _make_uboot_package "${pkgname}" } -package_uboot4extlinux-linksprite_pcduino3() { - pkgdesc="U-Boot with Extlinux support for pcDuino3" - install=${pkgbase}.install - provides=('uboot4extlinux-sunxi') - conflicts=('uboot-sunxi' 'uboot4extlinux-sunxi' 'uboot4grub-sunxi') - replaces=('uboot4extlinux-pcduino3') +package_uboot4extlinux-linksprite_pcduino() +{ + pkgdesc=$(_make_pkgdesc "uboot4extlinux-pcduino") + + replaces=('uboot4extlinux-pcduino') - install -d "${pkgdir}"/boot/extlinux - install -d "${pkgdir}"/boot/u-boot/images/ - install -Dm644 bin_Linksprite_pcDuino3/u-boot-sunxi-with-spl.bin "${pkgdir}"/boot/u-boot/images/ + # util-linux is needed for blkid for install-uboot4extlinux.sh + depends=("${pkgbase}" 'util-linux') - install -Dm644 extlinux.conf "${pkgdir}"/boot/extlinux + _make_uboot_package "${pkgname}" } -package_uboot4extlinux-linksprite_pcduino3_nano() { - pkgdesc="U-Boot with Extlinux support for pcDuino3 Nano" - install=${pkgbase}.install - provides=('uboot4extlinux-sunxi') - conflicts=('uboot-sunxi' 'uboot4extlinux-sunxi' 'uboot4grub-sunxi') - replaces=('uboot4extlinux-pcduino3-nano') +package_uboot4extlinux-linksprite_pcduino3() +{ + pkgdesc=$(_make_pkgdesc "uboot4extlinux-pcduino3") + + replaces=('uboot4extlinux-pcduino3') + + # util-linux is needed for blkid for install-uboot4extlinux.sh + depends=("${pkgbase}" 'util-linux') + + _make_uboot_package "${pkgname}" +} + +package_uboot4extlinux-linksprite_pcduino3_nano() +{ + pkgdesc=$(_make_pkgdesc "uboot4extlinux-pcduino3-nano") + + replaces=('uboot4extlinux-pcduino3-nano') - install -d "${pkgdir}"/boot/extlinux - install -d "${pkgdir}"/boot/u-boot/images/ - install -Dm644 bin_Linksprite_pcDuino3_Nano/u-boot-sunxi-with-spl.bin "${pkgdir}"/boot/u-boot/images/ + # util-linux is needed for blkid for install-uboot4extlinux.sh + depends=("${pkgbase}" 'util-linux') - install -Dm644 extlinux.conf "${pkgdir}"/boot/extlinux + _make_uboot_package "${pkgname}" } -package_uboot4extlinux-orangepi_2() { - pkgdesc="U-Boot with Extlinux for Orange Pi 2" - install=${pkgbase}.install - provides=('uboot4extlinux-sunxi') - conflicts=('uboot-sunxi' 'uboot4extlinux-sunxi' 'uboot4grub-sunxi') +package_uboot4extlinux-orangepi_2() +{ + pkgdesc=$(_make_pkgdesc "Orange Pi 2") - install -d "${pkgdir}"/boot/extlinux - install -d "${pkgdir}"/boot/u-boot/images/ - install -Dm644 bin_orangepi_2/u-boot-sunxi-with-spl.bin "${pkgdir}"/boot/u-boot/images/ + # util-linux is needed for blkid for install-uboot4extlinux.sh + depends=("${pkgbase}" 'util-linux') - install -Dm644 extlinux.conf "${pkgdir}"/boot/extlinux + _make_uboot_package "${pkgname}" } -package_uboot4extlinux-orangepi_one() { - pkgdesc="U-Boot with Extlinux for Orange Pi One" - install=${pkgbase}.install - provides=('uboot4extlinux-sunxi') - conflicts=('uboot-sunxi' 'uboot4extlinux-sunxi' 'uboot4grub-sunxi') +package_uboot4extlinux-orangepi_one() +{ + pkgdesc=$(_make_pkgdesc "Orange Pi One") - install -d "${pkgdir}"/boot/extlinux - install -d "${pkgdir}"/boot/u-boot/images/ - install -Dm644 bin_orangepi_one/u-boot-sunxi-with-spl.bin "${pkgdir}"/boot/u-boot/images/ + # util-linux is needed for blkid for install-uboot4extlinux.sh + depends=("${pkgbase}" 'util-linux') - install -Dm644 extlinux.conf "${pkgdir}"/boot/extlinux + _make_uboot_package "${pkgname}" } -package_uboot4extlinux-orangepi_pc() { - pkgdesc="U-Boot with Extlinux for Orange Pi PC" - install=${pkgbase}.install - provides=('uboot4extlinux-sunxi') - conflicts=('uboot-sunxi' 'uboot4extlinux-sunxi' 'uboot4grub-sunxi') +package_uboot4extlinux-orangepi_pc() +{ + pkgdesc=$(_make_pkgdesc "Orange Pi PC") - install -d "${pkgdir}"/boot/extlinux - install -d "${pkgdir}"/boot/u-boot/images/ - install -Dm644 bin_orangepi_pc/u-boot-sunxi-with-spl.bin "${pkgdir}"/boot/u-boot/images/ + # util-linux is needed for blkid for install-uboot4extlinux.sh + depends=("${pkgbase}" 'util-linux') - install -Dm644 extlinux.conf "${pkgdir}"/boot/extlinux + _make_uboot_package "${pkgname}" } -package_uboot4extlinux-orangepi_plus() { - pkgdesc="U-Boot with Extlinux for Orange Pi Plus" - install=${pkgbase}.install - provides=('uboot4extlinux-sunxi') - conflicts=('uboot-sunxi' 'uboot4extlinux-sunxi' 'uboot4grub-sunxi') +package_uboot4extlinux-orangepi_plus() +{ + pkgdesc=$(_make_pkgdesc "Orange Pi Plus") - install -d "${pkgdir}"/boot/extlinux - install -d "${pkgdir}"/boot/u-boot/images/ - install -Dm644 bin_orangepi_plus/u-boot-sunxi-with-spl.bin "${pkgdir}"/boot/u-boot/images/ + # util-linux is needed for blkid for install-uboot4extlinux.sh + depends=("${pkgbase}" 'util-linux') - install -Dm644 extlinux.conf "${pkgdir}"/boot/extlinux + _make_uboot_package "${pkgname}" } diff --git a/libre/uboot4extlinux-sunxi/TODO.txt b/libre/uboot4extlinux-sunxi/TODO.txt new file mode 100644 index 000000000..1d8e08c63 --- /dev/null +++ b/libre/uboot4extlinux-sunxi/TODO.txt @@ -0,0 +1,39 @@ ++------+ +| TODO | ++------+ +- We could add automatic updates. It would require a bit of + work: + - u-boot has code to detect images. We could write a tool that + reuses that code to detect Allwinner eGON images. + See the 0001-Add-tool-to-dump-sunxi-images.patch for inspiration + on how to do that. + - Once done that tool could then be leveraged for detecting + u-boot installations and updating the u-boot images with a + pacman hook for devices that are booted. + - We could also check the devicetree to make sure we are + running on the right device. + - For chroots we could somehow detect that we are in a chroot + and find if there is an underlying block device, and upgrade + u-boot there. + - In any case we need to be careful not to break other computers: + some x86 laptops have eMMC too, and most of the time theses + eMMC also contains the BIOS and/or UEFI, so we don't want to + erase that. We also don't want to erase the laptop filesytems + either. +- We need to build some infrastructure for users to report working + boards and mention it here and on the wiki for adding official + support for boards. We could for instance do something as simple + as possible like open a new bug tracker specially for that and + just reference that in the wiki for instance. +- We also need to make dtb fragment work in u-boot to support more + use cases and possibly also package popular dtb fragment for the + beaglebone black. +- In addition we could then leverage that to build an image for + the beaglebone black (or other boards) for flashing Libreboot. + This way Libreboot would benefit from an FSDG compatible image + that is also maintained by an upstream distribution. +- We could also look maing an u-boot package that has UEFI compatibility + and also bundle GRUB with it. This way we could simplify the installation + instructions by leverage users knowledge about GRUB and also potentially + investigate if we could leverage the UEFI standard for easily upgrading + that u-boot+UEFI+grub image. diff --git a/libre/uboot4extlinux-sunxi/generate-uboot4extlinux-sunxi-install-text.sh b/libre/uboot4extlinux-sunxi/generate-uboot4extlinux-sunxi-install-text.sh new file mode 100644 index 000000000..e8c9c29a9 --- /dev/null +++ b/libre/uboot4extlinux-sunxi/generate-uboot4extlinux-sunxi-install-text.sh @@ -0,0 +1,141 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0+ +# Copyright (C) 2020 Denis 'GNUtoo' Carikli + +line_length=81 + +printchar() +{ + char="$1" + nr_chars="$2" + + if [ -z "${nr_chars}" ] ; then + echo -n "${char}" + else + i=0 + while [ $i -lt ${nr_chars} ] ; do + echo -n "${char}" + i=$(expr $i + 1) + done + fi +} + +print_separation_line() +{ + echo -n "+" + printchar "-" $(expr ${line_length} - 2) + echo "+" +} + +strlen() +{ + echo $(expr $(echo "$1" | wc -c) - 1) +} + +print_header() +{ + pkgname="$1" + + # ${line_length} + # - '| ' + # - ${pkgname} + # - ' ' + # - 'installation instructions:' + # - ' |' + extra_spaces=$(expr ${line_length} - 2 - $(strlen "${pkgname}") - 1) + extra_spaces=$(expr ${extra_spaces} - \ + $(strlen "installation instructions:") - 2) + + print_separation_line + echo -n "| " + echo -n "${pkgname} installation instructions:" + printchar " " "${extra_spaces}" + echo " |" + print_separation_line +} + +print_line() +{ + line="$1" + + # ${line_length} - '| ' - ${line} - ' |' + extra_spaces=$(expr ${line_length} - 2 - $(strlen "${line}") - 2) + echo -n '| ' + echo -n "${line}" + printchar " " "${extra_spaces}" + echo ' |' +} + +print_text() +{ + for line in "$@" ; do + print_line "${line}" + done +} + +print_introduction() +{ + print_text \ + "To boot with u-boot you will need to do two things:" \ + "- First you will need to install u-boot to the storage device (like" \ + " a microSD) you will be booting from. You can consult the Parabola" \ + " installation instructions to know which storage devices are" \ + " supported." \ + "- Then you will need to read and potentially modify the" \ + " /boot/extlinux/extlinux.conf configuration file to tell u-boot" \ + " from which kernel to boot, and various other settings related to" \ + " booting (like LVM or disk encryption settings)." +} + +print_uboot_install_instructions() +{ + pkgname="$1" + install_script="$2" + + print_text \ + "To install or upgrade u-boot you can use similar commands:" \ + " cd $(dirname ${script})" \ + " sudo ./$(basename ${script}) " + + print_line "" + + print_text \ + "For instance if the microSD you (will) boot from is available at" \ + "/dev/mmcblk0 you can use the following commands:" \ + " cd $(dirname ${script})" \ + " sudo ./$(basename ${script}) /dev/mmcblk0" + + print_line "" + + print_text \ + "Instead if the microSD is available at /dev/sdb you can use the" \ + "following commands:" \ + " cd $(dirname ${script})" \ + " sudo ./$(basename ${script}) /dev/sdb" +} + +print_extlinux_config_remainder() +{ + pkgbase="$1" + + print_text \ + "When this is done you'll need to create and/or modify the" \ + "/boot/extlinux/extlinux.conf configuration file." + print_line "" + + print_text \ + "There is an example file for that at" \ + "/usr/lib/u-boot/${pkgbase}/extlinux.conf" +} + +pkgname="$1" +pkgbase="$2" +script="$3" + +print_header "${pkgname}" +print_introduction +print_line " " +print_uboot_install_instructions "${pkgname}" "${script}" +print_line " " +print_extlinux_config_remainder "${pkgbase}" +print_separation_line diff --git a/libre/uboot4extlinux-sunxi/install-uboot4extlinux.sh.in b/libre/uboot4extlinux-sunxi/install-uboot4extlinux.sh.in new file mode 100644 index 000000000..1c744f313 --- /dev/null +++ b/libre/uboot4extlinux-sunxi/install-uboot4extlinux.sh.in @@ -0,0 +1,88 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0+ +# Copyright (C) 2020 Denis 'GNUtoo' Carikli + +progname="install-uboot4extlinux.sh" +u_boot_with_spl="@u_boot_with_spl@" +u_boot_with_spl_offset=@u_boot_with_spl_offset@ + +usage() +{ + echo "Usage: ${progname} [INSTALL_DEVICE]" +} + +install_image() +{ + install_device="$1" + offset="$2" + image="$3" + + # We need root permissions for now: + # - blkid is used to bypass caching and it needs root access + if [ "$(id -u)" != 0 ] ; then + echo "Error: This script needs to be run as root" + exit 1 + fi + + # We only support MBR for now + # It will also catch errors like /dev/sdb1 and mmcbk0p1 as they + # don't have the PTTYPE tag + PTTYPE="$(blkid --probe --match-tag PTTYPE ${install_device} | \ + awk '{print $2}' | sed 's#^PTTYPE="##' | sed 's#"$##')" + if [ -z "${PTTYPE}" ] ; then + echo "Error: Could not find an (MBR) formating inside " \ + "${install_device}" + echo " Possible causes:" + echo " - Maybe {instal_device} is a partition" + echo " - or Maybe it's completelyor unformated" + exit 1 + elif [ "${PTTYPE}" != "dos" ] ; then + echo "Error: ${install_device} is not in MBR format" + echo " Currently, only the MBR format is supported" + exit 1 + fi + + # Check if offset > MBR partition table part end + if [ ${offset} -lt 512 ] ; then + echo "Error: The offset (${offset}) is < 512" + echo " offsets < 512 aren't supported (yet)" + exit 1 + fi + + # Get the image size + image_size="$(du --bytes --apparent-size ${image} | awk '{print $1}')" + + # With MBR, most partitioning tools leave makes the first partition + # start at 1MiB. So we need to check if the bootloader doesn't end + # up overwriting the first partition. + if [ $(expr ${image_size} + ${offset}) -gt $(expr 1024 \* 1024) ] ; then + echo "Error: ${image} is too big:" + echo " offset: ${offset}" + echo " size: ${image_size}" + echo " By default, "\ + "partitioing tools makes the first partition start at 1MiB" + echo " Instaling ${images} "\ + "would overwrite that first partition (if it's present)." + echo " Please contact the Parabola developers " \ + "so they could fix that issue" + exit 1 + fi + + # Copies with with a block size of 1 can be quite slow in practice + if [ "$(expr ${offset} % 512)" = 0 ] ; then + dd conv=notrunc "if=${image}" "of=${install_device}" \ + bs=512 "seek=$(expr ${offset} / 512)" + else + echo "Warning: slow copy" + dd conv=notrunc "if=${image}" "of=${install_device}" \ + bs=1 "seek=${offset}" + fi + + sync "${install_device}" +} + +if [ $# -ne 1 ] ; then + usage +else + install_image "$1" "${u_boot_with_spl_offset}" "${u_boot_with_spl}" +fi diff --git a/libre/uboot4extlinux-sunxi/uboot4extlinux-sunxi.hook.in b/libre/uboot4extlinux-sunxi/uboot4extlinux-sunxi.hook.in new file mode 100644 index 000000000..8cfa27bcc --- /dev/null +++ b/libre/uboot4extlinux-sunxi/uboot4extlinux-sunxi.hook.in @@ -0,0 +1,11 @@ +[Trigger] +Type = Package +Operation = Install +Operation = Upgrade +Target = @pkgname@ + +[Action] +Description = Test +When = PostTransaction +Exec = /usr/bin/cat /usr/share/doc/u-boot/@pkgname@/install-uboot4extlinux.txt +NeedsTargets diff --git a/libre/uboot4extlinux-sunxi/uboot4extlinux-sunxi.install b/libre/uboot4extlinux-sunxi/uboot4extlinux-sunxi.install deleted file mode 100644 index 46f8304cd..000000000 --- a/libre/uboot4extlinux-sunxi/uboot4extlinux-sunxi.install +++ /dev/null @@ -1,35 +0,0 @@ -flash_instructions() { - echo "# dd if=/boot/u-boot/images/u-boot-sunxi-with-spl.bin of=/dev/mmcblk0 bs=1024 seek=8" -} - -extlinux_warning() { - echo "==> WARNING: Remember to set up your kernels in /boot/extlinux/extlinux.conf" -} - -flash_uboot() { - root=$(mount | awk '/ on \/ / { print $1; }') - if [[ $root =~ ^/dev/mmcblk.*$ ]]; then - root=${root:0:12} - echo "A new U-Boot version needs to be flashed onto $root." - echo "Do you want to do this now? [y|N]" - read -r shouldwe - if [[ $shouldwe =~ ^([yY][eE][sS]|[yY])$ ]]; then - dd if=/boot/u-boot/images/u-boot-sunxi-with-spl.bin of=$root bs=1024 seek=8 - else - echo "You can do this later by running:" - flash_instructions - fi - else - echo "Flash the new U-Boot version onto your boot device. For example:" - flash_instructions - fi - extlinux_warning -} - -post_install() { - flash_uboot -} - -post_upgrade() { - flash_uboot -} -- cgit v1.2.3