diff --git a/src/canboot_main.c b/src/canboot_main.c index 0188f6c..7bbe49c 100644 --- a/src/canboot_main.c +++ b/src/canboot_main.c @@ -31,6 +31,8 @@ #define WAIT_BLINK_TIME 1000000 #define XFER_BLINK_TIME 10000 +#define REQUEST_SIG 0x5984E3FA6CA1589B // Random request sig + static uint8_t page_buffer[CONFIG_FLASH_PAGE_SIZE]; static uint8_t cmd_buf[CMD_BUF_SIZE]; static uint8_t cmd_pos = 0; @@ -264,18 +266,23 @@ enter_bootloader(void) void canboot_main(void) { - uint16_t mkey = read_magic_key(); - // Enter the bootloader if the magic key has been set or if - // no application has been flashed - if (mkey == CONFIG_MAGIC_KEY || !check_application_code()) - enter_bootloader(); + uint32_t req_addr = *(uint32_t *)CONFIG_FLASH_START; + volatile uint64_t* boot_request_sig = (volatile uint64_t *)req_addr; - // set magic key and delay for one second. This enters the bootloader if + // Enter the bootloader in the following conditions: + // - The request signature is set in memory (request from app) + // - No application code is present + if ((*boot_request_sig == REQUEST_SIG ) || !check_application_code()) { + *boot_request_sig = 0; + enter_bootloader(); + } + + // set request signature and delay for two seconds. This enters the bootloader if // the reset button is double clicked - set_magic_key(); - udelay(1500000); + *boot_request_sig = REQUEST_SIG; + udelay(2000000); + *boot_request_sig = 0; // No reset, read the key back out to clear it - read_magic_key(); // jump to app jump_to_application(); diff --git a/src/generic/armcm_link.lds.S b/src/generic/armcm_link.lds.S index eb3962a..2dfc7db 100644 --- a/src/generic/armcm_link.lds.S +++ b/src/generic/armcm_link.lds.S @@ -57,13 +57,18 @@ SECTIONS _bss_end = .; } > ram - _stack_start = CONFIG_RAM_START + CONFIG_RAM_SIZE - CONFIG_STACK_SIZE ; + _stack_start = CONFIG_RAM_START + CONFIG_RAM_SIZE - CONFIG_STACK_SIZE - 8; .stack _stack_start (NOLOAD) : { . = . + CONFIG_STACK_SIZE; _stack_end = .; } > ram + .reserved (NOLOAD) : + { + . = . + 8; + } > ram + /DISCARD/ : { // The .init/.fini sections are used by __libc_init_array(), but // that isn't needed so no need to include them in the binary.