mcu_hi3321_watch/include/middleware/utils/nv.h
2025-05-26 20:15:20 +08:00

426 lines
17 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Copyright (c) @CompanyNameMagicTag 2018-2022. All rights reserved.\n
* Description: NV STORAGE INTERFACE \n
* Author: @CompanyNameTag \n
* History: \n
* 2022-02-25, fix comments. \n
* 2018-08-08, Create file. \n
*/
#ifndef NV_H
#define NV_H
#include <stdint.h>
#include <stdbool.h>
#include "errcode.h"
#include "key_id.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
/**
* @defgroup middleware_utils_nv_api NV
* @ingroup middleware_utils
* @{
*/
/**
* @if Eng
* @brief nv storage callback.
* @else
* @brief nv存储回调函数。
* @endif
*/
typedef void (*nv_storage_completed_callback)(errcode_t result);
/**
* @if Eng
* @brief nv changed notify callback.
* @else
* @brief nv值更改回调函数。
* @endif
*/
typedef void (*nv_changed_notify_func)(uint16_t key);
/**
* @if Eng
* @brief nv key Properties.
* @else
* @brief NV属性
* @endif
*/
typedef struct {
bool permanent; /*!< @if Eng Indicates whether the key is a permanent key.
@else 是否为永久NV @endif */
bool encrypted; /*!< @if Eng Indicates whether to store ciphertext.
@else 是否为密文存储 @endif */
bool non_upgrade; /*!< @if Eng Indicates whether upgradeable.
@else 是否不可升级 @endif */
uint8_t reserve; /*!< @if Eng Reserved field for the future
@else 保留字段 @endif */
} nv_key_attr_t;
/**
* @if Eng
* @brief nv storage Status.
* @else
* @brief nv存储状态
* @endif
*/
typedef struct {
uint32_t total_space; /*!< @if Eng Total NV space of the current core
@else 当前核的总NV空间 @endif */
uint32_t used_space; /*!< @if Eng Used NV space of the current core
@else 当前核已使用的NV空间 @endif */
uint32_t reclaimable_space; /*!< @if Eng NV recyclable space of the current core,
can be reused after erasing
@else 当前核的NV可回收空间 @endif */
uint32_t corrupted_space; /*!< @if Eng NV corrupted space of the current core,
It's a valid data,but the data is abnormal.
It can be reused after erasing
@else 当前核已损坏了的NV空间 @endif */
uint32_t max_key_space; /*!< @if Eng Maximum single NV space that can be stored
@else 可存储的最大单NV项空间 @endif */
} nv_store_status_t;
/**
* @if Eng
* @brief region of of key_id value.
* @else
* @brief key_id取值区域
* @endif
*/
typedef enum {
KEY_ID_REGION0, /*!< @if Eng The region 0 of value range of key_id: [0x0001,0x1000).
@else key_id的取值区域0[0x0001,0x1000)。 @endif */
KEY_ID_REGION1, /*!< @if Eng The region 1 of value range of key_id: [0x1000,0x2000).
@else key_id的取值区域1[0x1000,0x2000)。 @endif */
KEY_ID_REGION2, /*!< @if Eng The region 2 of value range of key_id: [0x2000,0x3000).
@else key_id的取值区域2[0x2000,0x3000)。 @endif */
KEY_ID_REGION3, /*!< @if Eng The region 3 of value range of key_id: [0x3000,0x4000).
@else key_id的取值区域3[0x3000,0x4000)。 @endif */
KEY_ID_REGION4, /*!< @if Eng The region 4 of value range of key_id: [0x4000,0x5000).
@else key_id的取值区域4[0x4000,0x5000)。 @endif */
KEY_ID_REGION5, /*!< @if Eng The region 5 of value range of key_id: [0x5000,0x6000).
@else key_id的取值区域5[0x5000,0x6000)。 @endif */
KEY_ID_REGION6, /*!< @if Eng The region 6 of value range of key_id: [0x6000,0x7000).
@else key_id的取值区域6[0x6000,0x7000)。 @endif */
KEY_ID_REGION7, /*!< @if Eng The region 7 of value range of key_id: [0x7000,0x8000).
@else key_id的取值区域7[0x7000,0x8000)。 @endif */
KEY_ID_REGION8, /*!< @if Eng The region 8 of value range of key_id: [0x8000,0x9000).
@else key_id的取值区域8[0x8000,0x9000)。 @endif */
KEY_ID_REGION9, /*!< @if Eng The region 9 of value range of key_id: [0x9000,0xA000).
@else key_id的取值区域9[0x9000,0xA000)。 @endif */
KEY_ID_REGION10, /*!< @if Eng The region 10 of value range of key_id: [0xA000,0xB000).
@else key_id的取值区域10[0xA000,0xB000)。 @endif */
KEY_ID_REGION11, /*!< @if Eng The region 11 of value range of key_id: [0xB000,0xC000).
@else key_id的取值区域11[0xB000,0xC000)。 @endif */
KEY_ID_REGION12, /*!< @if Eng The region 12 of value range of key_id: [0xC000,0xD000).
@else key_id的取值区域12[0xC000,0xD000)。 @endif */
KEY_ID_REGION13, /*!< @if Eng The region 13 of value range of key_id: [0xD000,0xE000).
@else key_id的取值区域13[0xD000,0xE000)。 @endif */
KEY_ID_REGION14, /*!< @if Eng The region 14 of value range of key_id: [0xE000,0xF000).
@else key_id的取值区域14[0xE000,0xF000)。 @endif */
KEY_ID_REGION15, /*!< @if Eng The region 15 of value range of key_id: [0xF000,0xFFFF].
@else key_id的取值区域15[0xF000,0xFFFF]。 @endif */
KEY_ID_REGION_MAX_NUM, /*!< @if Eng The Number of the regions.
@else key_id的取值区域数量 @endif */
} nv_key_id_region_t;
/**
* @if Eng
* @brief Mode selection of Restoring factory settings.The value true indicates that the data is to be restored.
* @else
* @brief 恢复出厂区域配置true代表要恢复
* @endif
*/
typedef struct {
bool region_mode[KEY_ID_REGION_MAX_NUM]; /*!< @if Eng Recovery region flag configuration
@else 恢复出厂区域标志配置 @endif */
} nv_restore_mode_t;
/**
* @if Eng
* @brief Backup region flag configuration.The value true indicates that the data is backed up.
* @else
* @brief 备份区域配置true代表要备份
* @endif
*/
typedef struct {
bool region_mode[KEY_ID_REGION_MAX_NUM]; /*!< @if Eng Backup region flag configuration
@else 备份区域标志配置 @endif */
} nv_backup_mode_t;
/**
* @if Eng
* @brief Init the nv module, it must be called before using nv function.
* @retval EXT_ERR_SUCCESS Success.
* @retval Other ERRCODE_FAIL or other error num.
* @par Depends:
* @li nv.h
* @else
* @brief 初始化nv模块必须在使用nv函数之前调用。
* @retval ERRCODE_SUCC 成功返回#ERRCODE_SUCC
* @retval Other 失败返回#ERRCODE_FAIL或其他返回值
* @par 依赖:
* @li nv.h
* @endif
*/
void uapi_nv_init(void);
/**
* @if Eng
* @brief Store a key value pair.
* @par Description: Writes NV data item. The default attribute is Normal and no callback function is available.
* @param [in] key The key ID to which the kvalue is associated.
* @param [in] kvalue The value to store.
* @param [in] kvalue_length Length of kvalue in bytes.
* @retval EXT_ERR_SUCCESS Success.
* @retval Other ERRCODE_FAIL or other error num.
* @par Depends:
* @li nv.h
* @else
* @brief 写入NV数据项
* @par 说明: 默认属性为Normal没有回调函数。
* @param [in] key 要写入的NV项的key ID用于索引
* @param [in] kvalue 指向要写入的NV项的值的指针
* @param [in] kvalue_length 写入数据的长度(以字节为单位)
* @retval ERRCODE_SUCC 成功返回#ERRCODE_SUCC
* @retval Other 失败返回#ERRCODE_FAIL或其他返回值
* @par 依赖:
* @li nv.h
* @endif
*/
errcode_t uapi_nv_write(uint16_t key, const uint8_t *kvalue, uint16_t kvalue_length);
/**
* @if Eng
* @brief set a value associated with a specific key.
* @par Description: Write the NV data associated with a particular key.
* @attention The encryption attribute and permanent attribute of a key cannot be modified,
* and the kvalue of the permanent attribute cannot be modified.
* @param [in] key The key to which the kvalue is associated.
* @param [in] kvalue The value to store.
* @param [in] kvalue_length Length of kvalue in bytes.
* @param [in] attr Set the storage properties of the key.
* @param [in] func Callback function invoked after kvalue is written to the flash memory.
* @retval EXT_ERR_SUCCESS Success.
* @retval Other ERRCODE_FAIL or other error num.
* @par Depends:
* @li nv.h
* @else
* @brief 写入NV数据项并根据业务需求配置属性及回调函数
* @par 说明: 写入NV数据项并根据业务需求配置属性及回调函数
* @attention NV的加密属性和永久属性不能修改永久属性的kvalue不能修改
* @param [in] key 要写入的NV项的key ID用于索引
* @param [in] kvalue 指向要写入的NV项的值的指针
* @param [in] kvalue_length 写入数据的长度(以字节为单位)
* @param [in] attr 要配置的NV项的属性
* @param [in] func kvalue写入flash后调用的回调函数
* @retval ERRCODE_SUCC 成功返回#ERRCODE_SUCC
* @retval Other 失败返回#ERRCODE_FAIL或其他返回值
* @par 依赖:
* @li nv.h
* @endif
*/
errcode_t uapi_nv_write_with_attr(uint16_t key, const uint8_t *kvalue, uint16_t kvalue_length, nv_key_attr_t *attr,
nv_storage_completed_callback func);
/**
* @if Eng
* @brief Get a value associated with a specific key.
* @par Description: Reads NV data.
* @attention By default, the key attribute value is not obtained.
* @param [in] key The key to which the kvalue is associated.
* @param [in] kvalue_max_length The maximum length, in bytes,
* that is allowed to be copied in the kvalue buffer if the key is found.
* @param [out] kvalue_length Length of kvalue in bytes.
* @param [out] kvalue The value to store.
* @retval EXT_ERR_SUCCESS Success.
* @retval Other ERRCODE_FAIL or other error num.
* @par Depends:
* @li nv.h
* @else
* @brief 读取指定NV数据项的值
* @par 说明: 读取指定NV数据项的值
* @attention 默认情况下不获取NV属性值
* @param [in] key 要读取的NV项的key ID用于索引
* @param [in] kvalue_max_length 允许存储数据的最大长度(以字节为单位)
* @param [out] kvalue_length 实际读取到的数据长度
* @param [out] kvalue 指向保存读取数据的buffer的指针
* @retval ERRCODE_SUCC 成功返回#ERRCODE_SUCC
* @retval Other 失败返回#ERRCODE_FAIL或其他返回值
* @par 依赖:
* @li nv.h
* @endif
*/
errcode_t uapi_nv_read(uint16_t key, uint16_t kvalue_max_length, uint16_t *kvalue_length, uint8_t *kvalue);
/**
* @if Eng
* @brief Get a value associated with a specific key.
* @par Description: Reads NV data and obtains the attribute value of the key.
* @param [in] key The key to which the kvalue is associated.
* @param [in] kvalue_max_length The maximum length, in bytes,
* that is allowed to be copied in the kvalue buffer if the key is found.
* @param [out] kvalue_length Length of kvalue in bytes.
* @param [out] kvalue The value to store.
* @param [out] attr Attribute value of the key.
* @retval EXT_ERR_SUCCESS Success.
* @retval Other ERRCODE_FAIL or other error num.
* @par Depends:
* @li nv.h
* @else
* @brief 读取指定NV数据项的值同时获取key的属性值
* @par 说明: 读取指定NV数据项的值同时获取key的属性值
* @param [in] key 要读取的NV项的key ID用于索引。
* @param [in] kvalue_max_length 允许存储数据的最大长度(以字节为单位)
* @param [out] kvalue_length 实际读取到的数据长度
* @param [out] kvalue 指向保存读取数据的buffer的指针
* @param [out] attr 获取到的NV项的属性
* @retval ERRCODE_SUCC 成功返回#ERRCODE_SUCC
* @retval Other 失败返回#ERRCODE_FAIL或其他返回值
* @par 依赖:
* @li nv.h
* @endif
*/
errcode_t uapi_nv_read_with_attr(uint16_t key, uint16_t kvalue_max_length, uint16_t *kvalue_length, uint8_t *kvalue,
nv_key_attr_t *attr);
/**
* @if Eng
* @brief Get the space usage of NV storage.
* @par Description: Query the NV space status.
* @param [out] status pointer to NV status .
* @retval EXT_ERR_SUCCESS Success.
* @retval Other ERRCODE_FAIL or other error num.
* @par Depends:
* @li nv.h
* @else
* @brief 获取NV存储的空间使用情况
* @par 说明: 查询NV空间状态
* @param [out] status 指向保存NV状态数据的指针
* @retval ERRCODE_SUCC 成功返回#ERRCODE_SUCC
* @retval Other 失败返回#ERRCODE_FAIL或其他返回值
* @par 依赖:
* @li nv.h
* @endif
*/
errcode_t uapi_nv_get_store_status(nv_store_status_t *status);
/**
* @if Eng
* @brief NV backup.
* @par Description: NV backup.
* @param [in] backup_mode pointer to NV backup region flag.
* @retval EXT_ERR_SUCCESS Success.
* @retval Other ERRCODE_FAIL or other error num.
* @par Depends:
* @li nv.h
* @else
* @brief 执行NV备份
* @par 说明: 执行NV备份
* @param [in] backup_mode 指向保存NV备份区域选择的指针
* @retval ERRCODE_SUCC 成功返回#ERRCODE_SUCC
* @retval Other 失败返回#ERRCODE_FAIL或其他返回值
* @par 依赖:
* @li nv.h
* @endif
*/
errcode_t uapi_nv_backup(const nv_backup_mode_t *backup_mode);
/**
* @if Eng
* @brief Set NV all restore flag.
* @retval EXT_ERR_SUCCESS Success.
* @retval Other ERRCODE_FAIL or other error num.
* @par Depends:
* @li nv.h
* @else
* @brief 设置NV全量恢复标志
* @retval ERRCODE_SUCC 成功返回#ERRCODE_SUCC
* @retval Other 失败返回#ERRCODE_FAIL或其他返回值
* @par 依赖:
* @li nv.h
* @endif
*/
errcode_t uapi_nv_set_restore_mode_all(void);
/**
* @if Eng
* @brief Set NV partitial restore flag.
* @par Description: Set NV partitial restore flag.
* @param [in] restore_mode pointer to NV restore region flag.
* @retval EXT_ERR_SUCCESS Success.
* @retval Other ERRCODE_FAIL or other error num.
* @par Depends:
* @li nv.h
* @else
* @brief 设置NV部分恢复标志
* @par 说明: 设置NV部分恢复标志
* @param [in] restore_mode 指向保存NV各区域是否恢复标志的指针
* @retval ERRCODE_SUCC 成功返回#ERRCODE_SUCC
* @retval Other 失败返回#ERRCODE_FAIL或其他返回值
* @par 依赖:
* @li nv.h
* @endif
*/
errcode_t uapi_nv_set_restore_mode_partitial(const nv_restore_mode_t *restore_mode);
/**
* @if Eng
* @brief Ensure NV data from ram flush to flash.
* @par Description: Only when nv open the CONFIG NV SUPPORT ASYNCHRONOUS STORE valid.
* @retval EXT_ERR_SUCCESS Success.
* @retval Other ERRCODE_FAIL or other error num.
* @par Depends:
* @li nv.h
* @else
* @brief 确保NV数据从Ram上同步到Falsh
* @par 说明: 仅NV支持异步存储时调用有效。
* @retval ERRCODE_SUCC 成功返回#ERRCODE_SUCC
* @retval Other 失败返回#ERRCODE_FAIL或其他返回值
* @par 依赖:
* @li nv.h
* @endif
*/
errcode_t uapi_nv_flush(void);
/**
* @if Eng
* @brief register callback function of nv key value changed notification.
* @param min_key Minimum key-ID supported by registration callback.
* @param max_key Maximum key-ID supported by registration callback.
* @param func callback function.
* @retval EXT_ERR_SUCCESS Success.
* @retval Other ERRCODE_FAIL or other error num.
* @par Depends:
* @li nv.h
* @else
* @brief 注册nv键值改变通知的回调函数
* @param min_key 注册回调支持的最小key-ID
* @param max_key 注册回调支持的最大key-ID
* @param func 回调函数.
* @retval ERRCODE_SUCC 成功返回#ERRCODE_SUCC
* @retval Other 失败返回#ERRCODE_FAIL或其他返回值
* @par 依赖:
* @li nv.h
* @endif
*/
errcode_t uapi_nv_register_change_notify_proc(uint16_t min_key, uint16_t max_key, nv_changed_notify_func func);
/**
* @}
*/
#ifdef __cplusplus
#if __cplusplus
}
#endif /* __cplusplus */
#endif /* __cplusplus */
#endif /* NV_H */