HALFRED  0.4.0
hal_nv.h
Go to the documentation of this file.
1 
10 #ifndef HAL_NV_H_
11 #define HAL_NV_H_
12 
13 #include <stdbool.h>
14 #include "hal_config.h"
15 #include "hal_os.h"
16 #include "hal_bp.h"
17 
107 #if !defined(HAL_ENABLE_OS) || (HAL_ENABLE_OS == 0)
108 #error "OS support has to be enabled to be able to use NVMEM!"
109 #endif
110 
111 #if !defined(HAL_ENABLE_BP) || (HAL_ENABLE_BP == 0)
112 #error "Buffer pool support has to be enabled to be able to use NVMEM!"
113 #endif
114 
115 
116 #if defined(HAL_NV_USE_WORKER_TASK) && (HAL_NV_USE_WORKER_TASK != 0)
117 #if defined(HAL_NV_USE_SEM_TO_PROCESS_IDLE) && (HAL_NV_USE_SEM_TO_PROCESS_IDLE != 0)
118 /*
119  * Counting semaphores (up to number of entries in requests queue)
120  * initially semaphore should have counter set to 0 (no entries available)
121  */
122 #define HAL_NV_WAIT_SEM_PTR_DECLARE(name) OSCntSem name
123 #endif /* defined(HAL_NV_USE_SEM_TO_PROCESS_IDLE) && (HAL_NV_USE_SEM_TO_PROCESS_IDLE != 0) */
124 #endif /* defined(HAL_NV_USE_WORKER_TASK) && (HAL_NV_USE_WORKER_TASK != 0) */
125 
126 
127 #if defined(HAL_NV_USE_SEM_TO_PROCESS_IDLE) && (HAL_NV_USE_SEM_TO_PROCESS_IDLE != 0)
128 #if !defined(HAL_NV_USE_WORKER_TASK) || (HAL_NV_USE_WORKER_TASK == 0)
129 #warning "The HAL_NV_USE_SEM_TO_PROCESS_IDLE macro definition has no effect!"
130 #undef HAL_NV_USE_SEM_TO_PROCESS_IDLE
131 #endif
132 #endif
133 
137 typedef enum {
138  NVOP_OK,
139  NVOP_IN_PROGRESS,
140  NVOP_BAD_REQUEST,
141  NVOP_NO_SEM_AVAIL,
142  NVOP_NO_BUF_AVAIL,
143  NVOP_TOO_MANY_REQ,
144  NVOP_DEVOP_RD_ERR,
145  NVOP_DEVOP_WR_ERR,
146  NVOP_DEVOP_ER_ERR,
147  NVOP_LOCKED
148 } NV_OpResult;
149 
153 typedef uint32_t NV_Addressable;
154 
158 typedef uint32_t NV_DevId;
159 
163 struct NV_Memory_Tag;
164 typedef struct NV_Memory_Tag* NV_Memory;
165 
166 
167 #if defined(HAL_NV_USE_WORKER_TASK) && (HAL_NV_USE_WORKER_TASK != 0)
168 
172 struct NV_SemaphorePool_Tag;
173 typedef struct NV_SemaphorePool_Tag* NV_SemaphorePool;
174 
178 struct NV_RequestQueue_Tag;
179 typedef struct NV_RequestQueue_Tag* NV_RequestQueue;
180 
181 #endif /* defined(HAL_NV_USE_WORKER_TASK) && (HAL_NV_USE_WORKER_TASK != 0) */
182 
190 typedef struct NV_AddressMap_Tag
191 {
192  NV_Addressable start_addr;
193  NV_Addressable end_addr;
194  NV_Addressable write_len_unit;
196 
201 
202 
206 typedef struct NV_MemPeripheral_Tag
207 {
208  void (*init)(NV_Memory dev);
209  void (*deinit)(NV_Memory dev);
210  NV_OpResult (*read)(NV_Memory dev, NV_Addressable addr, NV_Addressable size, void* dst);
211  NV_OpResult (*write)(NV_Memory dev, NV_Addressable addr, const void* src);
212  NV_OpResult (*erase)(NV_Memory dev);
214 
219 
223 typedef struct NV_MemDevice_Tag
224 {
225  NV_Memory* devices;
226  uint32_t no_devices;
227 #if defined(HAL_NV_USE_WORKER_TASK) && (HAL_NV_USE_WORKER_TASK != 0)
228  NV_RequestQueue dev_requests;
229  NV_SemaphorePool dev_semaphores;
230  BP_BufferPool buf_pool;
231 #endif
232  uint8_t* page_buffer;
233  volatile bool op_in_progress;
234  bool was_init;
235  volatile bool lock;
236 #if defined(HAL_NV_USE_SEM_TO_PROCESS_IDLE) && (HAL_NV_USE_SEM_TO_PROCESS_IDLE != 0)
237  HAL_NV_WAIT_SEM_PTR_DECLARE(req_queue_sem);
238 #endif
240 
245 
249 typedef struct NV_Memory_Tag
250 {
251  NV_MemDevice parent_dev;
252  NV_AddressMap mem_map;
253  void* phy_data;
254  NV_MemPeripheral ops;
255 } NV_Memory_T;
256 
257 
258 
268 #define NV_INIT_MEMORY(mem_map, phy_data, dev_ops) { NULL, &(mem_map), (void*)(phy_data), &(dev_ops) }
269 
277 #if defined(HAL_NV_USE_WORKER_TASK) && (HAL_NV_USE_WORKER_TASK != 0)
278 #if defined(HAL_NV_USE_SEM_TO_PROCESS_IDLE) && (HAL_NV_USE_SEM_TO_PROCESS_IDLE != 0)
279 #define NV_INIT_MEMDEVICE(devs, no_devs) { (devs), (no_devs), NULL, NULL, NULL, NULL, false, false, false, NULL }
280 #else
281 #define NV_INIT_MEMDEVICE(devs, no_devs) { (devs), (no_devs), NULL, NULL, NULL, NULL, false, false, false }
282 #endif
283 #else
284 #define NV_INIT_MEMDEVICE(devs, no_devs) { (devs), (no_devs), NULL, false, false, false }
285 #endif
286 
305 #if defined(HAL_NV_USE_WORKER_TASK) && (HAL_NV_USE_WORKER_TASK != 0)
306 void NV_MemDeviceInit(NV_MemDevice mdev, uint8_t* buffer, uint32_t req_queue_len, uint32_t sem_pool_len, BP_BufferPool bpool);
307 #else
308 void NV_MemDeviceInit(NV_MemDevice mdev, uint8_t* buffer);
309 #endif
310 
318 
332 #if defined(HAL_NV_USE_WORKER_TASK) && (HAL_NV_USE_WORKER_TASK != 0)
333 NV_OpResult NV_MemDeviceLock(NV_MemDevice mdev, bool flush);
334 #else
336 #endif
337 
345 
346 #if defined(HAL_NV_USE_WORKER_TASK) && (HAL_NV_USE_WORKER_TASK != 0)
347 
356 void NV_ProcessRequests(NV_MemDevice mdev);
357 #endif
358 
369 NV_OpResult NV_ReadSync(NV_Memory nv_mem, NV_Addressable addr, NV_Addressable size, void* dst);
370 
371 #if defined(HAL_NV_USE_WORKER_TASK) && (HAL_NV_USE_WORKER_TASK != 0)
372 
385 NV_OpResult NV_WriteAsync(NV_Memory nv_mem, NV_Addressable addr, NV_Addressable size, const void* src, volatile NV_OpResult* result);
386 #endif
387 
398 NV_OpResult NV_WriteSync(NV_Memory nv_mem, NV_Addressable addr, NV_Addressable size, const void* src);
399 
400 #if defined(HAL_NV_USE_WORKER_TASK) && (HAL_NV_USE_WORKER_TASK != 0)
401 
408 NV_OpResult NV_Flush(NV_Memory nv_mem);
409 #endif
410 
419 NV_OpResult NV_Erase(NV_Memory nv_mem);
420 
426 #endif /* HAL_NV_H_ */
427 
428 
NV_OpResult NV_Erase(NV_Memory nv_mem)
NV_OpResult NV_WriteSync(NV_Memory nv_mem, NV_Addressable addr, NV_Addressable size, const void *src)
struct NV_MemPeripheral_Tag NV_MemPeripheral_T
struct NV_Memory_Tag NV_Memory_T
Definition: hal_nv.h:190
uint32_t NV_Addressable
Definition: hal_nv.h:153
Definition: hal_nv.h:206
NV_OpResult NV_MemDeviceLock(NV_MemDevice mdev)
uint32_t NV_DevId
Definition: hal_nv.h:158
Definition: hal_nv.h:249
NV_MemPeripheral_T * NV_MemPeripheral
Definition: hal_nv.h:218
void NV_MemDeviceDeInit(NV_MemDevice mdev)
NV_OpResult NV_ReadSync(NV_Memory nv_mem, NV_Addressable addr, NV_Addressable size, void *dst)
NV_AddressMap_T * NV_AddressMap
Definition: hal_nv.h:200
NV_MemDevice_T * NV_MemDevice
Definition: hal_nv.h:244
void NV_MemDeviceUnlock(NV_MemDevice mdev)
Operating system (OS) API.
NV_OpResult
Definition: hal_nv.h:137
struct NV_AddressMap_Tag NV_AddressMap_T
Buffer pool API.
Definition: hal_nv.h:223
struct NV_MemDevice_Tag NV_MemDevice_T
void NV_MemDeviceInit(NV_MemDevice mdev, uint8_t *buffer)