Base class for sector-addressable (block) devices. More...
#include <BlockDevice.h>
Classes | |
struct | Stat |
Public Member Functions | |
bool | read (storage_size_t address, void *dst, size_t size) override |
Read data from the storage device. More... | |
bool | write (storage_size_t address, const void *src, size_t size) override |
Write data to the storage device. More... | |
bool | erase_range (storage_size_t address, storage_size_t size) override |
Erase a region of storage in preparation for writing. More... | |
size_t | getBlockSize () const override |
Obtain smallest allocation unit for erase operations. More... | |
storage_size_t | getSize () const override |
Obtain addressable size of this device. More... | |
storage_size_t | getSectorCount () const override |
Obtain total number of sectors on this device. More... | |
bool | sync () override |
Flush any pending writes to the physical media. More... | |
bool | allocateBuffers (unsigned numBuffers) |
Set number of sector buffers to use. More... | |
Public Member Functions inherited from Storage::Device | |
Device () | |
~Device () | |
bool | operator== (const String &name) const |
const PartitionTable & | partitions () const |
Provide read-only access to partition table. More... | |
PartitionTable & | editablePartitions () |
Provide full access to partition table. More... | |
bool | loadPartitions (uint32_t tableOffset) |
Load partition table entries @tableOffset Location of partition table to read. More... | |
bool | loadPartitions (Device &source, uint32_t tableOffset) |
Load partition table entries from another table. More... | |
virtual String | getName () const =0 |
Obtain unique device name. More... | |
virtual uint32_t | getId () const |
Obtain device ID. More... | |
virtual Type | getType () const =0 |
Obtain device type. More... | |
virtual uint16_t | getSectorSize () const |
Get sector size, the unit of allocation for block-access devices. More... | |
size_t | printTo (Print &p) const |
Public Member Functions inherited from LinkedObjectTemplate< Device > | |
Device * | getNext () const |
bool | insertAfter (Device *object) |
Iterator | begin () const |
Iterator | end () const |
Iterator | cbegin () const |
Iterator | cend () const |
Public Member Functions inherited from LinkedObject | |
virtual | ~LinkedObject () |
virtual LinkedObject * | next () const |
bool | insertAfter (LinkedObject *object) |
bool | operator== (const LinkedObject &other) const |
bool | operator!= (const LinkedObject &other) const |
Public Attributes | |
Stat | stat |
Protected Member Functions | |
virtual bool | raw_sector_read (storage_size_t address, void *dst, size_t size)=0 |
virtual bool | raw_sector_write (storage_size_t address, const void *src, size_t size)=0 |
virtual bool | raw_sector_erase_range (storage_size_t address, size_t size)=0 |
virtual bool | raw_sync ()=0 |
bool | flushBuffer (Buffer &buf) |
bool | flushBuffers () |
Protected Attributes | |
std::unique_ptr< BufferList > | buffers |
uint64_t | sectorCount {0} |
uint16_t | sectorSize {defaultSectorSize} |
uint8_t | sectorSizeShift {getSizeBits(defaultSectorSize)} |
Protected Attributes inherited from Storage::Device | |
PartitionTable | mPartitions |
Additional Inherited Members | |
Public Types inherited from Storage::Device | |
enum class | Type : uint8_t { partitionType = uint8_t(Partition::Type::storage) , XX } |
Storage type. More... | |
using | List = LinkedObjectListTemplate< Device > |
using | OwnedList = OwnedLinkedObjectListTemplate< Device > |
Public Types inherited from LinkedObjectTemplate< Device > | |
using | Iterator = IteratorTemplate< Device, Device *, Device & > |
using | ConstIterator = IteratorTemplate< const Device, const Device *, const Device & > |
Static Public Attributes inherited from Storage::Device | |
static constexpr uint16_t | defaultSectorSize {512} |
Detailed Description
Base class for sector-addressable (block) devices.
Inherited classes must set the sectorCount
value, and implement the four raw_xxx
methods.
This class supports byte-level access using internal buffering, which if required must be enabled by the application via the allocateBuffers
method. Without buffering, read/writes must always be sector-aligned. Rrase must always be sector-aligned.
For power-loss resiliency it is important to call sync()
at appropriate times. Filing system implementations should do this after closing a file, for example. Applications should consider this if leaving files open for extended periods, and explicitly call 'flush' on the filing system or 'sync' on the partition or device if necessary.
Member Function Documentation
◆ allocateBuffers()
bool Storage::Disk::BlockDevice::allocateBuffers | ( | unsigned | numBuffers | ) |
Set number of sector buffers to use.
- Parameters
-
numBuffers Number of buffers to allocate 1,2,4,8,etc. Pass 0 to deallocate/disable buffering.
- Return values
-
bool false on memory allocation error, or if failed to flush existing buffers to disk
Required to support byte-level read/write operations on block devices. Buffering can improve performance, with diminishing returns above around 4 sectors.
◆ erase_range()
|
overridevirtual |
Erase a region of storage in preparation for writing.
- Parameters
-
address Where to start erasing size Size of region to erase, in bytes
- Return values
-
bool true on success, false on error
Implements Storage::Device.
◆ flushBuffer()
|
protected |
◆ flushBuffers()
|
protected |
◆ getBlockSize()
|
inlineoverridevirtual |
Obtain smallest allocation unit for erase operations.
Implements Storage::Device.
Reimplemented in Storage::SD::Card.
◆ getSectorCount()
|
inlineoverridevirtual |
Obtain total number of sectors on this device.
Reimplemented from Storage::Device.
◆ getSize()
|
inlineoverridevirtual |
Obtain addressable size of this device.
- Return values
-
storage_size_t Must be at least as large as the value declared in the hardware configuration
Implements Storage::Device.
◆ raw_sector_erase_range()
|
protectedpure virtual |
Implemented in USB::MSC::LogicalUnit, Storage::SD::Card, and Storage::Disk::HostFileDevice.
◆ raw_sector_read()
|
protectedpure virtual |
Implemented in USB::MSC::LogicalUnit, Storage::SD::Card, and Storage::Disk::HostFileDevice.
◆ raw_sector_write()
|
protectedpure virtual |
Implemented in USB::MSC::LogicalUnit, Storage::SD::Card, and Storage::Disk::HostFileDevice.
◆ raw_sync()
|
protectedpure virtual |
Implemented in USB::MSC::LogicalUnit, Storage::SD::Card, and Storage::Disk::HostFileDevice.
◆ read()
|
overridevirtual |
Read data from the storage device.
- Parameters
-
address Where to start reading dst Buffer to store data size Size of data to be read, in bytes.
- Return values
-
bool true on success, false on error
Implements Storage::Device.
◆ sync()
|
overridevirtual |
Flush any pending writes to the physical media.
- Return values
-
bool Return false if sync operation failed.
Devices with intermediate buffering should implement this method.
Reimplemented from Storage::Device.
◆ write()
|
overridevirtual |
Write data to the storage device.
- Parameters
-
address Where to start writing src Data to write size Size of data to be written, in bytes.
- Return values
-
bool true on success, false on error
Implements Storage::Device.
Member Data Documentation
◆ buffers
|
protected |
◆ sectorCount
|
protected |
◆ sectorSize
|
protected |
◆ sectorSizeShift
|
protected |
◆ stat
Stat Storage::Disk::BlockDevice::stat |
The documentation for this class was generated from the following file: