Also use struct flash_region in flash_read_security(), flash_sector_erase().

This commit is contained in:
René van Dorst
2025-10-05 16:53:46 +02:00
parent 52fa41760c
commit a59f92a648
4 changed files with 37 additions and 27 deletions
+11 -4
View File
@@ -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");
+18 -18
View File
@@ -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);
+2 -2
View File
@@ -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
+6 -3
View File
@@ -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");