nodemcu-firmware/components/lua/common/lfs.c

104 lines
2.5 KiB
C

#include "lfs.h"
#include "esp_partition.h"
#include "nvs_flash.h"
#include "platform.h"
#if defined(CONFIG_NODEMCU_EMBEDDED_LFS_SIZE)
// Symbol provided by embedded_lfs component
extern const char lua_flash_store_reserved[0];
#endif
bool lfs_get_location(lfs_location_info_t *out)
{
#if defined(CONFIG_NODEMCU_EMBEDDED_LFS_SIZE)
out->size = CONFIG_NODEMCU_EMBEDDED_LFS_SIZE;
out->addr_mem = lua_flash_store_reserved;
out->addr_phys = spi_flash_cache2phys(lua_flash_store_reserved);
if (out->addr_phys == SPI_FLASH_CACHE2PHYS_FAIL) {
NODE_ERR("spi_flash_cache2phys failed\n");
return false;
}
else
return true;
#else
const esp_partition_t *part = esp_partition_find_first(
PLATFORM_PARTITION_TYPE_NODEMCU,
PLATFORM_PARTITION_SUBTYPE_NODEMCU_LFS,
NULL);
if (!part)
return false; // Nothing to do if no LFS partition available
out->size = part->size; // in bytes
out->addr_mem = spi_flash_phys2cache(out->addr_phys, SPI_FLASH_MMAP_DATA);
out->addr_phys = part->address;
if (!out->addr_mem) { // not already mmap'd, have to do it ourselves
spi_flash_mmap_handle_t ignored;
esp_err_t err = spi_flash_mmap(
out->addr_phys, out->size, SPI_FLASH_MMAP_DATA, &out->addr_mem, &ignored);
if (err != ESP_OK) {
NODE_ERR("Unable to access LFS partition - is it 64kB aligned as it needs to be?\n");
return false;
}
}
return true;
#endif
}
#define LFS_LOAD_NS "lfsload"
#define LFS_LOAD_FILE_KEY "filename"
bool lfs_get_load_filename(char *buf, size_t bufsiz)
{
bool res = false;
nvs_handle_t handle;
esp_err_t err = nvs_open(LFS_LOAD_NS, NVS_READONLY, &handle);
if (err != ESP_OK)
goto out;
err = nvs_get_str(handle, LFS_LOAD_FILE_KEY, buf, &bufsiz);
if (err != ESP_OK)
goto close_out;
res = true;
close_out:
nvs_close(handle);
out:
return res;
}
bool lfs_set_load_filename(const char *fname)
{
bool res = false;
nvs_handle_t handle;
esp_err_t err = nvs_open(LFS_LOAD_NS, NVS_READWRITE, &handle);
if (err != ESP_OK)
goto out;
err = nvs_set_str(handle, LFS_LOAD_FILE_KEY, fname);
if (err != ESP_OK)
goto close_out;
res = true;
close_out:
nvs_close(handle);
out:
return res;
}
bool lfs_clear_load_filename(void)
{
bool res = false;
nvs_handle_t handle;
esp_err_t err = nvs_open(LFS_LOAD_NS, NVS_READWRITE, &handle);
if (err != ESP_OK)
goto out;
err = nvs_erase_key(handle, LFS_LOAD_FILE_KEY);
if (err != ESP_OK)
goto close_out;
res = true;
close_out:
nvs_close(handle);
out:
return res;
}