distortos  v0.7.0
object-oriented C++ RTOS for microcontrollers
SpiEeprom.hpp
Go to the documentation of this file.
1 
12 #ifndef INCLUDE_DISTORTOS_DEVICES_MEMORY_SPIEEPROM_HPP_
13 #define INCLUDE_DISTORTOS_DEVICES_MEMORY_SPIEEPROM_HPP_
14 
17 
19 
20 #include "distortos/Mutex.hpp"
21 
22 namespace distortos
23 {
24 
25 namespace devices
26 {
27 
28 class OutputPin;
29 class SpiMaster;
30 
38 class SpiEeprom : public BlockDevice
39 {
41  constexpr static size_t pageSizeShift_ {0};
42 
44  constexpr static size_t pageSizeWidth_ {3};
45 
47  constexpr static size_t pageSizeMask_ {((1 << pageSizeWidth_) - 1) << pageSizeShift_};
48 
50  constexpr static size_t sizeShift_ {pageSizeWidth_};
51 
53  constexpr static size_t sizeWidth_ {8 - pageSizeWidth_};
54 
56  constexpr static size_t sizeMask_ {((1 << sizeWidth_) - 1) << sizeShift_};
57 
58 public:
59 
61  enum class Type : uint8_t
62  {
99 
124 
149 
174 
213  };
214 
226  constexpr SpiEeprom(SpiMaster& spiMaster, OutputPin& slaveSelectPin, const Type type, const bool mode3 = {},
227  const uint32_t clockFrequency = 1000000) :
228  mutex_{Mutex::Type::recursive, Mutex::Protocol::priorityInheritance},
229  clockFrequency_{clockFrequency},
230  slaveSelectPin_{slaveSelectPin},
231  spiMaster_{spiMaster},
232  mode_{mode3 == false ? SpiMode::_0 : SpiMode::_3},
233  openCount_{},
234  type_{type}
235  {
236 
237  }
238 
245  ~SpiEeprom() override;
246 
260  int close() override;
261 
278  int erase(uint64_t address, uint64_t size) override;
279 
284  size_t getBlockSize() const override;
285 
290  uint64_t getSize() const override;
291 
307  void lock() override;
308 
320  int open() override;
321 
340  int read(uint64_t address, void* buffer, size_t size) override;
341 
353  int synchronize() override;
354 
365  void unlock() override;
366 
384  int write(uint64_t address, const void* buffer, size_t size) override;
385 
386 private:
387 
402  int eraseOrWrite(uint64_t address, const void* buffer, uint64_t size);
403 
418  std::pair<int, size_t> eraseOrWritePage(uint32_t address, const void* buffer, size_t size);
419 
429  int executeTransaction(SpiMasterTransfersRange transfersRange) const;
430 
435  size_t getPageSize() const
436  {
437  return 8 * (1 << ((static_cast<uint8_t>(type_) & pageSizeMask_) >> pageSizeShift_));
438  }
439 
448  std::pair<int, bool> isWriteInProgress();
449 
458  std::pair<int, uint8_t> readStatusRegister() const;
459 
469 
477  int writeEnable() const;
478 
481 
483  uint32_t clockFrequency_;
484 
487 
490 
493 
495  uint8_t openCount_;
496 
499 };
500 
501 } // namespace devices
502 
503 } // namespace distortos
504 
505 #endif // INCLUDE_DISTORTOS_DEVICES_MEMORY_SPIEEPROM_HPP_
constexpr SpiEeprom(SpiMaster &spiMaster, OutputPin &slaveSelectPin, const Type type, const bool mode3={}, const uint32_t clockFrequency=1000000)
SpiEeprom's constructor.
Definition: SpiEeprom.hpp:226
Definition: SpiEeprom.hpp:38
int writeEnable() const
Enables writes in SPI EEPROM.
Definition: SpiEeprom.cpp:312
int eraseOrWrite(uint64_t address, const void *buffer, uint64_t size)
Implementation of erase() and write()
Definition: SpiEeprom.cpp:217
void lock() override
Locks SPI EEPROM for exclusive use by current thread.
Definition: SpiEeprom.cpp:137
static constexpr size_t pageSizeMask_
bit mask of field with page size encoded in device's type
Definition: SpiEeprom.hpp:47
std::pair< int, bool > isWriteInProgress()
Checks whether any write operation is currently in progress.
Definition: SpiEeprom.cpp:284
static constexpr size_t sizeWidth_
bit width of field with size encoded in device's type
Definition: SpiEeprom.hpp:53
SpiMode enum class header.
uint8_t openCount_
number of times this device was opened but not yet closed
Definition: SpiEeprom.hpp:495
void unlock() override
Unlocks SPI EEPROM which was previously locked by current thread.
Definition: SpiEeprom.cpp:198
int waitWhileWriteInProgress()
Waits while any write operation is currently in progress.
Definition: SpiEeprom.cpp:298
BlockDevice class header.
static constexpr size_t sizeShift_
bit shift of field with size encoded in device's type
Definition: SpiEeprom.hpp:50
Definition: OutputPin.hpp:29
std::pair< int, uint8_t > readStatusRegister() const
Reads value of status register of SPI EEPROM.
Definition: SpiEeprom.cpp:290
SpiMode
Definition: SpiMode.hpp:29
size_t getBlockSize() const override
Definition: SpiEeprom.cpp:127
OutputPin & slaveSelectPin_
reference to slave select pin of this SPI EEPROM
Definition: SpiEeprom.hpp:486
estd::ContiguousRange< const SpiMasterTransfer > SpiMasterTransfersRange
Definition: SpiMasterTransfersRange.hpp:31
static constexpr size_t sizeMask_
bit mask of field with size encoded in device's type
Definition: SpiEeprom.hpp:56
~SpiEeprom() override
SpiEeprom's destructor.
Definition: SpiEeprom.cpp:102
SpiMaster & spiMaster_
reference to SPI master to which this SPI EEPROM is connected
Definition: SpiEeprom.hpp:489
Mutex class header.
std::pair< int, size_t > eraseOrWritePage(uint32_t address, const void *buffer, size_t size)
Erases or writes single page.
Definition: SpiEeprom.cpp:243
Mutex mutex_
mutex used to serialize access to this object
Definition: SpiEeprom.hpp:480
static constexpr size_t pageSizeWidth_
bit width of field with page size encoded in device's type
Definition: SpiEeprom.hpp:44
int synchronize() override
Synchronizes state of SPI EEPROM, ensuring all cached writes are finished.
Definition: SpiEeprom.cpp:189
Type type_
type of SPI EEPROM
Definition: SpiEeprom.hpp:498
int write(uint64_t address, const void *buffer, size_t size) override
Writes data to SPI EEPROM.
Definition: SpiEeprom.cpp:204
Top-level namespace of distortos project.
Definition: buttons.hpp:33
Mutex is the basic synchronization primitive.
Definition: Mutex.hpp:30
int close() override
Closes SPI EEPROM.
Definition: SpiEeprom.cpp:107
int executeTransaction(SpiMasterTransfersRange transfersRange) const
Executes series of transfers as a single atomic transaction.
Definition: SpiEeprom.cpp:273
Definition: BlockDevice.hpp:30
mode 0 - CPOL == 0, CPHA == 0
uint32_t clockFrequency_
desired clock frequency of SPI EEPROM, Hz
Definition: SpiEeprom.hpp:483
Definition: SpiMaster.hpp:37
uint64_t getSize() const override
Definition: SpiEeprom.cpp:132
int erase(uint64_t address, uint64_t size) override
Erases blocks on SPI EEPROM.
Definition: SpiEeprom.cpp:120
SpiMasterTransfersRange type alias header.
SpiMode mode_
SPI mode used by SPI EEPROM.
Definition: SpiEeprom.hpp:492
mode 3 - CPOL == 1, CPHA == 1
static constexpr size_t pageSizeShift_
bit shift of field with page size encoded in device's type
Definition: SpiEeprom.hpp:41
int read(uint64_t address, void *buffer, size_t size) override
Reads data from SPI EEPROM.
Definition: SpiEeprom.cpp:161
int open() override
Opens SPI EEPROM.
Definition: SpiEeprom.cpp:143
Type
type of device - determines size and page size
Definition: SpiEeprom.hpp:61
size_t getPageSize() const
Definition: SpiEeprom.hpp:435