rp: Created a Flash container type for the SPI-specific configuration bits

This commit is contained in:
dragonmux 2022-08-06 03:59:21 +01:00 committed by Piotr Esden-Tempski
parent d883fd0cdc
commit 4630353be4
1 changed files with 13 additions and 3 deletions

View File

@ -134,6 +134,12 @@ typedef struct rp_priv {
uint32_t regs[0x20]; /* Register playground*/ uint32_t regs[0x20]; /* Register playground*/
} rp_priv_s; } rp_priv_s;
typedef struct rp_flash {
target_flash_s f;
uint32_t page_size;
uint8_t sector_erase_opcode;
} rp_flash_s;
static bool rp_cmd_erase_sector(target *t, int argc, const char **argv); static bool rp_cmd_erase_sector(target *t, int argc, const char **argv);
static bool rp_cmd_reset_usb_boot(target *t, int argc, const char **argv); static bool rp_cmd_reset_usb_boot(target *t, int argc, const char **argv);
@ -169,14 +175,14 @@ static void rp_spi_read_sfdp(target *const t, const uint32_t address, void *cons
static void rp_add_flash(target *t) static void rp_add_flash(target *t)
{ {
struct target_flash *f = calloc(1, sizeof(*f)); rp_flash_s *flash = calloc(1, sizeof(*flash));
if (!f) { /* calloc failed: heap exhaustion */ if (!flash) { /* calloc failed: heap exhaustion */
DEBUG_WARN("calloc: failed in %s\n", __func__); DEBUG_WARN("calloc: failed in %s\n", __func__);
return; return;
} }
spi_parameters_s spi_parameters;
rp_flash_prepare(t); rp_flash_prepare(t);
spi_parameters_s spi_parameters;
if (!sfdp_read_parameters(t, &spi_parameters, rp_spi_read_sfdp)) { if (!sfdp_read_parameters(t, &spi_parameters, rp_spi_read_sfdp)) {
/* SFDP readout failed, so make some assumptions and hope for the best. */ /* SFDP readout failed, so make some assumptions and hope for the best. */
spi_parameters.page_size = 256U; spi_parameters.page_size = 256U;
@ -188,6 +194,7 @@ static void rp_add_flash(target *t)
DEBUG_INFO("Flash size: %zu MB\n", spi_parameters.capacity / (1024U * 1024U)); DEBUG_INFO("Flash size: %zu MB\n", spi_parameters.capacity / (1024U * 1024U));
target_flash_s *const f = &flash->f;
f->start = RP_XIP_FLASH_BASE; f->start = RP_XIP_FLASH_BASE;
f->length = spi_parameters.capacity; f->length = spi_parameters.capacity;
f->blocksize = spi_parameters.sector_size; f->blocksize = spi_parameters.sector_size;
@ -196,6 +203,9 @@ static void rp_add_flash(target *t)
f->buf_size = 2048; /* Max buffer size used otherwise */ f->buf_size = 2048; /* Max buffer size used otherwise */
f->erased = 0xffU; f->erased = 0xffU;
target_add_flash(t, f); target_add_flash(t, f);
flash->page_size = spi_parameters.page_size;
flash->sector_erase_opcode = spi_parameters.sector_erase_opcode;
} }
bool rp_probe(target *t) bool rp_probe(target *t)