btstack_tlv_flash_bank: cache bank size in interator

This commit is contained in:
Matthias Ringwald 2023-05-02 21:18:02 +02:00
parent c299d189d6
commit 4c7f527567

View File

@ -83,13 +83,14 @@ static const char * btstack_tlv_header_magic = "BTstack";
typedef struct { typedef struct {
int bank; int bank;
uint32_t offset; uint32_t offset;
uint32_t size;
uint32_t tag; uint32_t tag;
uint32_t len; uint32_t len;
} tlv_iterator_t; } tlv_iterator_t;
static uint32_t btstack_tlv_flash_bank_align_size(btstack_tlv_flash_bank_t * self, uint32_t size){ static uint32_t btstack_tlv_flash_bank_align_size(btstack_tlv_flash_bank_t * self, uint32_t size){
uint32_t aligment = self->hal_flash_bank_impl->get_alignment(self->hal_flash_bank_context); uint32_t alignment = self->hal_flash_bank_impl->get_alignment(self->hal_flash_bank_context);
return (size + aligment - 1) & ~(aligment - 1); return (size + alignment - 1) & ~(alignment - 1);
} }
// support unaligned flash read/writes // support unaligned flash read/writes
@ -141,6 +142,7 @@ static void btstack_tlv_flash_bank_write(btstack_tlv_flash_bank_t * self, int ba
// iterator // iterator
static void btstack_tlv_flash_bank_iterator_fetch_tag_len(btstack_tlv_flash_bank_t * self, tlv_iterator_t * it){ static void btstack_tlv_flash_bank_iterator_fetch_tag_len(btstack_tlv_flash_bank_t * self, tlv_iterator_t * it){
// abort if header doesn't fit into remaining space
if (it->offset + 8 + self->delete_tag_len >= self->hal_flash_bank_impl->get_size(self->hal_flash_bank_context)){ if (it->offset + 8 + self->delete_tag_len >= self->hal_flash_bank_impl->get_size(self->hal_flash_bank_context)){
it->tag = 0xffffffff; it->tag = 0xffffffff;
return; return;
@ -165,13 +167,13 @@ static void btstack_tlv_flash_bank_iterator_init(btstack_tlv_flash_bank_t * self
memset(it, 0, sizeof(tlv_iterator_t)); memset(it, 0, sizeof(tlv_iterator_t));
it->bank = bank; it->bank = bank;
it->offset = BTSTACK_TLV_HEADER_LEN; it->offset = BTSTACK_TLV_HEADER_LEN;
it->size = self->hal_flash_bank_impl->get_size(self->hal_flash_bank_context);
btstack_tlv_flash_bank_iterator_fetch_tag_len(self, it); btstack_tlv_flash_bank_iterator_fetch_tag_len(self, it);
} }
static int btstack_tlv_flash_bank_iterator_has_next(btstack_tlv_flash_bank_t * self, tlv_iterator_t * it){ static bool btstack_tlv_flash_bank_iterator_has_next(btstack_tlv_flash_bank_t * self, tlv_iterator_t * it){
UNUSED(self); UNUSED(self);
if (it->tag == 0xffffffff) return 0; return it->tag != 0xffffffff;
return 1;
} }
static void tlv_iterator_fetch_next(btstack_tlv_flash_bank_t * self, tlv_iterator_t * it){ static void tlv_iterator_fetch_next(btstack_tlv_flash_bank_t * self, tlv_iterator_t * it){
@ -182,7 +184,7 @@ static void tlv_iterator_fetch_next(btstack_tlv_flash_bank_t * self, tlv_iterato
it->offset += self->delete_tag_len; it->offset += self->delete_tag_len;
#endif #endif
if (it->offset >= self->hal_flash_bank_impl->get_size(self->hal_flash_bank_context)) { if (it->offset >= it->size) {
it->tag = 0xffffffff; it->tag = 0xffffffff;
it->len = 0; it->len = 0;
return; return;
@ -230,7 +232,7 @@ static int btstack_tlv_flash_bank_test_erased(btstack_tlv_flash_bank_t * self, i
while (offset < size){ while (offset < size){
uint32_t copy_size = (offset + sizeof(empty16) < size) ? sizeof(empty16) : (size - offset); uint32_t copy_size = (offset + sizeof(empty16) < size) ? sizeof(empty16) : (size - offset);
btstack_tlv_flash_bank_read(self, bank, offset, buffer, copy_size); btstack_tlv_flash_bank_read(self, bank, offset, buffer, copy_size);
if (memcmp(buffer, empty16, copy_size)) { if (memcmp(buffer, empty16, copy_size) != 0) {
log_info("not erased %x - %x", (unsigned int) offset, (unsigned int) (offset + copy_size)); log_info("not erased %x - %x", (unsigned int) offset, (unsigned int) (offset + copy_size));
return 0; return 0;
} }