From ea2e103bdecfe2999cb0a6c619400db3f83a456a Mon Sep 17 00:00:00 2001 From: Benjamin Valentin Date: Wed, 13 Jan 2021 22:13:05 +0100 Subject: [PATCH] bootloaders/riotboot: add serial bootloader --- bootloaders/riotboot_serial/Makefile | 14 ++++ bootloaders/riotboot_serial/Makefile.ci | 3 + bootloaders/riotboot_serial/main.c | 93 +++++++++++++++++++++++++ 3 files changed, 110 insertions(+) create mode 100644 bootloaders/riotboot_serial/Makefile create mode 100644 bootloaders/riotboot_serial/Makefile.ci create mode 100644 bootloaders/riotboot_serial/main.c diff --git a/bootloaders/riotboot_serial/Makefile b/bootloaders/riotboot_serial/Makefile new file mode 100644 index 0000000000..1bd20aa81f --- /dev/null +++ b/bootloaders/riotboot_serial/Makefile @@ -0,0 +1,14 @@ +# Default RIOT bootloader +APPLICATION = riotboot_serial + +# Include serial bootloader functionality +USEMODULE += riotboot_serial + +# RIOT codebase +RIOTBASE ?= $(CURDIR)/../../ + +include $(RIOTBASE)/Makefile.include + +# limit riotboot bootloader size +RIOTBOOT_SERIAL_LEN ?= $(RIOTBOOT_LEN) +ROM_LEN := $(RIOTBOOT_SERIAL_LEN) diff --git a/bootloaders/riotboot_serial/Makefile.ci b/bootloaders/riotboot_serial/Makefile.ci new file mode 100644 index 0000000000..e2184eae00 --- /dev/null +++ b/bootloaders/riotboot_serial/Makefile.ci @@ -0,0 +1,3 @@ +BOARD_INSUFFICIENT_MEMORY := \ + phynode-kw41z \ + # diff --git a/bootloaders/riotboot_serial/main.c b/bootloaders/riotboot_serial/main.c new file mode 100644 index 0000000000..5fce940813 --- /dev/null +++ b/bootloaders/riotboot_serial/main.c @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2017 Kaspar Schleiser + * Inria + * + * 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 Serial UART riot-based bootloader + * + * @author Kaspar Schleiser + * @author Francisco Acosta + * @author Benjamin Valentin + * + * @} + */ + +#include "cpu.h" +#include "panic.h" +#include "riotboot/slot.h" +#include "riotboot/serial.h" + +static int _get_slot(void) +{ + uint32_t version = 0; + int slot = -1; + + if (!IS_USED(MODULE_RIOTBOOT_SLOT)) { + return -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; + } + } + + return slot; +} + +static void _boot_default(int slot) +{ + if (!IS_USED(MODULE_RIOTBOOT_SLOT)) { + /* boot 'raw' firmware image */ + cpu_jump_to_image(SLOT0_OFFSET); + return; + } + + if (slot == -1) { + slot = _get_slot(); + } + + if (slot != -1) { + riotboot_slot_jump(slot); + } +} + +void kernel_init(void) +{ + int slot = -1; + + if (IS_USED(MODULE_RIOTBOOT_SERIAL)) { + slot = riotboot_serial_loader(); + } + + irq_disable(); + _boot_default(slot); + + /* serious trouble! nothing to boot */ + while (1) {} +} + +NORETURN void core_panic(core_panic_t crash_code, const char *message) +{ + (void)crash_code; + (void)message; + while (1) {} +}