@@ -339,8 +339,8 @@ static int flash_flexspi_nor_read(const struct device *dev, off_t offset,
339
339
}
340
340
341
341
uint8_t * src = memc_flexspi_get_ahb_address (& data -> controller ,
342
- data -> port ,
343
- offset );
342
+ data -> port ,
343
+ offset );
344
344
345
345
memcpy (buffer , src , len );
346
346
@@ -366,8 +366,8 @@ static int flash_flexspi_nor_write(const struct device *dev, off_t offset,
366
366
unsigned int key = 0 ;
367
367
368
368
uint8_t * dst = memc_flexspi_get_ahb_address (& data -> controller ,
369
- data -> port ,
370
- offset );
369
+ data -> port ,
370
+ offset );
371
371
372
372
if (memc_flexspi_is_running_xip (& data -> controller )) {
373
373
/*
@@ -436,8 +436,8 @@ static int flash_flexspi_nor_erase(const struct device *dev, off_t offset,
436
436
unsigned int key = 0 ;
437
437
438
438
uint8_t * dst = memc_flexspi_get_ahb_address (& data -> controller ,
439
- data -> port ,
440
- offset );
439
+ data -> port ,
440
+ offset );
441
441
442
442
if (offset % SPI_NOR_SECTOR_SIZE ) {
443
443
LOG_ERR ("Invalid offset" );
@@ -622,14 +622,16 @@ static int flash_flexspi_nor_quad_enable(struct flash_flexspi_nor_data *data,
622
622
kFLEXSPI_Command_SDR , kFLEXSPI_1PAD , SPI_NOR_CMD_WRSR2 ,
623
623
kFLEXSPI_Command_WRITE_SDR , kFLEXSPI_1PAD , 0x1 );
624
624
625
- /* Set bit 7 of status register 2 */
626
- bit = BIT (7 );
625
+ /* Set bit 1 of status register 2 */
626
+ bit = BIT (1 );
627
627
rd_size = 1 ;
628
628
wr_size = 1 ;
629
629
break ;
630
630
default :
631
631
return - ENOTSUP ;
632
632
}
633
+
634
+
633
635
ret = memc_flexspi_set_device_config (& data -> controller ,
634
636
& config ,
635
637
(uint32_t * )flexspi_lut ,
@@ -638,6 +640,7 @@ static int flash_flexspi_nor_quad_enable(struct flash_flexspi_nor_data *data,
638
640
if (ret < 0 ) {
639
641
return ret ;
640
642
}
643
+
641
644
transfer .dataSize = rd_size ;
642
645
transfer .seqIndex = SCRATCH_CMD ;
643
646
transfer .cmdType = kFLEXSPI_Read ;
@@ -873,7 +876,7 @@ static int flash_flexspi_nor_config_flash(struct flash_flexspi_nor_data *data,
873
876
if (ret == 0 ) {
874
877
/* Attempt to enable 4 byte addressing */
875
878
ret = flash_flexspi_nor_4byte_enable (data , flexspi_lut ,
876
- dw16 .enter_4ba );
879
+ dw16 .enter_4ba );
877
880
if (ret == 0 ) {
878
881
/* Use 4 byte address width */
879
882
addr_width = 32 ;
@@ -892,7 +895,7 @@ static int flash_flexspi_nor_config_flash(struct flash_flexspi_nor_data *data,
892
895
* Note- enhanced XIP not currently supported, nor is 4-4-4 mode.
893
896
*/
894
897
if (jesd216_bfp_read_support (& header -> phdr [0 ], bfp ,
895
- JESD216_MODE_144 , & instr ) > 0 ) {
898
+ JESD216_MODE_144 , & instr ) > 0 ) {
896
899
LOG_DBG ("Enable 144 mode" );
897
900
/* Configure for 144 QUAD read mode */
898
901
if (instr .mode_clocks == 2 ) {
@@ -919,7 +922,7 @@ static int flash_flexspi_nor_config_flash(struct flash_flexspi_nor_data *data,
919
922
ret = jesd216_bfp_decode_dw15 (& header -> phdr [0 ], bfp , & dw15 );
920
923
if (ret == 0 ) {
921
924
ret = flash_flexspi_nor_quad_enable (data , flexspi_lut ,
922
- dw15 .qer );
925
+ dw15 .qer );
923
926
if (ret == 0 ) {
924
927
/* Now, install 1S-1S-4S page program command */
925
928
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,
934
937
}
935
938
936
939
} else if (jesd216_bfp_read_support (& header -> phdr [0 ], bfp ,
937
- JESD216_MODE_122 , & instr ) > 0 ) {
940
+ JESD216_MODE_122 , & instr ) > 0 ) {
938
941
LOG_DBG ("Enable 122 mode" );
939
942
if (instr .mode_clocks == 4 ) {
940
943
mode_cmd = kFLEXSPI_Command_MODE8_SDR ;
@@ -1041,8 +1044,8 @@ flash_flexspi_nor_is25_clear_dummy_cycles(struct flash_flexspi_nor_data *data,
1041
1044
FLEXSPI_LUT_SEQ (kFLEXSPI_Command_SDR , kFLEXSPI_1PAD , 0x14 ,
1042
1045
kFLEXSPI_Command_READ_SDR , kFLEXSPI_1PAD , 0x1 );
1043
1046
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 );
1046
1049
1047
1050
if (ret < 0 ) {
1048
1051
return ret ;
@@ -1066,8 +1069,8 @@ flash_flexspi_nor_is25_clear_dummy_cycles(struct flash_flexspi_nor_data *data,
1066
1069
FLEXSPI_LUT_SEQ (kFLEXSPI_Command_SDR , kFLEXSPI_1PAD , 0xC0 ,
1067
1070
kFLEXSPI_Command_WRITE_SDR , kFLEXSPI_1PAD , 0x1 );
1068
1071
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 );
1071
1074
if (ret < 0 ) {
1072
1075
return ret ;
1073
1076
}
@@ -1140,7 +1143,7 @@ static int flash_flexspi_nor_check_jedec(struct flash_flexspi_nor_data *data,
1140
1143
kFLEXSPI_Command_READ_SDR , kFLEXSPI_1PAD , 0x01 );
1141
1144
/* Device uses bit 1 of status reg 2 for QE */
1142
1145
return flash_flexspi_nor_quad_enable (data , flexspi_lut ,
1143
- JESD216_DW15_QER_VAL_S2B1v5 );
1146
+ JESD216_DW15_QER_VAL_S2B1v5 );
1144
1147
case 0x2060ef :
1145
1148
/* W25Q512NW-IQ/IN flash, use 4 byte read/write */
1146
1149
flexspi_lut [READ ][0 ] = FLEXSPI_LUT_SEQ (
@@ -1171,7 +1174,7 @@ static int flash_flexspi_nor_check_jedec(struct flash_flexspi_nor_data *data,
1171
1174
kFLEXSPI_Command_READ_SDR , kFLEXSPI_1PAD , 0x01 );
1172
1175
/* Device uses bit 1 of status reg 2 for QE */
1173
1176
return flash_flexspi_nor_quad_enable (data , flexspi_lut ,
1174
- JESD216_DW15_QER_VAL_S2B1v5 );
1177
+ JESD216_DW15_QER_VAL_S2B1v5 );
1175
1178
case 0x3A25C2 :
1176
1179
/* MX25U51245G flash, use 4 byte read/write */
1177
1180
flexspi_lut [READ ][0 ] = FLEXSPI_LUT_SEQ (
@@ -1293,7 +1296,40 @@ static int flash_flexspi_nor_check_jedec(struct flash_flexspi_nor_data *data,
1293
1296
kFLEXSPI_Command_SDR , kFLEXSPI_8PAD , SPI_NOR_CMD_WREN ,
1294
1297
kFLEXSPI_Command_STOP , kFLEXSPI_1PAD , 0 );
1295
1298
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 );
1296
1323
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 );
1297
1333
default :
1298
1334
return - ENOTSUP ;
1299
1335
}
@@ -1337,7 +1373,7 @@ static int flash_flexspi_nor_probe(struct flash_flexspi_nor_data *data)
1337
1373
1338
1374
/* Setup initial LUT table and FlexSPI configuration */
1339
1375
memcpy (flexspi_probe_lut , flash_flexspi_nor_base_lut ,
1340
- sizeof (flash_flexspi_nor_base_lut ));
1376
+ sizeof (flash_flexspi_nor_base_lut ));
1341
1377
1342
1378
ret = memc_flexspi_set_device_config (& data -> controller , & config ,
1343
1379
(uint32_t * )flexspi_probe_lut ,
@@ -1386,7 +1422,7 @@ static int flash_flexspi_nor_probe(struct flash_flexspi_nor_data *data)
1386
1422
1387
1423
/* Configure flash */
1388
1424
ret = flash_flexspi_nor_config_flash (data , header , bfp ,
1389
- flexspi_probe_lut );
1425
+ flexspi_probe_lut );
1390
1426
if (ret < 0 ) {
1391
1427
goto _exit ;
1392
1428
}
@@ -1534,12 +1570,12 @@ static DEVICE_API(flash, flash_flexspi_nor_api) = {
1534
1570
}; \
1535
1571
\
1536
1572
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);
1544
1580
1545
1581
DT_INST_FOREACH_STATUS_OKAY (FLASH_FLEXSPI_NOR )
0 commit comments