Boot: add original files from MCUBoot and Zephyr project
Aligned with MCUBoot version 1.0.0
MCUBoot files:
-- bl2/ext/mcuboot
Aligned with Zephyr version 1.10.0
Zephyr files:
-- bl2/ext/mcuboot/include/util.h
-- platform/ext/target/common/flash.h
Change-Id: I314c3efa2bd2c13a4a2eaefeb5da43e53e988638
Signed-off-by: Tamas Ban <tamas.ban@arm.com>
diff --git a/bl2/ext/mcuboot/main.c b/bl2/ext/mcuboot/main.c
new file mode 100644
index 0000000..cdd4139
--- /dev/null
+++ b/bl2/ext/mcuboot/main.c
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2012-2014 Wind River Systems, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <assert.h>
+#include <zephyr.h>
+#include <flash.h>
+#include <asm_inline.h>
+#include <drivers/system_timer.h>
+
+#include "target.h"
+
+#define BOOT_LOG_LEVEL BOOT_LOG_LEVEL_INFO
+#include "bootutil/bootutil_log.h"
+#include "bootutil/image.h"
+#include "bootutil/bootutil.h"
+#include "flash_map/flash_map.h"
+
+struct device *boot_flash_device;
+
+void os_heap_init(void);
+
+extern void zephyr_flash_area_warn_on_open(void);
+
+#if defined(CONFIG_ARM)
+struct arm_vector_table {
+ uint32_t msp;
+ uint32_t reset;
+};
+
+static void do_boot(struct boot_rsp *rsp)
+{
+ struct arm_vector_table *vt;
+ uintptr_t flash_base;
+ int rc;
+
+ /* The beginning of the image is the ARM vector table, containing
+ * the initial stack pointer address and the reset vector
+ * consecutively. Manually set the stack pointer and jump into the
+ * reset vector
+ */
+ rc = flash_device_base(rsp->br_flash_dev_id, &flash_base);
+ assert(rc == 0);
+
+ vt = (struct arm_vector_table *)(flash_base +
+ rsp->br_image_off +
+ rsp->br_hdr->ih_hdr_size);
+ irq_lock();
+ sys_clock_disable();
+ _MspSet(vt->msp);
+ ((void (*)(void))vt->reset)();
+}
+#else
+/* Default: Assume entry point is at the very beginning of the image. Simply
+ * lock interrupts and jump there. This is the right thing to do for X86 and
+ * possibly other platforms.
+ */
+static void do_boot(struct boot_rsp *rsp)
+{
+ uintptr_t flash_base;
+ void *start;
+ int rc;
+
+ rc = flash_device_base(rsp->br_flash_dev_id, &flash_base);
+ assert(rc == 0);
+
+ start = (void *)(flash_base + rsp->br_image_off +
+ rsp->br_hdr->ih_hdr_size);
+
+ /* Lock interrupts and dive into the entry point */
+ irq_lock();
+ ((void (*)(void))start)();
+}
+#endif
+
+void main(void)
+{
+ struct boot_rsp rsp;
+ int rc;
+
+ BOOT_LOG_INF("Starting bootloader");
+
+ os_heap_init();
+
+ boot_flash_device = device_get_binding(FLASH_DRIVER_NAME);
+ if (!boot_flash_device) {
+ BOOT_LOG_ERR("Flash device not found");
+ while (1)
+ ;
+ }
+
+ rc = boot_go(&rsp);
+ if (rc != 0) {
+ BOOT_LOG_ERR("Unable to find bootable image");
+ while (1)
+ ;
+ }
+
+ BOOT_LOG_INF("Bootloader chainload address offset: 0x%x",
+ rsp.br_image_off);
+ zephyr_flash_area_warn_on_open();
+ BOOT_LOG_INF("Jumping to the first image slot");
+ do_boot(&rsp);
+
+ BOOT_LOG_ERR("Never should get here");
+ while (1)
+ ;
+}