1 /*
2 * Percepio DFM v2.1.0
3 * Copyright 2023 Percepio AB
4 * www.percepio.com
5 *
6 * SPDX-License-Identifier: Apache-2.0
7 *
8 * DFM Retained Memory Port for Zephyr
9 */
10
11 #include <dfm.h>
12
13 #if (defined(DFM_CFG_ENABLED) && (DFM_CFG_ENABLED >= 1)) && (defined(DFM_CFG_RETAINED_MEMORY) && (DFM_CFG_RETAINED_MEMORY >= 1))
14
15 #include <zephyr/retention/retention.h>
16
17 static const struct device *pxRetention0 = DEVICE_DT_GET(DT_NODELABEL(retention0));
18
xDfmRetainedMemoryPortInitialize(DfmRetainedMemoryPortData_t * pxBuffer)19 DfmResult_t xDfmRetainedMemoryPortInitialize(DfmRetainedMemoryPortData_t* pxBuffer)
20 {
21 (void)pxBuffer;
22
23 return DFM_SUCCESS;
24 }
25
xDfmRetainedMemoryPortClear(void)26 DfmResult_t xDfmRetainedMemoryPortClear(void)
27 {
28 if (retention_clear(pxRetention0) != 0)
29 {
30 return DFM_FAIL;
31 }
32
33 return DFM_SUCCESS;
34 }
35
xDfmRetainedMemoryPortWrite(void * pvData,unsigned int ulWriteSize,unsigned int ulWriteOffset)36 DfmResult_t xDfmRetainedMemoryPortWrite(void* pvData, unsigned int ulWriteSize, unsigned int ulWriteOffset)
37 {
38 if (retention_size(pxRetention0) < ulWriteOffset + ulWriteSize)
39 {
40 /* There's not enough space left in the retention memory area */
41 return DFM_FAIL;
42 }
43
44 if (retention_write(pxRetention0, ulWriteOffset, (uint8_t*)pvData, ulWriteSize) != 0)
45 {
46 return DFM_FAIL;
47 }
48
49 return DFM_SUCCESS;
50 }
51
xDfmRetainedMemoryPortRead(void * pvBuffer,unsigned int ulReadSize,unsigned int ulReadOffset)52 DfmResult_t xDfmRetainedMemoryPortRead(void* pvBuffer, unsigned int ulReadSize, unsigned int ulReadOffset)
53 {
54 if (retention_size(pxRetention0) < ulReadOffset + ulReadSize)
55 {
56 /* There's not enough space left in the retention memory area */
57 return DFM_FAIL;
58 }
59
60 if (retention_read(pxRetention0, ulReadOffset, (uint8_t*)pvBuffer, ulReadSize) != 0)
61 {
62 return DFM_FAIL;
63 }
64
65 return DFM_SUCCESS;
66 }
67
xDfmRetainedMemoryPortHasData(void)68 uint32_t xDfmRetainedMemoryPortHasData(void)
69 {
70 return (uint32_t)retention_is_valid(pxRetention0);
71 }
72
73 #endif
74