canboot: improve bootloader request method

Use a cross platform request signature to enter the
bootloader.

Signed-off-by:  Eric Callahan <arksine.code@gmail.com>
This commit is contained in:
Eric Callahan 2022-04-24 08:34:27 -04:00
parent 3541dd1f2f
commit 9b4c95ee9a
No known key found for this signature in database
GPG Key ID: 7027245FBBDDF59A
2 changed files with 22 additions and 10 deletions

View File

@ -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();

View File

@ -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.