summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>2021-01-07 00:56:11 +0100
committerDenis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>2021-07-05 20:17:21 +0200
commit89ab0d27c99ce4899829ab45001c0955db1149ab (patch)
tree9735cdba5977682103614a1c99992f1c1009bed7
parent5f989c87ef5056135de96820f697d825980d13e3 (diff)
downloadabslibre-89ab0d27c99ce4899829ab45001c0955db1149ab.tar.gz
abslibre-89ab0d27c99ce4899829ab45001c0955db1149ab.tar.bz2
abslibre-89ab0d27c99ce4899829ab45001c0955db1149ab.zip
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 <GNUtoo@cyberdimension.org>
-rw-r--r--libre/uboot4extlinux-sunxi/0001-Add-tool-to-dump-sunxi-images.patch85
-rw-r--r--libre/uboot4extlinux-sunxi/PKGBUILD600
-rw-r--r--libre/uboot4extlinux-sunxi/TODO.txt39
-rw-r--r--libre/uboot4extlinux-sunxi/generate-uboot4extlinux-sunxi-install-text.sh141
-rw-r--r--libre/uboot4extlinux-sunxi/install-uboot4extlinux.sh.in88
-rw-r--r--libre/uboot4extlinux-sunxi/uboot4extlinux-sunxi.hook.in11
-rw-r--r--libre/uboot4extlinux-sunxi/uboot4extlinux-sunxi.install35
7 files changed, 734 insertions, 265 deletions
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 <GNUtoo@cyberdimension.org>
+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 <GNUtoo@cyberdimension.org>
+---
+ 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,
+ &params);
+ }
+-
+ (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 <isacdaavid@at@isacdaavid@dot@info>
# Contributor: André Silva <emulatorman@hyperbola.info>
# Contributor: Timothy Redaelli <timothy.redaelli@gmail.com>
+# Contributor: Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
+
+# 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}) <path/to/block-device>"
+
+ 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
-}