X-Git-Url: https://git.gag.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Fproduct%2Fao_flash_task.c;h=8ae9b2e5d3fe4b26a4680ee519cbee4911ec02d4;hb=63fc45973ec92bf3ef7122da0f76d6e111ecd342;hp=4cfbf75fde3d15c38b7b8ab0809bb9a85abfc3d8;hpb=4ff54bb96f6c00c0c2c7dd32f81403bac331621a;p=fw%2Faltos diff --git a/src/product/ao_flash_task.c b/src/product/ao_flash_task.c index 4cfbf75f..8ae9b2e5 100644 --- a/src/product/ao_flash_task.c +++ b/src/product/ao_flash_task.c @@ -3,7 +3,8 @@ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of @@ -24,10 +25,12 @@ void ao_panic(uint8_t reason) { + (void) reason; + for (;;); } void -ao_put_string(__code char *s) +ao_put_string(const char *s) { char c; while ((c = *s++)) { @@ -46,7 +49,7 @@ ao_application(void) static uint32_t ao_get_hex32(void) { - int8_t n; + int n; uint32_t v = 0; for (;;) { @@ -63,7 +66,7 @@ ao_get_hex32(void) n = n - ('A' - 10); else break; - v = (v << 4) | n; + v = (v << 4) | (uint8_t) n; n = ao_usb_getchar(); } return v; @@ -78,6 +81,14 @@ ao_block_erase(void) ao_flash_erase_page(p); } +static int +ao_block_valid_address(uint32_t addr) +{ + if ((uint32_t) AO_BOOT_APPLICATION_BASE <= addr && addr <= (uint32_t) AO_BOOT_APPLICATION_BOUND - 256) + return 1; + return 0; +} + static void ao_block_write(void) { @@ -86,12 +97,10 @@ ao_block_write(void) uint8_t data[256]; uint16_t i; - if (addr < (uint32_t) AO_BOOT_APPLICATION_BASE) { - ao_put_string("Invalid address\n"); - return; - } for (i = 0; i < 256; i++) data[i] = ao_usb_getchar(); + if (!ao_block_valid_address(addr)) + return; ao_flash_page(p, (void *) data); } @@ -103,18 +112,43 @@ ao_block_read(void) uint16_t i; uint8_t c; + if (!ao_block_valid_address(addr)) { + for (i = 0; i < 256; i++) + ao_usb_putchar(0xff); + return; + } for (i = 0; i < 256; i++) { c = *p++; ao_usb_putchar(c); } } +static inline void +hexchar(uint8_t c) +{ + if (c > 10) + c += 'a' - ('9' + 1); + ao_usb_putchar(c + '0'); +} + +static void +ao_put_hex(uint32_t u) +{ + int8_t i; + for (i = 28; i >= 0; i -= 4) + hexchar((u >> i) & 0xf); +} + static void ao_show_version(void) { ao_put_string("altos-loader"); ao_put_string("\nmanufacturer "); ao_put_string(ao_manufacturer); ao_put_string("\nproduct "); ao_put_string(ao_product); + ao_put_string("\nflash-range "); + ao_put_hex((uint32_t) AO_BOOT_APPLICATION_BASE); + ao_usb_putchar(' '); + ao_put_hex((uint32_t) AO_BOOT_APPLICATION_BOUND); ao_put_string("\nsoftware-version "); ao_put_string(ao_version); ao_put_string("\n"); }