diff --git a/httpd/page_impl.c b/httpd/page_impl.c index 45b2e84..f605529 100644 --- a/httpd/page_impl.c +++ b/httpd/page_impl.c @@ -17,6 +17,8 @@ // #define DEBUG #include "debug.h" +extern __xdata char flash_size_str[10]; + #define L2_MAX_TRANSFER 30 #pragma codeseg BANK1 @@ -96,6 +98,10 @@ void itoa_html(uint8_t v) char_to_html('0' + (v % 10)); } +void string_to_html(register char *s) +{ + while (*s) char_to_html(*s++); +} uint16_t stat_content(void) { @@ -234,6 +240,9 @@ void send_basic_info(void) slen += strtox(outbuf + slen, BUILD_DATE); slen += strtox(outbuf + slen, "\",\"hw_ver\":\""); slen += strtox(outbuf + slen, machine.machine_name); + slen += strtox(outbuf + slen, "\",\"flash_size\":\""); + string_to_html(flash_size_str); + slen += strtox(outbuf + slen, "\",\"sfp_slot_0\":\""); send_sfp_info(0); char_to_html('"'); diff --git a/rtl837x_common.h b/rtl837x_common.h index f33a1d2..e9cc767 100644 --- a/rtl837x_common.h +++ b/rtl837x_common.h @@ -131,6 +131,7 @@ void memset(register __xdata uint8_t *dst, register __xdata uint8_t v, register uint16_t strlen(register __code const char *s); uint16_t strlen_x(register __xdata const char *s); uint16_t strtox(register __xdata uint8_t *dst, register __code const char *s); +uint16_t strcpy(register __xdata uint8_t *dst, register const char *s); void tcpip_output(void); uint8_t read_flash(uint8_t bank, __code uint8_t *addr); void get_random_32(void); diff --git a/rtl837x_flash.c b/rtl837x_flash.c index 76c6eb3..fa73743 100644 --- a/rtl837x_flash.c +++ b/rtl837x_flash.c @@ -10,6 +10,7 @@ __xdata uint8_t dio_enabled; __xdata struct flash_region_t flash_region; __xdata uint32_t flash_size; +__xdata char flash_size_str[16]; // For the flash commands, see e.g. Windbond W25Q32JV datasheet #define CMD_WRITE_STATUS 0x01 @@ -159,8 +160,17 @@ void flash_read_jedecid(void) flash_size = 1UL << cap; print_byte(cap); print_string(" = "); - print_long(flash_size); - print_string(" Bytes\n"); + switch(cap) { + case 0x12: memcpyc(flash_size_str, "256 KB", 7); break; + case 0x13: memcpyc(flash_size_str, "512 KB", 7); break; + case 0x14: memcpyc(flash_size_str, "1 MB", 5); break; + case 0x15: memcpyc(flash_size_str, "2 MB", 5); break; + case 0x16: memcpyc(flash_size_str, "4 MB", 5); break; + case 0x17: memcpyc(flash_size_str, "8 MB", 5); break; + case 0x18: memcpyc(flash_size_str, "16 MB", 6); break; + default: memcpyc(flash_size_str, "unknown", 8); break; + } + print_string_x(flash_size_str); write_char('\n'); flash_configure_mmio(); } diff --git a/rtlplayground.c b/rtlplayground.c index 9d9e755..22155a7 100644 --- a/rtlplayground.c +++ b/rtlplayground.c @@ -25,6 +25,7 @@ extern __code const struct machine machine; extern __xdata uint32_t flash_size; +extern __xdata char flash_size_str[10]; extern __xdata uint16_t crc_value; __xdata struct machine_runtime machine_detected; @@ -240,6 +241,15 @@ uint16_t strtox(register __xdata uint8_t *dst, register __code const char *s) return dst - b; } +uint16_t strcpy(register __xdata uint8_t *dst, register const char *s) +{ + __xdata uint8_t *b = dst; + while (*s) + *dst++ = *s++; + *dst = 0; + return dst - b; +} + uint16_t strlen(register __code const char *s) { uint16_t l = 0; @@ -1861,17 +1871,13 @@ void check_and_flash_update_image(void) { flash_read_jedecid(); // This initializes also __xdata flash_size variable - print_long(flash_size); print_string(" flash size detected.\n"); - print_long(FIRMWARE_UPLOAD_START*2); print_string(" bytes needed for update.\n"); + print_string_x(flash_size_str); print_string(" flash size detected. (1 MB is needed for image updating)\n"); if (flash_size < FIRMWARE_UPLOAD_START*2) { print_string("Flash too small for updating; skipping update check\n"); return; } - else { - print_string("Flash size ok.\n"); - } - + print_string("Checking for update image in flash... "); // Check if an update image is in flash flash_region.addr = FIRMWARE_UPLOAD_START; flash_region.len = 0x100; @@ -1884,7 +1890,7 @@ void check_and_flash_update_image(void) __xdata uint16_t i = 0; __xdata uint16_t j = 0; __xdata uint8_t * __xdata bptr; - print_string("Identified update image. Checking integrity"); + print_string("found update image! Checking integrity"); flash_init(0); // Re-initialize flash for non-DIO operation, otherwise flashing will fail set_sys_led_state(SYS_LED_FAST); crc_value = 0x0000; @@ -1940,6 +1946,10 @@ void check_and_flash_update_image(void) dest += 0x1000; } } + else + { + print_string("no update image found.\n"); + } } void bootloader(void)