modm API documentation
modm::BdSpiFlash< Spi, Cs, flashSize > Class Template Reference

Block device with SPI Flash. More...

#include <modm/driver/storage/block_device_spiflash.hpp>

Inheritance diagram for modm::BdSpiFlash< Spi, Cs, flashSize >:
modm::BlockDevice modm::SpiDevice< Spi > modm::NestedResumable< 6 >

Classes

struct  JedecId
 

Public Typedefs

using bd_address_t = uint32_t
 
using bd_size_t = uint32_t
 

Public Types

enum  StatusRegister : uint8_t {
  Busy = Bit0, WriteEnabled = Bit1, EraseSuspended = Bit2, ProgramSuspended = Bit3,
  WriteProtectionLockDown = Bit4, SecurityIdLocked = Bit5
}
 

Public Member Functions

modm::ResumableResult< bool > initialize ()
 Initializes the storage hardware.
 
modm::ResumableResult< bool > deinitialize ()
 Deinitializes the storage hardware.
 
modm::ResumableResult< bool > read (uint8_t *buffer, bd_address_t address, bd_size_t size)
 
modm::ResumableResult< bool > program (const uint8_t *buffer, bd_address_t address, bd_size_t size)
 
modm::ResumableResult< bool > erase (bd_address_t address, bd_size_t size)
 
modm::ResumableResult< bool > write (const uint8_t *buffer, bd_address_t address, bd_size_t size)
 
modm::ResumableResult< JedecIdreadId ()
 
 MODM_FLAGS8 (StatusRegister)
 
modm::ResumableResult< StatusRegister > readStatus ()
 
modm::ResumableResult< void > selectDie (uint8_t die)
 
modm::ResumableResult< bool > isBusy ()
 
modm::ResumableResult< void > waitWhileBusy ()
 
modm::ResumableResult< bool > deinitialize ()
 Deinitializes the storage hardware.
 
modm::ResumableResult< bool > erase (bd_address_t address, bd_size_t size)
 
modm::ResumableResult< bool > initialize ()
 Initializes the storage hardware.
 
modm::ResumableResult< bool > program (const uint8_t *buffer, bd_address_t address, bd_size_t size)
 
modm::ResumableResult< bool > read (uint8_t *buffer, bd_address_t address, bd_size_t size)
 
modm::ResumableResult< bool > write (const uint8_t *buffer, bd_address_t address, bd_size_t size)
 
void attachConfigurationHandler (Spi::ConfigurationHandler handler)
 

Static Public Attributes

static constexpr bd_size_t BlockSizeRead = 1
 
static constexpr bd_size_t BlockSizeWrite = 256
 
static constexpr bd_size_t BlockSizeErase = 4 * 1'024
 
static constexpr bd_size_t DeviceSize = flashSize
 
static constexpr bd_size_t ExtendedAddressThreshold = 16 * 1'024 * 1'024
 
static constexpr bd_size_t BlockSizeErase = 1
 
static constexpr bd_size_t BlockSizeRead = 1
 
static constexpr bd_size_t BlockSizeWrite = 1
 

Protected Member Functions

bool acquireMaster ()
 
bool releaseMaster ()
 
modm::ResumableResult< ReturnType > resumable function (...)
 
int8_t getResumableDepth () const
 
bool isResumableRunning () const
 
void stopResumable ()
 Force all resumable functions to stop running at the current nesting level.
 

Detailed Description

template<typename Spi, typename Cs, uint32_t flashSize>
class modm::BdSpiFlash< Spi, Cs, flashSize >

Block device with SPI Flash.

Template Parameters
SpiThe SpiMaster interface
CsThe GpioOutput pin connected to the flash chip select
flashSizeFlash chip size in byte

The read(), erase(),program() and write() methodes wait for the chip to finish writing to the flash.

Author
Raphael Lehmann
Rasmus Kleist Hørlyck Sørensen

Member Function Documentation

modm::ResumableResult<bool> modm::BlockDevice::erase ( bd_address_t  address,
bd_size_t  size 
)
inherited

Erase blocks

The state of an erased block is undefined until it has been programmed

Parameters
addressAddress of block to begin erasing
sizeSize to erase in bytes (multiple of read block size)
Returns
True on success
template<typename Spi , typename Cs , uint32_t flashSize>
modm::ResumableResult<bool> modm::BdSpiFlash< Spi, Cs, flashSize >::erase ( bd_address_t  address,
bd_size_t  size 
)

Erase blocks

The state of an erased block is undefined until it has been programmed

Parameters
addressAddress of block to begin erasing
sizeSize to erase in bytes (multiple of read block size)
Returns
True on success
modm::ResumableResult< ReturnType > resumable modm::NestedResumable< 1 >::function (   ...)
inherited

