diff --git a/common/Kconfig b/common/Kconfig index d862c0583..b9cbe19ae 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -593,6 +593,12 @@ config DEFAULT_ENVIRONMENT_GENERIC_NEW_MENU depends on CONFIG_CMD_MENU_MANAGEMENT default y +config DEFAULT_ENVIRONMENT_GENERIC_NEW_DFU + bool + depends on DEFAULT_ENVIRONMENT_GENERIC_NEW + depends on USB_GADGET_DFU + default y + config DEFAULT_ENVIRONMENT_GENERIC bool depends on !HAVE_DEFAULT_ENVIRONMENT_NEW diff --git a/defaultenv/Makefile b/defaultenv/Makefile index d449e0237..fc679ebc9 100644 --- a/defaultenv/Makefile +++ b/defaultenv/Makefile @@ -1,5 +1,6 @@ bbenv-$(CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW) += defaultenv-2-base bbenv-$(CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW_MENU) += defaultenv-2-menu +bbenv-$(CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW_DFU) += defaultenv-2-dfu bbenv-$(CONFIG_DEFAULT_ENVIRONMENT_GENERIC) += defaultenv-1 obj-$(CONFIG_DEFAULT_ENVIRONMENT) += defaultenv.o extra-y += barebox_default_env barebox_default_env.h barebox_default_env$(DEFAULT_COMPRESSION_SUFFIX) diff --git a/defaultenv/defaultenv-2-dfu/boot/dfu b/defaultenv/defaultenv-2-dfu/boot/dfu new file mode 100644 index 000000000..c9463b667 --- /dev/null +++ b/defaultenv/defaultenv-2-dfu/boot/dfu @@ -0,0 +1,39 @@ +#!/bin/sh + +if [ "$1" = menu ]; then + boot-menu-add-entry "$0" "Device Firmware upgrade (DFU)" + exit +fi + +if [ -d /dfutmp ]; then + rm -r /dfutmp +fi + +mkdir -p /dfutmp + +kernel="/dfutmp/kernel" +dtb="/dfutmp/dtb" +cmdline="/dfutmp/cmdline" + +global.bootm.image="$kernel" + +dfu $kernel(kernel)c,$dtb(dtb)c,$cmdline(cmdline)c +if [ $? != 0 ]; then + exit 1 +fi + +if [ ! -f "$kernel" ]; then + echo "No kernel uploaded. Aborting" + exit 1 +fi + +if [ -f "$cmdline" ]; then + global linux.bootargs.dyn.dfu + readf $cmdline global.linux.bootargs.dyn.dfu +fi + +if [ -f "$dtb" ]; then + global.bootm.oftree="$dtb" +fi + +true diff --git a/defaultenv/defaultenv.c b/defaultenv/defaultenv.c index 3f517b463..dc0e484c8 100644 --- a/defaultenv/defaultenv.c +++ b/defaultenv/defaultenv.c @@ -46,6 +46,8 @@ static void defaultenv_add_base(void) defaultenv_append_directory(defaultenv_2_base); if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW_MENU)) defaultenv_append_directory(defaultenv_2_menu); + if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW_DFU)) + defaultenv_append_directory(defaultenv_2_dfu); if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT_GENERIC)) defaultenv_append_directory(defaultenv_1); diff --git a/scripts/dfuboot.sh b/scripts/dfuboot.sh new file mode 100755 index 000000000..524113b61 --- /dev/null +++ b/scripts/dfuboot.sh @@ -0,0 +1,68 @@ +#!/bin/bash + +DEVICETREE= +KERNEL= +CMDLINE= + +usage() { + echo "usage: $0 [OPTIONS]" + echo "This script uploads a kernel and optionally a devicetree" + echo "and a kernel commandline to barebox via DFU running the" + echo "'boot dfu' command." + echo "OPTIONS:" + echo " -k kernelimage to upload" + echo " -d devicetree binary blob to upload" + echo " -c \"cmdline\" kernel commandline" + echo " -h This help text" + + exit 0 +} + +while getopts "k:d:c:h" opt +do + case "$opt" in + h) + usage + ;; + d) + DEVICETREE="$OPTARG" + ;; + k) + KERNEL="$OPTARG" + ;; + c) + CMDLINE="$OPTARG" + ;; + esac +done + +dfu-util -D "${KERNEL}" -a kernel +if [ $? != 0 ]; then + echo "Failed to upload kernel" + exit 1 +fi + +if [ -n "$DEVICETREE" ]; then + dfu-util -D "${DEVICETREE}" -a dtb + if [ $? != 0 ]; then + echo "Failed to upload devicetree" + exit 1 + fi +fi + +if [ -n "$CMDLINE" ]; then + cmdlinefile=$(mktemp) + + echo -e "$CMDLINE" > "${cmdlinefile}" + + dfu-util -D "${cmdlinefile}" -a cmdline -R + result=$? + + rm -f "${cmdlinefile}" + + if [ $result != 0 ]; then + echo "Failed to upload cmdline" + exit 1 + fi + +fi