nvs.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  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_err.h"
  19. #ifdef __cplusplus
  20. extern "C" {
  21. #endif
  22. /**
  23. * Opaque pointer type representing non-volatile storage handle
  24. */
  25. typedef uint32_t nvs_handle;
  26. #define ESP_ERR_NVS_BASE 0x1100 /*!< Starting number of error codes */
  27. #define ESP_ERR_NVS_NOT_INITIALIZED (ESP_ERR_NVS_BASE + 0x01) /*!< The storage driver is not initialized */
  28. #define ESP_ERR_NVS_NOT_FOUND (ESP_ERR_NVS_BASE + 0x02) /*!< Id namespace doesn’t exist yet and mode is NVS_READONLY */
  29. #define ESP_ERR_NVS_TYPE_MISMATCH (ESP_ERR_NVS_BASE + 0x03) /*!< TBA */
  30. #define ESP_ERR_NVS_READ_ONLY (ESP_ERR_NVS_BASE + 0x04) /*!< Storage handle was opened as read only */
  31. #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 */
  32. #define ESP_ERR_NVS_INVALID_NAME (ESP_ERR_NVS_BASE + 0x06) /*!< Namespace name doesn’t satisfy constraints */
  33. #define ESP_ERR_NVS_INVALID_HANDLE (ESP_ERR_NVS_BASE + 0x07) /*!< Handle has been closed or is NULL */
  34. #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. */
  35. #define ESP_ERR_NVS_KEY_TOO_LONG (ESP_ERR_NVS_BASE + 0x09) /*!< TBA */
  36. #define ESP_ERR_NVS_PAGE_FULL (ESP_ERR_NVS_BASE + 0x0a) /*!< TBA */
  37. #define ESP_ERR_NVS_INVALID_STATE (ESP_ERR_NVS_BASE + 0x0b) /*!< TBA */
  38. #define ESP_ERR_NVS_INVALID_LENGTH (ESP_ERR_NVS_BASE + 0x0c) /*!< TBA */
  39. /**
  40. * @brief Mode of opening the non-volatile storage
  41. *
  42. */
  43. typedef enum {
  44. NVS_READONLY, /*!< Read only */
  45. NVS_READWRITE /*!< Read and write */
  46. } nvs_open_mode;
  47. /**
  48. * @brief Open non-volatile storage with a given namespace
  49. *
  50. * Multiple internal ESP-IDF and third party application modules can store
  51. * their key-value pairs in the NVS module. In order to reduce possible
  52. * conflicts on key names, each module can use its own namespace.
  53. *
  54. * @param[in] name Namespace name. Maximal length is determined by the
  55. * underlying implementation, but is guaranteed to be
  56. * at least 16 characters. Shouldn't be empty.
  57. * @param[in] open_mode NVS_READWRITE or NVS_READONLY. If NVS_READONLY, will
  58. * open a handle for reading only. All write requests will
  59. * be rejected for this handle.
  60. * @param[out] out_handle If successful (return code is zero), handle will be
  61. * returned in this argument.
  62. *
  63. * @return
  64. * - ESP_OK if storage handle was opened successfully
  65. * - ESP_ERR_NVS_NOT_INITIALIZED if the storage driver is not initialized
  66. * - ESP_ERR_NVS_NOT_FOUND id namespace doesn't exist yet and
  67. * mode is NVS_READONLY
  68. * - ESP_ERR_NVS_INVALID_NAME if namespace name doesn't satisfy constraints
  69. * - other error codes from the underlying storage driver
  70. */
  71. esp_err_t nvs_open(const char* name, nvs_open_mode open_mode, nvs_handle *out_handle);
  72. /**@{*/
  73. /**
  74. * @brief set value for given key
  75. *
  76. * This family of functions set value for the key, given its name. Note that
  77. * actual storage will not be updated until nvs_commit function is called.
  78. *
  79. * @param[in] handle Handle obtained from nvs_open function.
  80. * Handles that were opened read only cannot be used.
  81. * @param[in] key Key name. Maximal length is determined by the underlying
  82. * implementation, but is guaranteed to be at least
  83. * 16 characters. Shouldn't be empty.
  84. * @param[in] value The value to set.
  85. *
  86. * @return
  87. * - ESP_OK if value was set successfully
  88. * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
  89. * - ESP_ERR_NVS_READ_ONLY if storage handle was opened as read only
  90. * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints
  91. * - ESP_ERR_NVS_NOT_ENOUGH_SPACE if there is not enough space in the
  92. * underlying storage to save the value
  93. * - ESP_ERR_NVS_REMOVE_FAILED if the value wasn't updated because flash
  94. * write operation has failed. The value was written however, and
  95. * update will be finished after re-initialization of nvs, provided that
  96. * flash operation doesn't fail again.
  97. */
  98. esp_err_t nvs_set_i8 (nvs_handle handle, const char* key, int8_t value);
  99. esp_err_t nvs_set_u8 (nvs_handle handle, const char* key, uint8_t value);
  100. esp_err_t nvs_set_i16 (nvs_handle handle, const char* key, int16_t value);
  101. esp_err_t nvs_set_u16 (nvs_handle handle, const char* key, uint16_t value);
  102. esp_err_t nvs_set_i32 (nvs_handle handle, const char* key, int32_t value);
  103. esp_err_t nvs_set_u32 (nvs_handle handle, const char* key, uint32_t value);
  104. esp_err_t nvs_set_i64 (nvs_handle handle, const char* key, int64_t value);
  105. esp_err_t nvs_set_u64 (nvs_handle handle, const char* key, uint64_t value);
  106. esp_err_t nvs_set_str (nvs_handle handle, const char* key, const char* value);
  107. /**@}*/
  108. /**
  109. * @brief set variable length binary value for given key
  110. *
  111. * This family of functions set value for the key, given its name. Note that
  112. * actual storage will not be updated until nvs_commit function is called.
  113. *
  114. * @param[in] handle Handle obtained from nvs_open function.
  115. * Handles that were opened read only cannot be used.
  116. * @param[in] key Key name. Maximal length is determined by the underlying
  117. * implementation, but is guaranteed to be at least
  118. * 16 characters. Shouldn't be empty.
  119. * @param[in] value The value to set.
  120. * @param[in] length length of binary value to set, in bytes.
  121. *
  122. * @return
  123. * - ESP_OK if value was set successfully
  124. * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
  125. * - ESP_ERR_NVS_READ_ONLY if storage handle was opened as read only
  126. * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints
  127. * - ESP_ERR_NVS_NOT_ENOUGH_SPACE if there is not enough space in the
  128. * underlying storage to save the value
  129. * - ESP_ERR_NVS_REMOVE_FAILED if the value wasn't updated because flash
  130. * write operation has failed. The value was written however, and
  131. * update will be finished after re-initialization of nvs, provided that
  132. * flash operation doesn't fail again.
  133. */
  134. esp_err_t nvs_set_blob(nvs_handle handle, const char* key, const void* value, size_t length);
  135. /**@{*/
  136. /**
  137. * @brief get value for given key
  138. *
  139. * These functions retrieve value for the key, given its name. If key does not
  140. * exist, or the requested variable type doesn't match the type which was used
  141. * when setting a value, an error is returned.
  142. *
  143. * In case of any error, out_value is not modified.
  144. *
  145. * All functions expect out_value to be a pointer to an already allocated variable
  146. * of the given type.
  147. *
  148. * \code{c}
  149. * // Example of using nvs_get_i32:
  150. * int32_t max_buffer_size = 4096; // default value
  151. * esp_err_t err = nvs_get_i32(my_handle, "max_buffer_size", &max_buffer_size);
  152. * assert(err == ESP_OK || err == ESP_ERR_NVS_NOT_FOUND);
  153. * // if ESP_ERR_NVS_NOT_FOUND was returned, max_buffer_size will still
  154. * // have its default value.
  155. *
  156. * \endcode
  157. *
  158. * @param[in] handle Handle obtained from nvs_open function.
  159. * @param[in] key Key name. Maximal length is determined by the underlying
  160. * implementation, but is guaranteed to be at least
  161. * 16 characters. Shouldn't be empty.
  162. * @param out_value Pointer to the output value.
  163. * May be NULL for nvs_get_str and nvs_get_blob, in this
  164. * case required length will be returned in length argument.
  165. *
  166. * @return
  167. * - ESP_OK if the value was retrieved successfully
  168. * - ESP_ERR_NVS_NOT_FOUND if the requested key doesn't exist
  169. * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
  170. * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints
  171. * - ESP_ERR_NVS_INVALID_LENGTH if length is not sufficient to store data
  172. */
  173. esp_err_t nvs_get_i8 (nvs_handle handle, const char* key, int8_t* out_value);
  174. esp_err_t nvs_get_u8 (nvs_handle handle, const char* key, uint8_t* out_value);
  175. esp_err_t nvs_get_i16 (nvs_handle handle, const char* key, int16_t* out_value);
  176. esp_err_t nvs_get_u16 (nvs_handle handle, const char* key, uint16_t* out_value);
  177. esp_err_t nvs_get_i32 (nvs_handle handle, const char* key, int32_t* out_value);
  178. esp_err_t nvs_get_u32 (nvs_handle handle, const char* key, uint32_t* out_value);
  179. esp_err_t nvs_get_i64 (nvs_handle handle, const char* key, int64_t* out_value);
  180. esp_err_t nvs_get_u64 (nvs_handle handle, const char* key, uint64_t* out_value);
  181. /**@}*/
  182. /**
  183. * @brief get value for given key
  184. *
  185. * These functions retrieve value for the key, given its name. If key does not
  186. * exist, or the requested variable type doesn't match the type which was used
  187. * when setting a value, an error is returned.
  188. *
  189. * In case of any error, out_value is not modified.
  190. *
  191. * All functions expect out_value to be a pointer to an already allocated variable
  192. * of the given type.
  193. *
  194. * nvs_get_str and nvs_get_blob functions support WinAPI-style length queries.
  195. * To get the size necessary to store the value, call nvs_get_str or nvs_get_blob
  196. * with zero out_value and non-zero pointer to length. Variable pointed to
  197. * by length argument will be set to the required length. For nvs_get_str,
  198. * this length includes the zero terminator. When calling nvs_get_str and
  199. * nvs_get_blob with non-zero out_value, length has to be non-zero and has to
  200. * point to the length available in out_value.
  201. * It is suggested that nvs_get/set_str is used for zero-terminated C strings, and
  202. * nvs_get/set_blob used for arbitrary data structures.
  203. *
  204. * \code{c}
  205. * // Example (without error checking) of using nvs_get_str to get a string into dynamic array:
  206. * size_t required_size;
  207. * nvs_get_str(my_handle, "server_name", NULL, &required_size);
  208. * char* server_name = malloc(required_size);
  209. * nvs_get_str(my_handle, "server_name", server_name, &required_size);
  210. *
  211. * // Example (without error checking) of using nvs_get_blob to get a binary data
  212. * into a static array:
  213. * uint8_t mac_addr[6];
  214. * size_t size = sizeof(mac_addr);
  215. * nvs_get_blob(my_handle, "dst_mac_addr", mac_addr, &size);
  216. * \endcode
  217. *
  218. * @param[in] handle Handle obtained from nvs_open function.
  219. * @param[in] key Key name. Maximal length is determined by the underlying
  220. * implementation, but is guaranteed to be at least
  221. * 16 characters. Shouldn't be empty.
  222. * @param out_value Pointer to the output value.
  223. * May be NULL for nvs_get_str and nvs_get_blob, in this
  224. * case required length will be returned in length argument.
  225. * @param[inout] length A non-zero pointer to the variable holding the length of out_value.
  226. * In case out_value a zero, will be set to the length
  227. * required to hold the value. In case out_value is not
  228. * zero, will be set to the actual length of the value
  229. * written. For nvs_get_str this includes zero terminator.
  230. *
  231. * @return
  232. * - ESP_OK if the value was retrieved successfully
  233. * - ESP_ERR_NVS_NOT_FOUND if the requested key doesn't exist
  234. * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
  235. * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints
  236. * - ESP_ERR_NVS_INVALID_LENGTH if length is not sufficient to store data
  237. */
  238. /**@{*/
  239. esp_err_t nvs_get_str (nvs_handle handle, const char* key, char* out_value, size_t* length);
  240. esp_err_t nvs_get_blob(nvs_handle handle, const char* key, void* out_value, size_t* length);
  241. /**@}*/
  242. /**
  243. * @brief Erase key-value pair with given key name.
  244. *
  245. * Note that actual storage may not be updated until nvs_commit function is called.
  246. *
  247. * @param[in] handle Storage handle obtained with nvs_open.
  248. * Handles that were opened read only cannot be used.
  249. *
  250. * @param[in] key Key name. Maximal length is determined by the underlying
  251. * implementation, but is guaranteed to be at least
  252. * 16 characters. Shouldn't be empty.
  253. *
  254. * @return
  255. * - ESP_OK if erase operation was successful
  256. * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
  257. * - ESP_ERR_NVS_READ_ONLY if handle was opened as read only
  258. * - ESP_ERR_NVS_NOT_FOUND if the requested key doesn't exist
  259. * - other error codes from the underlying storage driver
  260. */
  261. esp_err_t nvs_erase_key(nvs_handle handle, const char* key);
  262. /**
  263. * @brief Erase all key-value pairs in a namespace
  264. *
  265. * Note that actual storage may not be updated until nvs_commit function is called.
  266. *
  267. * @param[in] handle Storage handle obtained with nvs_open.
  268. * Handles that were opened read only cannot be used.
  269. *
  270. * @return
  271. * - ESP_OK if erase operation was successful
  272. * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
  273. * - ESP_ERR_NVS_READ_ONLY if handle was opened as read only
  274. * - other error codes from the underlying storage driver
  275. */
  276. esp_err_t nvs_erase_all(nvs_handle handle);
  277. /**
  278. * @brief Write any pending changes to non-volatile storage
  279. *
  280. * After setting any values, nvs_commit() must be called to ensure changes are written
  281. * to non-volatile storage. Individual implementations may write to storage at other times,
  282. * but this is not guaranteed.
  283. *
  284. * @param[in] handle Storage handle obtained with nvs_open.
  285. * Handles that were opened read only cannot be used.
  286. *
  287. * @return
  288. * - ESP_OK if the changes have been written successfully
  289. * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
  290. * - other error codes from the underlying storage driver
  291. */
  292. esp_err_t nvs_commit(nvs_handle handle);
  293. /**
  294. * @brief Close the storage handle and free any allocated resources
  295. *
  296. * This function should be called for each handle opened with nvs_open once
  297. * the handle is not in use any more. Closing the handle may not automatically
  298. * write the changes to nonvolatile storage. This has to be done explicitly using
  299. * nvs_commit function.
  300. * Once this function is called on a handle, the handle should no longer be used.
  301. *
  302. * @param[in] handle Storage handle to close
  303. */
  304. void nvs_close(nvs_handle handle);
  305. #ifdef __cplusplus
  306. } // extern "C"
  307. #endif
  308. #endif //ESP_NVS_H