distortos  v0.7.0
object-oriented C++ RTOS for microcontrollers
SdMmcCardLowLevel.hpp
Go to the documentation of this file.
1 
12 #ifndef INCLUDE_DISTORTOS_DEVICES_MEMORY_SDMMCCARDLOWLEVEL_HPP_
13 #define INCLUDE_DISTORTOS_DEVICES_MEMORY_SDMMCCARDLOWLEVEL_HPP_
14 
15 #include "estd/ContiguousRange.hpp"
16 
17 namespace distortos
18 {
19 
20 namespace devices
21 {
22 
23 class SdMmcCardBase;
24 
32 {
33 public:
34 
36  enum class BusMode : uint8_t
37  {
39  _1Bit,
41  _4Bit,
43  _8Bit,
44  };
45 
47  class Response : public estd::ContiguousRange<uint32_t>
48  {
49  public:
50 
53 
60  constexpr Response() :
61  Base{}
62  {
63 
64  }
65 
74  constexpr explicit Response(uint32_t& shortResponse) :
75  Base{shortResponse}
76  {
77 
78  }
79 
88  constexpr explicit Response(uint32_t (& shortResponse)[1]) :
89  Base{shortResponse}
90  {
91 
92  }
93 
102  constexpr explicit Response(std::array<uint32_t, 1>& shortResponse) :
103  Base{shortResponse}
104  {
105 
106  }
107 
116  constexpr explicit Response(uint32_t (& longResponse)[4]) :
117  Base{longResponse}
118  {
119 
120  }
121 
130  constexpr explicit Response(std::array<uint32_t, 4>& longResponse) :
131  Base{longResponse}
132  {
133 
134  }
135  };
136 
138  class Transfer
139  {
140  public:
141 
148  constexpr Transfer() :
149  readBuffer_{},
150  size_{},
151  blockSize_{},
152  timeoutMs_{},
154  {
155 
156  }
157 
169  constexpr Transfer(void* const readBuffer, const size_t size, const size_t blockSize,
170  const uint16_t timeoutMs) :
171  readBuffer_{readBuffer},
172  size_{size},
173  blockSize_{blockSize},
174  timeoutMs_{timeoutMs},
176  {
177 
178  }
179 
191  constexpr Transfer(const void* const writeBuffer, const size_t size, const size_t blockSize,
192  const uint16_t timeoutMs) :
193  writeBuffer_{writeBuffer},
194  size_{size},
195  blockSize_{blockSize},
196  timeoutMs_{timeoutMs},
197  writeTransfer_{true}
198  {
199 
200  }
201 
206  size_t getBlockSize() const
207  {
208  return blockSize_;
209  }
210 
215  void* getReadBuffer() const
216  {
217  return readBuffer_;
218  }
219 
224  size_t getSize() const
225  {
226  return size_;
227  }
228 
233  uint16_t getTimeoutMs() const
234  {
235  return timeoutMs_;
236  }
237 
242  const void* getWriteBuffer() const
243  {
244  return writeBuffer_;
245  }
246 
251  bool isWriteTransfer() const
252  {
253  return writeTransfer_;
254  }
255 
256  private:
257 
258  union
259  {
261  void* readBuffer_;
262 
264  const void* writeBuffer_;
265  };
266 
268  size_t size_;
269 
271  size_t blockSize_;
272 
274  uint16_t timeoutMs_;
275 
278  };
279 
281  struct ReadTransfer : public Transfer
282  {
292  constexpr ReadTransfer(void* const readBuffer, const size_t size, const size_t blockSize,
293  const uint16_t timeoutMs) :
294  Transfer{readBuffer, size, blockSize, timeoutMs}
295  {
296 
297  }
298  };
299 
301  struct WriteTransfer : public Transfer
302  {
303 
313  constexpr WriteTransfer(const void* const writeBuffer, const size_t size, const size_t blockSize,
314  const uint16_t timeoutMs) :
315  Transfer{writeBuffer, size, blockSize, timeoutMs}
316  {
317 
318  }
319  };
320 
322  constexpr static uint8_t maxCommand {(1 << 6) - 1};
323 
330  virtual ~SdMmcCardLowLevel() = default;
331 
343  virtual void configure(BusMode busMode, uint32_t clockFrequency) = 0;
344 
353  virtual int start() = 0;
354 
384  virtual void startTransaction(SdMmcCardBase& sdMmcCardBase, uint8_t command, uint32_t argument, Response response,
385  Transfer transfer) = 0;
386 
396  virtual void stop() = 0;
397 };
398 
399 } // namespace devices
400 
401 } // namespace distortos
402 
403 #endif // INCLUDE_DISTORTOS_DEVICES_MEMORY_SDMMCCARDLOWLEVEL_HPP_
bool writeTransfer_
selects whether this is a read (false) or write (true) transfer
Definition: SdMmcCardLowLevel.hpp:277
constexpr Transfer(const void *const writeBuffer, const size_t size, const size_t blockSize, const uint16_t timeoutMs)
Transfer's constructor.
Definition: SdMmcCardLowLevel.hpp:191
void * readBuffer_
buffer into which the data will be read, valid only if writeTransfer_ is false
Definition: SdMmcCardLowLevel.hpp:261
constexpr Response(uint32_t &shortResponse)
Response's constructor.
Definition: SdMmcCardLowLevel.hpp:74
command response
Definition: SdMmcCardLowLevel.hpp:47
transfer associated with transaction
Definition: SdMmcCardLowLevel.hpp:138
constexpr Response(uint32_t(&longResponse)[4])
Response's constructor.
Definition: SdMmcCardLowLevel.hpp:116
read transfer associated with transaction
Definition: SdMmcCardLowLevel.hpp:281
virtual int start()=0
Starts low-level SD/MMC card driver.
size_t size_
size of readBuffer_ or writeBuffer_, bytes
Definition: SdMmcCardLowLevel.hpp:268
void * getReadBuffer() const
Definition: SdMmcCardLowLevel.hpp:215
constexpr Transfer()
Transfer's constructor.
Definition: SdMmcCardLowLevel.hpp:148
uint16_t timeoutMs_
timeout of transfer, milliseconds
Definition: SdMmcCardLowLevel.hpp:274
ContiguousRange template class is a pair of iterators to contiguous sequence of elements in memory.
Definition: ContiguousRange.hpp:27
constexpr Transfer(void *const readBuffer, const size_t size, const size_t blockSize, const uint16_t timeoutMs)
Transfer's constructor.
Definition: SdMmcCardLowLevel.hpp:169
constexpr Response(std::array< uint32_t, 1 > &shortResponse)
Response's constructor.
Definition: SdMmcCardLowLevel.hpp:102
constexpr ReadTransfer(void *const readBuffer, const size_t size, const size_t blockSize, const uint16_t timeoutMs)
ReadTransfer's constructor.
Definition: SdMmcCardLowLevel.hpp:292
size_t getSize() const
Definition: SdMmcCardLowLevel.hpp:224
constexpr Response(std::array< uint32_t, 4 > &longResponse)
Response's constructor.
Definition: SdMmcCardLowLevel.hpp:130
const void * writeBuffer_
buffer with data that will be written, valid only if writeTransfer_ is true
Definition: SdMmcCardLowLevel.hpp:264
write transfer associated with transaction
Definition: SdMmcCardLowLevel.hpp:301
size_t getBlockSize() const
Definition: SdMmcCardLowLevel.hpp:206
Definition: SdMmcCardLowLevel.hpp:31
constexpr Response(uint32_t(&shortResponse)[1])
Response's constructor.
Definition: SdMmcCardLowLevel.hpp:88
ContiguousRange template class header.
virtual void stop()=0
Stops low-level SD/MMC card driver.
Top-level namespace of distortos project.
Definition: buttons.hpp:33
size_t blockSize_
block size, bytes
Definition: SdMmcCardLowLevel.hpp:271
uint16_t getTimeoutMs() const
Definition: SdMmcCardLowLevel.hpp:233
Definition: SdMmcCardBase.hpp:30
BusMode
bus mode
Definition: SdMmcCardLowLevel.hpp:36
bool isWriteTransfer() const
Definition: SdMmcCardLowLevel.hpp:251
constexpr WriteTransfer(const void *const writeBuffer, const size_t size, const size_t blockSize, const uint16_t timeoutMs)
WriteTransfer's constructor.
Definition: SdMmcCardLowLevel.hpp:313
const void * getWriteBuffer() const
Definition: SdMmcCardLowLevel.hpp:242
constexpr Response()
Response's constructor.
Definition: SdMmcCardLowLevel.hpp:60
virtual ~SdMmcCardLowLevel()=default
SdMmcCardLowLevel's destructor.
static constexpr uint8_t maxCommand
maximum allowed command
Definition: SdMmcCardLowLevel.hpp:322
virtual void configure(BusMode busMode, uint32_t clockFrequency)=0
Configures parameters of low-level SD/MMC card driver.
virtual void startTransaction(SdMmcCardBase &sdMmcCardBase, uint8_t command, uint32_t argument, Response response, Transfer transfer)=0
Starts asynchronous transaction.