alif/ospi_flash: Restore XIP settings after erase and write.
Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
parent
df5e4ced76
commit
c395f5ebb0
3 changed files with 34 additions and 11 deletions
|
|
@ -206,20 +206,22 @@ void ospi_setup_write_ext(ospi_flash_cfg_t *ospi_cfg, bool rxds, uint32_t inst_l
|
|||
spi_enable(ospi_cfg);
|
||||
}
|
||||
|
||||
static inline uint32_t ospi_xip_ctrlr0(uint32_t data_len) {
|
||||
return CTRLR0_IS_MST
|
||||
| (OCTAL << CTRLR0_SPI_FRF_OFFSET)
|
||||
| (0 << CTRLR0_SCPOL_OFFSET)
|
||||
| (0 << CTRLR0_SCPH_OFFSET)
|
||||
| (0 << CTRLR0_SSTE_OFFSET)
|
||||
| (TMOD_RO << CTRLR0_TMOD_OFFSET)
|
||||
| (data_len << CTRLR0_DFS_OFFSET);
|
||||
}
|
||||
|
||||
void ospi_xip_enter_ext(ospi_flash_cfg_t *ospi_cfg, uint32_t inst_len, uint32_t data_len, uint16_t incr_command, uint16_t wrap_command, uint16_t read_dummy_cycles) {
|
||||
spi_disable(ospi_cfg);
|
||||
|
||||
uint32_t val = CTRLR0_IS_MST
|
||||
| (OCTAL << CTRLR0_SPI_FRF_OFFSET)
|
||||
| (0 << CTRLR0_SCPOL_OFFSET)
|
||||
| (0 << CTRLR0_SCPH_OFFSET)
|
||||
| (0 << CTRLR0_SSTE_OFFSET)
|
||||
| (TMOD_RO << CTRLR0_TMOD_OFFSET)
|
||||
| (data_len << CTRLR0_DFS_OFFSET);
|
||||
ospi_writel(ospi_cfg, ctrlr0, ospi_xip_ctrlr0(data_len));
|
||||
|
||||
ospi_writel(ospi_cfg, ctrlr0, val);
|
||||
|
||||
val = (OCTAL << XIP_CTRL_FRF_OFFSET)
|
||||
uint32_t val = (OCTAL << XIP_CTRL_FRF_OFFSET)
|
||||
| (0x2 << XIP_CTRL_TRANS_TYPE_OFFSET)
|
||||
| (ADDR_L32bit << XIP_CTRL_ADDR_L_OFFSET)
|
||||
| (inst_len << XIP_CTRL_INST_L_OFFSET)
|
||||
|
|
@ -292,3 +294,9 @@ void ospi_xip_exit_ext(ospi_flash_cfg_t *ospi_cfg, uint32_t inst_len, uint16_t i
|
|||
ospi_xip_enable(ospi_cfg);
|
||||
ospi_xip_disable(ospi_cfg);
|
||||
}
|
||||
|
||||
void ospi_xip_restore_ext(ospi_flash_cfg_t *ospi_cfg, uint32_t data_len) {
|
||||
spi_disable(ospi_cfg);
|
||||
ospi_writel(ospi_cfg, ctrlr0, ospi_xip_ctrlr0(data_len));
|
||||
spi_enable(ospi_cfg);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -53,5 +53,6 @@ void ospi_setup_write_ext(ospi_flash_cfg_t *ospi_cfg, bool rxds, uint32_t inst_l
|
|||
|
||||
void ospi_xip_enter_ext(ospi_flash_cfg_t *ospi_cfg, uint32_t inst_len, uint32_t data_len, uint16_t incr_command, uint16_t wrap_command, uint16_t read_dummy_cycles);
|
||||
void ospi_xip_exit_ext(ospi_flash_cfg_t *ospi_cfg, uint32_t inst_len, uint16_t incr_command, uint16_t wrap_command);
|
||||
void ospi_xip_restore_ext(ospi_flash_cfg_t *ospi_cfg, uint32_t data_len);
|
||||
|
||||
#endif // MICROPY_INCLUDED_ALIF_OSPI_EXT_H
|
||||
|
|
|
|||
|
|
@ -354,8 +354,9 @@ int ospi_flash_init(void) {
|
|||
}
|
||||
}
|
||||
|
||||
// Enter XIP mode. It will be disabled during flash read/erase/write.
|
||||
// Enter XIP mode.
|
||||
ospi_flash_xip_enter(self);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -385,6 +386,13 @@ int ospi_flash_xip_exit(ospi_flash_t *self) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
int ospi_flash_xip_restore(ospi_flash_t *self) {
|
||||
if (self->xip_active) {
|
||||
ospi_xip_restore_ext(&self->cfg, self->set->xip_data_len);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
// Top-level read/erase/write functions.
|
||||
|
||||
|
|
@ -398,6 +406,8 @@ int ospi_flash_erase_sector(uint32_t addr) {
|
|||
ret = ospi_flash_wait_wip0(self);
|
||||
}
|
||||
|
||||
ospi_flash_xip_restore(self);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -442,6 +452,8 @@ static int ospi_flash_write_page(uint32_t addr, uint32_t len, const uint8_t *src
|
|||
}
|
||||
|
||||
int ospi_flash_write(uint32_t addr, uint32_t len, const uint8_t *src) {
|
||||
ospi_flash_t *self = &global_flash;
|
||||
|
||||
int ret = 0;
|
||||
uint32_t offset = addr & (PAGE_SIZE - 1);
|
||||
|
||||
|
|
@ -460,6 +472,8 @@ int ospi_flash_write(uint32_t addr, uint32_t len, const uint8_t *src) {
|
|||
offset = 0;
|
||||
}
|
||||
|
||||
ospi_flash_xip_restore(self);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue