Skip to content

Commit ca69263

Browse files
Matthew MacovskyKyle Kearney
authored andcommitted
Differentiate alt and dummy cycles in QSPIF
Propagate separate alt cycle and dummy cycle counts from QSPIFBlockDevice down to the qspi driver, so that drivers which handle the two separately have enough information to do so.
1 parent 7455b89 commit ca69263

File tree

2 files changed

+55
-21
lines changed

2 files changed

+55
-21
lines changed

components/storage/blockdevice/COMPONENT_QSPIF/QSPIFBlockDevice.cpp

Lines changed: 48 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ using namespace mbed;
3636
#define UINT64_MAX -1
3737
#endif
3838
#define QSPI_NO_ADDRESS_COMMAND UINT64_MAX
39+
#define QSPI_ALT_DEFAULT_VALUE 0
3940
// Status Register Bits
4041
#define QSPIF_STATUS_BIT_WIP 0x1 //Write In Progress
4142
#define QSPIF_STATUS_BIT_WEL 0x2 // Write Enable Latch
@@ -168,12 +169,13 @@ int QSPIFBlockDevice::init()
168169
_inst_width = QSPI_CFG_BUS_SINGLE;
169170
_address_width = QSPI_CFG_BUS_SINGLE;
170171
_address_size = QSPI_CFG_ADDR_SIZE_24;
172+
_alt_size = QSPI_CFG_ALT_SIZE_8;
173+
_alt_enabled = false;
174+
_dummy_cycles = 0;
171175
_data_width = QSPI_CFG_BUS_SINGLE;
172-
_dummy_and_mode_cycles = 0;
173176
_write_register_inst = QSPIF_WRSR;
174177
_read_register_inst = QSPIF_RDSR;
175178

176-
177179
if (QSPI_STATUS_OK != _qspi_set_frequency(_freq)) {
178180
tr_error("QSPI Set Frequency Failed");
179181
status = QSPIF_BD_ERROR_DEVICE_ERROR;
@@ -302,15 +304,15 @@ int QSPIFBlockDevice::read(void *buffer, bd_addr_t addr, bd_size_t size)
302304
_mutex.lock();
303305

304306
// 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);
307309

308310
if (QSPI_STATUS_OK != _qspi_send_read_command(_read_instruction, buffer, addr, size)) {
309311
status = QSPIF_BD_ERROR_DEVICE_ERROR;
310312
tr_error("Read Command failed");
311313
}
312314

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)
314316
_qspi_configure_format(QSPI_CFG_BUS_SINGLE, QSPI_CFG_BUS_SINGLE, QSPI_CFG_ADDR_SIZE_24, QSPI_CFG_BUS_SINGLE,
315317
QSPI_CFG_ALT_SIZE_8, QSPI_CFG_BUS_SINGLE, 0);
316318

@@ -1024,8 +1026,9 @@ int QSPIFBlockDevice::_sfdp_detect_best_bus_read_mode(uint8_t *basic_param_table
10241026
read_inst = basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_444_READ_INST_BYTE];
10251027
set_quad_enable = true;
10261028
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);
10291032
tr_debug("Read Bus Mode set to 4-4-4, Instruction: 0x%xh", _read_instruction);
10301033
//_inst_width = QSPI_CFG_BUS_QUAD;
10311034
_address_width = QSPI_CFG_BUS_QUAD;
@@ -1038,9 +1041,9 @@ int QSPIFBlockDevice::_sfdp_detect_best_bus_read_mode(uint8_t *basic_param_table
10381041
// Fast Read 1-4-4 Supported
10391042
read_inst = basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_144_READ_INST_BYTE];
10401043
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);
10441047
_address_width = QSPI_CFG_BUS_QUAD;
10451048
_data_width = QSPI_CFG_BUS_QUAD;
10461049
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
10511054
// Fast Read 1-1-4 Supported
10521055
read_inst = basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_114_READ_INST_BYTE];
10531056
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);
10561060
_data_width = QSPI_CFG_BUS_QUAD;
10571061
tr_debug("Read Bus Mode set to 1-1-4, Instruction: 0x%xh", _read_instruction);
10581062
break;
@@ -1061,8 +1065,9 @@ int QSPIFBlockDevice::_sfdp_detect_best_bus_read_mode(uint8_t *basic_param_table
10611065
if (examined_byte & 0x01) {
10621066
// Fast Read 2-2-2 Supported
10631067
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);
10661071
_address_width = QSPI_CFG_BUS_DUAL;
10671072
_data_width = QSPI_CFG_BUS_DUAL;
10681073
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
10731078
if (examined_byte & 0x10) {
10741079
// Fast Read 1-2-2 Supported
10751080
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);
10781084
_address_width = QSPI_CFG_BUS_DUAL;
10791085
_data_width = QSPI_CFG_BUS_DUAL;
10801086
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
10831089
if (examined_byte & 0x01) {
10841090
// Fast Read 1-1-2 Supported
10851091
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);
10881095
_data_width = QSPI_CFG_BUS_DUAL;
10891096
tr_debug("Read Bus Mode set to 1-1-2, Instruction: 0x%xh", _read_instruction);
10901097
break;
@@ -1306,7 +1313,29 @@ int QSPIFBlockDevice::_utils_iterate_next_largest_erase_type(uint8_t &bitfield,
13061313
tr_error("No erase type was found for current region addr");
13071314
}
13081315
return largest_erase_type;
1316+
}
13091317

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+
}
13101339
}
13111340

13121341
/***************************************************/
@@ -1323,7 +1352,7 @@ qspi_status_t QSPIFBlockDevice::_qspi_send_read_command(unsigned int read_inst,
13231352
// Send Read command to device driver
13241353
size_t buf_len = size;
13251354

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) {
13271356
tr_error("Read failed");
13281357
return QSPI_STATUS_ERROR;
13291358
}

components/storage/blockdevice/COMPONENT_QSPIF/QSPIFBlockDevice.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,9 @@ class QSPIFBlockDevice : public mbed::BlockDevice {
312312
// Iterates from highest type to lowest
313313
int _utils_iterate_next_largest_erase_type(uint8_t &bitfield, int size, int offset, int boundry);
314314

315+
// Determine alt size from mode bits
316+
void _utils_determine_alt_size(uint8_t mode_bits);
317+
315318
private:
316319
// QSPI Driver Object
317320
mbed::QSPI _qspi;
@@ -357,9 +360,11 @@ class QSPIFBlockDevice : public mbed::BlockDevice {
357360
// Bus speed configuration
358361
qspi_bus_width_t _inst_width; //Bus width for Instruction phase
359362
qspi_bus_width_t _address_width; //Bus width for Address phase
360-
qspi_address_size_t _address_size; // number of bytes for address
363+
qspi_address_size_t _address_size; //Number of bits for address
364+
qspi_alt_size_t _alt_size; //Number of bits for alt
365+
bool _alt_enabled; //Whether alt is enabled
366+
uint8_t _dummy_cycles; //Number of Dummy cycles required by Current Bus Mode
361367
qspi_bus_width_t _data_width; //Bus width for Data phase
362-
int _dummy_and_mode_cycles; // Number of Dummy and Mode Bits required by Current Bus Mode
363368

364369
uint32_t _init_ref_count;
365370
bool _is_initialized;

0 commit comments

Comments
 (0)