X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=src%2Fstm-flash%2Fao_stm_flash.c;h=51856b469fb0b423a255b14b4dacd52405f21679;hp=2988a9375345c947665cc8972b87083da28e004e;hb=5db4d5e5b1272b161102e889e65b9c7bc7928352;hpb=b1a43ce313c85cb7f8f16f7f0647d9d4320ba692 diff --git a/src/stm-flash/ao_stm_flash.c b/src/stm-flash/ao_stm_flash.c index 2988a937..51856b46 100644 --- a/src/stm-flash/ao_stm_flash.c +++ b/src/stm-flash/ao_stm_flash.c @@ -32,8 +32,89 @@ 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_application, "a\0Switch to application" }, + { ao_block_erase, "e \0Erase block." }, + { ao_block_write, "W \0Write block. 256 binary bytes follow newline" }, + { ao_block_read, "R \0Read block. Returns 256 bytes" }, { 0, NULL }, };