Line data Source code
1 1 : /*
2 : * Copyright (c) 2023 Nordic Semiconductor ASA
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : /**
8 : * @file
9 : * @brief Public API for retained memory drivers
10 : */
11 :
12 : #ifndef ZEPHYR_INCLUDE_DRIVERS_RETAINED_MEM_
13 : #define ZEPHYR_INCLUDE_DRIVERS_RETAINED_MEM_
14 :
15 : #include <stdint.h>
16 : #include <stddef.h>
17 : #include <sys/types.h>
18 : #include <zephyr/kernel.h>
19 : #include <zephyr/device.h>
20 : #include <zephyr/types.h>
21 : #include <zephyr/sys/math_extras.h>
22 :
23 : #ifdef __cplusplus
24 : extern "C" {
25 : #endif
26 :
27 : BUILD_ASSERT(!(sizeof(off_t) > sizeof(size_t)),
28 0 : "Size of off_t must be equal or less than size of size_t");
29 :
30 : /**
31 : * @brief Retained memory driver interface
32 : * @defgroup retained_mem_interface Retained memory driver interface
33 : * @since 3.4
34 : * @version 0.8.0
35 : * @ingroup io_interfaces
36 : * @{
37 : */
38 :
39 : /**
40 : * @typedef retained_mem_size_api
41 : * @brief Callback API to get size of retained memory area.
42 : * See retained_mem_size() for argument description.
43 : */
44 1 : typedef ssize_t (*retained_mem_size_api)(const struct device *dev);
45 :
46 : /**
47 : * @typedef retained_mem_read_api
48 : * @brief Callback API to read from retained memory area.
49 : * See retained_mem_read() for argument description.
50 : */
51 1 : typedef int (*retained_mem_read_api)(const struct device *dev, off_t offset, uint8_t *buffer,
52 : size_t size);
53 :
54 : /**
55 : * @typedef retained_mem_write_api
56 : * @brief Callback API to write to retained memory area.
57 : * See retained_mem_write() for argument description.
58 : */
59 1 : typedef int (*retained_mem_write_api)(const struct device *dev, off_t offset,
60 : const uint8_t *buffer, size_t size);
61 :
62 : /**
63 : * @typedef retained_mem_clear_api
64 : * @brief Callback API to clear retained memory area (reset all data to 0x00).
65 : * See retained_mem_clear() for argument description.
66 : */
67 1 : typedef int (*retained_mem_clear_api)(const struct device *dev);
68 :
69 : /**
70 : * @brief Retained memory driver API
71 : * API which can be used by a device to store data in a retained memory area. Retained memory is
72 : * memory that is retained while the device is powered but is lost when power to the device is
73 : * lost (note that low power modes in some devices may clear the data also). This may be in a
74 : * non-initialised RAM region, or in specific registers, but is not reset when a different
75 : * application begins execution or the device is rebooted (without power loss). It must support
76 : * byte-level reading and writing without a need to erase data before writing.
77 : *
78 : * Note that drivers must implement all functions, none of the functions are optional.
79 : */
80 1 : __subsystem struct retained_mem_driver_api {
81 0 : retained_mem_size_api size;
82 0 : retained_mem_read_api read;
83 0 : retained_mem_write_api write;
84 0 : retained_mem_clear_api clear;
85 : };
86 :
87 : /**
88 : * @brief Returns the size of the retained memory area.
89 : *
90 : * @param dev Retained memory device to use.
91 : *
92 : * @retval Positive value indicating size in bytes on success, else negative errno
93 : * code.
94 : */
95 1 : __syscall ssize_t retained_mem_size(const struct device *dev);
96 :
97 : static inline ssize_t z_impl_retained_mem_size(const struct device *dev)
98 : {
99 : struct retained_mem_driver_api *api = (struct retained_mem_driver_api *)dev->api;
100 :
101 : return api->size(dev);
102 : }
103 :
104 : /**
105 : * @brief Reads data from the Retained memory area.
106 : *
107 : * @param dev Retained memory device to use.
108 : * @param offset Offset to read data from.
109 : * @param buffer Buffer to store read data in.
110 : * @param size Size of data to read.
111 : *
112 : * @retval 0 on success else negative errno code.
113 : */
114 1 : __syscall int retained_mem_read(const struct device *dev, off_t offset, uint8_t *buffer,
115 : size_t size);
116 :
117 : static inline int z_impl_retained_mem_read(const struct device *dev, off_t offset,
118 : uint8_t *buffer, size_t size)
119 : {
120 : struct retained_mem_driver_api *api = (struct retained_mem_driver_api *)dev->api;
121 : size_t area_size;
122 :
123 : /* Validate user-supplied parameters */
124 : if (size == 0) {
125 : return 0;
126 : }
127 :
128 : area_size = api->size(dev);
129 :
130 : if (offset < 0 || size > area_size || (area_size - size) < (size_t)offset) {
131 : return -EINVAL;
132 : }
133 :
134 : return api->read(dev, offset, buffer, size);
135 : }
136 :
137 : /**
138 : * @brief Writes data to the Retained memory area - underlying data does not need to
139 : * be cleared prior to writing.
140 : *
141 : * @param dev Retained memory device to use.
142 : * @param offset Offset to write data to.
143 : * @param buffer Data to write.
144 : * @param size Size of data to be written.
145 : *
146 : * @retval 0 on success else negative errno code.
147 : */
148 1 : __syscall int retained_mem_write(const struct device *dev, off_t offset, const uint8_t *buffer,
149 : size_t size);
150 :
151 : static inline int z_impl_retained_mem_write(const struct device *dev, off_t offset,
152 : const uint8_t *buffer, size_t size)
153 : {
154 : struct retained_mem_driver_api *api = (struct retained_mem_driver_api *)dev->api;
155 : size_t area_size;
156 :
157 : /* Validate user-supplied parameters */
158 : if (size == 0) {
159 : return 0;
160 : }
161 :
162 : area_size = api->size(dev);
163 :
164 : if (offset < 0 || size > area_size || (area_size - size) < (size_t)offset) {
165 : return -EINVAL;
166 : }
167 :
168 : return api->write(dev, offset, buffer, size);
169 : }
170 :
171 : /**
172 : * @brief Clears data in the retained memory area by setting it to 0x00.
173 : *
174 : * @param dev Retained memory device to use.
175 : *
176 : * @retval 0 on success else negative errno code.
177 : */
178 1 : __syscall int retained_mem_clear(const struct device *dev);
179 :
180 : static inline int z_impl_retained_mem_clear(const struct device *dev)
181 : {
182 : struct retained_mem_driver_api *api = (struct retained_mem_driver_api *)dev->api;
183 :
184 : return api->clear(dev);
185 : }
186 :
187 : /**
188 : * @}
189 : */
190 :
191 : #ifdef __cplusplus
192 : }
193 : #endif
194 :
195 : #include <zephyr/syscalls/retained_mem.h>
196 :
197 : #endif /* ZEPHYR_INCLUDE_DRIVERS_RETAINED_MEM_ */
|