Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,12 @@ enum dummy {
DATAFLASH_HIGHEST_FREQUENCY_BYTES = 2
};

MBED_WEAK BlockDevice *DataFlashBlockDevice::get_target_default_instance()
{
static DataFlashBlockDevice default_bd;
return &default_bd;
}

DataFlashBlockDevice::DataFlashBlockDevice(PinName mosi,
PinName miso,
PinName sclk,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,14 @@
*/
class DataFlashBlockDevice : public mbed::BlockDevice {
public:
/** Create target default DataFlashBlockDevice
*
* An application can override target settings by implementing
* DataFlashBlockDevice::get_target_default_instance() - the default
* definition is weak.
*/
static mbed::BlockDevice *get_target_default_instance();

/** Creates a DataFlashBlockDevice on a SPI bus specified by pins
*
* @param mosi SPI master out, slave in pin
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,59 @@ using namespace mbed;
#define DEBUG_PRINTF(...)
#endif

// Align a value to a specified size.
// Parameters :
// val - [IN] Value.
// size - [IN] Size.
// Return : Aligned value.
static inline uint32_t align_up(uint32_t val, uint32_t size)
{
return (((val - 1) / size) + 1) * size;
}

static inline uint32_t align_down(uint64_t val, uint64_t size)
{
return (((val) / size)) * size;
}

MBED_WEAK BlockDevice *FlashIAPBlockDevice::get_target_default_instance()
{
#if (MBED_CONF_FLASHIAP_BLOCK_DEVICE_SIZE == 0) && (MBED_CONF_FLASHIAP_BLOCK_DEVICE_BASE_ADDRESS == 0xFFFFFFFF)

size_t flash_size;
uint32_t start_address;
uint32_t bottom_address;
FlashIAP flash;

int ret = flash.init();
if (ret != 0) {
return nullptr;
}

//Find the start of first sector after text area
uint32_t sector_size = flash.get_sector_size(FLASHIAP_APP_ROM_END_ADDR);
bottom_address = align_up(FLASHIAP_APP_ROM_END_ADDR, sector_size);
start_address = flash.get_flash_start();
flash_size = flash.get_flash_size();

ret = flash.deinit();

uint32_t total_size = start_address + flash_size - bottom_address;
if (total_size % (sector_size * 2)) {
total_size = align_down(total_size, sector_size * 2);
}
static FlashIAPBlockDevice default_bd(bottom_address, total_size);

#else

static FlashIAPBlockDevice default_bd;

#endif

return &default_bd;

}

FlashIAPBlockDevice::FlashIAPBlockDevice(uint32_t address, uint32_t size)
: _flash(), _base(address), _size(size), _is_initialized(false), _init_ref_count(0)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,13 @@
*/
class FlashIAPBlockDevice : public mbed::BlockDevice {
public:
/** Create target default FlashIAPBlockDevice
*
* An application can override target settings by implementing
* FlashIAPBlockDevice::get_target_default_instance() - the default
* definition is weak.
*/
static mbed::BlockDevice *get_target_default_instance();

/** Creates a FlashIAPBlockDevice
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,12 @@ PinName *QSPIFBlockDevice::_active_qspif_flash_csel_arr = generate_initialized_a

/********* Public API Functions *********/
/****************************************/
MBED_WEAK BlockDevice *QSPIFBlockDevice::get_target_default_instance()
{
static QSPIFBlockDevice default_bd;
return &default_bd;
}

QSPIFBlockDevice::QSPIFBlockDevice(PinName io0, PinName io1, PinName io2, PinName io3, PinName sclk, PinName csel,
int clock_mode,
int freq)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,14 @@ enum qspif_polarity_mode {
*/
class QSPIFBlockDevice : public mbed::BlockDevice {
public:
/** Create target default QSPIFBlockDevice
*
* An application can override target settings by implementing
* QSPIFBlockDevice::get_target_default_instance() - the default
* definition is weak.
*/
static mbed::BlockDevice *get_target_default_instance();

/** Create QSPIFBlockDevice - An SFDP based Flash Block Device over QSPI bus
*
* @param io0 1st IO pin used for sending/receiving data during data phase of a transaction
Expand Down
13 changes: 13 additions & 0 deletions components/storage/blockdevice/COMPONENT_SD/SDBlockDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,19 @@ using namespace std::chrono;
// Only HC block size is supported. Making this a static constant reduces code size.
const uint32_t SDBlockDevice::_block_size = BLOCK_SIZE_HC;

MBED_WEAK BlockDevice *SDBlockDevice::get_target_default_instance()
{
#if (STATIC_PINMAP_READY)
static SDBlockDevice default_bd {
static_spi_pinmap,
MBED_CONF_SD_SPI_CS
};
#else
static SDBlockDevice default_bd;
#endif
return &default_bd;
}

#if MBED_CONF_SD_CRC_ENABLED
SDBlockDevice::SDBlockDevice(PinName mosi, PinName miso, PinName sclk, PinName cs, uint64_t hz, bool crc_on)
: _sectors(0), _spi(mosi, miso, sclk, cs, use_gpio_ssel), _is_initialized(0),
Expand Down
8 changes: 8 additions & 0 deletions components/storage/blockdevice/COMPONENT_SD/SDBlockDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,14 @@
*/
class SDBlockDevice : public mbed::BlockDevice {
public:
/** Create target default SDBlockDevice
*
* An application can override target settings by implementing
* SDBlockDevice::get_target_default_instance() - the default
* definition is weak.
*/
static mbed::BlockDevice *get_target_default_instance();

/** Creates an SDBlockDevice on a SPI bus specified by pins (using dynamic pin-map)
*
* @param mosi SPI master out, slave in pin
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,12 @@ SingletonPtr<PlatformMutex> SPIFBlockDevice::_mutex;
//***********************
// SPIF Block Device APIs
//***********************
MBED_WEAK BlockDevice *SPIFBlockDevice::get_target_default_instance()
{
static SPIFBlockDevice default_bd;
return &default_bd;
}

SPIFBlockDevice::SPIFBlockDevice(PinName mosi, PinName miso, PinName sclk, PinName csel, int freq)
:
_spi(mosi, miso, sclk, csel, use_gpio_ssel), _prog_instruction(0), _erase_instruction(0),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,14 @@ enum spif_bd_error {
*/
class SPIFBlockDevice : public mbed::BlockDevice {
public:
/** Create target default SPIFBlockDevice
*
* An application can override target settings by implementing
* SPIFBlockDevice::get_target_default_instance() - the default
* definition is weak.
*/
static mbed::BlockDevice *get_target_default_instance();

/** Creates a SPIFBlockDevice on a SPI bus specified by pins
*
* @param mosi SPI master out, slave in pin
Expand Down
74 changes: 6 additions & 68 deletions features/storage/system_storage/SystemStorage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,93 +46,31 @@ const spi_pinmap_t static_spi_pinmap = get_spi_pinmap(MBED_CONF_SD_SPI_MOSI, MBE

using namespace mbed;

// Align a value to a specified size.
// Parameters :
// val - [IN] Value.
// size - [IN] Size.
// Return : Aligned value.
static inline uint32_t align_up(uint32_t val, uint32_t size)
{
return (((val - 1) / size) + 1) * size;
}

static inline uint32_t align_down(uint64_t val, uint64_t size)
{
return (((val) / size)) * size;
}

MBED_WEAK BlockDevice *BlockDevice::get_default_instance()
{
#if COMPONENT_SPIF

static SPIFBlockDevice default_bd;

return &default_bd;
return SPIFBlockDevice::get_target_default_instance();

#elif COMPONENT_QSPIF

static QSPIFBlockDevice default_bd;

return &default_bd;
return QSPIFBlockDevice::get_target_default_instance();

#elif COMPONENT_DATAFLASH

static DataFlashBlockDevice default_bd;

return &default_bd;
return DataFlashBlockDevice::get_target_default_instance();

#elif COMPONENT_SD

#if (STATIC_PINMAP_READY)
static SDBlockDevice default_bd(
static_spi_pinmap,
MBED_CONF_SD_SPI_CS
);
#else
static SDBlockDevice default_bd;
#endif

return &default_bd;
return SDBlockDevice::get_target_default_instance();

#elif COMPONENT_FLASHIAP

#if (MBED_CONF_FLASHIAP_BLOCK_DEVICE_SIZE == 0) && (MBED_CONF_FLASHIAP_BLOCK_DEVICE_BASE_ADDRESS == 0xFFFFFFFF)

size_t flash_size;
uint32_t start_address;
uint32_t bottom_address;
FlashIAP flash;

int ret = flash.init();
if (ret != 0) {
return 0;
}

//Find the start of first sector after text area
int sector_size = flash.get_sector_size(FLASHIAP_APP_ROM_END_ADDR);
bottom_address = align_up(FLASHIAP_APP_ROM_END_ADDR, sector_size);
start_address = flash.get_flash_start();
flash_size = flash.get_flash_size();

ret = flash.deinit();

int total_size = start_address + flash_size - bottom_address;
if (total_size % (sector_size * 2)) {
total_size = align_down(total_size, sector_size * 2);
}
static FlashIAPBlockDevice default_bd(bottom_address, total_size);

#else

static FlashIAPBlockDevice default_bd;

#endif

return &default_bd;
return FlashIAPBlockDevice::get_target_default_instance();

#else

return NULL;
return nullptr;

#endif

Expand Down