16 #ifndef MBED_SPIF_BLOCK_DEVICE_H 17 #define MBED_SPIF_BLOCK_DEVICE_H 19 #include "platform/SingletonPtr.h" 21 #include "DigitalOut.h" 22 #include "BlockDevice.h" 30 SPIF_BD_ERROR_DEVICE_ERROR = BD_ERROR_DEVICE_ERROR,
31 SPIF_BD_ERROR_PARSING_FAILED = -4002,
32 SPIF_BD_ERROR_READY_FAILED = -4003,
33 SPIF_BD_ERROR_WREN_FAILED = -4004,
34 SPIF_BD_ERROR_INVALID_ERASE_PARAMS = -4005,
38 #define SPIF_MAX_REGIONS 10 39 #define MAX_NUM_OF_ERASE_TYPES 4 86 SPIFBlockDevice(PinName mosi, PinName miso, PinName sclk, PinName csel,
int freq = 40000000);
118 virtual int read(
void *buffer, mbed::bd_addr_t addr, mbed::bd_size_t
size);
132 virtual int program(
const void *buffer, mbed::bd_addr_t addr, mbed::bd_size_t size);
145 virtual int erase(mbed::bd_addr_t addr, mbed::bd_size_t size);
190 virtual mbed::bd_size_t
size()
const;
196 virtual const char *
get_type()
const;
206 int _sfdp_parse_sfdp_headers(uint32_t &basic_table_addr,
size_t &basic_table_size,
207 uint32_t §or_map_table_addr,
size_t §or_map_table_size);
210 int _sfdp_parse_basic_param_table(uint32_t basic_table_addr,
size_t basic_table_size);
213 int _sfdp_parse_sector_map_table(uint32_t sector_map_table_addr,
size_t sector_map_table_size);
216 int _sfdp_detect_best_bus_read_mode(uint8_t *basic_param_table_ptr,
int basic_param_table_size,
int &read_inst);
219 unsigned int _sfdp_detect_page_size(uint8_t *basic_param_table_ptr,
int basic_param_table_size);
222 int _sfdp_detect_erase_types_inst_and_size(uint8_t *basic_param_table_ptr,
int basic_param_table_size,
224 int *erase_type_inst_arr,
unsigned int *erase_type_size_arr);
230 int _utils_find_addr_region(bd_size_t offset);
234 int _utils_iterate_next_largest_erase_type(uint8_t &bitfield,
int size,
int offset,
int boundry);
240 spif_bd_error _spi_send_program_command(
int prog_inst,
const void *buffer, mbed::bd_addr_t addr, mbed::bd_size_t size);
244 spif_bd_error _spi_send_read_command(
int read_inst, uint8_t *buffer, mbed::bd_addr_t addr, mbed::bd_size_t size);
247 spif_bd_error _spi_send_erase_command(
int erase_inst, mbed::bd_addr_t addr, mbed::bd_size_t size);
250 spif_bd_error _spi_send_general_command(
int instruction, mbed::bd_addr_t addr,
char *tx_buffer,
251 size_t tx_length,
char *rx_buffer,
size_t rx_length);
254 spif_bd_error _spi_set_frequency(
int freq);
258 int _reset_flash_mem();
261 int _set_write_enable();
264 bool _is_mem_ready();
277 int _read_instruction;
278 int _prog_instruction;
279 int _erase_instruction;
283 int _erase_type_inst_arr[MAX_NUM_OF_ERASE_TYPES];
284 unsigned int _erase_type_size_arr[MAX_NUM_OF_ERASE_TYPES];
288 int _region_size_bytes[SPIF_MAX_REGIONS];
289 bd_size_t _region_high_boundary[SPIF_MAX_REGIONS];
291 uint8_t _region_erase_types_bitfield[SPIF_MAX_REGIONS];
292 unsigned int _min_common_erase_size;
294 unsigned int _page_size_bytes;
295 bd_size_t _device_size_bytes;
298 unsigned int _address_size;
299 unsigned int _read_dummy_and_mode_cycles;
300 unsigned int _write_dummy_and_mode_cycles;
301 unsigned int _dummy_and_mode_cycles;
302 uint32_t _init_ref_count;
303 bool _is_initialized;
virtual mbed::bd_size_t get_read_size() const
Get the size of a readable block.
virtual const char * get_type() const
Get the BlockDevice class type.
A hardware device capable of writing and reading blocks.
virtual int init()
Initialize a block device.
virtual mbed::bd_size_t size() const
Get the total size of the underlying device.
SPIFBlockDevice(PinName mosi, PinName miso, PinName sclk, PinName csel, int freq=40000000)
Creates a SPIFBlockDevice on a SPI bus specified by pins.
virtual int get_erase_value() const
Get the value of storage byte after it was erased.
BlockDevice for SFDP based flash devices over SPI bus.
~SPIFBlockDevice()
Desctruct SPIFBlockDevice.
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 get_program_size() const
Get the size of a programable block.
virtual int program(const void *buffer, mbed::bd_addr_t addr, mbed::bd_size_t size)
Program blocks to a block device.
virtual int erase(mbed::bd_addr_t addr, mbed::bd_size_t size)
Erase blocks on a block device.
A digital output, used for setting the state of a pin.
A SPI Master, used for communicating with SPI slave devices.
virtual int deinit()
Deinitialize a block device.
virtual mbed::bd_size_t get_erase_size() const
Get the size of an erasable block.