mirror of
https://github.com/espressif/esp-idf.git
synced 2026-05-29 17:16:32 +03:00
- BDL provider can be enabled vor NVS in the menuconfig option NVS_BDL_STACK - Hierarchy of Partition class tree was adjusted and all operations were documented - Class Partition is now derived from intrusive_list_node and ExceptionlessAllocable - Class NVSPartition implements only the dual support for esp_partition and BDL - Class NVSEncryptedPartition implements only encryption related extensions
118 lines
3.1 KiB
C++
118 lines
3.1 KiB
C++
/*
|
|
* SPDX-FileCopyrightText: 2019-2025 Espressif Systems (Shanghai) CO LTD
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
#include "nvs_partition_lookup.hpp" // For partition_lookup namespace
|
|
|
|
#include "esp_partition.h" // For esp_partition_t
|
|
#ifndef LINUX_TARGET
|
|
#include "nvs_encrypted_partition.hpp"
|
|
#endif // ! LINUX_TARGET
|
|
|
|
namespace nvs {
|
|
namespace partition_lookup {
|
|
|
|
esp_err_t lookup_nvs_partition(const char* label, Partition **p)
|
|
{
|
|
#ifndef CONFIG_NVS_BDL_STACK
|
|
const esp_partition_t* esp_partition = esp_partition_find_first(
|
|
ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_NVS, label);
|
|
|
|
if (esp_partition == nullptr) {
|
|
return ESP_ERR_NOT_FOUND;
|
|
}
|
|
if (esp_partition->encrypted) {
|
|
return ESP_ERR_NVS_WRONG_ENCRYPTION;
|
|
}
|
|
|
|
NVSPartition *partition = new (std::nothrow) NVSPartition(esp_partition);
|
|
if (partition == nullptr) {
|
|
return ESP_ERR_NO_MEM;
|
|
}
|
|
|
|
*p = partition;
|
|
return ESP_OK;
|
|
#else
|
|
esp_blockdev_handle_t bdl = NULL;
|
|
esp_err_t err = esp_partition_get_blockdev(
|
|
ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_NVS, label, &bdl);
|
|
|
|
if (err != ESP_OK) {
|
|
return ESP_ERR_NOT_FOUND;
|
|
}
|
|
if (!NVSPartition::is_bdl_nvs_compliant(label, bdl)) {
|
|
if(bdl->ops->release) bdl->ops->release(bdl);
|
|
return ESP_ERR_NVS_PART_NOT_FOUND;
|
|
}
|
|
|
|
NVSPartition *partition = new (std::nothrow) NVSPartition(label, bdl);
|
|
if (partition == nullptr) {
|
|
return ESP_ERR_NO_MEM;
|
|
}
|
|
|
|
*p = partition;
|
|
return ESP_OK;
|
|
#endif
|
|
}
|
|
|
|
#ifndef LINUX_TARGET
|
|
esp_err_t lookup_nvs_encrypted_partition(const char* label, nvs_sec_cfg_t* cfg, Partition **p)
|
|
{
|
|
#ifndef CONFIG_NVS_BDL_STACK
|
|
const esp_partition_t* esp_partition = esp_partition_find_first(
|
|
ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_NVS, label);
|
|
|
|
if (esp_partition == nullptr) {
|
|
return ESP_ERR_NOT_FOUND;
|
|
}
|
|
|
|
if (esp_partition->encrypted) {
|
|
return ESP_ERR_NVS_WRONG_ENCRYPTION;
|
|
}
|
|
|
|
NVSEncryptedPartition *partition = new (std::nothrow) NVSEncryptedPartition(esp_partition);
|
|
if (partition == nullptr) {
|
|
return ESP_ERR_NO_MEM;
|
|
}
|
|
|
|
esp_err_t result = partition->init(cfg);
|
|
if (result != ESP_OK) {
|
|
delete partition;
|
|
return result;
|
|
}
|
|
*p = partition;
|
|
return ESP_OK;
|
|
#else
|
|
esp_blockdev_handle_t bdl = NULL;
|
|
esp_err_t err = esp_partition_get_blockdev(
|
|
ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_NVS, label, &bdl);
|
|
|
|
if (err != ESP_OK) {
|
|
return ESP_ERR_NOT_FOUND;
|
|
}
|
|
|
|
if (!NVSPartition::is_bdl_nvs_compliant(label, bdl)) {
|
|
if(bdl->ops->release) bdl->ops->release(bdl);
|
|
return ESP_ERR_NVS_PART_NOT_FOUND;
|
|
}
|
|
|
|
NVSEncryptedPartition *partition = new (std::nothrow) NVSEncryptedPartition(label, bdl);
|
|
if (partition == nullptr) {
|
|
return ESP_ERR_NO_MEM;
|
|
}
|
|
|
|
esp_err_t result = partition->init(cfg);
|
|
if (result != ESP_OK) {
|
|
delete partition;
|
|
return result;
|
|
}
|
|
*p = partition;
|
|
return ESP_OK;
|
|
#endif
|
|
}
|
|
#endif // !LINUX_TARGET
|
|
|
|
} // namespace partition_lookup
|
|
} // namespace nvs
|