17 #ifndef MBED_QSPIF_BLOCK_DEVICE_H 18 #define MBED_QSPIF_BLOCK_DEVICE_H 20 #include "drivers/QSPI.h" 21 #include "blockdevice/internal/SFDP.h" 22 #include "blockdevice/BlockDevice.h" 23 #include "platform/Callback.h" 25 #ifndef MBED_CONF_QSPIF_QSPI_IO0 26 #define MBED_CONF_QSPIF_QSPI_IO0 NC 28 #ifndef MBED_CONF_QSPIF_QSPI_IO1 29 #define MBED_CONF_QSPIF_QSPI_IO1 NC 31 #ifndef MBED_CONF_QSPIF_QSPI_IO2 32 #define MBED_CONF_QSPIF_QSPI_IO2 NC 34 #ifndef MBED_CONF_QSPIF_QSPI_IO3 35 #define MBED_CONF_QSPIF_QSPI_IO3 NC 37 #ifndef MBED_CONF_QSPIF_QSPI_SCK 38 #define MBED_CONF_QSPIF_QSPI_SCK NC 40 #ifndef MBED_CONF_QSPIF_QSPI_CSN 41 #define MBED_CONF_QSPIF_QSPI_CSN NC 43 #ifndef MBED_CONF_QSPIF_QSPI_POLARITY_MODE 44 #define MBED_CONF_QSPIF_QSPI_POLARITY_MODE 0 46 #ifndef MBED_CONF_QSPIF_QSPI_FREQ 47 #define MBED_CONF_QSPIF_QSPI_FREQ 40000000 55 QSPIF_BD_ERROR_OK = 0,
56 QSPIF_BD_ERROR_DEVICE_ERROR = mbed::BD_ERROR_DEVICE_ERROR,
57 QSPIF_BD_ERROR_PARSING_FAILED = -4002,
58 QSPIF_BD_ERROR_READY_FAILED = -4003,
59 QSPIF_BD_ERROR_WREN_FAILED = -4004,
60 QSPIF_BD_ERROR_INVALID_ERASE_PARAMS = -4005,
61 QSPIF_BD_ERROR_DEVICE_NOT_UNIQUE = -4006,
62 QSPIF_BD_ERROR_DEVICE_MAX_EXCEED = -4007
69 enum qspif_polarity_mode {
70 QSPIF_POLARITY_MODE_0 = 0,
74 #define QSPIF_MAX_ACTIVE_FLASH_DEVICES 10 129 PinName io1 = MBED_CONF_QSPIF_QSPI_IO1,
130 PinName io2 = MBED_CONF_QSPIF_QSPI_IO2,
131 PinName io3 = MBED_CONF_QSPIF_QSPI_IO3,
132 PinName sclk = MBED_CONF_QSPIF_QSPI_SCK,
133 PinName csel = MBED_CONF_QSPIF_QSPI_CSN,
134 int clock_mode = MBED_CONF_QSPIF_QSPI_POLARITY_MODE,
135 int freq = MBED_CONF_QSPIF_QSPI_FREQ);
168 virtual int read(
void *buffer, mbed::bd_addr_t addr, mbed::bd_size_t
size);
183 virtual int program(
const void *buffer, mbed::bd_addr_t addr, mbed::bd_size_t size);
198 virtual int erase(mbed::bd_addr_t addr, mbed::bd_size_t size);
226 virtual mbed::bd_size_t
get_erase_size(mbed::bd_addr_t addr)
const;
243 virtual mbed::bd_size_t
size()
const;
249 virtual const char *
get_type()
const;
257 int add_new_csel_instance(PinName csel);
260 int remove_csel_instance(PinName csel);
267 mbed::bd_addr_t addr, mbed::bd_size_t *size);
277 mbed::bd_size_t tx_length,
const char *rx_buffer, mbed::bd_size_t rx_length);
280 int _qspi_send_read_sfdp_command(mbed::bd_addr_t addr, mbed::sfdp_cmd_addr_size_t addr_size,
281 uint8_t inst, uint8_t dummy_cycles,
282 void *rx_buffer, mbed::bd_size_t rx_length);
285 qspi_status_t _qspi_read_status_registers(uint8_t *reg_buffer);
288 qspi_status_t _qspi_write_status_registers(uint8_t *reg_buffer);
294 qspi_status_t _qspi_update_4byte_ext_addr_reg(mbed::bd_addr_t addr);
300 int _clear_block_protection();
303 int _set_write_enable();
306 bool _is_mem_ready();
309 int _enable_fast_mode();
312 int _handle_vendor_quirks();
318 int _sfdp_parse_basic_param_table(
mbed::Callback<
int(mbed::bd_addr_t, mbed::sfdp_cmd_addr_size_t, uint8_t, uint8_t,
void *, mbed::bd_size_t)> sfdp_reader,
322 int _sfdp_detect_reset_protocol_and_reset(uint8_t *basic_param_table_ptr);
325 int _sfdp_detect_best_bus_read_mode(uint8_t *basic_param_table_ptr,
int basic_param_table_size,
326 bool &set_quad_enable,
bool &is_qpi_mode);
329 int _sfdp_set_quad_enabled(uint8_t *basic_param_table_ptr);
332 int _sfdp_set_qpi_enabled(uint8_t *basic_param_table_ptr);
335 int _sfdp_detect_and_enable_4byte_addressing(uint8_t *basic_param_table_ptr,
int basic_param_table_size);
338 enum qspif_clear_protection_method_t {
350 static int _number_of_active_qspif_flash_csel;
351 static PinName *_active_qspif_flash_csel_arr;
353 int _unique_device_status;
364 unsigned int _num_status_registers;
369 bool _attempt_4_byte_addressing;
374 int _quad_enable_register_idx;
375 int _quad_enable_bit;
377 bool _needs_fast_mode;
380 bool _S25FS512S_quirk;
383 qspif_clear_protection_method_t _clear_protection_method;
388 unsigned int _page_size_bytes;
397 uint8_t _dummy_cycles;
400 uint32_t _init_ref_count;
401 bool _is_initialized;
virtual int program(const void *buffer, mbed::bd_addr_t addr, mbed::bd_size_t size)
Program blocks to a block device.
virtual mbed::bd_size_t get_program_size() const
Get the size of a programable block.
QSPIFBlockDevice(PinName io0=NC, PinName io1=NC, PinName io2=NC, PinName io3=NC, PinName sclk=NC, PinName csel=NC, int clock_mode=0, int freq=40000000)
Create QSPIFBlockDevice - An SFDP based Flash Block Device over QSPI bus.
A hardware device capable of writing and reading blocks.
virtual mbed::bd_size_t get_erase_size() const
Get the size of a eraseable block.
~QSPIFBlockDevice()
Desctruct QSPIFBlockDevie.
virtual int read(void *buffer, mbed::bd_addr_t addr, mbed::bd_size_t size)
Read blocks from a block device.
virtual mbed::bd_size_t size() const
Get the total size of the underlying device.
SFDP JEDEC Parameter Table info.
virtual int get_erase_value() const
Get the value of storage byte after it was erased.
virtual int deinit()
Deinitialize a block device.
virtual mbed::bd_size_t get_read_size() const
Get the size of a readable block.
enum qspi_address_size qspi_address_size_t
Address size in bits.
virtual int erase(mbed::bd_addr_t addr, mbed::bd_size_t size)
Erase blocks on a block device.
virtual int init()
Initialize a block device.
int qspi_inst_t
Type representing a QSPI instruction.
virtual const char * get_type() const
Get the BlockDevice class type.
uint8_t qspi_alt_size_t
Alternative size in bits.
enum qspi_bus_width qspi_bus_width_t
QSPI Bus width.
BlockDevice for SFDP based flash devices over QSPI bus.
Callback class based on template specialization.
A QSPI Driver, used for communicating with QSPI slave devices.
enum qspi_status qspi_status_t
QSPI return status.