BlockDevice.h
Go to the documentation of this file.
1 /****
2  * Sming Framework Project - Open Source framework for high efficiency native ESP8266 development.
3  * Created 2015 by Skurydin Alexey
4  * http://github.com/SmingHub/Sming
5  * All files of the Sming Core are provided under the LGPL v3 license.
6  *
7  * BlockkDevice.h
8  *
9  ****/
10 #pragma once
11 
12 #include <Storage/Device.h>
13 #include "Buffer.h"
14 #include <map>
15 
16 namespace Storage::Disk
17 {
33 class BlockDevice : public Device
34 {
35 public:
36  bool read(storage_size_t address, void* dst, size_t size) override
37  {
38  return transfer(address, dst, size, false);
39  }
40 
41  bool write(storage_size_t address, const void* src, size_t size) override
42  {
43  return transfer(address, const_cast<void*>(src), size, true);
44  }
45 
46  bool erase_range(storage_size_t address, storage_size_t size) override;
47 
48  size_t getBlockSize() const override
49  {
50  return sectorSize;
51  }
52 
53  storage_size_t getSize() const override
54  {
55  return sectorCount << sectorSizeShift;
56  }
57 
58  storage_size_t getSectorCount() const override
59  {
60  return sectorCount;
61  }
62 
63  bool sync() override;
64 
73  bool allocateBuffers(unsigned numBuffers);
74 
75  struct Stat {
76  enum Function { read, write, erase };
77  struct Func {
78  uint32_t count[2]{}; // Hit, Miss
79 
80  uint32_t totalCount() const
81  {
82  return count[0] + count[1];
83  }
84 
85  size_t printTo(Print& p) const;
86  };
87  Func func[3];
88  std::map<uint32_t, Func> sectors;
89 
90  void update(Function fn, uint32_t sector, uint32_t cacheSector);
91  size_t printTo(Print& p) const;
92  };
94 
95 protected:
96  virtual bool raw_sector_read(storage_size_t address, void* dst, size_t size) = 0;
97  virtual bool raw_sector_write(storage_size_t address, const void* src, size_t size) = 0;
98  virtual bool raw_sector_erase_range(storage_size_t address, size_t size) = 0;
99  virtual bool raw_sync() = 0;
100 
101  bool transfer(storage_size_t address, void* data, size_t size, bool isWrite);
102  bool flushBuffer(Buffer& buf);
103  bool flushBuffers();
104 
105  std::unique_ptr<BufferList> buffers;
106  uint64_t sectorCount{0};
109 };
110 
111 } // namespace Storage::Disk
uint32_t storage_size_t
Definition: Components/Storage/src/include/Storage/Types.h:19
Provides formatted output to stream.
Definition: Print.h:37
Represents a storage device (e.g. flash memory)
Definition: Components/Storage/src/include/Storage/Device.h:34
static constexpr uint16_t defaultSectorSize
Definition: Components/Storage/src/include/Storage/Device.h:188
Base class for sector-addressable (block) devices.
Definition: BlockDevice.h:34
uint8_t sectorSizeShift
Definition: BlockDevice.h:108
bool flushBuffer(Buffer &buf)
bool write(storage_size_t address, const void *src, size_t size) override
Write data to the storage device.
Definition: BlockDevice.h:41
uint16_t sectorSize
Definition: BlockDevice.h:107
size_t getBlockSize() const override
Obtain smallest allocation unit for erase operations.
Definition: BlockDevice.h:48
Stat stat
Definition: BlockDevice.h:93
virtual bool raw_sync()=0
storage_size_t getSectorCount() const override
Obtain total number of sectors on this device.
Definition: BlockDevice.h:58
bool read(storage_size_t address, void *dst, size_t size) override
Read data from the storage device.
Definition: BlockDevice.h:36
std::unique_ptr< BufferList > buffers
Definition: BlockDevice.h:105
uint64_t sectorCount
Definition: BlockDevice.h:106
storage_size_t getSize() const override
Obtain addressable size of this device.
Definition: BlockDevice.h:53
virtual bool raw_sector_read(storage_size_t address, void *dst, size_t size)=0
bool transfer(storage_size_t address, void *data, size_t size, bool isWrite)
bool sync() override
Flush any pending writes to the physical media.
bool allocateBuffers(unsigned numBuffers)
Set number of sector buffers to use.
virtual bool raw_sector_write(storage_size_t address, const void *src, size_t size)=0
bool erase_range(storage_size_t address, storage_size_t size) override
Erase a region of storage in preparation for writing.
virtual bool raw_sector_erase_range(storage_size_t address, size_t size)=0
Definition: Partition.h:78
constexpr std::enable_if<(sizeof(T)<=4), uint8_t >::type getSizeBits(T value)
Definition: Components/Storage/src/include/Storage/Types.h:49
Definition: BlockDevice.h:77
uint32_t count[2]
Definition: BlockDevice.h:78
uint32_t totalCount() const
Definition: BlockDevice.h:80
Definition: BlockDevice.h:75
size_t printTo(Print &p) const
Function
Definition: BlockDevice.h:76
@ read
Definition: BlockDevice.h:76
@ write
Definition: BlockDevice.h:76
@ erase
Definition: BlockDevice.h:76
std::map< uint32_t, Func > sectors
By sector.
Definition: BlockDevice.h:88
Func func[3]
Read, Write, Erase.
Definition: BlockDevice.h:87
void update(Function fn, uint32_t sector, uint32_t cacheSector)
Definition: DiskStorage/src/include/Storage/Disk/Buffer.h:17