@@ -36,6 +36,7 @@ using namespace mbed;
36
36
#define UINT64_MAX -1
37
37
#endif
38
38
#define QSPI_NO_ADDRESS_COMMAND UINT64_MAX
39
+ #define QSPI_ALT_DEFAULT_VALUE 0
39
40
// Status Register Bits
40
41
#define QSPIF_STATUS_BIT_WIP 0x1 // Write In Progress
41
42
#define QSPIF_STATUS_BIT_WEL 0x2 // Write Enable Latch
@@ -168,12 +169,13 @@ int QSPIFBlockDevice::init()
168
169
_inst_width = QSPI_CFG_BUS_SINGLE;
169
170
_address_width = QSPI_CFG_BUS_SINGLE;
170
171
_address_size = QSPI_CFG_ADDR_SIZE_24;
172
+ _alt_size = QSPI_CFG_ALT_SIZE_8;
173
+ _alt_enabled = false ;
174
+ _dummy_cycles = 0 ;
171
175
_data_width = QSPI_CFG_BUS_SINGLE;
172
- _dummy_and_mode_cycles = 0 ;
173
176
_write_register_inst = QSPIF_WRSR;
174
177
_read_register_inst = QSPIF_RDSR;
175
178
176
-
177
179
if (QSPI_STATUS_OK != _qspi_set_frequency (_freq)) {
178
180
tr_error (" QSPI Set Frequency Failed" );
179
181
status = QSPIF_BD_ERROR_DEVICE_ERROR;
@@ -302,15 +304,15 @@ int QSPIFBlockDevice::read(void *buffer, bd_addr_t addr, bd_size_t size)
302
304
_mutex.lock ();
303
305
304
306
// Configure Bus for Reading
305
- _qspi_configure_format (_inst_width, _address_width, _address_size, QSPI_CFG_BUS_SINGLE,
306
- QSPI_CFG_ALT_SIZE_8 , _data_width, _dummy_and_mode_cycles );
307
+ _qspi_configure_format (_inst_width, _address_width, _address_size, _address_width, // Alt width == address width
308
+ _alt_size , _data_width, _dummy_cycles );
307
309
308
310
if (QSPI_STATUS_OK != _qspi_send_read_command (_read_instruction, buffer, addr, size)) {
309
311
status = QSPIF_BD_ERROR_DEVICE_ERROR;
310
312
tr_error (" Read Command failed" );
311
313
}
312
314
313
- // All commands other than Read use default 1-1-1 Bus mode (Program/Erase are constrained by flash memory performance less than that of the bus)
315
+ // All commands other than Read use default 1-1-1 Bus mode (Program/Erase are constrained by flash memory performance more than bus performance )
314
316
_qspi_configure_format (QSPI_CFG_BUS_SINGLE, QSPI_CFG_BUS_SINGLE, QSPI_CFG_ADDR_SIZE_24, QSPI_CFG_BUS_SINGLE,
315
317
QSPI_CFG_ALT_SIZE_8, QSPI_CFG_BUS_SINGLE, 0 );
316
318
@@ -1024,8 +1026,9 @@ int QSPIFBlockDevice::_sfdp_detect_best_bus_read_mode(uint8_t *basic_param_table
1024
1026
read_inst = basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_444_READ_INST_BYTE];
1025
1027
set_quad_enable = true ;
1026
1028
is_qpi_mode = true ;
1027
- _dummy_and_mode_cycles = (basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_444_READ_INST_BYTE - 1 ] >> 5 )
1028
- + (basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_444_READ_INST_BYTE - 1 ] & 0x1F );
1029
+ _dummy_cycles = basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_444_READ_INST_BYTE - 1 ] & 0x1F ;
1030
+ uint8_t mode_cycles = basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_444_READ_INST_BYTE - 1 ] >> 5 ;
1031
+ _utils_determine_alt_size (mode_cycles * 4 );
1029
1032
tr_debug (" Read Bus Mode set to 4-4-4, Instruction: 0x%xh" , _read_instruction);
1030
1033
// _inst_width = QSPI_CFG_BUS_QUAD;
1031
1034
_address_width = QSPI_CFG_BUS_QUAD;
@@ -1038,9 +1041,9 @@ int QSPIFBlockDevice::_sfdp_detect_best_bus_read_mode(uint8_t *basic_param_table
1038
1041
// Fast Read 1-4-4 Supported
1039
1042
read_inst = basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_144_READ_INST_BYTE];
1040
1043
set_quad_enable = true ;
1041
- // dummy cycles + mode cycles = Dummy Cycles
1042
- _dummy_and_mode_cycles = ( basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_144_READ_INST_BYTE - 1 ] >> 5 )
1043
- + (basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_144_READ_INST_BYTE - 1 ] & 0x1F );
1044
+ _dummy_cycles = basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_144_READ_INST_BYTE - 1 ] & 0x1F ;
1045
+ uint8_t mode_cycles = basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_144_READ_INST_BYTE - 1 ] >> 5 ;
1046
+ _utils_determine_alt_size (mode_cycles * 4 );
1044
1047
_address_width = QSPI_CFG_BUS_QUAD;
1045
1048
_data_width = QSPI_CFG_BUS_QUAD;
1046
1049
tr_debug (" Read Bus Mode set to 1-4-4, Instruction: 0x%xh" , _read_instruction);
@@ -1051,8 +1054,9 @@ int QSPIFBlockDevice::_sfdp_detect_best_bus_read_mode(uint8_t *basic_param_table
1051
1054
// Fast Read 1-1-4 Supported
1052
1055
read_inst = basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_114_READ_INST_BYTE];
1053
1056
set_quad_enable = true ;
1054
- _dummy_and_mode_cycles = (basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_114_READ_INST_BYTE - 1 ] >> 5 )
1055
- + (basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_114_READ_INST_BYTE - 1 ] & 0x1F );
1057
+ _dummy_cycles = basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_114_READ_INST_BYTE - 1 ] & 0x1F ;
1058
+ uint8_t mode_cycles = basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_114_READ_INST_BYTE - 1 ] >> 5 ;
1059
+ _utils_determine_alt_size (mode_cycles);
1056
1060
_data_width = QSPI_CFG_BUS_QUAD;
1057
1061
tr_debug (" Read Bus Mode set to 1-1-4, Instruction: 0x%xh" , _read_instruction);
1058
1062
break ;
@@ -1061,8 +1065,9 @@ int QSPIFBlockDevice::_sfdp_detect_best_bus_read_mode(uint8_t *basic_param_table
1061
1065
if (examined_byte & 0x01 ) {
1062
1066
// Fast Read 2-2-2 Supported
1063
1067
read_inst = basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_222_READ_INST_BYTE];
1064
- _dummy_and_mode_cycles = (basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_222_READ_INST_BYTE - 1 ] >> 5 )
1065
- + (basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_222_READ_INST_BYTE - 1 ] & 0x1F );
1068
+ _dummy_cycles = basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_222_READ_INST_BYTE - 1 ] & 0x1F ;
1069
+ uint8_t mode_cycles = basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_222_READ_INST_BYTE - 1 ] >> 5 ;
1070
+ _utils_determine_alt_size (mode_cycles * 2 );
1066
1071
_address_width = QSPI_CFG_BUS_DUAL;
1067
1072
_data_width = QSPI_CFG_BUS_DUAL;
1068
1073
tr_debug (" Read Bus Mode set to 2-2-2, Instruction: 0x%xh" , _read_instruction);
@@ -1073,8 +1078,9 @@ int QSPIFBlockDevice::_sfdp_detect_best_bus_read_mode(uint8_t *basic_param_table
1073
1078
if (examined_byte & 0x10 ) {
1074
1079
// Fast Read 1-2-2 Supported
1075
1080
read_inst = basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_122_READ_INST_BYTE];
1076
- _dummy_and_mode_cycles = (basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_122_READ_INST_BYTE - 1 ] >> 5 )
1077
- + (basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_122_READ_INST_BYTE - 1 ] & 0x1F );
1081
+ _dummy_cycles = basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_122_READ_INST_BYTE - 1 ] & 0x1F ;
1082
+ uint8_t mode_cycles = basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_122_READ_INST_BYTE - 1 ] >> 5 ;
1083
+ _utils_determine_alt_size (mode_cycles * 2 );
1078
1084
_address_width = QSPI_CFG_BUS_DUAL;
1079
1085
_data_width = QSPI_CFG_BUS_DUAL;
1080
1086
tr_debug (" Read Bus Mode set to 1-2-2, Instruction: 0x%xh" , _read_instruction);
@@ -1083,8 +1089,9 @@ int QSPIFBlockDevice::_sfdp_detect_best_bus_read_mode(uint8_t *basic_param_table
1083
1089
if (examined_byte & 0x01 ) {
1084
1090
// Fast Read 1-1-2 Supported
1085
1091
read_inst = basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_112_READ_INST_BYTE];
1086
- _dummy_and_mode_cycles = (basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_112_READ_INST_BYTE - 1 ] >> 5 )
1087
- + (basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_112_READ_INST_BYTE - 1 ] & 0x1F );
1092
+ _dummy_cycles = basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_112_READ_INST_BYTE - 1 ] & 0x1F ;
1093
+ uint8_t mode_cycles = basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_112_READ_INST_BYTE - 1 ] >> 5 ;
1094
+ _utils_determine_alt_size (mode_cycles);
1088
1095
_data_width = QSPI_CFG_BUS_DUAL;
1089
1096
tr_debug (" Read Bus Mode set to 1-1-2, Instruction: 0x%xh" , _read_instruction);
1090
1097
break ;
@@ -1306,7 +1313,29 @@ int QSPIFBlockDevice::_utils_iterate_next_largest_erase_type(uint8_t &bitfield,
1306
1313
tr_error (" No erase type was found for current region addr" );
1307
1314
}
1308
1315
return largest_erase_type;
1316
+ }
1309
1317
1318
+ void QSPIFBlockDevice::_utils_determine_alt_size (uint8_t mode_bits)
1319
+ {
1320
+ _alt_enabled = true ;
1321
+ switch (mode_bits)
1322
+ {
1323
+ case 8 :
1324
+ _alt_size = QSPI_CFG_ALT_SIZE_8;
1325
+ break ;
1326
+ case 16 :
1327
+ _alt_size = QSPI_CFG_ALT_SIZE_16;
1328
+ break ;
1329
+ case 24 :
1330
+ _alt_size = QSPI_CFG_ALT_SIZE_24;
1331
+ break ;
1332
+ case 32 :
1333
+ _alt_size = QSPI_CFG_ALT_SIZE_32;
1334
+ break ;
1335
+ default :
1336
+ _alt_enabled = false ;
1337
+ break ;
1338
+ }
1310
1339
}
1311
1340
1312
1341
/* **************************************************/
@@ -1323,7 +1352,7 @@ qspi_status_t QSPIFBlockDevice::_qspi_send_read_command(unsigned int read_inst,
1323
1352
// Send Read command to device driver
1324
1353
size_t buf_len = size;
1325
1354
1326
- if (_qspi.read (read_inst, -1 , (unsigned int )addr, (char *)buffer, &buf_len) != QSPI_STATUS_OK) {
1355
+ if (_qspi.read (read_inst, _alt_enabled ? QSPI_ALT_DEFAULT_VALUE : -1 , (unsigned int )addr, (char *)buffer, &buf_len) != QSPI_STATUS_OK) {
1327
1356
tr_error (" Read failed" );
1328
1357
return QSPI_STATUS_ERROR;
1329
1358
}
0 commit comments