Run the resumable function.

You need to implement this method in you subclass yourself.

Returns
>NestingError if still running, <=NestingError if it has finished.
int8_t modm::NestedResumable< 1 >::getResumableDepth ( ) const
inheritedinline
Returns
the nesting depth in the current resumable function, or -1 if called outside any resumable function
template<typename Spi , typename Cs , uint32_t flashSize>
modm::ResumableResult<bool> modm::BdSpiFlash< Spi, Cs, flashSize >::isBusy ( )

Check if device is busy

Returns
True if device is busy.
bool modm::NestedResumable< 1 >::isResumableRunning ( ) const
inheritedinline
Returns
true if a resumable function is running at the current nesting level, else false
modm::ResumableResult<bool> modm::BlockDevice::program ( const uint8_t *  buffer,
bd_address_t  address,
bd_size_t  size 
)
inherited

Program blocks with data

Any block has to be erased prior to being programmed

Parameters
bufferBuffer of data to write to blocks
addressAddress of first block to begin writing to
sizeSize to write in bytes (multiple of read block size)
Returns
True on success
template<typename Spi , typename Cs , uint32_t flashSize>
modm::ResumableResult<bool> modm::BdSpiFlash< Spi, Cs, flashSize >::program ( const uint8_t *  buffer,
bd_address_t  address,
bd_size_t  size 
)

Program blocks with data

Any block has to be erased prior to being programmed

Parameters
bufferBuffer of data to write to blocks
addressAddress of first block to begin writing to
sizeSize to write in bytes (multiple of read block size)
Returns
True on success
modm::ResumableResult<bool> modm::BlockDevice::read ( uint8_t *  buffer,
bd_address_t  address,
bd_size_t  size 
)
inherited

Read data from one or more blocks

Parameters
bufferBuffer to read data into
addressAddress to begin reading from
sizeSize to read in bytes (multiple of read block size)
Returns
True on success
template<typename Spi , typename Cs , uint32_t flashSize>
modm::ResumableResult<bool> modm::BdSpiFlash< Spi, Cs, flashSize >::read ( uint8_t *  buffer,
bd_address_t  address,
bd_size_t  size 
)

Read data from one or more blocks

Parameters
bufferBuffer to read data into
addressAddress to begin reading from
sizeSize to read in bytes (multiple of read block size)
Returns
True on success
template<typename Spi , typename Cs , uint32_t flashSize>
modm::ResumableResult<JedecId> modm::BdSpiFlash< Spi, Cs, flashSize >::readId ( )

Reads the Jedec ID from the flash chip

Returns
The Jedec Id returned from the flash chip
template<typename Spi , typename Cs , uint32_t flashSize>
modm::ResumableResult<StatusRegister> modm::BdSpiFlash< Spi, Cs, flashSize >::readStatus ( )

Read status register of thew Spi Flash chip

Returns
Status register
template<typename Spi , typename Cs , uint32_t flashSize>
modm::ResumableResult<void> modm::BdSpiFlash< Spi, Cs, flashSize >::selectDie ( uint8_t  die)

Software Die Select

Parameters
dieThe pre-assigned “Die ID::” of the die to select
template<typename Spi , typename Cs , uint32_t flashSize>
modm::ResumableResult<void> modm::BdSpiFlash< Spi, Cs, flashSize >::waitWhileBusy ( )

This function can be used in another resumable function to wait until the flash operation is finished.

modm::ResumableResult<bool> modm::BlockDevice::write ( const uint8_t *  buffer,
bd_address_t  address,
bd_size_t  size 
)
inherited

Writes data to one or more blocks after erasing them

The blocks are erased proir to being programmed

Parameters
bufferBuffer of data to write to blocks
addressAddress of first block to begin writing to
sizeSize to write in bytes (multiple of read block size)
Returns
True on success
template<typename Spi , typename Cs , uint32_t flashSize>
modm::ResumableResult<bool> modm::BdSpiFlash< Spi, Cs, flashSize >::write ( const uint8_t *  buffer,
bd_address_t  address,
bd_size_t  size 
)

Writes data to one or more blocks after erasing them

The blocks are erased prior to being programmed

Parameters
bufferBuffer of data to write to blocks
addressAddress of first block to begin writing to
sizeSize to write in bytes (multiple of read block size)
Returns
True on success

Member Data Documentation

constexpr bd_size_t modm::BlockDevice::BlockSizeRead = 1
inheritedstaticconstexpr

Minimum block sizes for block device operations

Most persistent storage devices require program(), erase() and sometimes read() operations to be executed on fixed sized blocks.


The documentation for this class was generated from the following file: