From 28bcfecfaf14bf1a4e562d82cd51d5a4d6982140 Mon Sep 17 00:00:00 2001 From: Arturo Buzarra Date: Thu, 4 Jul 2024 15:22:30 +0200 Subject: [PATCH] uboot: add support to ConnectCore MP25 DVK platform Add initial support cloned from ccmp15, based on v2022.10 from STM release openstlinux-6.1-yocto-mickledore-mp2-v23.12.06. https://onedigi.atlassian.net/browse/DEL-8995 Signed-off-by: Arturo Buzarra --- .../recipes-bsp/u-boot/u-boot-dey.inc | 13 + .../u-boot-dey/ccmp2/install_linux_fw_sd.txt | 281 +++++++++++++++ .../u-boot-dey/ccmp2/install_linux_fw_usb.txt | 284 +++++++++++++++ .../u-boot-dey/ccmp2/install_linux_fw_uuu.sh | 339 ++++++++++++++++++ .../u-boot/u-boot-dey/ccmp25-dvk/boot.txt | 82 +++++ .../recipes-bsp/u-boot/u-boot-dey_2022.10.bb | 35 ++ 6 files changed, 1034 insertions(+) create mode 100644 meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp2/install_linux_fw_sd.txt create mode 100644 meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp2/install_linux_fw_usb.txt create mode 100644 meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp2/install_linux_fw_uuu.sh create mode 100644 meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp25-dvk/boot.txt create mode 100644 meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2022.10.bb diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey.inc b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey.inc index 17d8a783e..83edbcf49 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey.inc +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey.inc @@ -220,6 +220,7 @@ do_compile:append:ccmp1() { BOOT_TOOLS = "imx-boot-tools" BOOT_TOOLS:ccmp1 = "u-boot" +BOOT_TOOLS:ccmp2 = "u-boot" do_deploy:append:ccimx8m() { # Deploy u-boot-nodtb.bin and ccimx8m[m|n]-dvk.dtb, to be packaged in boot binary by imx-boot @@ -269,4 +270,16 @@ do_deploy:append:ccmp1() { fi } +do_deploy:append:ccmp2() { + # Deploy u-boot-nodtb.bin and ccmp2x-dvk-xxxx.dtb, to be packaged in fip binary by tf-a + install -d ${DEPLOYDIR}/${BOOT_TOOLS} + if [ -n "${UBOOT_DEVICETREE}" ]; then + for devicetree in ${UBOOT_DEVICETREE}; do + # Install u-boot dtb + install -m 644 ${B}/${config}/arch/arm/dts/${devicetree}.dtb ${DEPLOYDIR}/${BOOT_TOOLS}/${FIP_UBOOT_DTB}-${devicetree}.dtb + done + fi + install -m 0777 ${B}/${config}/u-boot-nodtb.bin ${DEPLOYDIR}/${BOOT_TOOLS}/u-boot-nodtb.bin +} + SYSROOT_DIRS += "/boot" diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp2/install_linux_fw_sd.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp2/install_linux_fw_sd.txt new file mode 100644 index 000000000..d013b28d6 --- /dev/null +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp2/install_linux_fw_sd.txt @@ -0,0 +1,281 @@ +# +# U-Boot script for installing Linux images created by Yocto from the micro SD +# card into the eMMC +# + +# Reset temp variables +install_abort=0 +BASEFILENAME=0 + +setenv INSTALL_ATF_FILENAME tf-a-##MACHINE##-${module_ram}-emmc.stm32 +setenv INSTALL_FIP_FILENAME fip-##MACHINE##-${module_ram}-optee.bin +setenv INSTALL_MMCDEV 1 + +if test -z "${image-name}"; then + setenv image-name ##DEFAULT_IMAGE_NAME## +fi +GRAPHICAL_IMAGES="##GRAPHICAL_IMAGES##" +for g in ${GRAPHICAL_IMAGES}; do + if test "${image-name}" = "${g}"; then + BASEFILENAME="${image-name}-##GRAPHICAL_BACKEND##" + fi +done +if test "${BASEFILENAME}" = "0"; then + BASEFILENAME="${image-name}" +fi +setenv INSTALL_LINUX_FILENAME ${BASEFILENAME}-##MACHINE##.boot.ubifs +setenv INSTALL_RECOVERY_FILENAME ${BASEFILENAME}-##MACHINE##.recovery.ubifs +setenv INSTALL_ROOTFS_FILENAME ${BASEFILENAME}-##MACHINE##.ubifs + +# Check for presence of firmware files on the SD card +FILES="${INSTALL_ATF_FILENAME} ${INSTALL_FIP_FILENAME} ${INSTALL_LINUX_FILENAME}" +if test "${dualboot}" != "yes"; then + FILES="${FILES} ${INSTALL_RECOVERY_FILENAME}" +fi +for install_f in ${FILES}; do + if test ! -e mmc ${INSTALL_MMCDEV} ${install_f}; then + echo "ERROR: Could not find file ${install_f}"; + install_abort=1; + fi; +done +# Verify what kind of rootfs is going to be programmed +if test ! -e mmc ${INSTALL_MMCDEV} ${INSTALL_ROOTFS_FILENAME}; then + echo "ERROR: Could not find file ${INSTALL_ROOTFS_FILENAME}"; + setenv INSTALL_ROOTFS_FILENAME ${BASEFILENAME}-##MACHINE##.squashfs + echo "INFO: Trying with file ${INSTALL_ROOTFS_FILENAME}"; + if test ! -e mmc ${INSTALL_MMCDEV} ${INSTALL_ROOTFS_FILENAME}; then + echo "ERROR: Could not find file ${INSTALL_ROOTFS_FILENAME}"; + install_abort=1; + else + setenv rootfstype squashfs + fi +fi +if test "${install_abort}" = "1"; then + echo "To install a different image, set variable 'image-name', e.g.:" + echo " => setenv image-name core-image-base" + echo "Aborted."; + exit; +fi + +echo "############################################################" +echo "# Linux firmware install from micro SD #" +echo "############################################################" +echo "" +echo " This process will erase your NAND and will install the following files" +echo " on the partitions of the NAND." +echo "" +echo " PARTITION FILENAME" +echo " --------- --------" +echo " fsbl1 ${INSTALL_ATF_FILENAME}" +echo " fsbl2 ${INSTALL_ATF_FILENAME}" +echo " fip-a ${INSTALL_FIP_FILENAME}" +echo " fip-b ${INSTALL_FIP_FILENAME}" +if test "${dualboot}" = "yes"; then + echo " linux_a ${INSTALL_LINUX_FILENAME}" + if test "${install_dualboot}" = "yes"; then + echo " linux_b ${INSTALL_LINUX_FILENAME}" + fi + echo " rootfs_a ${INSTALL_ROOTFS_FILENAME}" + if test "${install_dualboot}" = "yes"; then + echo " rootfs_b ${INSTALL_ROOTFS_FILENAME}" + fi +else + echo " linux ${INSTALL_LINUX_FILENAME}" + echo " recovery ${INSTALL_RECOVERY_FILENAME}" + echo " rootfs ${INSTALL_ROOTFS_FILENAME}" +fi +echo "" +echo " Press CTRL+C now if you wish to abort or wait 10 seconds" +echo " to continue." + +sleep 10 +if test $? -eq 1; then + echo "Aborted by user."; + exit; +fi + +# Skip user confirmation for U-Boot update +setenv forced_update 1 + +# Set bootdelay to zero so that firmware update is run immediately after +# the first reset. +setenv bootdelay 0 + +# Update ATF and FIP images +echo "" +echo "" +echo ">> Installing ATF boot loader image ${INSTALL_ATF_FILENAME}" +echo "" +echo "" +update fsbl1 mmc ${INSTALL_MMCDEV} ${INSTALL_ATF_FILENAME} +if test $? -eq 1; then + echo "[ERROR] Failed to update fsbl1!"; + echo ""; + echo "Aborted."; + exit; +fi +update fsbl2 mmc ${INSTALL_MMCDEV} ${INSTALL_ATF_FILENAME} +if test $? -eq 1; then + echo "[ERROR] Failed to update fsbl2!"; + echo ""; + echo "Aborted."; + exit; +fi +echo "" +echo "" +echo ">> Installing FIP boot loader image ${INSTALL_FIP_FILENAME} (target will reset)" +echo "" +echo "" +update fip-a mmc ${INSTALL_MMCDEV} ${INSTALL_FIP_FILENAME} +if test $? -eq 1; then + echo "[ERROR] Failed to update fip-a!"; + echo ""; + echo "Aborted."; + exit; +fi +update fip-b mmc ${INSTALL_MMCDEV} ${INSTALL_FIP_FILENAME} +if test $? -eq 1; then + echo "[ERROR] Failed to update fip-b!"; + echo ""; + echo "Aborted."; + exit; +fi + +# Check if uboot_config volume exists (U-Boot env) +ubi part UBI +ubi check uboot_config +if test $? -eq 1; then + # Create volumes layout (including U-Boot env) + run ubivolscript; +fi + +# Set 'bootcmd' to the second part of the script that will +# - Reset environment to defaults +# - Restore 'dualboot' if previously set +# - Run 'ubivolscript' script to re-partition the UBI partition and save the +# environment +# - If Dual Boot +# - Update the system partitions: linux_a, linux_b, rootfs_a, rootfs_b +# - Set bootlimit to 3 +# - If Normal Boot: +# - Update the system partitions: linux, recovery, rootfs +# - Configure recovery to wipe 'update' partition +# - Run 'recovery' and let the system boot after +setenv bootcmd " + env default -a; + setenv dualboot ${dualboot}; + setenv rootfstype ${rootfstype}; + setenv install_dualboot ${install_dualboot}; + run ubivolscript; + if test \"\$\{dualboot\}\" = yes; then + echo \"\"; + echo \"\"; + echo \">> Installing file ${INSTALL_LINUX_FILENAME} on linux_a\"; + echo \"\"; + echo \"\"; + update linux_a mmc ${INSTALL_MMCDEV} ${INSTALL_LINUX_FILENAME} ${force_erase}; + if test \$? -eq 1; then + echo \"[ERROR] Failed to update linux_a!\"; + echo \"\"; + echo \"Aborted.\"; + exit; + fi; + if test \"\$\{install_dualboot\}\" = yes; then + echo \"\"; + echo \"\"; + echo \">> Installing file ${INSTALL_LINUX_FILENAME} on linux_b\"; + echo \"\"; + echo \"\"; + update linux_b mmc ${INSTALL_MMCDEV} ${INSTALL_LINUX_FILENAME} ${force_erase}; + if test \$? -eq 1; then + echo \"[ERROR] Failed to update linux_b!\"; + echo \"\"; + echo \"Aborted.\"; + exit; + fi; + fi; + echo \"\"; + echo \"\"; + echo \">> Installing file ${INSTALL_ROOTFS_FILENAME} on rootfs_a\"; + echo \"\"; + echo \"\"; + update rootfs_a mmc ${INSTALL_MMCDEV} ${INSTALL_ROOTFS_FILENAME} ${force_erase}; + if test \$? -eq 1; then + echo \"[ERROR] Failed to update rootfs_a partition!\"; + echo \"\"; + echo \"Aborted.\"; + exit; + fi; + if test \"\$\{install_dualboot\}\" = yes; then + echo \"\"; + echo \"\"; + echo \">> Installing file ${INSTALL_ROOTFS_FILENAME} on rootfs_b\"; + echo \"\"; + echo \"\"; + update rootfs_b mmc ${INSTALL_MMCDEV} ${INSTALL_ROOTFS_FILENAME} ${force_erase}; + if test \$? -eq 1; then + echo \"[ERROR] Failed to update rootfs_b partition!\"; + echo \"\"; + echo \"Aborted.\"; + exit; + fi; + fi; + setenv bootlimit 3; + else + echo \"\"; + echo \"\"; + echo \">> Installing file ${INSTALL_LINUX_FILENAME} on linux\"; + echo \"\"; + echo \"\"; + update linux mmc ${INSTALL_MMCDEV} ${INSTALL_LINUX_FILENAME} ${force_erase}; + if test \$? -eq 1; then + echo \"[ERROR] Failed to update linux!\"; + echo \"\"; + echo \"Aborted.\"; + exit; + fi; + echo \"\"; + echo \"\"; + echo \">> Installing file ${INSTALL_RECOVERY_FILENAME} on recovery\"; + echo \"\"; + echo \"\"; + update recovery mmc ${INSTALL_MMCDEV} ${INSTALL_RECOVERY_FILENAME} ${force_erase}; + if test \$? -eq 1; then + echo \"[ERROR] Failed to update recovery partition!\"; + echo \"\"; + echo \"Aborted.\"; + exit; + fi; + echo \"\"; + echo \"\"; + echo \">> Installing file ${INSTALL_ROOTFS_FILENAME} on rootfs\"; + echo \"\"; + echo \"\"; + update rootfs mmc ${INSTALL_MMCDEV} ${INSTALL_ROOTFS_FILENAME} ${force_erase}; + if test \$? -eq 1; then + echo \"[ERROR] Failed to update rootfs partition!\"; + echo \"\"; + echo \"Aborted.\"; + exit; + fi; + echo \"\"; + setenv boot_recovery yes; + setenv recovery_command wipe_update; + fi; + saveenv; + echo \"\"; + echo \"\"; + echo \">> Firmware installation complete.\"; + if test \"\$\{dualboot\}\" != yes; then + echo \"Rebooting into recovery mode for final deployment.\"; + fi; + echo \"\"; + echo \"\"; + sleep 1; + bootcount reset; + reset; +" + +bootcount reset +saveenv +reset diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp2/install_linux_fw_usb.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp2/install_linux_fw_usb.txt new file mode 100644 index 000000000..eb0432506 --- /dev/null +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp2/install_linux_fw_usb.txt @@ -0,0 +1,284 @@ +# +# U-Boot script for installing Linux images created by Yocto from a USB stick +# into the NAND +# + +# Reset temp variables +install_abort=0 +BASEFILENAME=0 + +setenv INSTALL_ATF_FILENAME tf-a-##MACHINE##-${module_ram}-nand.stm32 +setenv INSTALL_FIP_FILENAME fip-##MACHINE##-${module_ram}-optee.bin +setenv INSTALL_USBDEV 0 + +if test -z "${image-name}"; then + setenv image-name ##DEFAULT_IMAGE_NAME## +fi +GRAPHICAL_IMAGES="##GRAPHICAL_IMAGES##" +for g in ${GRAPHICAL_IMAGES}; do + if test "${image-name}" = "${g}"; then + BASEFILENAME="${image-name}-##GRAPHICAL_BACKEND##" + fi +done +if test "${BASEFILENAME}" = "0"; then + BASEFILENAME="${image-name}" +fi +setenv INSTALL_LINUX_FILENAME ${BASEFILENAME}-##MACHINE##.boot.ubifs +setenv INSTALL_RECOVERY_FILENAME ${BASEFILENAME}-##MACHINE##.recovery.ubifs +setenv INSTALL_ROOTFS_FILENAME ${BASEFILENAME}-##MACHINE##.ubifs + +# Check for presence of firmware files on the USB +FILES="${INSTALL_ATF_FILENAME} ${INSTALL_FIP_FILENAME} ${INSTALL_LINUX_FILENAME}" +if test "${dualboot}" != "yes"; then + FILES="${FILES} ${INSTALL_RECOVERY_FILENAME}" +fi +for install_f in ${FILES}; do + if test ! -e usb ${INSTALL_USBDEV} ${install_f}; then + echo "ERROR: Could not find file ${install_f}"; + install_abort=1; + fi; +done +# Verify what kind of rootfs is going to be programmed +if test ! -e usb ${INSTALL_USBDEV} ${INSTALL_ROOTFS_FILENAME}; then + echo "ERROR: Could not find file ${INSTALL_ROOTFS_FILENAME}"; + setenv INSTALL_ROOTFS_FILENAME ${BASEFILENAME}-##MACHINE##.squashfs + echo "INFO: Trying with file ${INSTALL_ROOTFS_FILENAME}"; + if test ! -e usb ${INSTALL_USBDEV} ${INSTALL_ROOTFS_FILENAME}; then + echo "ERROR: Could not find file ${INSTALL_ROOTFS_FILENAME}"; + install_abort=1; + else + setenv rootfstype squashfs + fi +else + setenv rootfstype +fi +if test "${install_abort}" = "1"; then + echo "To install a different image, set variable 'image-name', e.g.:" + echo " => setenv image-name core-image-base" + echo "Aborted."; + exit; +fi + +echo "############################################################" +echo "# Linux firmware install from USB #" +echo "############################################################" +echo "" +echo " This process will erase your NAND and will install the following files" +echo " on the partitions of the NAND." +echo "" +echo " PARTITION FILENAME" +echo " --------- --------" +echo " fsbl1 ${INSTALL_ATF_FILENAME}" +echo " fsbl2 ${INSTALL_ATF_FILENAME}" +echo " fip-a ${INSTALL_FIP_FILENAME}" +echo " fip-b ${INSTALL_FIP_FILENAME}" +if test "${dualboot}" = "yes"; then + echo " linux_a ${INSTALL_LINUX_FILENAME}" + if test "${install_dualboot}" = "yes"; then + echo " linux_b ${INSTALL_LINUX_FILENAME}" + fi + echo " rootfs_a ${INSTALL_ROOTFS_FILENAME}" + if test "${install_dualboot}" = "yes"; then + echo " rootfs_b ${INSTALL_ROOTFS_FILENAME}" + fi +else + echo " linux ${INSTALL_LINUX_FILENAME}" + echo " recovery ${INSTALL_RECOVERY_FILENAME}" + echo " rootfs ${INSTALL_ROOTFS_FILENAME}" +fi +echo "" +echo " Press CTRL+C now if you wish to abort or wait 10 seconds" +echo " to continue." + +sleep 10 +if test $? -eq 1; then + echo "Aborted by user."; + exit; +fi + +# Skip user confirmation for U-Boot update +setenv forced_update 1 + +# Set bootdelay to zero so that firmware update is run immediately after +# the first reset. +setenv bootdelay 0 + +# Update ATF and FIP images +echo "" +echo "" +echo ">> Installing ATF boot loader image ${INSTALL_ATF_FILENAME}" +echo "" +echo "" +update fsbl1 usb ${INSTALL_USBDEV} ${INSTALL_ATF_FILENAME} +if test $? -eq 1; then + echo "[ERROR] Failed to update fsbl1!"; + echo ""; + echo "Aborted."; + exit; +fi +update fsbl2 usb ${INSTALL_USBDEV} ${INSTALL_ATF_FILENAME} +if test $? -eq 1; then + echo "[ERROR] Failed to update fsbl2!"; + echo ""; + echo "Aborted."; + exit; +fi +echo "" +echo "" +echo ">> Installing FIP boot loader image ${INSTALL_FIP_FILENAME} (target will reset)" +echo "" +echo "" +update fip-a usb ${INSTALL_USBDEV} ${INSTALL_FIP_FILENAME} +if test $? -eq 1; then + echo "[ERROR] Failed to update fip-a!"; + echo ""; + echo "Aborted."; + exit; +fi +update fip-b usb ${INSTALL_USBDEV} ${INSTALL_FIP_FILENAME} +if test $? -eq 1; then + echo "[ERROR] Failed to update fip-b!"; + echo ""; + echo "Aborted."; + exit; +fi + +# Check if uboot_config volume exists (U-Boot env) +ubi part UBI +ubi check uboot_config +if test $? -eq 1; then + # Create volumes layout (including U-Boot env) + run ubivolscript; +fi + +# Set 'bootcmd' to the second part of the script that will +# - Reset environment to defaults +# - Restore 'dualboot' if previously set +# - Run 'ubivolscript' script to re-partition the UBI partition and save the +# environment +# - If Dual Boot +# - Update the system partitions: linux_a, linux_b, rootfs_a, rootfs_b +# - Set bootlimit to 3 +# - If Normal Boot: +# - Update the system partitions: linux, recovery, rootfs +# - Configure recovery to wipe 'update' partition +# - Run 'recovery' and let the system boot after +setenv bootcmd " + env default -a; + setenv dualboot ${dualboot}; + setenv rootfstype ${rootfstype}; + setenv install_dualboot ${install_dualboot}; + run ubivolscript; + usb start; + if test \"\$\{dualboot\}\" = yes; then + echo \"\"; + echo \"\"; + echo \">> Installing file ${INSTALL_LINUX_FILENAME} on linux_a\"; + echo \"\"; + echo \"\"; + update linux_a usb ${INSTALL_USBDEV} ${INSTALL_LINUX_FILENAME} ${force_erase}; + if test \$? -eq 1; then + echo \"[ERROR] Failed to update linux_a!\"; + echo \"\"; + echo \"Aborted.\"; + exit; + fi; + if test \"\$\{install_dualboot\}\" = yes; then + echo \"\"; + echo \"\"; + echo \">> Installing file ${INSTALL_LINUX_FILENAME} on linux_b\"; + echo \"\"; + echo \"\"; + update linux_b usb ${INSTALL_USBDEV} ${INSTALL_LINUX_FILENAME} ${force_erase}; + if test \$? -eq 1; then + echo \"[ERROR] Failed to update linux_b!\"; + echo \"\"; + echo \"Aborted.\"; + exit; + fi; + fi; + echo \"\"; + echo \"\"; + echo \">> Installing file ${INSTALL_ROOTFS_FILENAME} on rootfs_a\"; + echo \"\"; + echo \"\"; + update rootfs_a usb ${INSTALL_USBDEV} ${INSTALL_ROOTFS_FILENAME} ${force_erase}; + if test \$? -eq 1; then + echo \"[ERROR] Failed to update rootfs_a partition!\"; + echo \"\"; + echo \"Aborted.\"; + exit; + fi; + if test \"\$\{install_dualboot\}\" = yes; then + echo \"\"; + echo \"\"; + echo \">> Installing file ${INSTALL_ROOTFS_FILENAME} on rootfs_b\"; + echo \"\"; + echo \"\"; + update rootfs_b usb ${INSTALL_USBDEV} ${INSTALL_ROOTFS_FILENAME} ${force_erase}; + if test \$? -eq 1; then + echo \"[ERROR] Failed to update rootfs_b partition!\"; + echo \"\"; + echo \"Aborted.\"; + exit; + fi; + fi; + setenv bootlimit 3; + else + echo \"\"; + echo \"\"; + echo \">> Installing file ${INSTALL_LINUX_FILENAME} on linux\"; + echo \"\"; + echo \"\"; + update linux usb ${INSTALL_USBDEV} ${INSTALL_LINUX_FILENAME} ${force_erase}; + if test \$? -eq 1; then + echo \"[ERROR] Failed to update linux!\"; + echo \"\"; + echo \"Aborted.\"; + exit; + fi; + echo \"\"; + echo \"\"; + echo \">> Installing file ${INSTALL_RECOVERY_FILENAME} on recovery\"; + echo \"\"; + echo \"\"; + update recovery usb ${INSTALL_USBDEV} ${INSTALL_RECOVERY_FILENAME} ${force_erase}; + if test \$? -eq 1; then + echo \"[ERROR] Failed to update recovery partition!\"; + echo \"\"; + echo \"Aborted.\"; + exit; + fi; + echo \"\"; + echo \"\"; + echo \">> Installing file ${INSTALL_ROOTFS_FILENAME} on rootfs\"; + echo \"\"; + echo \"\"; + update rootfs usb ${INSTALL_USBDEV} ${INSTALL_ROOTFS_FILENAME} ${force_erase}; + if test \$? -eq 1; then + echo \"[ERROR] Failed to update rootfs partition!\"; + echo \"\"; + echo \"Aborted.\"; + exit; + fi; + echo \"\"; + setenv boot_recovery yes; + setenv recovery_command wipe_update; + fi; + saveenv; + echo \"\"; + echo \"\"; + echo \">> Firmware installation complete.\"; + if test \"\$\{dualboot\}\" != yes; then + echo \"Rebooting into recovery mode for final deployment.\"; + fi; + echo \"\"; + echo \"\"; + sleep 1; + bootcount reset; + reset; +" + +bootcount reset +saveenv +reset diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp2/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp2/install_linux_fw_uuu.sh new file mode 100644 index 000000000..70468cdd4 --- /dev/null +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp2/install_linux_fw_uuu.sh @@ -0,0 +1,339 @@ +#!/bin/sh +#=============================================================================== +# +# Copyright (C) 2022-2024 by Digi International Inc. +# All rights reserved. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. +# +# +# Description: +# Script to flash Yocto build artifacts over USB to the target. +#=============================================================================== +# set -x + +# +# U-Boot script for installing Linux images created by Yocto +# + +# Exit on any error +set -e + +# Parse uuu cmd output +getenv() +{ + uuu -v fb: ucmd printenv "${1}" | sed -ne "s,^${1}=,,g;T;p" +} + +check_cmd() +{ + uuu -v fb: acmd ${1} > /dev/null 2> /dev/null + uuu -v fb: ucmd echo retval=\$? | sed -ne "s,^retval=,,g;T;p" +} + +show_usage() +{ + echo "Usage: $0 [options]" + echo "" + echo " Options:" + echo " -a Arm-trusted-firmware filename." + echo " Auto-determined by variant if not provided." + echo " -b Activate bootcount mechanism (3 boot attempts)." + echo " -d Install firmware on dualboot partitions (system A and system B)." + echo " (Implies -b)." + echo " -f FIP filename." + echo " Auto-determined by variant if not provided." + echo " -h Show this help." + echo " -i Image name that prefixes the image filenames, such as 'dey-image-qt', " + echo " 'dey-image-webkit', 'core-image-base'..." + echo " Defaults to '##DEFAULT_IMAGE_NAME##' if not provided." + echo " -n No wait. Skips 10 seconds delay to stop script." + echo " -t Install TrustFence artifacts." + exit 2 +} + +# Update a partition +# Params: +# 1. partition +# 2. file +# 3. timeout (in ms) +# Description: +# - downloads image to RAM +# - runs 'update' command from RAM +part_update() +{ + echo "\033[36m" + echo "=====================================================================================" + echo "Updating '${1}' partition with file: ${2}" + echo "=====================================================================================" + echo "\033[0m" + + uuu fb: download -f "${2}" + uuu "fb[-t ${3}]:" ucmd update "${1}" ram \${fastboot_buffer} \${filesize} ${ERASE} +} + +clear +echo "############################################################" +echo "# Linux firmware install through USB OTG #" +echo "############################################################" + +# Command line admits the following parameters: +# -a +# -b, -d, -n (booleans) +# -f +# -i +while getopts 'a:bdf:hi:n' c +do + case $c in + a) INSTALL_ATF_FILENAME=${OPTARG} ;; + b) BOOTCOUNT=true ;; + d) INSTALL_DUALBOOT=true && BOOTCOUNT=true ;; + f) INSTALL_FIP_FILENAME=${OPTARG} ;; + h) show_usage ;; + i) IMAGE_NAME=${OPTARG} ;; + n) NOWAIT=true ;; + t) TRUSTFENCE=true ;; + esac +done + +# Enable the redirect support to get u-boot variables values +uuu fb: ucmd setenv stdout serial,fastboot + +# Check if dualboot variable is active +dualboot=$(getenv "dualboot") +if [ "${dualboot}" = "yes" ]; then + DUALBOOT=true; +fi + +# Check if uboot_config volume exists (U-Boot env) +uuu "fb[-t 15000]:" ucmd ubi part UBI +check=$(check_cmd "ubi check uboot_config") +if [ "${check}" = "1" ]; then + RUNVOLS=true +fi + +# Check module_ram variable exists +module_ram=$(getenv "module_ram") +if [ -z "${module_ram}" ]; then + module_ram="512MB" # Default variant +fi + +# remove redirect +uuu fb: ucmd setenv stdout serial + +echo "" +echo "Determining image files to use..." + +# Determine ATF file to program +if [ -z "${INSTALL_ATF_FILENAME}" ]; then + INSTALL_ATF_FILENAME="tf-a-##MACHINE##-${module_ram}-nand.stm32##SIGNED_TFA##" +fi + +# Determine FIP file to program +if [ -z "${INSTALL_FIP_FILENAME}" ]; then + INSTALL_FIP_FILENAME="fip-##MACHINE##-${module_ram}-optee##SIGNED##.bin" +fi + +# Determine linux, recovery, and rootfs image filenames to update +if [ -z "${IMAGE_NAME}" ]; then + IMAGE_NAME="##DEFAULT_IMAGE_NAME##" +fi +GRAPHICAL_IMAGES="##GRAPHICAL_IMAGES##" +for g in ${GRAPHICAL_IMAGES}; do + if [ "${IMAGE_NAME}" = "${g}" ]; then + BASEFILENAME="${IMAGE_NAME}-##GRAPHICAL_BACKEND##" + fi +done +if [ -z "${BASEFILENAME}" ]; then + BASEFILENAME="${IMAGE_NAME}" +fi +INSTALL_LINUX_FILENAME="${BASEFILENAME}-##MACHINE##.boot.ubifs" +INSTALL_RECOVERY_FILENAME="${BASEFILENAME}-##MACHINE##.recovery.ubifs" +INSTALL_ROOTFS_FILENAME="${BASEFILENAME}-##MACHINE##.ubifs" + +# Verify existence of files before starting the update +FILES="${INSTALL_ATF_FILENAME} ${INSTALL_FIP_FILENAME} ${INSTALL_LINUX_FILENAME}" +if [ "${DUALBOOT}" != true ]; then + FILES="${FILES} ${INSTALL_RECOVERY_FILENAME}" +fi + +for f in ${FILES}; do + if [ ! -f ${f} ]; then + echo "\033[31m[ERROR] Could not find file '${f}'\033[0m" + ABORT=true + fi +done; + +# Verify what kind of rootfs is going to be programmed +if [ ! -f ${INSTALL_ROOTFS_FILENAME} ]; then + echo "\033[31m[ERROR] Could not find file '${INSTALL_ROOTFS_FILENAME}'\033[0m" + INSTALL_ROOTFS_FILENAME="${BASEFILENAME}-##MACHINE##.squashfs" + echo "\033[32m[INFO] Trying with file '${INSTALL_ROOTFS_FILENAME}'\033[0m" + if [ -f "${INSTALL_ROOTFS_FILENAME}" ]; then + SQUASHFS=true + else + echo "\033[31m[ERROR] Could not find file '${INSTALL_ROOTFS_FILENAME}'\033[0m" + ABORT=true + fi +fi + +[ "${ABORT}" = true ] && exit 1 + +# Enable bootcount mechanism by setting a bootlimit +if [ "${BOOTCOUNT}" = true ]; then + bootlimit_cmd="setenv bootlimit 3" +fi + +# parts names +LINUX_NAME="linux" +RECOVERY_NAME="recovery" +ROOTFS_NAME="rootfs" +# Print warning about storage media being deleted +if [ "${NOWAIT}" != true ]; then + WAIT=10 + printf "\n" + printf " ====================\n" + printf " = IMPORTANT! =\n" + printf " ====================\n" + printf " This process will erase your NAND and will install the following files\n" + printf " on the partitions of the NAND.\n" + printf "\n" + printf " PARTITION\tFILENAME\n" + printf " ---------\t--------\n" + printf " fsbl1\t${INSTALL_ATF_FILENAME}\n" + printf " fsbl2\t${INSTALL_ATF_FILENAME}\n" + printf " fip-a\t${INSTALL_FIP_FILENAME}\n" + printf " fip-b\t${INSTALL_FIP_FILENAME}\n" + if [ "${DUALBOOT}" = true ]; then + printf " ${LINUX_NAME}_a\t${INSTALL_LINUX_FILENAME}\n" + if [ "${INSTALL_DUALBOOT}" = true ]; then + printf " ${LINUX_NAME}_b\t${INSTALL_LINUX_FILENAME}\n" + fi + printf " ${ROOTFS_NAME}_a\t${INSTALL_ROOTFS_FILENAME}\n" + if [ "${INSTALL_DUALBOOT}" = true ]; then + printf " ${ROOTFS_NAME}_b\t${INSTALL_ROOTFS_FILENAME}\n" + fi + else + printf " ${LINUX_NAME}\t${INSTALL_LINUX_FILENAME}\n" + printf " ${RECOVERY_NAME}\t${INSTALL_RECOVERY_FILENAME}\n" + printf " ${ROOTFS_NAME}\t${INSTALL_ROOTFS_FILENAME}\n" + fi + printf "\n" + printf " Press CTRL+C now if you wish to abort.\n" + printf "\n" + while [ ${WAIT} -gt 0 ]; do + printf "\r Update process starts in %d " ${WAIT} + sleep 1 + WAIT=$(( ${WAIT} - 1 )) + done + printf "\r \n" + printf " Starting update process\n" +fi + +# Set fastboot buffer address to $loadaddr, just in case +uuu fb: ucmd setenv fastboot_buffer \${loadaddr} + +# Skip user confirmation for U-Boot update +uuu fb: ucmd setenv forced_update 1 + +# Update ATF +part_update "fsbl1" "${INSTALL_ATF_FILENAME}" 5000 +part_update "fsbl2" "${INSTALL_ATF_FILENAME}" 5000 + +# Update FIP +part_update "fip-a" "${INSTALL_FIP_FILENAME}" 5000 +part_update "fip-b" "${INSTALL_FIP_FILENAME}" 5000 + +# Environment volume does not exist and needs to be created +if [ "${RUNVOLS}" = true ]; then + # Create UBI volumes + uuu "fb[-t 45000]:" ucmd run ubivolscript +fi + +# Set 'bootcmd' for the second part of the script that will +# - Reset environment to defaults +# - Keep the 'dualboot' status +# - Reset the bootcount +# - Set bootlimit (if required) +# - Save the environment +# - Update the 'linux' partition(s) +# - Update the 'rootfs' partition(s) +uuu fb: ucmd setenv bootcmd " + env default -a; + setenv dualboot \${dualboot}; + bootcount reset; + ${bootlimit_cmd}; + saveenv; + saveenv; + echo \"\"; + echo \"\"; + echo \">> Installing Linux firmware\"; + echo \"\"; + echo \"\"; + fastboot 0; +" + +uuu fb: ucmd saveenv +uuu fb: acmd reset + +# Wait for the target to reset +sleep 8 + +# Set fastboot buffer address to $loadaddr +uuu fb: ucmd setenv fastboot_buffer \${loadaddr} + +# Create UBI volumes +uuu "fb[-t 45000]:" ucmd run ubivolscript + +if [ "${DUALBOOT}" = true ]; then + # Update Linux A + part_update "${LINUX_NAME}_a" "${INSTALL_LINUX_FILENAME}" 15000 + # Update Linux B + if [ "${INSTALL_DUALBOOT}" = true ]; then + part_update "${LINUX_NAME}_b" "${INSTALL_LINUX_FILENAME}" 15000 + fi + # Update Rootfs A + part_update "${ROOTFS_NAME}_a" "${INSTALL_ROOTFS_FILENAME}" 120000 + # Update Rootfs B + if [ "${INSTALL_DUALBOOT}" = true ]; then + part_update "${ROOTFS_NAME}_b" "${INSTALL_ROOTFS_FILENAME}" 120000 + fi +else + # Update Linux + part_update "${LINUX_NAME}" "${INSTALL_LINUX_FILENAME}" 15000 + # Update Recovery + part_update "${RECOVERY_NAME}" "${INSTALL_RECOVERY_FILENAME}" 15000 + # Update Rootfs + part_update "${ROOTFS_NAME}" "${INSTALL_ROOTFS_FILENAME}" 120000 + # Configure u-boot to boot into recovery mode and format the + # 'update' partition + uuu fb: ucmd setenv boot_recovery yes + uuu fb: ucmd setenv recovery_command wipe_update + uuu fb: ucmd saveenv +fi + +# Set the dboot_kernel_var to fitimage if Trustfence is enabled +if [ "${TRUSTFENCE}" = "true" ] || echo "$INSTALL_UBOOT_FILENAME" | grep -q -e "signed"; then + uuu fb: ucmd setenv dboot_kernel_var fitimage + uuu fb: ucmd saveenv +fi +# Set the rootfstype if squashfs +if [ "${SQUASHFS}" = true ]; then + uuu fb: ucmd setenv rootfstype squashfs + uuu fb: ucmd saveenv +fi + +# Reset the bootcount +uuu fb: ucmd bootcount reset +# Reset the target +uuu fb: acmd reset + +echo "\033[32m" +echo "=============================================================" +echo "Done! Wait for the target to complete first boot process." +echo "=============================================================" +echo "\033[0m" + +exit diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp25-dvk/boot.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp25-dvk/boot.txt new file mode 100644 index 000000000..93457c87f --- /dev/null +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp25-dvk/boot.txt @@ -0,0 +1,82 @@ +# +# U-Boot bootscript for EMMC/SD images created by Yocto. +# + +# As the first step in the boot script, check if we are using DualBoot. This +# requires the script to change some variables and save them, while the rest +# of the script changes variables only temporarily without saving them. + +# Build boot attempt message string +if test "${bootlimit}" -gt 0 && test "${bootcount}" -gt 0; then + bootattempt="(boot attempt ${bootcount}/${bootlimit})" +fi + +# Pre step: check if we boot from uSD. +if test "${mmcbootdev}" = "1"; then + # We are booting from the SD card. + setenv mmcroot /dev/mmcblk${mmcbootdev}p2 +elif test "${dualboot}" = "yes"; then + if test "${active_system}" = "linux_a"; then + echo "Booting from system A ${bootattempt}" + part number mmc ${mmcbootdev} linux_a tmp_mmcpart + part number mmc ${mmcbootdev} rootfs_a tmp_rootfs_index + else + echo "Booting from system B ${bootattempt}" + part number mmc ${mmcbootdev} linux_b tmp_mmcpart + part number mmc ${mmcbootdev} rootfs_b tmp_rootfs_index + fi + part uuid mmc ${mmcbootdev}:${tmp_rootfs_index} tmp_mmcroot + if test "${mmcpart}" -ne "${tmp_mmcpart}"; then + setexpr mmcpart ${tmp_mmcpart} + env_save_needed="1" + fi + if test "${mmcroot}" != "PARTUUID=${tmp_mmcroot}"; then + setenv mmcroot PARTUUID=${tmp_mmcroot} + env_save_needed="1" + fi + if test "${env_save_needed}" = "1"; then + env delete tmp_mmcpart tmp_rootfs_index tmp_mmcroot + env save + fi +else + echo "Booting system ${bootattempt}" + # Get the UUID of the configured boot partition. + part uuid mmc ${mmcbootdev}:${mmcpart} bootpart + # Check the boot source. + if test "${bootpart}" = "${part1_uuid}"; then + # We are booting from the eMMC using 'linux'. + true + elif test "${bootpart}" = "${part2_uuid}"; then + # We are booting from the eMMC using 'recovery'. + setenv boot_initrd true + setenv initrd_file uramdisk-recovery.img + fi +fi + +# Back up environment variables +setenv ORIG_overlays ${overlays} + +# +# Determine overlays to apply depending on the hardware capabilities +# described by the HWID, SOM version, and carrier board version. +# +setexpr module_has_wifi ${hwid_2} \& 20000 +setexpr module_has_wifi ${module_has_wifi} / 20000 +setexpr module_has_bt ${hwid_2} \& 40000 +setexpr module_has_bt ${module_has_bt} / 40000 + +if test "${module_has_bt}" = "1" && test -z "${disable_bt}"; then + setenv overlays _ov_som_bt_ccmp25.dtbo,${overlays} +fi + +if test "${module_has_wifi}" = "1" && test -z "${disable_wifi}"; then + setenv overlays _ov_som_wifi_ccmp25.dtbo,${overlays} +fi + +dboot linux mmc ${mmcbootdev}:${mmcpart} + +# We only get here in case of an error on the dboot command. + +# Undo changes to environment variables +setenv overlays ${ORIG_overlays} +setenv ORIG_overlays diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2022.10.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2022.10.bb new file mode 100644 index 000000000..11f0da850 --- /dev/null +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2022.10.bb @@ -0,0 +1,35 @@ +# Copyright (C) 2024 Digi International Inc. + +require u-boot-dey.inc +LIC_FILES_CHKSUM = "file://Licenses/README;md5=2ca5f2c35c8cc335f0a19756634782f1" + +DEPENDS += "flex-native bison-native" +DEPENDS += "python3-setuptools-native" + +SRCBRANCH = "v2022.10/master" +SRCREV = "${AUTOREV}" + +SRC_URI += " \ + ${@oe.utils.conditional('TRUSTFENCE_SIGN_FIT_STM', '1', 'file://fit_signature.cfg', '', d)} \ +" + +install_helper_files() { + # Install dtbs from UBOOT_DEVICETREE to datadir, so that kernel + # can use it for signing, and kernel will deploy after signs it. + if [ -n "${UBOOT_DEVICETREE}" ]; then + for devicetree in ${UBOOT_DEVICETREE}; do + install -Dm 0644 ${B}/${config}/arch/arm/dts/${devicetree}.dtb ${D}${datadir}/${devicetree}.dtb + done + else + bbwarn "${UBOOT_DEVICETREE} not found" + fi +} + +do_install:append() { + # Copy additional files, so kernel can use it when creating the FIT image + if [ "${KERNEL_IMAGETYPE}" = "fitImage" ]; then + install_helper_files + fi +} + +COMPATIBLE_MACHINE = "(ccmp2)"