libDaisy
Hardware Library for Daisy
Loading...
Searching...
No Matches
qspi.h
Go to the documentation of this file.
1#ifndef DSY_QSPI
2#define DSY_QSPI
4#ifndef UNIT_TEST // for unit tests, a dummy implementation
5
6#include <cstdint>
7#include "daisy_core.h" // Added for dsy_gpio_pin typedef
8
9#define DSY_QSPI_TEXT \
10 __attribute__((section( \
11 ".qspiflash_text")))
12#define DSY_QSPI_DATA \
13 __attribute__((section( \
14 ".qspiflash_data")))
15#define DSY_QSPI_BSS \
16 __attribute__((section( \
17 ".qspiflash_bss")))
19namespace daisy
20{
31{
32 public:
33 enum Result
34 {
35 OK = 0,
36 ERR
37 };
38
55
95
102
104 const Config& GetConfig() const;
105
106 // Couldn't this just be called before anything else in init? That
107 // would make manually calling it unnecessary.
114
124
133
143
151
156
165
166 QSPIHandle() : pimpl_(nullptr) {}
167 QSPIHandle(const QSPIHandle& other) = default;
169
170 class Impl;
172 private:
173 Impl* pimpl_;
174};
175
178} // namespace daisy
179
180#else
181
182#include <cstdint>
183#include "../tests/TestIsolator.h"
184
185namespace daisy
186{
193class QSPIHandle
194{
195 public:
196 enum Result
197 {
198 OK = 0,
199 ERR
200 };
201
206 static Result ResetAndClear()
207 {
208 testIsolator_.GetStateForCurrentTest()->memory_.clear();
209 return Result::OK;
210 }
211
212
213 static Result Write(uint32_t address, uint32_t size, uint8_t* buffer)
214 {
215 // 256-byte aligned, normalized address value
216 uint32_t adjusted_addr = (address) & (uint32_t)(~0xff);
217 // Make sure memory is of approriate size
218 uint32_t total_bytes = adjusted_addr + size;
219 AdaptToSize(total_bytes);
220 // Copy data into vector
221 uint8_t* dest = testIsolator_.GetStateForCurrentTest()->memory_.data();
222 std::copy(&buffer[adjusted_addr],
223 &buffer[adjusted_addr + size],
224 &dest[adjusted_addr]);
225 return Result::OK;
226 }
227
228 static Result Erase(uint32_t start_addr, uint32_t end_addr)
229 {
230 uint32_t adjusted_start_addr = (start_addr) & (uint32_t)(~0xff);
231 uint32_t adjusted_end_addr = (end_addr) & (uint32_t)(~0xff);
232
233 // guard addresses
234 assert(adjusted_start_addr < kMaxAdjustedAddr);
235 assert(adjusted_end_addr < kMaxAdjustedAddr);
236
237 // Make sure vector is of appropriate size
238 // size should be at least (adjusted_end_addr)
239 AdaptToSize(adjusted_end_addr);
240 uint8_t* buff = testIsolator_.GetStateForCurrentTest()->memory_.data();
241 // Erases memory by setting all bits to 1
242 std::fill(&buff[adjusted_start_addr], &buff[adjusted_end_addr], 0xff);
243 return Result::OK;
244 }
245
248 static void* GetData(uint32_t offset = 0)
249 {
250 assert(offset < kMaxAdjustedAddr);
251 AdaptToSize(offset + 1);
252 return (void*)(testIsolator_.GetStateForCurrentTest()->memory_.data()
253 + offset);
254 }
255
260 static size_t GetCurrentSize()
261 {
262 return testIsolator_.GetStateForCurrentTest()->memory_.size();
263 }
264
265 private:
267 static void AdaptToSize(uint32_t required_bytes)
268 {
269 if(testIsolator_.GetStateForCurrentTest()->memory_.size()
270 < required_bytes)
271 testIsolator_.GetStateForCurrentTest()->memory_.resize(
272 required_bytes, 0x00);
273 }
274 static constexpr uint32_t kMaxAdjustedAddr = 0x800000;
275 struct QSPIState
276 {
277 // Emulate the byte-memory of the QSPI flash
278 std::vector<uint8_t> memory_;
279 };
280 static TestIsolator<QSPIState> testIsolator_;
281};
282
283
284} // namespace daisy
285
286
287#endif // ifndef UNIT_TEST
288
289#endif // ifndef DSY_QSPI
Definition leddriver.h:33
Definition qspi.h:31
const Config & GetConfig() const
QSPIHandle(const QSPIHandle &other)=default
Status
Definition qspi.h:49
@ GOOD
Definition qspi.h:50
@ E_INVALID_MODE
Definition qspi.h:53
@ E_HAL_ERROR
Definition qspi.h:51
@ E_SWITCHING_MODES
Definition qspi.h:52
QSPIHandle & operator=(const QSPIHandle &other)=default
Result EraseSector(uint32_t address)
Result Erase(uint32_t start_addr, uint32_t end_addr)
Result Init(const Config &config)
QSPIHandle()
Definition qspi.h:166
void * GetData(uint32_t offset=0)
Result
Definition qspi.h:34
@ OK
Definition qspi.h:35
@ ERR
Definition qspi.h:36
Result Write(uint32_t address, uint32_t size, uint8_t *buffer)
Result WritePage(uint32_t address, uint32_t size, uint8_t *buffer)
Hardware defines and helpers for daisy field platform.
Definition index.h:2
Definition qspi.h:58
Device
Definition qspi.h:61
@ IS25LP064A
Definition qspi.h:63
@ DEVICE_LAST
Definition qspi.h:64
@ IS25LP080D
Definition qspi.h:62
dsy_gpio_pin clk
Definition qspi.h:88
struct daisy::QSPIHandle::Config::@14 pin_config
dsy_gpio_pin io3
Definition qspi.h:87
Device device
Definition qspi.h:92
Mode
Definition qspi.h:75
@ MEMORY_MAPPED
Definition qspi.h:76
@ INDIRECT_POLLING
Definition qspi.h:77
@ MODE_LAST
Definition qspi.h:78
dsy_gpio_pin io2
Definition qspi.h:86
dsy_gpio_pin ncs
Definition qspi.h:89
dsy_gpio_pin io0
Definition qspi.h:84
dsy_gpio_pin io1
Definition qspi.h:85
Mode mode
Definition qspi.h:93
Definition daisy_core.h:205