From 7a0f2484242fe6ed42a0243ef94b37cd5a6626de Mon Sep 17 00:00:00 2001 From: feelfree69 Date: Sat, 28 Feb 2026 19:56:18 +0100 Subject: [PATCH 1/3] Add flash_size to web interface --- httpd/page_impl.c | 9 +++++++++ rtl837x_common.h | 1 + rtl837x_flash.c | 14 ++++++++++++-- rtlplayground.c | 24 +++++++++++++++++------- 4 files changed, 39 insertions(+), 9 deletions(-) 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) From 494320b1911cf5ecb0b9b7e8df978dde4c4a2fd0 Mon Sep 17 00:00:00 2001 From: feelfree69 Date: Thu, 5 Mar 2026 08:55:51 +0100 Subject: [PATCH 2/3] Resolve review comments --- httpd/page_impl.c | 3 +-- rtl837x_flash.c | 38 +++++++++++++++++++------------------- rtl837x_flash.h | 2 ++ rtlplayground.c | 11 +---------- 4 files changed, 23 insertions(+), 31 deletions(-) diff --git a/httpd/page_impl.c b/httpd/page_impl.c index f605529..9769311 100644 --- a/httpd/page_impl.c +++ b/httpd/page_impl.c @@ -17,7 +17,6 @@ // #define DEBUG #include "debug.h" -extern __xdata char flash_size_str[10]; #define L2_MAX_TRANSFER 30 @@ -241,7 +240,7 @@ void send_basic_info(void) 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); + string_to_html(get_flash_size_str()); slen += strtox(outbuf + slen, "\",\"sfp_slot_0\":\""); send_sfp_info(0); diff --git a/rtl837x_flash.c b/rtl837x_flash.c index fa73743..42a6cf3 100644 --- a/rtl837x_flash.c +++ b/rtl837x_flash.c @@ -9,8 +9,11 @@ __xdata uint8_t dio_enabled; __xdata struct flash_region_t flash_region; + __xdata uint32_t flash_size; -__xdata char flash_size_str[16]; +__xdata uint8_t flash_capacity_code; +__code char * __code flash_size_text[] = { "256 KB", "512 KB", "1 MB", "2 MB", "4 MB", "8 MB", "16 MB" }; + // For the flash commands, see e.g. Windbond W25Q32JV datasheet #define CMD_WRITE_STATUS 0x01 @@ -135,6 +138,13 @@ void flash_read_uid(void) flash_configure_mmio(); } +__code char* get_flash_size_str(void) +{ + if (flash_capacity_code >= 0x12 && flash_capacity_code <= 0x18) + return flash_size_text[flash_capacity_code - 0x12]; + else + return "unknown"; +} void flash_read_jedecid(void) { @@ -151,26 +161,16 @@ void flash_read_jedecid(void) SFR_FLASH_EXEC_GO = 1; while(SFR_FLASH_EXEC_BUSY); - print_string("Maufacturer ID: 0x"); + print_string("Flash information:\n"); + print_string(" Manufacturer ID: 0x"); print_byte(SFR_FLASH_DATA0); - print_string("\nMemory Type: 0x"); + print_string("\n Memory Type: 0x"); print_byte(SFR_FLASH_DATA8); - print_string("\nCapacity: 0x"); - uint8_t cap = SFR_FLASH_DATA16; - flash_size = 1UL << cap; - print_byte(cap); - print_string(" = "); - 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'); + print_string("\n Capacity: 0x"); + flash_capacity_code = SFR_FLASH_DATA16; + flash_size = 1UL << flash_capacity_code; + print_byte(flash_capacity_code); + print_string(" = "); print_string(get_flash_size_str()); write_char('\n'); flash_configure_mmio(); } diff --git a/rtl837x_flash.h b/rtl837x_flash.h index cad66b0..2267b23 100644 --- a/rtl837x_flash.h +++ b/rtl837x_flash.h @@ -10,4 +10,6 @@ void flash_read_security(void); void flash_sector_erase(void); void flash_read_bulk(__xdata uint8_t *dst); void flash_write_bytes(__xdata uint8_t *ptr); +__code char* get_flash_size_str(void); + #endif diff --git a/rtlplayground.c b/rtlplayground.c index 22155a7..c58a761 100644 --- a/rtlplayground.c +++ b/rtlplayground.c @@ -25,7 +25,6 @@ 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; @@ -241,14 +240,6 @@ 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) { @@ -1871,7 +1862,7 @@ void check_and_flash_update_image(void) { flash_read_jedecid(); // This initializes also __xdata flash_size variable - print_string_x(flash_size_str); print_string(" flash size detected. (1 MB is needed for image updating)\n"); + print_string(get_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; From 71880a95f59eb2a5e86e50747f03905d8b781986 Mon Sep 17 00:00:00 2001 From: feelfree69 Date: Fri, 6 Mar 2026 08:55:59 +0100 Subject: [PATCH 3/3] optimization as suggested by review comment --- rtl837x_flash.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/rtl837x_flash.c b/rtl837x_flash.c index 42a6cf3..8845375 100644 --- a/rtl837x_flash.c +++ b/rtl837x_flash.c @@ -12,8 +12,6 @@ __xdata struct flash_region_t flash_region; __xdata uint32_t flash_size; __xdata uint8_t flash_capacity_code; -__code char * __code flash_size_text[] = { "256 KB", "512 KB", "1 MB", "2 MB", "4 MB", "8 MB", "16 MB" }; - // For the flash commands, see e.g. Windbond W25Q32JV datasheet #define CMD_WRITE_STATUS 0x01 @@ -140,10 +138,16 @@ void flash_read_uid(void) __code char* get_flash_size_str(void) { - if (flash_capacity_code >= 0x12 && flash_capacity_code <= 0x18) - return flash_size_text[flash_capacity_code - 0x12]; - else - return "unknown"; + switch (flash_capacity_code) { + case 0x12: return "256 KB"; + case 0x13: return "512 KB"; + case 0x14: return "1 MB"; + case 0x15: return "2 MB"; + case 0x16: return "4 MB"; + case 0x17: return "8 MB"; + case 0x18: return "16 MB"; + default: return "unknown"; + } } void flash_read_jedecid(void)