LCOV - code coverage report
Current view: top level - zephyr/drivers - retained_mem.h Hit Total Coverage
Test: new.info Lines: 10 15 66.7 %
Date: 2024-12-22 00:14:23

          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 1.14