LCOV - code coverage report
Current view: top level - zephyr/drivers - retained_mem.h Coverage Total Hit
Test: new.info Lines: 66.7 % 15 10
Test Date: 2025-09-05 20:47:19

            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_ */
        

Generated by: LCOV version 2.0-1