rp: Made use of the extra information we pull back from the SFDP data in rp_flash_erase

This commit is contained in:
dragonmux 2022-08-06 04:11:55 +01:00 committed by Piotr Esden-Tempski
parent 09b044e351
commit 1556db88de
1 changed files with 9 additions and 7 deletions

View File

@ -86,8 +86,9 @@
#define RP_SSI_XIP_SPI_CTRL0_INSTR_LENGTH_8b (2U << 8U) #define RP_SSI_XIP_SPI_CTRL0_INSTR_LENGTH_8b (2U << 8U)
#define RP_SSI_XIP_SPI_CTRL0_WAIT_CYCLES(x) (((x) * 8U) << 11U) #define RP_SSI_XIP_SPI_CTRL0_WAIT_CYCLES(x) (((x) * 8U) << 11U)
#define BOOTROM_FUNC_TABLE_ADDR 0x00000014U #define BOOTROM_FUNC_TABLE_ADDR 0x00000014U
#define BOOTROM_FUNC_TABLE_TAG(x, y) ((uint8_t)(x) | ((uint8_t)(y) << 8U)) #define BOOTROM_FUNC_TABLE_TAG(x, y) ((uint8_t)(x) | ((uint8_t)(y) << 8U))
#define FLASHSIZE_4K_SECTOR (4U * 1024U) #define FLASHSIZE_4K_SECTOR (4U * 1024U)
#define FLASHSIZE_32K_BLOCK (32U * 1024U) #define FLASHSIZE_32K_BLOCK (32U * 1024U)
#define FLASHSIZE_64K_BLOCK (64U * 1024U) #define FLASHSIZE_64K_BLOCK (64U * 1024U)
@ -112,7 +113,7 @@
* not support these commands * not support these commands
*/ */
#define FLASHCMD_SECTOR_ERASE 0x20 #define SPI_FLASH_CMD_SECTOR_ERASE 0x20
#define FLASHCMD_BLOCK32K_ERASE 0x52 #define FLASHCMD_BLOCK32K_ERASE 0x52
#define FLASHCMD_BLOCK64K_ERASE 0xd8 #define FLASHCMD_BLOCK64K_ERASE 0xd8
#define FLASHCMD_CHIP_ERASE 0x60 #define FLASHCMD_CHIP_ERASE 0x60
@ -188,7 +189,7 @@ static void rp_add_flash(target *t)
spi_parameters.page_size = 256U; spi_parameters.page_size = 256U;
spi_parameters.sector_size = 4096U; spi_parameters.sector_size = 4096U;
spi_parameters.capacity = rp_get_flash_length(t); spi_parameters.capacity = rp_get_flash_length(t);
spi_parameters.sector_erase_opcode = 0x20U; spi_parameters.sector_erase_opcode = SPI_FLASH_CMD_SECTOR_ERASE;
} }
rp_flash_resume(t); rp_flash_resume(t);
@ -394,7 +395,7 @@ static int rp_flash_erase(target_flash_s *f, target_addr addr, size_t len)
{ {
DEBUG_INFO("Erase addr 0x%08" PRIx32 " len 0x%" PRIx32 "\n", addr, (uint32_t)len); DEBUG_INFO("Erase addr 0x%08" PRIx32 " len 0x%" PRIx32 "\n", addr, (uint32_t)len);
target *t = f->t; target *t = f->t;
if (addr & (FLASHSIZE_4K_SECTOR - 1)) { if (addr & (f->blocksize - 1)) {
DEBUG_WARN("Unaligned erase\n"); DEBUG_WARN("Unaligned erase\n");
return -1; return -1;
} }
@ -403,7 +404,7 @@ static int rp_flash_erase(target_flash_s *f, target_addr addr, size_t len)
return -1; return -1;
} }
addr -= f->start; addr -= f->start;
len = ALIGN(len, FLASHSIZE_4K_SECTOR); len = ALIGN(len, f->blocksize);
len = MIN(len, f->length - addr); len = MIN(len, f->length - addr);
rp_priv_s *ps = (rp_priv_s *)t->target_storage; rp_priv_s *ps = (rp_priv_s *)t->target_storage;
const bool full_erase = addr == f->start && len == f->length; const bool full_erase = addr == f->start && len == f->length;
@ -435,10 +436,11 @@ static int rp_flash_erase(target_flash_s *f, target_addr addr, size_t len)
len -= chunk; len -= chunk;
addr += chunk; addr += chunk;
} else { } else {
rp_flash_s *flash = (rp_flash_s *)f;
ps->regs[0] = addr; ps->regs[0] = addr;
ps->regs[1] = len; ps->regs[1] = len;
ps->regs[2] = FLASHSIZE_4K_SECTOR; ps->regs[2] = f->blocksize;
ps->regs[3] = FLASHCMD_SECTOR_ERASE; ps->regs[3] = flash->sector_erase_opcode;
DEBUG_WARN("Sector_ERASE addr 0x%08" PRIx32 " len 0x%" PRIx32 "\n", addr, (uint32_t)len); DEBUG_WARN("Sector_ERASE addr 0x%08" PRIx32 " len 0x%" PRIx32 "\n", addr, (uint32_t)len);
ret = rp_rom_call(t, ps->regs, ps->rom_flash_range_erase, 410); ret = rp_rom_call(t, ps->regs, ps->rom_flash_range_erase, 410);
len = 0; len = 0;