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