From a59f92a6480ff6a53a913d6e8beb6c257526ee12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sun, 5 Oct 2025 16:49:44 +0200 Subject: [PATCH] Also use struct flash_region in flash_read_security(), flash_sector_erase(). --- cmd_parser.c | 15 +++++++++++---- rtl837x_flash.c | 36 ++++++++++++++++++------------------ rtl837x_flash.h | 4 ++-- rtlplayground.c | 9 ++++++--- 4 files changed, 37 insertions(+), 27 deletions(-) diff --git a/cmd_parser.c b/cmd_parser.c index 1f9ad4c..4538c3d 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -491,9 +491,15 @@ void cmd_parser(void) __banked if (cmd_compare(0, "flash") && cmd_words_b[1] > 0 && cmd_buffer[cmd_words_b[1]] == 'r') { print_string("\nPRINT SECURITY REGISTERS\n"); // The following will only show something else than 0xff if it was programmed for a managed switch - flash_read_security(0x0001000, 40); - flash_read_security(0x0002000, 40); - flash_read_security(0x0003000, 40); + flash_region.addr = 0x0001000; + flash_region.len = 40; + flash_read_security(); + flash_region.addr = 0x0002000; + flash_region.len = 40; + flash_read_security(); + flash_region.addr = 0x0003000; + flash_region.len = 40; + flash_read_security(); } if (cmd_compare(0, "flash") && cmd_words_b[1] > 0 && cmd_buffer[cmd_words_b[1]] == 'd') { print_string("\nDUMPING FLASH\n"); @@ -520,7 +526,8 @@ void cmd_parser(void) __banked } if (cmd_compare(0, "flash") && cmd_words_b[1] > 0 && cmd_buffer[cmd_words_b[1]] == 'e') { print_string("\nFLASH erase\n"); - flash_sector_erase(0x20000); + flash_region.addr = 0x20000; + flash_sector_erase(); } if (cmd_compare(0, "flash") && cmd_words_b[1] > 0 && cmd_buffer[cmd_words_b[1]] == 'w') { print_string("\nFLASH write\n"); diff --git a/rtl837x_flash.c b/rtl837x_flash.c index c4bf5af..4df0604 100644 --- a/rtl837x_flash.c +++ b/rtl837x_flash.c @@ -283,7 +283,7 @@ void flash_read_bulk(__xdata uint8_t *dst) } -void flash_read_security(uint32_t addr, uint8_t len) +void flash_read_security() { while (flash_read_status() & 0x1); @@ -294,40 +294,40 @@ void flash_read_security(uint32_t addr, uint8_t len) // Transfer 4 bytes (command + 3byte address) SFR_FLASH_TCONF = 4; - while (len) { - SFR_FLASH_ADDR16 = addr >> 16; - SFR_FLASH_ADDR8 = addr >> 8; - SFR_FLASH_ADDR0 = addr; - addr += 4; + do { + SFR_FLASH_ADDR16 = flash_region.addr >> 16; + SFR_FLASH_ADDR8 = flash_region.addr >> 8; + SFR_FLASH_ADDR0 = flash_region.addr; + flash_region.addr += 4; SFR_FLASH_EXEC_GO = 1; while(SFR_FLASH_EXEC_BUSY); print_byte(SFR_FLASH_DATA0); - if (len == 1) - return; + if (flash_region.len == 1) + break; print_byte(SFR_FLASH_DATA8); - if (len == 2) - return; + if (flash_region.len == 2) + break; print_byte(SFR_FLASH_DATA16); - if (len == 3) - return; + if (flash_region.len == 3) + break; print_byte(SFR_FLASH_DATA24); - len -= 4; - } + flash_region.len -= 4; + } while(flash_region.len); } -void flash_sector_erase(uint32_t addr) +void flash_sector_erase(void) { flash_write_enable(); SFR_FLASH_TCONF = 8; SFR_FLASH_CMD = CMD_SECTOR_ERASE; - SFR_FLASH_ADDR16 = addr >> 16; - SFR_FLASH_ADDR8 = addr >> 8; - SFR_FLASH_ADDR0 = addr; + SFR_FLASH_ADDR16 = flash_region.addr >> 16; + SFR_FLASH_ADDR8 = flash_region.addr >> 8; + SFR_FLASH_ADDR0 = flash_region.addr; SFR_FLASH_EXEC_GO = 1; while (flash_read_status() & 0x1); diff --git a/rtl837x_flash.h b/rtl837x_flash.h index fb0ada6..cad66b0 100644 --- a/rtl837x_flash.h +++ b/rtl837x_flash.h @@ -6,8 +6,8 @@ void flash_read_uid(void); void flash_write_enable(void); void flash_dump(uint8_t len); void flash_read_jedecid(void); -void flash_read_security(uint32_t addr, uint8_t len); -void flash_sector_erase(uint32_t addr); +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); #endif diff --git a/rtlplayground.c b/rtlplayground.c index b4aeb73..5ce107c 100644 --- a/rtlplayground.c +++ b/rtlplayground.c @@ -1717,8 +1717,10 @@ void bootloader(void) flash_region.len = 0x200; flash_read_bulk(flash_buf); write_char('\n'); - if (!(i & 0x7)) - flash_sector_erase(dest); + if (!(i & 0x7)) { + flash_region.addr = dest; + flash_sector_erase(); + } flash_region.addr = dest; flash_region.len = 0x200; flash_write_bytes(flash_buf); @@ -1728,7 +1730,8 @@ void bootloader(void) print_string("Deleting uploaded flash image\n"); dest = FIRMWARE_UPLOAD_START; for (register uint8_t i=0; i < 120; i++) { - flash_sector_erase(dest); + flash_region.addr = dest; + flash_sector_erase(); dest += 0x1000; } print_string("Resetting now");