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 */
 | 
			
		||||
/****************************/
 | 
			
		||||
#define QSPIF_DEFAULT_PAGE_SIZE  256
 | 
			
		||||
#define QSPIF_DEFAULT_SE_SIZE    4096
 | 
			
		||||
// The SFDP spec only defines two status registers. But some devices,
 | 
			
		||||
// 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_122_READ_INST_BYTE 15
 | 
			
		||||
#define QSPIF_BASIC_PARAM_TABLE_112_READ_INST_BYTE 13
 | 
			
		||||
#define QSPIF_BASIC_PARAM_TABLE_PAGE_SIZE_BYTE 40
 | 
			
		||||
// Quad Enable Params
 | 
			
		||||
#define QSPIF_BASIC_PARAM_TABLE_QER_BYTE 58
 | 
			
		||||
#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;
 | 
			
		||||
 | 
			
		||||
    // 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) {
 | 
			
		||||
        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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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 basic_param_table_size,
 | 
			
		||||
                                                             sfdp_smptbl_info &smptbl)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,7 +30,6 @@ using namespace mbed;
 | 
			
		|||
/****************************/
 | 
			
		||||
#define SPIF_DEFAULT_READ_SIZE  1
 | 
			
		||||
#define SPIF_DEFAULT_PROG_SIZE  1
 | 
			
		||||
#define SPIF_DEFAULT_PAGE_SIZE  256
 | 
			
		||||
#define SPIF_DEFAULT_SE_SIZE    4096
 | 
			
		||||
#define SPI_MAX_STATUS_REGISTER_SIZE 2
 | 
			
		||||
#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_122_READ_INST_BYTE 15
 | 
			
		||||
#define SPIF_BASIC_PARAM_TABLE_112_READ_INST_BYTE 13
 | 
			
		||||
#define SPIF_BASIC_PARAM_TABLE_PAGE_SIZE_BYTE 40
 | 
			
		||||
// Address Length
 | 
			
		||||
#define SPIF_ADDR_SIZE_3_BYTES 3
 | 
			
		||||
#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;
 | 
			
		||||
 | 
			
		||||
    // 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
 | 
			
		||||
    _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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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 &erase4k_inst,
 | 
			
		||||
                                                            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);
 | 
			
		||||
 | 
			
		||||
/** 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 */
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -192,5 +192,24 @@ int sfdp_parse_sector_map_table(Callback<int(bd_addr_t, void *, bd_size_t)> sfdp
 | 
			
		|||
    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 */
 | 
			
		||||
#endif /* (DEVICE_SPI || DEVICE_QSPI) */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue