| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- #ifndef ESP_NVS_H
- #define ESP_NVS_H
- #include <stdint.h>
- #include <stddef.h>
- #include <stdbool.h>
- #include "esp_err.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
- /**
- * Opaque pointer type representing non-volatile storage handle
- */
- typedef uint32_t nvs_handle;
- #define ESP_ERR_NVS_BASE 0x1100 /*!< Starting number of error codes */
- #define ESP_ERR_NVS_NOT_INITIALIZED (ESP_ERR_NVS_BASE + 0x01) /*!< The storage driver is not initialized */
- #define ESP_ERR_NVS_NOT_FOUND (ESP_ERR_NVS_BASE + 0x02) /*!< Id namespace doesn’t exist yet and mode is NVS_READONLY */
- #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 */
- #define ESP_ERR_NVS_READ_ONLY (ESP_ERR_NVS_BASE + 0x04) /*!< Storage handle was opened as read only */
- #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 */
- #define ESP_ERR_NVS_INVALID_NAME (ESP_ERR_NVS_BASE + 0x06) /*!< Namespace name doesn’t satisfy constraints */
- #define ESP_ERR_NVS_INVALID_HANDLE (ESP_ERR_NVS_BASE + 0x07) /*!< Handle has been closed or is NULL */
- #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. */
- #define ESP_ERR_NVS_KEY_TOO_LONG (ESP_ERR_NVS_BASE + 0x09) /*!< Key name is too long */
- #define ESP_ERR_NVS_PAGE_FULL (ESP_ERR_NVS_BASE + 0x0a) /*!< Internal error; never returned by nvs_ API functions */
- #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. */
- #define ESP_ERR_NVS_INVALID_LENGTH (ESP_ERR_NVS_BASE + 0x0c) /*!< String or blob length is not sufficient to store data */
- #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. */
- /**
- * @brief Mode of opening the non-volatile storage
- *
- */
- typedef enum {
- NVS_READONLY, /*!< Read only */
- NVS_READWRITE /*!< Read and write */
- } nvs_open_mode;
- /**
- * @brief Open non-volatile storage with a given namespace
- *
- * Multiple internal ESP-IDF and third party application modules can store
- * their key-value pairs in the NVS module. In order to reduce possible
- * conflicts on key names, each module can use its own namespace.
- *
- * @param[in] name Namespace name. Maximal length is determined by the
- * underlying implementation, but is guaranteed to be
- * at least 16 characters. Shouldn't be empty.
- * @param[in] open_mode NVS_READWRITE or NVS_READONLY. If NVS_READONLY, will
- * open a handle for reading only. All write requests will
- * be rejected for this handle.
- * @param[out] out_handle If successful (return code is zero), handle will be
- * returned in this argument.
- *
- * @return
- * - ESP_OK if storage handle was opened successfully
- * - ESP_ERR_NVS_NOT_INITIALIZED if the storage driver is not initialized
- * - ESP_ERR_NVS_NOT_FOUND id namespace doesn't exist yet and
- * mode is NVS_READONLY
- * - ESP_ERR_NVS_INVALID_NAME if namespace name doesn't satisfy constraints
- * - other error codes from the underlying storage driver
- */
- esp_err_t nvs_open(const char* name, nvs_open_mode open_mode, nvs_handle *out_handle);
- /**@{*/
- /**
- * @brief set value for given key
- *
- * This family of functions set value for the key, given its name. Note that
- * actual storage will not be updated until nvs_commit function is called.
- *
- * @param[in] handle Handle obtained from nvs_open function.
- * Handles that were opened read only cannot be used.
- * @param[in] key Key name. Maximal length is determined by the underlying
- * implementation, but is guaranteed to be at least
- * 16 characters. Shouldn't be empty.
- * @param[in] value The value to set.
- *
- * @return
- * - ESP_OK if value was set successfully
- * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
- * - ESP_ERR_NVS_READ_ONLY if storage handle was opened as read only
- * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints
- * - ESP_ERR_NVS_NOT_ENOUGH_SPACE if there is not enough space in the
- * underlying storage to save the value
- * - ESP_ERR_NVS_REMOVE_FAILED if 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.
- */
- esp_err_t nvs_set_i8 (nvs_handle handle, const char* key, int8_t value);
- esp_err_t nvs_set_u8 (nvs_handle handle, const char* key, uint8_t value);
- esp_err_t nvs_set_i16 (nvs_handle handle, const char* key, int16_t value);
- esp_err_t nvs_set_u16 (nvs_handle handle, const char* key, uint16_t value);
- esp_err_t nvs_set_i32 (nvs_handle handle, const char* key, int32_t value);
- esp_err_t nvs_set_u32 (nvs_handle handle, const char* key, uint32_t value);
- esp_err_t nvs_set_i64 (nvs_handle handle, const char* key, int64_t value);
- esp_err_t nvs_set_u64 (nvs_handle handle, const char* key, uint64_t value);
- esp_err_t nvs_set_str (nvs_handle handle, const char* key, const char* value);
- /**@}*/
- /**
- * @brief set variable length binary value for given key
- *
- * This family of functions set value for the key, given its name. Note that
- * actual storage will not be updated until nvs_commit function is called.
- *
- * @param[in] handle Handle obtained from nvs_open function.
- * Handles that were opened read only cannot be used.
- * @param[in] key Key name. Maximal length is determined by the underlying
- * implementation, but is guaranteed to be at least
- * 16 characters. Shouldn't be empty.
- * @param[in] value The value to set.
- * @param[in] length length of binary value to set, in bytes.
- *
- * @return
- * - ESP_OK if value was set successfully
- * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
- * - ESP_ERR_NVS_READ_ONLY if storage handle was opened as read only
- * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints
- * - ESP_ERR_NVS_NOT_ENOUGH_SPACE if there is not enough space in the
- * underlying storage to save the value
- * - ESP_ERR_NVS_REMOVE_FAILED if 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.
- */
- esp_err_t nvs_set_blob(nvs_handle handle, const char* key, const void* value, size_t length);
- /**@{*/
- /**
- * @brief get value for given key
- *
- * These functions retrieve value for the key, given its name. If key does not
- * exist, or the requested variable type doesn't match the type which was used
- * when setting a value, an error is returned.
- *
- * In case of any error, out_value is not modified.
- *
- * All functions expect out_value to be a pointer to an already allocated variable
- * of the given type.
- *
- * \code{c}
- * // Example of using nvs_get_i32:
- * int32_t max_buffer_size = 4096; // default value
- * esp_err_t err = nvs_get_i32(my_handle, "max_buffer_size", &max_buffer_size);
- * assert(err == ESP_OK || err == ESP_ERR_NVS_NOT_FOUND);
- * // if ESP_ERR_NVS_NOT_FOUND was returned, max_buffer_size will still
- * // have its default value.
- *
- * \endcode
- *
- * @param[in] handle Handle obtained from nvs_open function.
- * @param[in] key Key name. Maximal length is determined by the underlying
- * implementation, but is guaranteed to be at least
- * 16 characters. Shouldn't be empty.
- * @param out_value Pointer to the output value.
- * May be NULL for nvs_get_str and nvs_get_blob, in this
- * case required length will be returned in length argument.
- *
- * @return
- * - ESP_OK if the value was retrieved successfully
- * - ESP_ERR_NVS_NOT_FOUND if the requested key doesn't exist
- * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
- * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints
- * - ESP_ERR_NVS_INVALID_LENGTH if length is not sufficient to store data
- */
- esp_err_t nvs_get_i8 (nvs_handle handle, const char* key, int8_t* out_value);
- esp_err_t nvs_get_u8 (nvs_handle handle, const char* key, uint8_t* out_value);
- esp_err_t nvs_get_i16 (nvs_handle handle, const char* key, int16_t* out_value);
- esp_err_t nvs_get_u16 (nvs_handle handle, const char* key, uint16_t* out_value);
- esp_err_t nvs_get_i32 (nvs_handle handle, const char* key, int32_t* out_value);
- esp_err_t nvs_get_u32 (nvs_handle handle, const char* key, uint32_t* out_value);
- esp_err_t nvs_get_i64 (nvs_handle handle, const char* key, int64_t* out_value);
- esp_err_t nvs_get_u64 (nvs_handle handle, const char* key, uint64_t* out_value);
- /**@}*/
- /**
- * @brief get value for given key
- *
- * These functions retrieve value for the key, given its name. If key does not
- * exist, or the requested variable type doesn't match the type which was used
- * when setting a value, an error is returned.
- *
- * In case of any error, out_value is not modified.
- *
- * All functions expect out_value to be a pointer to an already allocated variable
- * of the given type.
- *
- * nvs_get_str and nvs_get_blob functions support WinAPI-style length queries.
- * To get the size necessary to store the value, call nvs_get_str or nvs_get_blob
- * with zero out_value and non-zero pointer to length. Variable pointed to
- * by length argument will be set to the required length. For nvs_get_str,
- * this length includes the zero terminator. When calling nvs_get_str and
- * nvs_get_blob with non-zero out_value, length has to be non-zero and has to
- * point to the length available in out_value.
- * It is suggested that nvs_get/set_str is used for zero-terminated C strings, and
- * nvs_get/set_blob used for arbitrary data structures.
- *
- * \code{c}
- * // Example (without error checking) of using nvs_get_str to get a string into dynamic array:
- * size_t required_size;
- * nvs_get_str(my_handle, "server_name", NULL, &required_size);
- * char* server_name = malloc(required_size);
- * nvs_get_str(my_handle, "server_name", server_name, &required_size);
- *
- * // Example (without error checking) of using nvs_get_blob to get a binary data
- * into a static array:
- * uint8_t mac_addr[6];
- * size_t size = sizeof(mac_addr);
- * nvs_get_blob(my_handle, "dst_mac_addr", mac_addr, &size);
- * \endcode
- *
- * @param[in] handle Handle obtained from nvs_open function.
- * @param[in] key Key name. Maximal length is determined by the underlying
- * implementation, but is guaranteed to be at least
- * 16 characters. Shouldn't be empty.
- * @param out_value Pointer to the output value.
- * May be NULL for nvs_get_str and nvs_get_blob, in this
- * case required length will be returned in length argument.
- * @param[inout] length A non-zero pointer to the variable holding the length of out_value.
- * In case out_value a zero, will be set to the length
- * required to hold the value. In case out_value is not
- * zero, will be set to the actual length of the value
- * written. For nvs_get_str this includes zero terminator.
- *
- * @return
- * - ESP_OK if the value was retrieved successfully
- * - ESP_ERR_NVS_NOT_FOUND if the requested key doesn't exist
- * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
- * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints
- * - ESP_ERR_NVS_INVALID_LENGTH if length is not sufficient to store data
- */
- /**@{*/
- esp_err_t nvs_get_str (nvs_handle handle, const char* key, char* out_value, size_t* length);
- esp_err_t nvs_get_blob(nvs_handle handle, const char* key, void* out_value, size_t* length);
- /**@}*/
- /**
- * @brief Erase key-value pair with given key name.
- *
- * Note that actual storage may not be updated until nvs_commit function is called.
- *
- * @param[in] handle Storage handle obtained with nvs_open.
- * Handles that were opened read only cannot be used.
- *
- * @param[in] key Key name. Maximal length is determined by the underlying
- * implementation, but is guaranteed to be at least
- * 16 characters. Shouldn't be empty.
- *
- * @return
- * - ESP_OK if erase operation was successful
- * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
- * - ESP_ERR_NVS_READ_ONLY if handle was opened as read only
- * - ESP_ERR_NVS_NOT_FOUND if the requested key doesn't exist
- * - other error codes from the underlying storage driver
- */
- esp_err_t nvs_erase_key(nvs_handle handle, const char* key);
- /**
- * @brief Erase all key-value pairs in a namespace
- *
- * Note that actual storage may not be updated until nvs_commit function is called.
- *
- * @param[in] handle Storage handle obtained with nvs_open.
- * Handles that were opened read only cannot be used.
- *
- * @return
- * - ESP_OK if erase operation was successful
- * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
- * - ESP_ERR_NVS_READ_ONLY if handle was opened as read only
- * - other error codes from the underlying storage driver
- */
- esp_err_t nvs_erase_all(nvs_handle handle);
- /**
- * @brief Write any pending changes to non-volatile storage
- *
- * After setting any values, nvs_commit() must be called to ensure changes are written
- * to non-volatile storage. Individual implementations may write to storage at other times,
- * but this is not guaranteed.
- *
- * @param[in] handle Storage handle obtained with nvs_open.
- * Handles that were opened read only cannot be used.
- *
- * @return
- * - ESP_OK if the changes have been written successfully
- * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL
- * - other error codes from the underlying storage driver
- */
- esp_err_t nvs_commit(nvs_handle handle);
- /**
- * @brief Close the storage handle and free any allocated resources
- *
- * This function should be called for each handle opened with nvs_open once
- * the handle is not in use any more. Closing the handle may not automatically
- * write the changes to nonvolatile storage. This has to be done explicitly using
- * nvs_commit function.
- * Once this function is called on a handle, the handle should no longer be used.
- *
- * @param[in] handle Storage handle to close
- */
- void nvs_close(nvs_handle handle);
- #ifdef __cplusplus
- } // extern "C"
- #endif
- #endif //ESP_NVS_H
|