mirror of https://github.com/ARMmbed/mbed-os.git
SFDP: consolidation of sfdp_detect_page_size
parent
8a076d4b1f
commit
7d1886ecae
|
@ -31,7 +31,6 @@ using namespace mbed;
|
||||||
|
|
||||||
/* Default QSPIF Parameters */
|
/* Default QSPIF Parameters */
|
||||||
/****************************/
|
/****************************/
|
||||||
#define QSPIF_DEFAULT_PAGE_SIZE 256
|
|
||||||
#define QSPIF_DEFAULT_SE_SIZE 4096
|
#define QSPIF_DEFAULT_SE_SIZE 4096
|
||||||
// The SFDP spec only defines two status registers. But some devices,
|
// The SFDP spec only defines two status registers. But some devices,
|
||||||
// have three "status-like" registers (one status, two config)
|
// have three "status-like" registers (one status, two config)
|
||||||
|
@ -62,7 +61,6 @@ using namespace mbed;
|
||||||
#define QSPIF_BASIC_PARAM_TABLE_222_READ_INST_BYTE 23
|
#define QSPIF_BASIC_PARAM_TABLE_222_READ_INST_BYTE 23
|
||||||
#define QSPIF_BASIC_PARAM_TABLE_122_READ_INST_BYTE 15
|
#define QSPIF_BASIC_PARAM_TABLE_122_READ_INST_BYTE 15
|
||||||
#define QSPIF_BASIC_PARAM_TABLE_112_READ_INST_BYTE 13
|
#define QSPIF_BASIC_PARAM_TABLE_112_READ_INST_BYTE 13
|
||||||
#define QSPIF_BASIC_PARAM_TABLE_PAGE_SIZE_BYTE 40
|
|
||||||
// Quad Enable Params
|
// Quad Enable Params
|
||||||
#define QSPIF_BASIC_PARAM_TABLE_QER_BYTE 58
|
#define QSPIF_BASIC_PARAM_TABLE_QER_BYTE 58
|
||||||
#define QSPIF_BASIC_PARAM_TABLE_444_MODE_EN_SEQ_BYTE 56
|
#define QSPIF_BASIC_PARAM_TABLE_444_MODE_EN_SEQ_BYTE 56
|
||||||
|
@ -652,7 +650,7 @@ int QSPIFBlockDevice::_sfdp_parse_basic_param_table(Callback<int(bd_addr_t, void
|
||||||
_device_size_bytes = (density_bits + 1) / 8;
|
_device_size_bytes = (density_bits + 1) / 8;
|
||||||
|
|
||||||
// Set Page Size (QSPI write must be done on Page limits)
|
// Set Page Size (QSPI write must be done on Page limits)
|
||||||
_page_size_bytes = _sfdp_detect_page_size(param_table, basic_table_size);
|
_page_size_bytes = sfdp_detect_page_size(param_table, basic_table_size);
|
||||||
|
|
||||||
if (_sfdp_detect_reset_protocol_and_reset(param_table) != QSPIF_BD_ERROR_OK) {
|
if (_sfdp_detect_reset_protocol_and_reset(param_table) != QSPIF_BD_ERROR_OK) {
|
||||||
tr_error("Init - Detecting reset protocol/resetting failed");
|
tr_error("Init - Detecting reset protocol/resetting failed");
|
||||||
|
@ -832,21 +830,6 @@ int QSPIFBlockDevice::_sfdp_set_qpi_enabled(uint8_t *basic_param_table_ptr)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int QSPIFBlockDevice::_sfdp_detect_page_size(uint8_t *basic_param_table_ptr, int basic_param_table_size)
|
|
||||||
{
|
|
||||||
unsigned int page_size = QSPIF_DEFAULT_PAGE_SIZE;
|
|
||||||
|
|
||||||
if (basic_param_table_size > QSPIF_BASIC_PARAM_TABLE_PAGE_SIZE_BYTE) {
|
|
||||||
// Page Size is specified by 4 Bits (N), calculated by 2^N
|
|
||||||
int page_to_power_size = ((int)basic_param_table_ptr[QSPIF_BASIC_PARAM_TABLE_PAGE_SIZE_BYTE]) >> 4;
|
|
||||||
page_size = 1 << page_to_power_size;
|
|
||||||
tr_debug("Detected Page Size: %d", page_size);
|
|
||||||
} else {
|
|
||||||
tr_debug("Using Default Page Size: %d", page_size);
|
|
||||||
}
|
|
||||||
return page_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
int QSPIFBlockDevice::_sfdp_detect_erase_types_inst_and_size(uint8_t *basic_param_table_ptr,
|
int QSPIFBlockDevice::_sfdp_detect_erase_types_inst_and_size(uint8_t *basic_param_table_ptr,
|
||||||
int basic_param_table_size,
|
int basic_param_table_size,
|
||||||
sfdp_smptbl_info &smptbl)
|
sfdp_smptbl_info &smptbl)
|
||||||
|
|
|
@ -30,7 +30,6 @@ using namespace mbed;
|
||||||
/****************************/
|
/****************************/
|
||||||
#define SPIF_DEFAULT_READ_SIZE 1
|
#define SPIF_DEFAULT_READ_SIZE 1
|
||||||
#define SPIF_DEFAULT_PROG_SIZE 1
|
#define SPIF_DEFAULT_PROG_SIZE 1
|
||||||
#define SPIF_DEFAULT_PAGE_SIZE 256
|
|
||||||
#define SPIF_DEFAULT_SE_SIZE 4096
|
#define SPIF_DEFAULT_SE_SIZE 4096
|
||||||
#define SPI_MAX_STATUS_REGISTER_SIZE 2
|
#define SPI_MAX_STATUS_REGISTER_SIZE 2
|
||||||
#ifndef UINT64_MAX
|
#ifndef UINT64_MAX
|
||||||
|
@ -49,7 +48,6 @@ using namespace mbed;
|
||||||
#define SPIF_BASIC_PARAM_TABLE_222_READ_INST_BYTE 23
|
#define SPIF_BASIC_PARAM_TABLE_222_READ_INST_BYTE 23
|
||||||
#define SPIF_BASIC_PARAM_TABLE_122_READ_INST_BYTE 15
|
#define SPIF_BASIC_PARAM_TABLE_122_READ_INST_BYTE 15
|
||||||
#define SPIF_BASIC_PARAM_TABLE_112_READ_INST_BYTE 13
|
#define SPIF_BASIC_PARAM_TABLE_112_READ_INST_BYTE 13
|
||||||
#define SPIF_BASIC_PARAM_TABLE_PAGE_SIZE_BYTE 40
|
|
||||||
// Address Length
|
// Address Length
|
||||||
#define SPIF_ADDR_SIZE_3_BYTES 3
|
#define SPIF_ADDR_SIZE_3_BYTES 3
|
||||||
#define SPIF_ADDR_SIZE_4_BYTES 4
|
#define SPIF_ADDR_SIZE_4_BYTES 4
|
||||||
|
@ -653,7 +651,7 @@ int SPIFBlockDevice::_sfdp_parse_basic_param_table(Callback<int(bd_addr_t, void
|
||||||
_erase_instruction = SPIF_SE;
|
_erase_instruction = SPIF_SE;
|
||||||
|
|
||||||
// Set Page Size (SPI write must be done on Page limits)
|
// Set Page Size (SPI write must be done on Page limits)
|
||||||
_page_size_bytes = _sfdp_detect_page_size(param_table, sfdp_info.bptbl.size);
|
_page_size_bytes = sfdp_detect_page_size(param_table, sfdp_info.bptbl.size);
|
||||||
|
|
||||||
// Detect and Set Erase Types
|
// Detect and Set Erase Types
|
||||||
_sfdp_detect_erase_types_inst_and_size(param_table, sfdp_info.bptbl.size, _erase4k_inst, sfdp_info.smptbl);
|
_sfdp_detect_erase_types_inst_and_size(param_table, sfdp_info.bptbl.size, _erase4k_inst, sfdp_info.smptbl);
|
||||||
|
@ -665,21 +663,6 @@ int SPIFBlockDevice::_sfdp_parse_basic_param_table(Callback<int(bd_addr_t, void
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int SPIFBlockDevice::_sfdp_detect_page_size(uint8_t *basic_param_table_ptr, int basic_param_table_size)
|
|
||||||
{
|
|
||||||
unsigned int page_size = SPIF_DEFAULT_PAGE_SIZE;
|
|
||||||
|
|
||||||
if (basic_param_table_size > SPIF_BASIC_PARAM_TABLE_PAGE_SIZE_BYTE) {
|
|
||||||
// Page Size is specified by 4 Bits (N), calculated by 2^N
|
|
||||||
int page_to_power_size = ((int)basic_param_table_ptr[SPIF_BASIC_PARAM_TABLE_PAGE_SIZE_BYTE]) >> 4;
|
|
||||||
page_size = local_math_power(2, page_to_power_size);
|
|
||||||
tr_debug("Detected Page Size: %d", page_size);
|
|
||||||
} else {
|
|
||||||
tr_debug("Using Default Page Size: %d", page_size);
|
|
||||||
}
|
|
||||||
return page_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
int SPIFBlockDevice::_sfdp_detect_erase_types_inst_and_size(uint8_t *basic_param_table_ptr, int basic_param_table_size,
|
int SPIFBlockDevice::_sfdp_detect_erase_types_inst_and_size(uint8_t *basic_param_table_ptr, int basic_param_table_size,
|
||||||
int &erase4k_inst,
|
int &erase4k_inst,
|
||||||
sfdp_smptbl_info &smptbl)
|
sfdp_smptbl_info &smptbl)
|
||||||
|
|
|
@ -126,6 +126,15 @@ int sfdp_parse_headers(Callback<int(bd_addr_t, void *, bd_size_t)> sfdp_reader,
|
||||||
*/
|
*/
|
||||||
int sfdp_parse_sector_map_table(Callback<int(bd_addr_t, void *, bd_size_t)> sfdp_reader, sfdp_smptbl_info &smtbl);
|
int sfdp_parse_sector_map_table(Callback<int(bd_addr_t, void *, bd_size_t)> sfdp_reader, sfdp_smptbl_info &smtbl);
|
||||||
|
|
||||||
|
/** Detect page size used for writing on flash
|
||||||
|
*
|
||||||
|
* @param bptbl_ptr Pointer to memory holding a Basic Parameter Table structure
|
||||||
|
* @param bptbl_size Size of memory holding a Basic Parameter Table
|
||||||
|
*
|
||||||
|
* @return Page size
|
||||||
|
*/
|
||||||
|
size_t sfdp_detect_page_size(uint8_t *bptbl_ptr, size_t bptbl_size);
|
||||||
|
|
||||||
/** @}*/
|
/** @}*/
|
||||||
} /* namespace mbed */
|
} /* namespace mbed */
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -192,5 +192,24 @@ int sfdp_parse_sector_map_table(Callback<int(bd_addr_t, void *, bd_size_t)> sfdp
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t sfdp_detect_page_size(uint8_t *basic_param_table_ptr, size_t basic_param_table_size)
|
||||||
|
{
|
||||||
|
constexpr int SFDP_BASIC_PARAM_TABLE_PAGE_SIZE = 40;
|
||||||
|
constexpr int SFDP_DEFAULT_PAGE_SIZE = 256;
|
||||||
|
|
||||||
|
unsigned int page_size = SFDP_DEFAULT_PAGE_SIZE;
|
||||||
|
|
||||||
|
if (basic_param_table_size > SFDP_BASIC_PARAM_TABLE_PAGE_SIZE) {
|
||||||
|
// Page Size is specified by 4 Bits (N), calculated by 2^N
|
||||||
|
int page_to_power_size = ((int)basic_param_table_ptr[SFDP_BASIC_PARAM_TABLE_PAGE_SIZE]) >> 4;
|
||||||
|
page_size = 1 << page_to_power_size;
|
||||||
|
tr_debug("Detected Page Size: %d", page_size);
|
||||||
|
} else {
|
||||||
|
tr_debug("Using Default Page Size: %d", page_size);
|
||||||
|
}
|
||||||
|
return page_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} /* namespace mbed */
|
} /* namespace mbed */
|
||||||
#endif /* (DEVICE_SPI || DEVICE_QSPI) */
|
#endif /* (DEVICE_SPI || DEVICE_QSPI) */
|
||||||
|
|
Loading…
Reference in New Issue