diff --git a/PKGBUILD b/PKGBUILD index efc9e0a0b307bb6743d6980f489d0b10f71a5970..d07b643439982bd5ef903df18cab8d37d69da80e 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -1,23 +1,31 @@ # U-Boot: Pinephone Pro based on PKGBUILD for RK3399 # Contributor: Furkan Kardame <furkan@fkardame.com> +# Contributor: Dan Johansen <strit@manjaro.org> +# Contributor: Dragan Simic <dsimic@buserror.io> pkgname=uboot-pinephonepro pkgver=2021.01rc3 -pkgrel=5 +pkgrel=6 epoch=1 _srcname=u-boot-pine64-pinephonepro _commit=0719bf42931033c3109ecc6357e8adb567cb637b _tfaver=2.6 -pkgdesc="U-Boot for Pinephone Pro" +pkgdesc="U-Boot for Pine64 PinePhone Pro" arch=('aarch64') url='https://git.sr.ht/~martijnbraam/u-boot' license=('GPL') makedepends=('git' 'arm-none-eabi-gcc' 'dtc' 'bc') +depends=('uboot-tools') provides=('uboot') conflicts=('uboot') install=${pkgname}.install source=("u-boot-$_commit.tar.gz::https://source.denx.de/u-boot/u-boot/-/archive/${_commit}/u-boot-${_commit}.tar.gz" "https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/snapshot/trusted-firmware-a-$_tfaver.tar.gz" + "boot.txt" + "ppp-prepare-fstab" + "ppp-prepare-fstab.service" + "ppp-uboot-flash" + "ppp-uboot-mkscr" 0001-PPP.patch 0002-Add-ppp-dt.patch 0003-Config-changes.patch @@ -29,6 +37,11 @@ source=("u-boot-$_commit.tar.gz::https://source.denx.de/u-boot/u-boot/-/archive/ 0009-Correct-boot-order-to-be-USB-SD-eMMC.patch) sha256sums=('6b196b6592fabed060b7c5b1fa05a743f9be131d11389b762b7d0e2beebbd381' '4e59f02ccb042d5d18c89c849701b96e6cf4b788709564405354b5d313d173f7' + '4e356b3868c0c1ac061c2c15c7ba80c627e1743214680409f418f9b4c00eb3f7' + 'de7e36cdc7ed2fb5abb9155c97f87926361aa5be87d794c9016776160f3430ec' + 'e55fb02dfb6213eabbb899b468dc5f68d36a11c05feda4c14e80282415222fea' + '6265fb9d3bc84bf1217383b52587b1d5a36372d88a824932586a802a502f62ba' + '05eaccb2e8ea1eba3e86a4e7fcf12fd232195b5018c049ddf36e5a82a968cc24' 'f2e9d4efd24b7a6d94ccfe8c1a6fd0fac04776483be7a2d343f5b7a6b50a8ff2' 'c889eb1b55868a3d007be6f5c618823faca70905ce4a4047cd98bdcbfb48d6ab' '355444b20346bb5adbc531b1a8813483bb8e8e6a0b884139479dbf2ad342ef79' @@ -52,21 +65,41 @@ prepare() { } build() { - cd trusted-firmware-a-$_tfaver + # Avoid build warnings by editing a .config option in place instead of + # appending an option to .config, if an option is already present + update_config() { + if ! grep -q "^$1=$2$" .config; then + if grep -q "^# $1 is not set$" .config; then + sed -i -e "s/^# $1 is not set$/$1=$2/g" .config + elif grep -q "^$1=" .config; then + sed -i -e "s/^$1=.*/$1=$2/g" .config + else + echo "$1=$2" >> .config + fi + fi + } + unset CFLAGS CXXFLAGS CPPFLAGS LDFLAGS + + cd trusted-firmware-a-$_tfaver + + echo -e "\nBuilding TF-A for Pine64 PinePhone Pro...\n" make PLAT=rk3399 cp build/rk3399/release/bl31/bl31.elf ../u-boot-${_commit} + cd ../u-boot-${_commit} - unset CFLAGS CXXFLAGS CPPFLAGS LDFLAGS + + echo -e "\nBuilding U-Boot for Pine64 PinePhone Pro...\n" make pinephone-pro-rk3399_defconfig - echo 'CONFIG_IDENT_STRING=" Manjaro ARM"' >> .config - echo 'CONFIG_USB_EHCI_HCD=n' >> .config - echo 'CONFIG_USB_EHCI_GENERIC=n' >> .config - echo 'CONFIG_USB_XHCI_HCD=n' >> .config - echo 'CONFIG_USB_XHCI_DWC3=n' >> .config - echo 'CONFIG_USB_DWC3=n' >> .config - echo 'CONFIG_USB_DWC3_GENERIC=n' >> .config - echo 'CONFIG_BOOTDELAY=0' >> .config + + update_config 'CONFIG_IDENT_STRING' '" Manjaro Linux ARM"' + update_config 'CONFIG_BOOTDELAY' '0' + update_config 'CONFIG_USB_EHCI_HCD' 'n' + update_config 'CONFIG_USB_EHCI_GENERIC' 'n' + update_config 'CONFIG_USB_XHCI_HCD' 'n' + update_config 'CONFIG_USB_XHCI_DWC3' 'n' + update_config 'CONFIG_USB_DWC3' 'n' + update_config 'CONFIG_USB_DWC3_GENERIC' 'n' make EXTRAVERSION=-${pkgrel} } @@ -74,7 +107,11 @@ build() { package() { cd u-boot-${_commit} - mkdir -p "${pkgdir}/boot/extlinux" - cp idbloader.img u-boot.itb "${pkgdir}/boot/" -} + install -D -m 0644 idbloader.img u-boot.itb -t "${pkgdir}/boot" + install -D -m 0644 "${srcdir}/boot.txt" -t "${pkgdir}/boot" + install -D -m 0755 "${srcdir}/ppp-uboot-mkscr" -t "${pkgdir}/usr/bin" + install -D -m 0755 "${srcdir}/ppp-prepare-fstab" -t "${pkgdir}/usr/bin" + install -D -m 0644 "${srcdir}/ppp-prepare-fstab.service" -t "${pkgdir}/usr/lib/systemd/system" + install -D -m 0755 "${srcdir}/ppp-uboot-flash" -t "${pkgdir}/usr/bin" +} diff --git a/boot.txt b/boot.txt new file mode 100644 index 0000000000000000000000000000000000000000..60e610a7cdf92882fc74563bb2150b35bcd72b82 --- /dev/null +++ b/boot.txt @@ -0,0 +1,37 @@ +# +# /boot/boot.txt +# After modifying, run "ppp-uboot-mkscr" to re-generate the U-Boot boot script. +# + +# +# This is the description of the GPIO lines used in this boot script: +# +# GPIO #105 is GPIO3_B1, or RK3399 ball C27, which controls the vibrator motor +# GPIO #154 is GPIO4_D2, or RK3399 ball AH3, which controls the red part of the multicolor LED +# GPIO #157 is GPIO4_D5, or RK3399 ball AJ3, which controls the green part of the multicolor LED +# GPIO #158 is GPIO4_D6, or RK3399 ball AG4, which controls the blue part of the multicolor LED +# + +gpio set 105 +gpio set 154 + +# Set root partition to the second partition of boot device +part uuid ${devtype} ${devnum}:1 uuid_boot +part uuid ${devtype} ${devnum}:2 uuid_root + +setenv bootargs loglevel=4 console=tty0 console=${console} earlycon=uart8250,mmio32,0xff1a0000 consoleblank=0 boot=PARTUUID=${uuid_boot} root=PARTUUID=${uuid_root} rw rootwait quiet audit=0 bootsplash.bootfile=bootsplash-themes/manjaro/bootsplash + +if load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} /Image; then + gpio clear 105 + if load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} /dtbs/${fdtfile}; then + if load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} /initramfs-linux.img; then + gpio set 157 + booti ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r}; + else + gpio set 158 + booti ${kernel_addr_r} - ${fdt_addr_r}; + fi; + fi; +fi + +# EOF diff --git a/ppp-prepare-fstab b/ppp-prepare-fstab new file mode 100644 index 0000000000000000000000000000000000000000..91dd9e878f5d5070a06c89a3ff170bc5985d114d --- /dev/null +++ b/ppp-prepare-fstab @@ -0,0 +1,46 @@ +#!/bin/bash + +# +# /usr/bin/ppp-prepare-fstab +# This script will be executed automatically on boot, and only once. +# + +FSTAB="/etc/fstab" + +kernel_cmdline() { + for param in $(cat /proc/cmdline); do + case "${param}" in + $1=*) echo "${param##*=}"; return 0 ;; + $1) return 0 ;; + *) continue ;; + esac + done + + [ -n "${2}" ] && echo "${2}" + return 1 +} + +PART_BOOT=$(kernel_cmdline boot) +PART_ROOT=$(kernel_cmdline root) + +if [[ -z ${PART_BOOT} ]]; then + echo "Failed to determine boot partition, no changes made to ${FSTAB}." + exit 1 +fi + +if [[ -z ${PART_ROOT} ]]; then + echo "Failed to determine root partition, no changes made to ${FSTAB}." + exit 1 +fi + +sed -i -e '/[ \t]\+\/boot[ \t]\+/d' ${FSTAB} +sed -i -e '/[ \t]\+\/[ \t]\+/d' ${FSTAB} + +echo "PARTUUID=${PART_BOOT} /boot vfat defaults,noexec,nodev,showexec 0 0" >> ${FSTAB} +echo "PARTUUID=${PART_ROOT} / auto defaults 0 0" >> ${FSTAB} + +echo "Configured ${FSTAB} to use ${PART_BOOT} and ${PART_ROOT} as boot and root partitions, respectively." + +mount -a + +# EOF diff --git a/ppp-prepare-fstab.service b/ppp-prepare-fstab.service new file mode 100644 index 0000000000000000000000000000000000000000..2fac51af44cd936974f2d7af3f375d76ea4bdacc --- /dev/null +++ b/ppp-prepare-fstab.service @@ -0,0 +1,12 @@ +[Unit] +Description=Prepare Partition Mounts +Before=local-fs.target + +[Service] +Type=oneshot +RemainAfterExit=true +ExecStart=/usr/bin/ppp-prepare-fstab +ExecStartPost=/usr/bin/systemctl disable ppp-prepare-fstab.service + +[Install] +WantedBy=local-fs.target diff --git a/ppp-uboot-flash b/ppp-uboot-flash new file mode 100644 index 0000000000000000000000000000000000000000..023abaedf250436acefce5cfc890640218fc49d4 --- /dev/null +++ b/ppp-uboot-flash @@ -0,0 +1,60 @@ +#!/bin/bash + +# +# /usr/bin/ppp-uboot-flash +# Utility that flashes selected U-Boot image to the boot device. +# + +# Check that we're running as root +if [[ ${EUID} != 0 ]]; then + echo "Flashing U-Boot image not possible, please execute this utility as root." + exit 1 +fi + +# Get the device that the root resides on, and remove "/dev/" from the device name +ROOT_DEV=`findmnt / -o source -n | cut -d "[" -f 1 | cut -d "/" -f 3` + +# Get the full real name of the root device, which is usually "/dev/mmcblk0" +ROOT_DEV_NAME="/dev/"`echo /sys/block/*/${ROOT_DEV} | cut -d "/" -f 4` + +# Verify that the determined root device is available, just in case +if [[ ! -r ${ROOT_DEV_NAME} ]]; then + echo "Flashing U-Boot not possible, device ${ROOT_DEV_NAME} not found. No changes made to U-Boot." + exit 1 +fi + +# Get the U-Boot component names and check that they exist +IDBLOADER_IMG="/boot/idbloader.img" +U_BOOT_ITB="/boot/u-boot.itb" +for COMPONENT in ${IDBLOADER_IMG} ${U_BOOT_ITB}; do + if [[ ! -r ${COMPONENT} ]]; then + echo "Flashing U-Boot not possible, file ${COMPONENT} not found. No changes made to U-Boot." + exit 1 + fi +done + +# Flash the first of the selected U-Boot components to the determined root device +echo -n "Flashing U-Boot components..." +dd if=${IDBLOADER_IMG} of=${ROOT_DEV_NAME} seek=64 conv=notrunc,fsync > /dev/null 2>&1 +STATUS_IMG=$? +STATUS_ITB=0 + +# Now flash the second U-Boot component, but only if the first one flashed successfully +if [[ ${STATUS_IMG} = 0 ]]; then + dd if=${U_BOOT_ITB} of=${ROOT_DEV_NAME} seek=16384 conv=notrunc,fsync > /dev/null 2>&1 + STATUS_ITB=$? +fi + +# At the end, display the final status message of the U-Boot flashing +if [[ ${STATUS_IMG} = 0 && ${STATUS_ITB} = 0 ]]; then + echo " done." + echo "Required U-Boot components flashed to ${ROOT_DEV_NAME} successfully." + echo "Please reboot your phone for the changes to take effect." +else + echo " failed." + echo "Flashing U-Boot components to ${ROOT_DEV_NAME} failed due to unknown reason." + echo "Please try flashing the U-Boot again, or your phone may no longer boot properly." + exit 1 +fi + +# EOF diff --git a/ppp-uboot-mkscr b/ppp-uboot-mkscr new file mode 100644 index 0000000000000000000000000000000000000000..2b6be88f0e3baf1488d9f71a55b98c0cc8b75ddc --- /dev/null +++ b/ppp-uboot-mkscr @@ -0,0 +1,68 @@ +#!/bin/bash + +# +# /usr/bin/ppp-uboot-mkscr +# Utility that generates the U-Boot boot script. +# + +# Source and destination file paths +BOOT_TXT="/boot/boot.txt" +BOOT_SCR="/boot/boot.scr" + +# Boot script description +IMAGE_DESC="U-Boot boot script" + +# Determine the performed action +if [[ ! -r ${BOOT_SCR} ]]; then + ACTION="Generating" +else + ACTION="Re-generating" +fi + +# Check that we're running as root +if [[ ${EUID} != 0 ]]; then + echo "${ACTION} ${IMAGE_DESC} not possible, please execute this utility as root." + exit 1 +fi + +# Make sure that the required utility is available +if [[ ! -x /usr/bin/mkimage ]]; then + echo "${ACTION} ${IMAGE_DESC} not possible, mkimage utility not found." + echo "Please install the uboot-tools package, by running the following command:" + echo " pacman -S uboot-tools" + exit 1 +fi + +# Check that the source file exists +if [[ ! -r ${BOOT_TXT} ]]; then + echo "${ACTION} ${IMAGE_DESC} not possible, file ${BOOT_TXT} not found." + echo "Please reinstall the uboot-pinephone package, by running the following command:" + echo " pacman -S uboot-pinephone" + exit 1 +fi + +# Is this a quiet execution? +VERBOSE=true +while getopts "q" SWITCH; do + if [[ ${SWITCH} = "q" ]]; then + VERBOSE=false + fi +done + +# Generate the U-Boot boot script +echo -n "${ACTION} ${IMAGE_DESC} ${BOOT_SCR}..." +if [[ ${VERBOSE} = true ]]; then + echo + mkimage -A arm -O linux -T script -C none -n "${IMAGE_DESC}" -d ${BOOT_TXT} ${BOOT_SCR} +else + mkimage -A arm -O linux -T script -C none -n "${IMAGE_DESC}" -d ${BOOT_TXT} ${BOOT_SCR} > /dev/null 2>&1 + if [[ $? = 0 ]]; then + echo " done." + else + echo " failed." + echo "${ACTION} ${IMAGE_DESC} from ${BOOT_TXT} failed due to unknown reason." + echo "Please try generating the boot script again, or your phone may no longer boot properly." + fi +fi + +# EOF diff --git a/uboot-pinephonepro.install b/uboot-pinephonepro.install index b4fd113142c07856fa2c26a70670020906888fe9..36f49f1f780d6efe7d3d325e4f744ea472ddc387 100644 --- a/uboot-pinephonepro.install +++ b/uboot-pinephonepro.install @@ -1,39 +1,37 @@ -notice_uboot() { - echo "New version of U-Boot firmware can be flashed to your microSD card" - echo "or eMMC module. You can do that by running:" - echo "# dd if=/boot/idbloader.img of=/dev/mmcblkX seek=64 conv=notrunc,fsync" - echo "# dd if=/boot/u-boot.itb of=/dev/mmcblkX seek=16384 conv=notrunc,fsync" -} - -create_config() { - mkdir -p /boot/extlinux - echo "LABEL Manjaro ARM -KERNEL /Image -FDT /dtbs/rockchip/rk3399-pinephone-pro.dtb -APPEND initrd=/initramfs-linux.img console=ttyS2,1500000 root=LABEL=ROOT_MNJRO rw rootwait quiet splash plymouth.ignore-serial-consoles" > /boot/extlinux/extlinux.conf +flash_uboot() { + # (Re-)generate the U-Boot boot script and flash the U-Boot image + ppp-uboot-mkscr -q + ppp-uboot-flash } post_install() { - notice_uboot - if [ -f /boot/extlinux/extlinux.conf.pacsave ]; then - mv /boot/extlinux/extlinux.conf.pacsave /boot/extlinux/extlinux.conf - fi - if [ -f /boot/extlinux/extlinux.conf ]; then - echo "Keeping old extlinux.conf file..." - else - create_config - fi + # Perform the U-Boot flashing + flash_uboot + + # The service will be executed only once, it disables itself + systemctl enable ppp-prepare-fstab.service } post_upgrade() { - notice_uboot - if [ -f /boot/extlinux/extlinux.conf.pacsave ]; then - mv /boot/extlinux/extlinux.conf.pacsave /boot/extlinux/extlinux.conf + EXTLINUX="/boot/extlinux" + BOOT_OPTIONS="defaults,noexec,nodev,showexec" + + # Remove an obsolete directory, if it's present + if [[ -e ${EXTLINUX} ]]; then + echo -n "Removing obsolete ${EXTLINUX} directory..." + rm -rf ${EXTLINUX} + echo " done." fi - if [ -f /boot/extlinux/extlinux.conf ]; then - echo "Keeping old extlinux.conf file..." - else - create_config + + # Ensure updated mount options for /boot, if using vfat + if grep -q "/boot.*vfat" /etc/fstab; then + if ! grep -q "/boot.*${BOOT_OPTIONS}" /etc/fstab; then + echo -n "Updating mount options for /boot in /etc/fstab..." + sed -i -e "s#\(/boot\)\([ \t]\+\)\([^ \t]\+\)\([ \t]\+\)\([^ \t]\+\)\(.*\)\$#\1\2\3\4${BOOT_OPTIONS}\6#g" /etc/fstab + echo " done." + fi fi -} + # Perform the U-Boot flashing + flash_uboot +}