diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/stm-flash/ao_stm_flash.c | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/src/stm-flash/ao_stm_flash.c b/src/stm-flash/ao_stm_flash.c index 4a91ef1f..51856b46 100644 --- a/src/stm-flash/ao_stm_flash.c +++ b/src/stm-flash/ao_stm_flash.c @@ -54,6 +54,15 @@ ao_cmd_hex32(void) } 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(); @@ -64,24 +73,46 @@ ao_block_write(void) } u; uint16_t i; + if (addr < 0x08002000 || 0x08200000 <= addr) { + puts("Invalid address"); + return; + } for (i = 0; i < 256; i++) - u.data8[i] = getchar(); + 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++) - putchar(*p++); + 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_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" }, { 0, NULL }, |