Skip to content

Commit e97e24e

Browse files
Dipak Shettymmahadevan108
authored andcommitted
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 <[email protected]>
1 parent 9d7039f commit e97e24e

File tree

1 file changed

+37
-1
lines changed

1 file changed

+37
-1
lines changed

drivers/flash/flash_mcux_flexspi_nor.c

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ enum {
4646
READ_STATUS,
4747
WRITE_ENABLE,
4848
ERASE_SECTOR,
49+
ERASE_BLOCK,
4950
PAGE_PROGRAM_INPUT,
5051
PAGE_PROGRAM_QUAD_INPUT,
5152
READ_ID,
@@ -91,6 +92,11 @@ static const uint32_t flash_flexspi_nor_lut[][4] = {
9192
kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),
9293
},
9394

95+
[ERASE_BLOCK] = {
96+
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_BE,
97+
kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),
98+
},
99+
94100
[ERASE_CHIP] = {
95101
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_CE,
96102
kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),
@@ -251,6 +257,26 @@ static int flash_flexspi_nor_erase_sector(const struct device *dev,
251257
return memc_flexspi_transfer(data->controller, &transfer);
252258
}
253259

260+
static int flash_flexspi_nor_erase_block(const struct device *dev,
261+
off_t offset)
262+
{
263+
struct flash_flexspi_nor_data *data = dev->data;
264+
265+
flexspi_transfer_t transfer = {
266+
.deviceAddress = offset,
267+
.port = data->port,
268+
.cmdType = kFLEXSPI_Command,
269+
.SeqNumber = 1,
270+
.seqIndex = ERASE_BLOCK,
271+
.data = NULL,
272+
.dataSize = 0,
273+
};
274+
275+
LOG_DBG("Erasing block at 0x%08zx", (ssize_t) offset);
276+
277+
return memc_flexspi_transfer(data->controller, &transfer);
278+
}
279+
254280
static int flash_flexspi_nor_erase_chip(const struct device *dev)
255281
{
256282
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,
392418
size_t size)
393419
{
394420
struct flash_flexspi_nor_data *data = dev->data;
395-
int num_sectors = size / SPI_NOR_SECTOR_SIZE;
421+
const size_t num_sectors = size / SPI_NOR_SECTOR_SIZE;
422+
const size_t num_blocks = size / SPI_NOR_BLOCK_SIZE;
423+
396424
int i;
397425
unsigned int key = 0;
398426

@@ -424,6 +452,14 @@ static int flash_flexspi_nor_erase(const struct device *dev, off_t offset,
424452
flash_flexspi_nor_erase_chip(dev);
425453
flash_flexspi_nor_wait_bus_busy(dev);
426454
memc_flexspi_reset(data->controller);
455+
} else if ((0 == (offset % SPI_NOR_BLOCK_SIZE)) && (0 == (size % SPI_NOR_BLOCK_SIZE))) {
456+
for (i = 0; i < num_blocks; i++) {
457+
flash_flexspi_nor_write_enable(dev);
458+
flash_flexspi_nor_erase_block(dev, offset);
459+
flash_flexspi_nor_wait_bus_busy(dev);
460+
memc_flexspi_reset(data->controller);
461+
offset += SPI_NOR_BLOCK_SIZE;
462+
}
427463
} else {
428464
for (i = 0; i < num_sectors; i++) {
429465
flash_flexspi_nor_write_enable(dev);

0 commit comments

Comments
 (0)