From e87bb6a0f9b7078515169dd745cca3c63f03c5b1 Mon Sep 17 00:00:00 2001 From: dylad Date: Tue, 15 Dec 2020 17:14:43 +0100 Subject: [PATCH] bootloader: create new bootloader application with DFU support --- bootloaders/riotboot_dfu/Makefile | 46 +++++++++++++++++++++ bootloaders/riotboot_dfu/main.c | 66 +++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 bootloaders/riotboot_dfu/Makefile create mode 100644 bootloaders/riotboot_dfu/main.c diff --git a/bootloaders/riotboot_dfu/Makefile b/bootloaders/riotboot_dfu/Makefile new file mode 100644 index 0000000000..5c5b1b08f5 --- /dev/null +++ b/bootloaders/riotboot_dfu/Makefile @@ -0,0 +1,46 @@ +# Default RIOT bootloader +APPLICATION = riotboot_dfu + +# Default testing board +BOARD ?= samr21-xpro + +# Select the boards with riotboot feature +FEATURES_REQUIRED += riotboot + +# Set RIOTBOOT_BUILD to indicate a riotboot application build +RIOTBOOT_BUILD = 1 +# Provide a define to detect if building the bootloader +CFLAGS += -DRIOTBOOT + +# Disable unused modules +CFLAGS += -DNDEBUG -DLOG_LEVEL=LOG_NONE +DISABLE_MODULE += core_init core_msg core_panic +DISABLE_MODULE += auto_init auto_init_% + +# avoid using stdio +USEMODULE += stdio_null + +# Include riotboot flash partition functionality +USEMODULE += riotboot_slot + +# Add RIOTBOOT USB DFU integration +USEMODULE=riotboot_usb_dfu + +# Use xtimer for scheduled reboot +USEMODULE += xtimer + +# RIOT codebase +RIOTBASE ?= $(CURDIR)/../../ + +# USB device vendor and product ID +# pid.codes test VID/PID, not globally unique + +USB_VID ?= ${USB_VID_TESTING} +USB_PID ?= ${USB_PID_TESTING} + +include $(RIOTBASE)/Makefile.include + +# limit riotboot bootloader size +# TODO: Manage to set this variable for boards which already embed a +# bootloader, currently it will be overwritten +ROM_LEN := $(RIOTBOOT_LEN) diff --git a/bootloaders/riotboot_dfu/main.c b/bootloaders/riotboot_dfu/main.c new file mode 100644 index 0000000000..2ec7c67429 --- /dev/null +++ b/bootloaders/riotboot_dfu/main.c @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2017 Kaspar Schleiser + * Inria + * 2020 Mesotic SAS + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup bootloaders + * @{ + * + * @file + * @brief RIOT-based bootloader with USB-DFU support + * + * @author Kaspar Schleiser + * @author Francisco Acosta + * @author Dylan Laduranty + * + * @} + */ + +#include "cpu.h" +#include "panic.h" +#include "riotboot/slot.h" +#include "riotboot/usb_dfu.h" + +void kernel_init(void) +{ + uint32_t version = 0; + int slot = -1; + + for (unsigned i = 0; i < riotboot_slot_numof; i++) { + const riotboot_hdr_t *riot_hdr = riotboot_slot_get_hdr(i); + if (riotboot_slot_validate(i)) { + /* skip slot if metadata broken */ + continue; + } + if (riot_hdr->start_addr != riotboot_slot_get_image_startaddr(i)) { + continue; + } + if (slot == -1 || riot_hdr->version > version) { + version = riot_hdr->version; + slot = i; + } + } + + /* Flash the unused slot if magic word is set */ + riotboot_usb_dfu_init(0); + + if (slot != -1) { + riotboot_slot_jump(slot); + } + + /* Nothing to boot, stay in DFU mode to flash a slot */ + riotboot_usb_dfu_init(1); +} + +NORETURN void core_panic(core_panic_t crash_code, const char *message) +{ + (void)crash_code; + (void)message; + while (1) {} +}