drivers: flash_mcux_flexspi_nor: Add block erase

Change reduces time consumed when a block needs to be erased.
The change was tested on a mimxrt1060_evk board.

Signed-off-by: Dipak Shetty <dipak.shetty@zeiss.com>
This commit is contained in:
Dipak Shetty 2022-10-04 13:54:42 +02:00 committed by Mahesh Mahadevan
commit e97e24e7a6

View file

@ -46,6 +46,7 @@ enum {
READ_STATUS,
WRITE_ENABLE,
ERASE_SECTOR,
ERASE_BLOCK,
PAGE_PROGRAM_INPUT,
PAGE_PROGRAM_QUAD_INPUT,
READ_ID,
@ -91,6 +92,11 @@ static const uint32_t flash_flexspi_nor_lut[][4] = {
kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),
},
[ERASE_BLOCK] = {
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_BE,
kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),
},
[ERASE_CHIP] = {
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_CE,
kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),
@ -251,6 +257,26 @@ static int flash_flexspi_nor_erase_sector(const struct device *dev,
return memc_flexspi_transfer(data->controller, &transfer);
}
static int flash_flexspi_nor_erase_block(const struct device *dev,
off_t offset)
{
struct flash_flexspi_nor_data *data = dev->data;
flexspi_transfer_t transfer = {
.deviceAddress = offset,
.port = data->port,
.cmdType = kFLEXSPI_Command,
.SeqNumber = 1,
.seqIndex = ERASE_BLOCK,
.data = NULL,
.dataSize = 0,
};
LOG_DBG("Erasing block at 0x%08zx", (ssize_t) offset);
return memc_flexspi_transfer(data->controller, &transfer);
}
static int flash_flexspi_nor_erase_chip(const struct device *dev)
{
struct flash_flexspi_nor_data *data = dev->data;
@ -392,7 +418,9 @@ static int flash_flexspi_nor_erase(const struct device *dev, off_t offset,
size_t size)
{
struct flash_flexspi_nor_data *data = dev->data;
int num_sectors = size / SPI_NOR_SECTOR_SIZE;
const size_t num_sectors = size / SPI_NOR_SECTOR_SIZE;
const size_t num_blocks = size / SPI_NOR_BLOCK_SIZE;
int i;
unsigned int key = 0;
@ -424,6 +452,14 @@ static int flash_flexspi_nor_erase(const struct device *dev, off_t offset,
flash_flexspi_nor_erase_chip(dev);
flash_flexspi_nor_wait_bus_busy(dev);
memc_flexspi_reset(data->controller);
} else if ((0 == (offset % SPI_NOR_BLOCK_SIZE)) && (0 == (size % SPI_NOR_BLOCK_SIZE))) {
for (i = 0; i < num_blocks; i++) {
flash_flexspi_nor_write_enable(dev);
flash_flexspi_nor_erase_block(dev, offset);
flash_flexspi_nor_wait_bus_busy(dev);
memc_flexspi_reset(data->controller);
offset += SPI_NOR_BLOCK_SIZE;
}
} else {
for (i = 0; i < num_sectors; i++) {
flash_flexspi_nor_write_enable(dev);