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;
33 uint8_t crc = type_array[0] ^ type_array[1] ^ type_array[2] ^ type_array[3];
34 while (first != last) {
41 const size_t buffer_size =
len + 1;
42 if (buffer_size > PREF_MAX_BUFFER_SIZE)
44 uint8_t buffer[PREF_MAX_BUFFER_SIZE];
45 memcpy(buffer, data,
len);
48 for (
size_t i = 0; i < buffer_size; i++) {
50 if (j >= RP2040_FLASH_STORAGE_SIZE)
52 uint8_t v = buffer[i];
53 uint8_t *ptr = &s_flash_storage[j];
62 const size_t buffer_size =
len + 1;
63 if (buffer_size > PREF_MAX_BUFFER_SIZE)
65 uint8_t buffer[PREF_MAX_BUFFER_SIZE];
67 for (
size_t i = 0; i < buffer_size; i++) {
69 if (j >= RP2040_FLASH_STORAGE_SIZE)
71 buffer[i] = s_flash_storage[j];
75 if (buffer[
len] != crc) {
79 memcpy(data, buffer,
len);
86 ESP_LOGVV(TAG,
"Loading preferences from flash");
87 memcpy(s_flash_storage, this->
eeprom_sector_, RP2040_FLASH_STORAGE_SIZE);
93 if (
end > RP2040_FLASH_STORAGE_SIZE) {
109 ESP_LOGD(TAG,
"Saving");
113 ::rp2040.idleOtherCore();
114 flash_range_erase((intptr_t) this->
eeprom_sector_ - (intptr_t) XIP_BASE, 4096);
115 flash_range_program((intptr_t) this->
eeprom_sector_ - (intptr_t) XIP_BASE, s_flash_storage,
116 RP2040_FLASH_STORAGE_SIZE);
117 ::rp2040.resumeOtherCore();
120 s_flash_dirty =
false;
125 ESP_LOGD(TAG,
"Erasing storage");
128 ::rp2040.idleOtherCore();
129 flash_range_erase((intptr_t) this->
eeprom_sector_ - (intptr_t) XIP_BASE, 4096);
130 ::rp2040.resumeOtherCore();
132 s_prevent_write =
true;
141 s_preferences.
setup();
Helper class to disable interrupts.
bool save(const uint8_t *data, size_t len)
bool load(uint8_t *data, size_t len)
ESPPreferenceObject make_preference(size_t length, uint32_t type, bool in_flash)
uint32_t current_flash_offset
RP2040Preferences * get_preferences()
void preferences_prevent_write(bool prevent)
uint8_t calculate_crc(It first, It last, uint32_t type)
Providing packet encoding functions for exchanging data with a remote host.
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).