nvs.h 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675
  1. // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. // http://www.apache.org/licenses/LICENSE-2.0
  7. //
  8. // Unless required by applicable law or agreed to in writing, software
  9. // distributed under the License is distributed on an "AS IS" BASIS,
  10. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. // See the License for the specific language governing permissions and
  12. // limitations under the License.
  13. #ifndef ESP_NVS_H
  14. #define ESP_NVS_H
  15. #include <stdint.h>
  16. #include <stddef.h>
  17. #include <stdbool.h>
  18. #include "esp_attr.h"
  19. #include "esp_err.h"
  20. #ifdef __cplusplus
  21. extern "C" {
  22. #endif
  23. /**
  24. * Opaque pointer type representing non-volatile storage handle
  25. */
  26. typedef uint32_t nvs_handle_t;
  27. /*
  28. * Pre-IDF V4.0 uses nvs_handle, so leaving the original typedef here for compatibility.
  29. */
  30. typedef nvs_handle_t nvs_handle IDF_DEPRECATED("Replace with nvs_handle_t");
  31. #define ESP_ERR_NVS_BASE 0x1100 /*!< Starting number of error codes */
  32. #define ESP_ERR_NVS_NOT_INITIALIZED (ESP_ERR_NVS_BASE + 0x01) /*!< The storage driver is not initialized */
  33. #define ESP_ERR_NVS_NOT_FOUND (ESP_ERR_NVS_BASE + 0x02) /*!< Id namespace doesn’t exist yet and mode is NVS_READONLY */
  34. #define ESP_ERR_NVS_TYPE_MISMATCH (ESP_ERR_NVS_BASE + 0x03) /*!< The type of set or get operation doesn't match the type of value stored in NVS */
  35. #define ESP_ERR_NVS_READ_ONLY (ESP_ERR_NVS_BASE + 0x04) /*!< Storage handle was opened as read only */
  36. #define ESP_ERR_NVS_NOT_ENOUGH_SPACE (ESP_ERR_NVS_BASE + 0x05) /*!< There is not enough space in the underlying storage to save the value */
  37. #define ESP_ERR_NVS_INVALID_NAME (ESP_ERR_NVS_BASE + 0x06) /*!< Namespace name doesn’t satisfy constraints */
  38. #define ESP_ERR_NVS_INVALID_HANDLE (ESP_ERR_NVS_BASE + 0x07) /*!< Handle has been closed or is NULL */
  39. #define ESP_ERR_NVS_REMOVE_FAILED (ESP_ERR_NVS_BASE + 0x08) /*!< The value wasn’t updated because flash write operation has failed. The value was written however, and update will be finished after re-initialization of nvs, provided that flash operation doesn’t fail again. */
  40. #define ESP_ERR_NVS_KEY_TOO_LONG (ESP_ERR_NVS_BASE + 0x09) /*!< Key name is too long */
  41. #define ESP_ERR_NVS_PAGE_FULL (ESP_ERR_NVS_BASE + 0x0a) /*!< Internal error; never returned by nvs API functions */
  42. #define ESP_ERR_NVS_INVALID_STATE (ESP_ERR_NVS_BASE + 0x0b) /*!< NVS is in an inconsistent state due to a previous error. Call nvs_flash_init and nvs_open again, then retry. */
  43. #define ESP_ERR_NVS_INVALID_LENGTH (ESP_ERR_NVS_BASE + 0x0c) /*!< String or blob length is not sufficient to store data */
  44. #define ESP_ERR_NVS_NO_FREE_PAGES (ESP_ERR_NVS_BASE + 0x0d) /*!< NVS partition doesn't contain any empty pages. This may happen if NVS partition was truncated. Erase the whole partition and call nvs_flash_init again. */
  45. #define ESP_ERR_NVS_VALUE_TOO_LONG (ESP_ERR_NVS_BASE + 0x0e) /*!< String or blob length is longer than supported by the implementation */
  46. #define ESP_ERR_NVS_PART_NOT_FOUND (ESP_ERR_NVS_BASE + 0x0f) /*!< Partition with specified name is not found in the partition table */
  47. #define ESP_ERR_NVS_NEW_VERSION_FOUND (ESP_ERR_NVS_BASE + 0x10) /*!< NVS partition contains data in new format and cannot be recognized by this version of code */
  48. #define ESP_ERR_NVS_XTS_ENCR_FAILED (ESP_ERR_NVS_BASE + 0x11) /*!< XTS encryption failed while writing NVS entry */
  49. #define ESP_ERR_NVS_XTS_DECR_FAILED (ESP_ERR_NVS_BASE + 0x12) /*!< XTS decryption failed while reading NVS entry */
  50. #define ESP_ERR_NVS_XTS_CFG_FAILED (ESP_ERR_NVS_BASE + 0x13) /*!< XTS configuration setting failed */
  51. #define ESP_ERR_NVS_XTS_CFG_NOT_FOUND (ESP_ERR_NVS_BASE + 0x14) /*!< XTS configuration not found */
  52. #define ESP_ERR_NVS_ENCR_NOT_SUPPORTED (ESP_ERR_NVS_BASE + 0x15) /*!< NVS encryption is not supported in this version */
  53. #define ESP_ERR_NVS_KEYS_NOT_INITIALIZED (ESP_ERR_NVS_BASE + 0x16) /*!< NVS key partition is uninitialized */
  54. #define ESP_ERR_NVS_CORRUPT_KEY_PART (ESP_ERR_NVS_BASE + 0x17) /*!< NVS key partition is corrupt */
  55. #define ESP_ERR_NVS_WRONG_ENCRYPTION (ESP_ERR_NVS_BASE + 0x19) /*!< NVS partition is marked as encrypted with generic flash encryption. This is forbidden since the NVS encryption works differently. */
  56. #define ESP_ERR_NVS_CONTENT_DIFFERS (ESP_ERR_NVS_BASE + 0x18) /*!< Internal error; never returned by nvs API functions. NVS key is different in comparison */
  57. #define NVS_DEFAULT_PART_NAME "nvs" /*!< Default partition name of the NVS partition in the partition table */
  58. #define NVS_PART_NAME_MAX_SIZE 16 /*!< maximum length of partition name (excluding null terminator) */
  59. #define NVS_KEY_NAME_MAX_SIZE 16 /*!< Maximal length of NVS key name (including null terminator) */
  60. /**
  61. * @brief Mode of opening the non-volatile storage
  62. */
  63. typedef enum {
  64. NVS_READONLY, /*!< Read only */
  65. NVS_READWRITE /*!< Read and write */
  66. } nvs_open_mode_t;
  67. /*
  68. * Pre-IDF V4.0 uses nvs_open_mode, so leaving the original typedef here for compatibility.
  69. */
  70. typedef nvs_open_mode_t nvs_open_mode IDF_DEPRECATED("Replace with nvs_open_mode_t");
  71. /**
  72. * @brief Types of variables
  73. *
  74. */
  75. typedef enum {
  76. NVS_TYPE_U8 = 0x01, /*!< Type uint8_t */
  77. NVS_TYPE_I8 = 0x11, /*!< Type int8_t */
  78. NVS_TYPE_U16 = 0x02, /*!< Type uint16_t */
  79. NVS_TYPE_I16 = 0x12, /*!< Type int16_t */
  80. NVS_TYPE_U32 = 0x04, /*!< Type uint32_t */
  81. NVS_TYPE_I32 = 0x14, /*!< Type int32_t */
  82. NVS_TYPE_U64 = 0x08, /*!< Type uint64_t */
  83. NVS_TYPE_I64 = 0x18, /*!< Type int64_t */
  84. NVS_TYPE_STR = 0x21, /*!< Type string */
  85. NVS_TYPE_BLOB = 0x42, /*!< Type blob */
  86. NVS_TYPE_ANY = 0xff /*!< Must be last */
  87. } nvs_type_t;
  88. /**
  89. * @brief information about entry obtained from nvs_entry_info function
  90. */
  91. typedef struct {
  92. char namespace_name[16]; /*!< Namespace to which key-value belong */
  93. char key[16]; /*!< Key of stored key-value pair */
  94. nvs_type_t type; /*!< Type of stored key-value pair */
  95. } nvs_entry_info_t;
  96. /**
  97. * Opaque pointer type representing iterator to nvs entries
  98. */
  99. typedef struct nvs_opaque_iterator_t *nvs_iterator_t;
  100. /**
  101. * @brief Open non-volatile storage with a given namespace from the default NVS partition
  102. *
  103. * Multiple internal ESP-IDF and third party application modules can store
  104. * their key-value pairs in the NVS module. In order to reduce possible
  105. * conflicts on key names, each module can use its own namespace.
  106. * The default NVS partition is the one that is labelled "nvs" in the partition
  107. * table.
  108. *
  109. * @param[in] name Namespace name. Maximal length is (NVS_KEY_NAME_MAX_SIZE-1) characters. Shouldn't be empty.
  110. * @param[in] open_mode NVS_READWRITE or NVS_READONLY. If NVS_READONLY, will
  111. * open a handle for reading only. All write requests will
  112. * be rejected for this handle.
  113. * @param[out] out_handle If successful (return code is zero), handle will be
  114. * returned in this argument.
  115. *
  116. * @return
  117. * - ESP_OK if storage handle was opened successfully
  118. * - ESP_ERR_NVS_NOT_INITIALIZED if the storage driver is not initialized
  119. * - ESP_ERR_NVS_PART_NOT_FOUND if the partition with label "nvs" is not found
  120. * - ESP_ERR_NVS_NOT_FOUND id namespace doesn't exist yet and
  121. * mode is NVS_READONLY
  122. * - ESP_ERR_NVS_INVALID_NAME if namespace name doesn't satisfy constraints
  123. * - ESP_ERR_NO_MEM in case memory could not be allocated for the internal structures
  124. * - other error codes from the underlying storage driver
  125. */
  126. esp_err_t nvs_open(const char* name, nvs_open_mode_t open_mode, nvs_handle_t *out_handle);
  127. /**
  128. * @brief Open non-volatile storage with a given namespace from specified partition
  129. *
  130. * The behaviour is same as nvs_open() API. However this API can operate on a specified NVS
  131. * partition instead of default NVS partition. Note that the specified partition must be registered
  132. * with NVS using nvs_flash_init_partition() API.
  133. *
  134. * @param[in] part_name Label (name) of the partition of interest for object read/write/erase
  135. * @param[in] name Namespace name. Maximal length is (NVS_KEY_NAME_MAX_SIZE-1) characters. Shouldn't be empty.
  136. * @param[in] open_mode NVS_READWRITE or NVS_READONLY. If NVS_READONLY, will
  137. * open a handle for reading only. All write requests will
  138. * be rejected for this handle.
  139. * @param[out] out_handle If successful (return code is zero), handle will be
  140. * returned in this argument.
  141. *
  142. * @return
  143. * - ESP_OK if storage handle was opened successfully
  144. * - ESP_ERR_NVS_NOT_INITIALIZED if the storage driver is not initialized
  145. * - ESP_ERR_NVS_PART_NOT_FOUND if the partition with specified name is not found
  146. * - ESP_ERR_NVS_NOT_FOUND id namespace doesn't exist yet and
  147. * mode is NVS_READONLY
  148. * - ESP_ERR_NVS_INVALID_NAME if namespace name doesn't satisfy constraints
  149. * - ESP_ERR_NO_MEM in case memory could not be allocated for the internal structures
  150. * - other error codes from the underlying storage driver
  151. */
  152. esp_err_t nvs_open_from_partition(const char *part_name, const char* name, nvs_open_mode_t open_mode, nvs_handle_t *out_handle);
  153. /**@{*/
  154. /**
  155. * @brief set int8_t value for given key
  156. *
  157. * Set value for the key, given its name. Note that the actual storage will not be updated
  158. * until \c nvs_commit is called.
  159. *
  160. * @param[in] handle Handle obtained from nvs_open function.
  161. * Handles that were opened read only cannot be used.
  162. * @param[in] key Key name. Maximal length is (NVS_KEY_NAME_MAX_SIZE-1) characters. Shouldn't be empty.
  163. * @param[in] value The value to set.
  164. *
  165. * @return
  166. * - ESP_OK if value was set successfully
  167. * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
  168. * - ESP_ERR_NVS_READ_ONLY if storage handle was opened as read only
  169. * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints
  170. * - ESP_ERR_NVS_NOT_ENOUGH_SPACE if there is not enough space in the
  171. * underlying storage to save the value
  172. * - ESP_ERR_NVS_REMOVE_FAILED if the value wasn't updated because flash
  173. * write operation has failed. The value was written however, and
  174. * update will be finished after re-initialization of nvs, provided that
  175. * flash operation doesn't fail again.
  176. */
  177. esp_err_t nvs_set_i8 (nvs_handle_t handle, const char* key, int8_t value);
  178. /**
  179. * @brief set uint8_t value for given key
  180. *
  181. * This function is the same as \c nvs_set_i8 except for the data type.
  182. */
  183. esp_err_t nvs_set_u8 (nvs_handle_t handle, const char* key, uint8_t value);
  184. /**
  185. * @brief set int16_t value for given key
  186. *
  187. * This function is the same as \c nvs_set_i8 except for the data type.
  188. */
  189. esp_err_t nvs_set_i16 (nvs_handle_t handle, const char* key, int16_t value);
  190. /**
  191. * @brief set uint16_t value for given key
  192. *
  193. * This function is the same as \c nvs_set_i8 except for the data type.
  194. */
  195. esp_err_t nvs_set_u16 (nvs_handle_t handle, const char* key, uint16_t value);
  196. /**
  197. * @brief set int32_t value for given key
  198. *
  199. * This function is the same as \c nvs_set_i8 except for the data type.
  200. */
  201. esp_err_t nvs_set_i32 (nvs_handle_t handle, const char* key, int32_t value);
  202. /**
  203. * @brief set uint32_t value for given key
  204. *
  205. * This function is the same as \c nvs_set_i8 except for the data type.
  206. */
  207. esp_err_t nvs_set_u32 (nvs_handle_t handle, const char* key, uint32_t value);
  208. /**
  209. * @brief set int64_t value for given key
  210. *
  211. * This function is the same as \c nvs_set_i8 except for the data type.
  212. */
  213. esp_err_t nvs_set_i64 (nvs_handle_t handle, const char* key, int64_t value);
  214. /**
  215. * @brief set uint64_t value for given key
  216. *
  217. * This function is the same as \c nvs_set_i8 except for the data type.
  218. */
  219. esp_err_t nvs_set_u64 (nvs_handle_t handle, const char* key, uint64_t value);
  220. /**
  221. * @brief set string for given key
  222. *
  223. * Set value for the key, given its name. Note that the actual storage will not be updated
  224. * until \c nvs_commit is called.
  225. *
  226. * @param[in] handle Handle obtained from nvs_open function.
  227. * Handles that were opened read only cannot be used.
  228. * @param[in] key Key name. Maximal length is (NVS_KEY_NAME_MAX_SIZE-1) characters. Shouldn't be empty.
  229. * @param[in] value The value to set.
  230. * For strings, the maximum length (including null character) is
  231. * 4000 bytes, if there is one complete page free for writing.
  232. * This decreases, however, if the free space is fragmented.
  233. *
  234. * @return
  235. * - ESP_OK if value was set successfully
  236. * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
  237. * - ESP_ERR_NVS_READ_ONLY if storage handle was opened as read only
  238. * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints
  239. * - ESP_ERR_NVS_NOT_ENOUGH_SPACE if there is not enough space in the
  240. * underlying storage to save the value
  241. * - ESP_ERR_NVS_REMOVE_FAILED if the value wasn't updated because flash
  242. * write operation has failed. The value was written however, and
  243. * update will be finished after re-initialization of nvs, provided that
  244. * flash operation doesn't fail again.
  245. * - ESP_ERR_NVS_VALUE_TOO_LONG if the string value is too long
  246. */
  247. esp_err_t nvs_set_str (nvs_handle_t handle, const char* key, const char* value);
  248. /**@}*/
  249. /**
  250. * @brief set variable length binary value for given key
  251. *
  252. * This family of functions set value for the key, given its name. Note that
  253. * actual storage will not be updated until nvs_commit function is called.
  254. *
  255. * @param[in] handle Handle obtained from nvs_open function.
  256. * Handles that were opened read only cannot be used.
  257. * @param[in] key Key name. Maximal length is (NVS_KEY_NAME_MAX_SIZE-1) characters. Shouldn't be empty.
  258. * @param[in] value The value to set.
  259. * @param[in] length length of binary value to set, in bytes; Maximum length is
  260. * 508000 bytes or (97.6% of the partition size - 4000) bytes
  261. * whichever is lower.
  262. *
  263. * @return
  264. * - ESP_OK if value was set successfully
  265. * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
  266. * - ESP_ERR_NVS_READ_ONLY if storage handle was opened as read only
  267. * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints
  268. * - ESP_ERR_NVS_NOT_ENOUGH_SPACE if there is not enough space in the
  269. * underlying storage to save the value
  270. * - ESP_ERR_NVS_REMOVE_FAILED if the value wasn't updated because flash
  271. * write operation has failed. The value was written however, and
  272. * update will be finished after re-initialization of nvs, provided that
  273. * flash operation doesn't fail again.
  274. * - ESP_ERR_NVS_VALUE_TOO_LONG if the value is too long
  275. */
  276. esp_err_t nvs_set_blob(nvs_handle_t handle, const char* key, const void* value, size_t length);
  277. /**@{*/
  278. /**
  279. * @brief get int8_t value for given key
  280. *
  281. * These functions retrieve value for the key, given its name. If \c key does not
  282. * exist, or the requested variable type doesn't match the type which was used
  283. * when setting a value, an error is returned.
  284. *
  285. * In case of any error, out_value is not modified.
  286. *
  287. * \c out_value has to be a pointer to an already allocated variable of the given type.
  288. *
  289. * \code{c}
  290. * // Example of using nvs_get_i32:
  291. * int32_t max_buffer_size = 4096; // default value
  292. * esp_err_t err = nvs_get_i32(my_handle, "max_buffer_size", &max_buffer_size);
  293. * assert(err == ESP_OK || err == ESP_ERR_NVS_NOT_FOUND);
  294. * // if ESP_ERR_NVS_NOT_FOUND was returned, max_buffer_size will still
  295. * // have its default value.
  296. *
  297. * \endcode
  298. *
  299. * @param[in] handle Handle obtained from nvs_open function.
  300. * @param[in] key Key name. Maximal length is (NVS_KEY_NAME_MAX_SIZE-1) characters. Shouldn't be empty.
  301. * @param out_value Pointer to the output value.
  302. * May be NULL for nvs_get_str and nvs_get_blob, in this
  303. * case required length will be returned in length argument.
  304. *
  305. * @return
  306. * - ESP_OK if the value was retrieved successfully
  307. * - ESP_ERR_NVS_NOT_FOUND if the requested key doesn't exist
  308. * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
  309. * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints
  310. * - ESP_ERR_NVS_INVALID_LENGTH if length is not sufficient to store data
  311. */
  312. esp_err_t nvs_get_i8 (nvs_handle_t handle, const char* key, int8_t* out_value);
  313. /**
  314. * @brief get uint8_t value for given key
  315. *
  316. * This function is the same as \c nvs_get_i8 except for the data type.
  317. */
  318. esp_err_t nvs_get_u8 (nvs_handle_t handle, const char* key, uint8_t* out_value);
  319. /**
  320. * @brief get int16_t value for given key
  321. *
  322. * This function is the same as \c nvs_get_i8 except for the data type.
  323. */
  324. esp_err_t nvs_get_i16 (nvs_handle_t handle, const char* key, int16_t* out_value);
  325. /**
  326. * @brief get uint16_t value for given key
  327. *
  328. * This function is the same as \c nvs_get_i8 except for the data type.
  329. */
  330. esp_err_t nvs_get_u16 (nvs_handle_t handle, const char* key, uint16_t* out_value);
  331. /**
  332. * @brief get int32_t value for given key
  333. *
  334. * This function is the same as \c nvs_get_i8 except for the data type.
  335. */
  336. esp_err_t nvs_get_i32 (nvs_handle_t handle, const char* key, int32_t* out_value);
  337. /**
  338. * @brief get uint32_t value for given key
  339. *
  340. * This function is the same as \c nvs_get_i8 except for the data type.
  341. */
  342. esp_err_t nvs_get_u32 (nvs_handle_t handle, const char* key, uint32_t* out_value);
  343. /**
  344. * @brief get int64_t value for given key
  345. *
  346. * This function is the same as \c nvs_get_i8 except for the data type.
  347. */
  348. esp_err_t nvs_get_i64 (nvs_handle_t handle, const char* key, int64_t* out_value);
  349. /**
  350. * @brief get uint64_t value for given key
  351. *
  352. * This function is the same as \c nvs_get_i8 except for the data type.
  353. */
  354. esp_err_t nvs_get_u64 (nvs_handle_t handle, const char* key, uint64_t* out_value);
  355. /**@}*/
  356. /**@{*/
  357. /**
  358. * @brief get string value for given key
  359. *
  360. * These functions retrieve the data of an entry, given its key. If key does not
  361. * exist, or the requested variable type doesn't match the type which was used
  362. * when setting a value, an error is returned.
  363. *
  364. * In case of any error, out_value is not modified.
  365. *
  366. * All functions expect out_value to be a pointer to an already allocated variable
  367. * of the given type.
  368. *
  369. * nvs_get_str and nvs_get_blob functions support WinAPI-style length queries.
  370. * To get the size necessary to store the value, call nvs_get_str or nvs_get_blob
  371. * with zero out_value and non-zero pointer to length. Variable pointed to
  372. * by length argument will be set to the required length. For nvs_get_str,
  373. * this length includes the zero terminator. When calling nvs_get_str and
  374. * nvs_get_blob with non-zero out_value, length has to be non-zero and has to
  375. * point to the length available in out_value.
  376. * It is suggested that nvs_get/set_str is used for zero-terminated C strings, and
  377. * nvs_get/set_blob used for arbitrary data structures.
  378. *
  379. * \code{c}
  380. * // Example (without error checking) of using nvs_get_str to get a string into dynamic array:
  381. * size_t required_size;
  382. * nvs_get_str(my_handle, "server_name", NULL, &required_size);
  383. * char* server_name = malloc(required_size);
  384. * nvs_get_str(my_handle, "server_name", server_name, &required_size);
  385. *
  386. * // Example (without error checking) of using nvs_get_blob to get a binary data
  387. * into a static array:
  388. * uint8_t mac_addr[6];
  389. * size_t size = sizeof(mac_addr);
  390. * nvs_get_blob(my_handle, "dst_mac_addr", mac_addr, &size);
  391. * \endcode
  392. *
  393. * @param[in] handle Handle obtained from nvs_open function.
  394. * @param[in] key Key name. Maximal length is (NVS_KEY_NAME_MAX_SIZE-1) characters. Shouldn't be empty.
  395. * @param[out] out_value Pointer to the output value.
  396. * May be NULL for nvs_get_str and nvs_get_blob, in this
  397. * case required length will be returned in length argument.
  398. * @param[inout] length A non-zero pointer to the variable holding the length of out_value.
  399. * In case out_value a zero, will be set to the length
  400. * required to hold the value. In case out_value is not
  401. * zero, will be set to the actual length of the value
  402. * written. For nvs_get_str this includes zero terminator.
  403. *
  404. * @return
  405. * - ESP_OK if the value was retrieved successfully
  406. * - ESP_ERR_NVS_NOT_FOUND if the requested key doesn't exist
  407. * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
  408. * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints
  409. * - ESP_ERR_NVS_INVALID_LENGTH if \c length is not sufficient to store data
  410. */
  411. esp_err_t nvs_get_str (nvs_handle_t handle, const char* key, char* out_value, size_t* length);
  412. /**
  413. * @brief get blob value for given key
  414. *
  415. * This function behaves the same as \c nvs_get_str, except for the data type.
  416. */
  417. esp_err_t nvs_get_blob(nvs_handle_t handle, const char* key, void* out_value, size_t* length);
  418. /**@}*/
  419. /**
  420. * @brief Erase key-value pair with given key name.
  421. *
  422. * Note that actual storage may not be updated until nvs_commit function is called.
  423. *
  424. * @param[in] handle Storage handle obtained with nvs_open.
  425. * Handles that were opened read only cannot be used.
  426. *
  427. * @param[in] key Key name. Maximal length is (NVS_KEY_NAME_MAX_SIZE-1) characters. Shouldn't be empty.
  428. *
  429. * @return
  430. * - ESP_OK if erase operation was successful
  431. * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
  432. * - ESP_ERR_NVS_READ_ONLY if handle was opened as read only
  433. * - ESP_ERR_NVS_NOT_FOUND if the requested key doesn't exist
  434. * - other error codes from the underlying storage driver
  435. */
  436. esp_err_t nvs_erase_key(nvs_handle_t handle, const char* key);
  437. /**
  438. * @brief Erase all key-value pairs in a namespace
  439. *
  440. * Note that actual storage may not be updated until nvs_commit function is called.
  441. *
  442. * @param[in] handle Storage handle obtained with nvs_open.
  443. * Handles that were opened read only cannot be used.
  444. *
  445. * @return
  446. * - ESP_OK if erase operation was successful
  447. * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
  448. * - ESP_ERR_NVS_READ_ONLY if handle was opened as read only
  449. * - other error codes from the underlying storage driver
  450. */
  451. esp_err_t nvs_erase_all(nvs_handle_t handle);
  452. /**
  453. * @brief Write any pending changes to non-volatile storage
  454. *
  455. * After setting any values, nvs_commit() must be called to ensure changes are written
  456. * to non-volatile storage. Individual implementations may write to storage at other times,
  457. * but this is not guaranteed.
  458. *
  459. * @param[in] handle Storage handle obtained with nvs_open.
  460. * Handles that were opened read only cannot be used.
  461. *
  462. * @return
  463. * - ESP_OK if the changes have been written successfully
  464. * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
  465. * - other error codes from the underlying storage driver
  466. */
  467. esp_err_t nvs_commit(nvs_handle_t handle);
  468. /**
  469. * @brief Close the storage handle and free any allocated resources
  470. *
  471. * This function should be called for each handle opened with nvs_open once
  472. * the handle is not in use any more. Closing the handle may not automatically
  473. * write the changes to nonvolatile storage. This has to be done explicitly using
  474. * nvs_commit function.
  475. * Once this function is called on a handle, the handle should no longer be used.
  476. *
  477. * @param[in] handle Storage handle to close
  478. */
  479. void nvs_close(nvs_handle_t handle);
  480. /**
  481. * @note Info about storage space NVS.
  482. */
  483. typedef struct {
  484. size_t used_entries; /**< Amount of used entries. */
  485. size_t free_entries; /**< Amount of free entries. */
  486. size_t total_entries; /**< Amount all available entries. */
  487. size_t namespace_count; /**< Amount name space. */
  488. } nvs_stats_t;
  489. /**
  490. * @brief Fill structure nvs_stats_t. It provides info about used memory the partition.
  491. *
  492. * This function calculates to runtime the number of used entries, free entries, total entries,
  493. * and amount namespace in partition.
  494. *
  495. * \code{c}
  496. * // Example of nvs_get_stats() to get the number of used entries and free entries:
  497. * nvs_stats_t nvs_stats;
  498. * nvs_get_stats(NULL, &nvs_stats);
  499. * printf("Count: UsedEntries = (%d), FreeEntries = (%d), AllEntries = (%d)\n",
  500. nvs_stats.used_entries, nvs_stats.free_entries, nvs_stats.total_entries);
  501. * \endcode
  502. *
  503. * @param[in] part_name Partition name NVS in the partition table.
  504. * If pass a NULL than will use NVS_DEFAULT_PART_NAME ("nvs").
  505. *
  506. * @param[out] nvs_stats Returns filled structure nvs_states_t.
  507. * It provides info about used memory the partition.
  508. *
  509. *
  510. * @return
  511. * - ESP_OK if the changes have been written successfully.
  512. * Return param nvs_stats will be filled.
  513. * - ESP_ERR_NVS_PART_NOT_FOUND if the partition with label "name" is not found.
  514. * Return param nvs_stats will be filled 0.
  515. * - ESP_ERR_NVS_NOT_INITIALIZED if the storage driver is not initialized.
  516. * Return param nvs_stats will be filled 0.
  517. * - ESP_ERR_INVALID_ARG if nvs_stats equal to NULL.
  518. * - ESP_ERR_INVALID_STATE if there is page with the status of INVALID.
  519. * Return param nvs_stats will be filled not with correct values because
  520. * not all pages will be counted. Counting will be interrupted at the first INVALID page.
  521. */
  522. esp_err_t nvs_get_stats(const char *part_name, nvs_stats_t *nvs_stats);
  523. /**
  524. * @brief Calculate all entries in a namespace.
  525. *
  526. * An entry represents the smallest storage unit in NVS.
  527. * Strings and blobs may occupy more than one entry.
  528. * Note that to find out the total number of entries occupied by the namespace,
  529. * add one to the returned value used_entries (if err is equal to ESP_OK).
  530. * Because the name space entry takes one entry.
  531. *
  532. * \code{c}
  533. * // Example of nvs_get_used_entry_count() to get amount of all key-value pairs in one namespace:
  534. * nvs_handle_t handle;
  535. * nvs_open("namespace1", NVS_READWRITE, &handle);
  536. * ...
  537. * size_t used_entries;
  538. * size_t total_entries_namespace;
  539. * if(nvs_get_used_entry_count(handle, &used_entries) == ESP_OK){
  540. * // the total number of entries occupied by the namespace
  541. * total_entries_namespace = used_entries + 1;
  542. * }
  543. * \endcode
  544. *
  545. * @param[in] handle Handle obtained from nvs_open function.
  546. *
  547. * @param[out] used_entries Returns amount of used entries from a namespace.
  548. *
  549. *
  550. * @return
  551. * - ESP_OK if the changes have been written successfully.
  552. * Return param used_entries will be filled valid value.
  553. * - ESP_ERR_NVS_NOT_INITIALIZED if the storage driver is not initialized.
  554. * Return param used_entries will be filled 0.
  555. * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL.
  556. * Return param used_entries will be filled 0.
  557. * - ESP_ERR_INVALID_ARG if used_entries equal to NULL.
  558. * - Other error codes from the underlying storage driver.
  559. * Return param used_entries will be filled 0.
  560. */
  561. esp_err_t nvs_get_used_entry_count(nvs_handle_t handle, size_t* used_entries);
  562. /**
  563. * @brief Create an iterator to enumerate NVS entries based on one or more parameters
  564. *
  565. * \code{c}
  566. * // Example of listing all the key-value pairs of any type under specified partition and namespace
  567. * nvs_iterator_t it = nvs_entry_find(partition, namespace, NVS_TYPE_ANY);
  568. * while (it != NULL) {
  569. * nvs_entry_info_t info;
  570. * nvs_entry_info(it, &info);
  571. * it = nvs_entry_next(it);
  572. * printf("key '%s', type '%d' \n", info.key, info.type);
  573. * };
  574. * // Note: no need to release iterator obtained from nvs_entry_find function when
  575. * // nvs_entry_find or nvs_entry_next function return NULL, indicating no other
  576. * // element for specified criteria was found.
  577. * }
  578. * \endcode
  579. *
  580. * @param[in] part_name Partition name
  581. *
  582. * @param[in] namespace_name Set this value if looking for entries with
  583. * a specific namespace. Pass NULL otherwise.
  584. *
  585. * @param[in] type One of nvs_type_t values.
  586. *
  587. * @return
  588. * Iterator used to enumerate all the entries found,
  589. * or NULL if no entry satisfying criteria was found.
  590. * Iterator obtained through this function has to be released
  591. * using nvs_release_iterator when not used any more.
  592. */
  593. nvs_iterator_t nvs_entry_find(const char *part_name, const char *namespace_name, nvs_type_t type);
  594. /**
  595. * @brief Returns next item matching the iterator criteria, NULL if no such item exists.
  596. *
  597. * Note that any copies of the iterator will be invalid after this call.
  598. *
  599. * @param[in] iterator Iterator obtained from nvs_entry_find function. Must be non-NULL.
  600. *
  601. * @return
  602. * NULL if no entry was found, valid nvs_iterator_t otherwise.
  603. */
  604. nvs_iterator_t nvs_entry_next(nvs_iterator_t iterator);
  605. /**
  606. * @brief Fills nvs_entry_info_t structure with information about entry pointed to by the iterator.
  607. *
  608. * @param[in] iterator Iterator obtained from nvs_entry_find or nvs_entry_next function. Must be non-NULL.
  609. *
  610. * @param[out] out_info Structure to which entry information is copied.
  611. */
  612. void nvs_entry_info(nvs_iterator_t iterator, nvs_entry_info_t *out_info);
  613. /**
  614. * @brief Release iterator
  615. *
  616. * @param[in] iterator Release iterator obtained from nvs_entry_find function. NULL argument is allowed.
  617. *
  618. */
  619. void nvs_release_iterator(nvs_iterator_t iterator);
  620. #ifdef __cplusplus
  621. } // extern "C"
  622. #endif
  623. #endif //ESP_NVS_H