86 template <
typename... Args>
102 if (writeOffset_ >= HW::physical_cell_count())
110 if (writeOffset_ + 1 < HW::physical_cell_count())
112 auto v = HW::read_cell(writeOffset_ + 1);
121 HW::write_cell(writeOffset_++, get_vcell(c));
126 using eeprom_t =
typename HW::eeprom_t;
130 unsigned vcell_ofs_bits =
131 (
sizeof(eeprom_t) * 8) - HW::bits_per_cell() - 1;
133 HASSERT((1U << vcell_ofs_bits) - 2 >= HW::virtual_cell_count());
135 HW::virtual_cell_count() + 2 <= (HW::physical_cell_count() / 2));
136 eeprom_t magic = HW::read_cell(FIRST_MAGIC_OFS);
142 for (
unsigned i = 0; i < HW::virtual_cell_count(); ++i)
144 eeprom_t v = HW::read_cell(i + HEADER_OFS);
147 eeprom_t magic2 = HW::read_cell(SECOND_MAGIC_OFS);
152 writeOffset_ = JOURNAL_OFS;
154 while (writeOffset_ < HW::physical_cell_count() &&
155 ((v = HW::read_cell(writeOffset_)) &
MARKER_MASK) ==
165 for (
unsigned i = JOURNAL_OFS; i < HW::physical_cell_count(); ++i)
167 eeprom_t v = HW::read_cell(i);
181 void clear_all_dirty()
192 for (
unsigned j = JOURNAL_OFS; j < HW::physical_cell_count(); ++j)
194 eeprom_t v = HW::read_cell(j);
197 HW::write_cell(j, 0);
207 for (
unsigned i = 0; i < HW::virtual_cell_count(); ++i)
209 eeprom_t ov = HW::read_cell(i + HEADER_OFS);
210 eeprom_t nv = get_vcell(i);
216 HW::write_cell(i + HEADER_OFS, nv);
218 eeprom_t v = HW::read_cell(JOURNAL_OFS);
226 writeOffset_ = JOURNAL_OFS;
229 void read_entry(eeprom_t v)
231 auto vcell = value_to_vcell_ofs(v);
233 HW::bits_per_cell(), value_to_vcell_value(v));
236 unsigned value_to_vcell_ofs(eeprom_t value)
238 return (value & ~
MARKER_MASK) >> HW::bits_per_cell();
241 unsigned value_to_vcell_value(eeprom_t value)
243 return (value & ((1U << HW::bits_per_cell()) - 1));
246 eeprom_t get_vcell(
unsigned vcell)
250 v |= (vcell << HW::bits_per_cell());
258 << ((
sizeof(eeprom_t) * 8) - 1);
260 static constexpr eeprom_t EEPROM_MASK = eeprom_t(-1);
265 0x02b26758U & EEPROM_MASK & (~MARKER_MASK);
267 static constexpr eeprom_t ERASED = 0xFFFFFFFFU & EEPROM_MASK;
269 static constexpr unsigned FIRST_MAGIC_OFS = 0;
270 static constexpr unsigned SECOND_MAGIC_OFS = 1;
271 static constexpr unsigned HEADER_OFS = 2;
272 static constexpr unsigned JOURNAL_OFS =
273 HW::virtual_cell_count() + HEADER_OFS;
277 unsigned writeOffset_;