Skip to content

Commit

Permalink
zephyr: arm: Update reading the flash image reset vector
Browse files Browse the repository at this point in the history
This change uses the flash functions to read the applications
reset vector. This allow flexibility on which flash device the
application is programmed.
For e.g: MCUBoot can be programmed and running from Internal
Flash while Zephyr can be loaded from a different Flash device.
This change is made for ARM platform, it can be extended to
non-ARM platforms as well.

Signed-off-by: Mahesh Mahadevan <[email protected]>
  • Loading branch information
mmahadevan108 committed Apr 17, 2024
1 parent 24ac8cc commit 92fceb4
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 7 deletions.
8 changes: 6 additions & 2 deletions boot/zephyr/flash_map_extended.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,12 @@ int flash_area_sector_from_off(off_t off, struct flash_sector *sector)

uint8_t flash_area_get_device_id(const struct flash_area *fa)
{
(void)fa;
return FLASH_DEVICE_ID;
#if defined(CONFIG_ARM)
return fa->fa_id;
#else
(void)fa;
return FLASH_DEVICE_ID;
#endif
}

#define ERASED_VAL 0xff
Expand Down
20 changes: 15 additions & 5 deletions boot/zephyr/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -157,16 +157,26 @@ static void do_boot(struct boot_rsp *rsp)
/* Get ram address for image */
vt = (struct arm_vector_table *)(rsp->br_hdr->ih_load_addr + rsp->br_hdr->ih_hdr_size);
#else
uintptr_t flash_base;
int rc;
const struct flash_area *fap;
static uint32_t dst[2];

/* Jump to flash image */
rc = flash_device_base(rsp->br_flash_dev_id, &flash_base);
rc = flash_area_open(rsp->br_flash_dev_id, &fap);
assert(rc == 0);

rc = flash_area_read(fap, rsp->br_hdr->ih_hdr_size, dst, sizeof(dst));
assert(rc == 0);
#ifndef CONFIG_ASSERT
/* Enter a lock up as asserts are disabled */
if (rc != 0) {
__asm("1: b 1b");
}
#endif

flash_area_close(fap);

vt = (struct arm_vector_table *)(flash_base +
rsp->br_image_off +
rsp->br_hdr->ih_hdr_size);
vt = (struct arm_vector_table *)dst;
#endif

if (IS_ENABLED(CONFIG_SYSTEM_TIMER_HAS_DISABLE_SUPPORT)) {
Expand Down

0 comments on commit 92fceb4

Please sign in to comment.