rp: Update rp_get_flash_length algorithm
Try to look for repeating sectors before reverting to reading the JEDEC ID of the flash chip. This way we don't interrupt the flash execution if a valid program is running, but can detect the flash size if the flash memory has been erased.
This commit is contained in:
parent
f2cb13cf36
commit
e67cb9f43c
|
@ -429,7 +429,37 @@ uint32_t rp_read_flash_chip(target *t, uint32_t cmd)
|
||||||
uint32_t rp_get_flash_length(target *t)
|
uint32_t rp_get_flash_length(target *t)
|
||||||
{
|
{
|
||||||
uint32_t size = MAX_FLASH;
|
uint32_t size = MAX_FLASH;
|
||||||
|
uint32_t bootsec[16];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
target_mem_read(t, bootsec, XIP_FLASH_START, sizeof(bootsec));
|
||||||
|
for (i = 0; i < 16; i++) {
|
||||||
|
if ((bootsec[i] != 0x00) && (bootsec[i] != 0xff))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < 16) {
|
||||||
|
// We have some data (hopefully a valid program) stored in the start
|
||||||
|
// of the flash memory. We can check if the start of this data is
|
||||||
|
// mirrored anywhere else in the flash as the flash region will repeat
|
||||||
|
// when we try to read out of bounds.
|
||||||
|
uint32_t mirrorsec[16];
|
||||||
|
while (size > FLASHSIZE_4K_SECTOR) {
|
||||||
|
target_mem_read(t, mirrorsec, XIP_FLASH_START + size, sizeof(bootsec));
|
||||||
|
if (memcmp(bootsec, mirrorsec, sizeof(bootsec)))
|
||||||
|
return size << 1;
|
||||||
|
size >>= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// That approach didn't work. Most likely because there was no data found in
|
||||||
|
// at the start of the flash memory. If we have no valid program it's ok to
|
||||||
|
// interrupt the flash execution to check the JEDEC ID of the flash chip.
|
||||||
|
size = MAX_FLASH;
|
||||||
|
|
||||||
|
rp_flash_prepare(t);
|
||||||
uint32_t flash_id = rp_read_flash_chip(t, FLASHCMD_READ_JEDEC_ID);
|
uint32_t flash_id = rp_read_flash_chip(t, FLASHCMD_READ_JEDEC_ID);
|
||||||
|
rp_flash_resume(t);
|
||||||
|
|
||||||
DEBUG_INFO("Flash device ID: %08" PRIx32 "\n", flash_id);
|
DEBUG_INFO("Flash device ID: %08" PRIx32 "\n", flash_id);
|
||||||
|
|
||||||
|
@ -437,8 +467,6 @@ uint32_t rp_get_flash_length(target *t)
|
||||||
if (size_log2 >= 8 || size_log2 <= 34)
|
if (size_log2 >= 8 || size_log2 <= 34)
|
||||||
size = 1 << size_log2;
|
size = 1 << size_log2;
|
||||||
|
|
||||||
DEBUG_INFO("Flash size: %d MB\n", (int)(size / 1024 / 1024));
|
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -458,9 +486,8 @@ static bool rp_attach(target *t)
|
||||||
/* Free previously loaded memory map */
|
/* Free previously loaded memory map */
|
||||||
target_mem_map_free(t);
|
target_mem_map_free(t);
|
||||||
|
|
||||||
rp_flash_prepare(t);
|
|
||||||
uint32_t size = rp_get_flash_length(t);
|
uint32_t size = rp_get_flash_length(t);
|
||||||
rp_flash_resume(t);
|
DEBUG_INFO("Flash size: %d MB\n", (int)(size / 1024 / 1024));
|
||||||
|
|
||||||
rp_add_flash(t, XIP_FLASH_START, size);
|
rp_add_flash(t, XIP_FLASH_START, size);
|
||||||
target_add_ram(t, SRAM_START, SRAM_SIZE);
|
target_add_ram(t, SRAM_START, SRAM_SIZE);
|
||||||
|
|
Loading…
Reference in New Issue