Skip to content

Commit a756a89

Browse files
committed
drivers: nxp : flexspi: add GD nor flash support
Fix a bug in quad bit enablement. Add LUT for Giga Device nor flash GD25Q256x. Signed-off-by: Raymond Lei <[email protected]>
1 parent 72dc0e5 commit a756a89

File tree

1 file changed

+63
-27
lines changed

1 file changed

+63
-27
lines changed

drivers/flash/flash_mcux_flexspi_nor.c

Lines changed: 63 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -339,8 +339,8 @@ static int flash_flexspi_nor_read(const struct device *dev, off_t offset,
339339
}
340340

341341
uint8_t *src = memc_flexspi_get_ahb_address(&data->controller,
342-
data->port,
343-
offset);
342+
data->port,
343+
offset);
344344

345345
memcpy(buffer, src, len);
346346

@@ -366,8 +366,8 @@ static int flash_flexspi_nor_write(const struct device *dev, off_t offset,
366366
unsigned int key = 0;
367367

368368
uint8_t *dst = memc_flexspi_get_ahb_address(&data->controller,
369-
data->port,
370-
offset);
369+
data->port,
370+
offset);
371371

372372
if (memc_flexspi_is_running_xip(&data->controller)) {
373373
/*
@@ -436,8 +436,8 @@ static int flash_flexspi_nor_erase(const struct device *dev, off_t offset,
436436
unsigned int key = 0;
437437

438438
uint8_t *dst = memc_flexspi_get_ahb_address(&data->controller,
439-
data->port,
440-
offset);
439+
data->port,
440+
offset);
441441

442442
if (offset % SPI_NOR_SECTOR_SIZE) {
443443
LOG_ERR("Invalid offset");
@@ -622,14 +622,16 @@ static int flash_flexspi_nor_quad_enable(struct flash_flexspi_nor_data *data,
622622
kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_WRSR2,
623623
kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x1);
624624

625-
/* Set bit 7 of status register 2 */
626-
bit = BIT(7);
625+
/* Set bit 1 of status register 2 */
626+
bit = BIT(1);
627627
rd_size = 1;
628628
wr_size = 1;
629629
break;
630630
default:
631631
return -ENOTSUP;
632632
}
633+
634+
633635
ret = memc_flexspi_set_device_config(&data->controller,
634636
&config,
635637
(uint32_t *)flexspi_lut,
@@ -638,6 +640,7 @@ static int flash_flexspi_nor_quad_enable(struct flash_flexspi_nor_data *data,
638640
if (ret < 0) {
639641
return ret;
640642
}
643+
641644
transfer.dataSize = rd_size;
642645
transfer.seqIndex = SCRATCH_CMD;
643646
transfer.cmdType = kFLEXSPI_Read;
@@ -873,7 +876,7 @@ static int flash_flexspi_nor_config_flash(struct flash_flexspi_nor_data *data,
873876
if (ret == 0) {
874877
/* Attempt to enable 4 byte addressing */
875878
ret = flash_flexspi_nor_4byte_enable(data, flexspi_lut,
876-
dw16.enter_4ba);
879+
dw16.enter_4ba);
877880
if (ret == 0) {
878881
/* Use 4 byte address width */
879882
addr_width = 32;
@@ -892,7 +895,7 @@ static int flash_flexspi_nor_config_flash(struct flash_flexspi_nor_data *data,
892895
* Note- enhanced XIP not currently supported, nor is 4-4-4 mode.
893896
*/
894897
if (jesd216_bfp_read_support(&header->phdr[0], bfp,
895-
JESD216_MODE_144, &instr) > 0) {
898+
JESD216_MODE_144, &instr) > 0) {
896899
LOG_DBG("Enable 144 mode");
897900
/* Configure for 144 QUAD read mode */
898901
if (instr.mode_clocks == 2) {
@@ -919,7 +922,7 @@ static int flash_flexspi_nor_config_flash(struct flash_flexspi_nor_data *data,
919922
ret = jesd216_bfp_decode_dw15(&header->phdr[0], bfp, &dw15);
920923
if (ret == 0) {
921924
ret = flash_flexspi_nor_quad_enable(data, flexspi_lut,
922-
dw15.qer);
925+
dw15.qer);
923926
if (ret == 0) {
924927
/* Now, install 1S-1S-4S page program command */
925928
flexspi_lut[PAGE_PROGRAM][0] = FLEXSPI_LUT_SEQ(
@@ -934,7 +937,7 @@ static int flash_flexspi_nor_config_flash(struct flash_flexspi_nor_data *data,
934937
}
935938

936939
} else if (jesd216_bfp_read_support(&header->phdr[0], bfp,
937-
JESD216_MODE_122, &instr) > 0) {
940+
JESD216_MODE_122, &instr) > 0) {
938941
LOG_DBG("Enable 122 mode");
939942
if (instr.mode_clocks == 4) {
940943
mode_cmd = kFLEXSPI_Command_MODE8_SDR;
@@ -1041,8 +1044,8 @@ flash_flexspi_nor_is25_clear_dummy_cycles(struct flash_flexspi_nor_data *data,
10411044
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x14,
10421045
kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x1);
10431046
ret = memc_flexspi_set_device_config(&data->controller, &config, (uint32_t *)flexspi_lut,
1044-
FLEXSPI_INSTR_END * MEMC_FLEXSPI_CMD_PER_SEQ,
1045-
data->port);
1047+
FLEXSPI_INSTR_END * MEMC_FLEXSPI_CMD_PER_SEQ,
1048+
data->port);
10461049

10471050
if (ret < 0) {
10481051
return ret;
@@ -1066,8 +1069,8 @@ flash_flexspi_nor_is25_clear_dummy_cycles(struct flash_flexspi_nor_data *data,
10661069
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xC0,
10671070
kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x1);
10681071
ret = memc_flexspi_set_device_config(&data->controller, &config, (uint32_t *)flexspi_lut,
1069-
FLEXSPI_INSTR_END * MEMC_FLEXSPI_CMD_PER_SEQ,
1070-
data->port);
1072+
FLEXSPI_INSTR_END * MEMC_FLEXSPI_CMD_PER_SEQ,
1073+
data->port);
10711074
if (ret < 0) {
10721075
return ret;
10731076
}
@@ -1140,7 +1143,7 @@ static int flash_flexspi_nor_check_jedec(struct flash_flexspi_nor_data *data,
11401143
kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x01);
11411144
/* Device uses bit 1 of status reg 2 for QE */
11421145
return flash_flexspi_nor_quad_enable(data, flexspi_lut,
1143-
JESD216_DW15_QER_VAL_S2B1v5);
1146+
JESD216_DW15_QER_VAL_S2B1v5);
11441147
case 0x2060ef:
11451148
/* W25Q512NW-IQ/IN flash, use 4 byte read/write */
11461149
flexspi_lut[READ][0] = FLEXSPI_LUT_SEQ(
@@ -1171,7 +1174,7 @@ static int flash_flexspi_nor_check_jedec(struct flash_flexspi_nor_data *data,
11711174
kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x01);
11721175
/* Device uses bit 1 of status reg 2 for QE */
11731176
return flash_flexspi_nor_quad_enable(data, flexspi_lut,
1174-
JESD216_DW15_QER_VAL_S2B1v5);
1177+
JESD216_DW15_QER_VAL_S2B1v5);
11751178
case 0x3A25C2:
11761179
/* MX25U51245G flash, use 4 byte read/write */
11771180
flexspi_lut[READ][0] = FLEXSPI_LUT_SEQ(
@@ -1293,7 +1296,40 @@ static int flash_flexspi_nor_check_jedec(struct flash_flexspi_nor_data *data,
12931296
kFLEXSPI_Command_SDR, kFLEXSPI_8PAD, SPI_NOR_CMD_WREN,
12941297
kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0);
12951298
return 0;
1299+
case 0x1940C8: /* GD25Q256E */
1300+
flexspi_lut[READ][0] = FLEXSPI_LUT_SEQ(
1301+
kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_4READ_4B,
1302+
kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 0x20);
1303+
/* Flash needs 15 dummy cycles */
1304+
flexspi_lut[READ][1] = FLEXSPI_LUT_SEQ(
1305+
kFLEXSPI_Command_MODE8_SDR, kFLEXSPI_4PAD, 0xF0,
1306+
kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_4PAD, 0x04);
1307+
flexspi_lut[READ][2] = FLEXSPI_LUT_SEQ(
1308+
kFLEXSPI_Command_READ_SDR, kFLEXSPI_4PAD, 0x04,
1309+
kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00);
1310+
1311+
data->legacy_poll = true;
1312+
flexspi_lut[READ_STATUS_REG][0] = FLEXSPI_LUT_SEQ(
1313+
kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_RDSR,
1314+
kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04);
1315+
1316+
flexspi_lut[ERASE_SECTOR][0] = FLEXSPI_LUT_SEQ(
1317+
kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_SE_4B,
1318+
kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x20);
1319+
1320+
flexspi_lut[ERASE_BLOCK][0] = FLEXSPI_LUT_SEQ(
1321+
kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_BE_4B,
1322+
kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x20);
12961323

1324+
flexspi_lut[PAGE_PROGRAM][0] = FLEXSPI_LUT_SEQ(
1325+
kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_PP_1_1_4_4B,
1326+
kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x20);
1327+
flexspi_lut[PAGE_PROGRAM][1] = FLEXSPI_LUT_SEQ(
1328+
kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_4PAD, 0x04,
1329+
kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00);
1330+
1331+
return flash_flexspi_nor_quad_enable(data, flexspi_lut,
1332+
JESD216_DW15_QER_VAL_S2B1v6);
12971333
default:
12981334
return -ENOTSUP;
12991335
}
@@ -1337,7 +1373,7 @@ static int flash_flexspi_nor_probe(struct flash_flexspi_nor_data *data)
13371373

13381374
/* Setup initial LUT table and FlexSPI configuration */
13391375
memcpy(flexspi_probe_lut, flash_flexspi_nor_base_lut,
1340-
sizeof(flash_flexspi_nor_base_lut));
1376+
sizeof(flash_flexspi_nor_base_lut));
13411377

13421378
ret = memc_flexspi_set_device_config(&data->controller, &config,
13431379
(uint32_t *)flexspi_probe_lut,
@@ -1386,7 +1422,7 @@ static int flash_flexspi_nor_probe(struct flash_flexspi_nor_data *data)
13861422

13871423
/* Configure flash */
13881424
ret = flash_flexspi_nor_config_flash(data, header, bfp,
1389-
flexspi_probe_lut);
1425+
flexspi_probe_lut);
13901426
if (ret < 0) {
13911427
goto _exit;
13921428
}
@@ -1534,12 +1570,12 @@ static DEVICE_API(flash, flash_flexspi_nor_api) = {
15341570
}; \
15351571
\
15361572
DEVICE_DT_INST_DEFINE(n, \
1537-
flash_flexspi_nor_init, \
1538-
NULL, \
1539-
&flash_flexspi_nor_data_##n, \
1540-
&flash_flexspi_nor_config_##n, \
1541-
POST_KERNEL, \
1542-
CONFIG_FLASH_INIT_PRIORITY, \
1543-
&flash_flexspi_nor_api);
1573+
flash_flexspi_nor_init, \
1574+
NULL, \
1575+
&flash_flexspi_nor_data_##n, \
1576+
&flash_flexspi_nor_config_##n, \
1577+
POST_KERNEL, \
1578+
CONFIG_FLASH_INIT_PRIORITY, \
1579+
&flash_flexspi_nor_api);
15441580

15451581
DT_INST_FOREACH_STATUS_OKAY(FLASH_FLEXSPI_NOR)

0 commit comments

Comments
 (0)