5#include <hardware/flash.h>
6#include <hardware/sync.h>
17static const char *
const TAG =
"preferences";
19static constexpr uint32_t RP2040_FLASH_STORAGE_SIZE = 512;
21static bool s_prevent_write =
false;
23 s_flash_storage[RP2040_FLASH_STORAGE_SIZE];
24static bool s_flash_dirty =
false;
27static constexpr size_t PREF_MAX_BUFFER_SIZE = RP2040_FLASH_STORAGE_SIZE;
34 uint8_t crc = type_array[0] ^ type_array[1] ^ type_array[2] ^ type_array[3];
35 while (first != last) {
42 if (
len >= PREF_MAX_BUFFER_SIZE)
44 const size_t buffer_size =
len + 1;
45 uint8_t buffer[PREF_MAX_BUFFER_SIZE];
46 memcpy(buffer, data,
len);
49 for (
size_t i = 0; i < buffer_size; i++) {
51 if (j >= RP2040_FLASH_STORAGE_SIZE)
53 uint8_t v = buffer[i];
54 uint8_t *ptr = &s_flash_storage[j];
63 if (
len >= PREF_MAX_BUFFER_SIZE)
65 const size_t buffer_size =
len + 1;
66 uint8_t buffer[PREF_MAX_BUFFER_SIZE];
68 for (
size_t i = 0; i < buffer_size; i++) {
70 if (j >= RP2040_FLASH_STORAGE_SIZE)
72 buffer[i] = s_flash_storage[j];
76 if (buffer[
len] != crc) {
80 memcpy(data, buffer,
len);
87 ESP_LOGVV(TAG,
"Loading preferences from flash");
88 memcpy(s_flash_storage, this->
eeprom_sector_, RP2040_FLASH_STORAGE_SIZE);
94 if (
end > RP2040_FLASH_STORAGE_SIZE) {
110 ESP_LOGD(TAG,
"Saving");
114 ::rp2040.idleOtherCore();
115 flash_range_erase((intptr_t) this->
eeprom_sector_ - (intptr_t) XIP_BASE, 4096);
116 flash_range_program((intptr_t) this->
eeprom_sector_ - (intptr_t) XIP_BASE, s_flash_storage,
117 RP2040_FLASH_STORAGE_SIZE);
118 ::rp2040.resumeOtherCore();
121 s_flash_dirty =
false;
126 ESP_LOGD(TAG,
"Erasing storage");
129 ::rp2040.idleOtherCore();
130 flash_range_erase((intptr_t) this->
eeprom_sector_ - (intptr_t) XIP_BASE, 4096);
131 ::rp2040.resumeOtherCore();
133 s_prevent_write =
true;
142 s_preferences.
setup();
Helper class to disable interrupts.
bool load(uint8_t *data, size_t len)
bool save(const uint8_t *data, size_t len)
uint32_t current_flash_offset
ESPPreferenceObject make_preference(size_t length, uint32_t type, bool in_flash)
void preferences_prevent_write(bool prevent)
uint8_t calculate_crc(It first, It last, uint32_t type)
RP2Preferences * get_preferences()
Preferences ESPPreferences
ESPPreferences * global_preferences
constexpr std::array< uint8_t, sizeof(T)> decode_value(T val)
Decode a value into its constituent bytes (from most to least significant).