diff options
author | Keith Packard <keithp@keithp.com> | 2013-03-11 13:21:04 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2013-05-07 20:16:36 -0700 |
commit | b1a43ce313c85cb7f8f16f7f0647d9d4320ba692 (patch) | |
tree | 932b1768bc85c5ef5865d6acd61eac22a8584dcc /src/stm-flash | |
parent | 56a7cbbf51f5c9ebbfe17d1cc30ed807572af3cc (diff) |
altos: Clean up boot loader support
Split out code into separate files.
Add support for getting back to boot loader from application.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/stm-flash')
-rw-r--r-- | src/stm-flash/Makefile | 2 | ||||
-rw-r--r-- | src/stm-flash/ao_pins.h | 5 | ||||
-rw-r--r-- | src/stm-flash/ao_stm_flash.c | 84 |
3 files changed, 7 insertions, 84 deletions
diff --git a/src/stm-flash/Makefile b/src/stm-flash/Makefile index 3c7b4966..e4a2f321 100644 --- a/src/stm-flash/Makefile +++ b/src/stm-flash/Makefile @@ -17,6 +17,8 @@ INC = \ # ALTOS_SRC = \ ao_interrupt.c \ + ao_boot_chain.c \ + ao_boot_pin.c \ ao_product.c \ ao_romconfig.c \ ao_task.c \ diff --git a/src/stm-flash/ao_pins.h b/src/stm-flash/ao_pins.h index ca53d844..382ef353 100644 --- a/src/stm-flash/ao_pins.h +++ b/src/stm-flash/ao_pins.h @@ -65,10 +65,13 @@ #define HAS_TASK_INFO 0 #define HAS_VERSION 0 +#define AO_BOOT_CHAIN 1 +#define AO_BOOT_PIN 1 + #define AO_BOOT_APPLICATION_GPIO stm_gpioa #define AO_BOOT_APPLICATION_PIN 0 #define AO_BOOT_APPLICATION_VALUE 1 #define AO_BOOT_APPLICATION_MODE 0 -#define AO_BOOT_APPLICATION_BASE 0x2000 +#define AO_BOOT_APPLICATION_BASE ((uint32_t *) 0x2000) #endif /* _AO_PINS_H_ */ diff --git a/src/stm-flash/ao_stm_flash.c b/src/stm-flash/ao_stm_flash.c index e2d7ec65..2988a937 100644 --- a/src/stm-flash/ao_stm_flash.c +++ b/src/stm-flash/ao_stm_flash.c @@ -32,89 +32,8 @@ ao_application(void) ao_boot_reboot(AO_BOOT_APPLICATION_BASE); } -static uint32_t -ao_cmd_hex32(void) -{ - __pdata uint8_t r = ao_cmd_lex_error; - int8_t n; - uint32_t v = 0; - - ao_cmd_white(); - for(;;) { - n = ao_cmd_hexchar(ao_cmd_lex_c); - if (n < 0) - break; - v = (v << 4) | n; - r = ao_cmd_success; - ao_cmd_lex(); - } - if (r != ao_cmd_success) - ao_cmd_status = r; - return v; -} - -void -ao_block_erase(void) -{ - uint32_t addr = ao_cmd_hex32(); - uint32_t *p = (uint32_t *) addr; - - ao_flash_erase_page(p); -} - -void -ao_block_write(void) -{ - uint32_t addr = ao_cmd_hex32(); - uint32_t *p = (uint32_t *) addr; - union { - uint8_t data8[256]; - uint32_t data32[64]; - } u; - uint16_t i; - - if (addr < 0x08002000 || 0x08200000 <= addr) { - puts("Invalid address"); - return; - } - for (i = 0; i < 256; i++) - u.data8[i] = i; - ao_flash_page(p, u.data32); -} - -static void -puthex(uint8_t c) -{ - c &= 0xf; - if (c < 10) - c += '0'; - else - c += 'a' - 10; - putchar (c); -} - -void -ao_block_read(void) -{ - uint32_t addr = ao_cmd_hex32(); - uint8_t *p = (uint8_t *) addr; - uint16_t i; - uint8_t c; - - for (i = 0; i < 256; i++) { - c = *p++; - puthex(c); - puthex(c>>4); - if ((i & 0xf) == 0xf) - putchar('\n'); - } -} - __code struct ao_cmds ao_flash_cmds[] = { - { ao_application, "a\0Switch to application" }, - { ao_block_erase, "e <addr>\0Erase block." }, - { ao_block_write, "W <addr>\0Write block. 256 binary bytes follow newline" }, - { ao_block_read, "R <addr>\0Read block. Returns 256 bytes" }, + { ao_application, "A\0Switch to application" }, { 0, NULL }, }; @@ -133,7 +52,6 @@ main(void) ao_usb_init(); ao_cmd_register(&ao_flash_cmds[0]); - ao_cmd_register(&ao_flash_cmds[0]); ao_start_scheduler(); return 0; } |