From ffded21621d635c47dcfaf2c1091aa7fb21d70df Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Tue, 29 Aug 2023 15:47:13 +0200 Subject: [PATCH] btstack_tlv_flash_bank: increase bank header to alignment size --- platform/embedded/btstack_tlv_flash_bank.c | 35 ++++++++++++---------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/platform/embedded/btstack_tlv_flash_bank.c b/platform/embedded/btstack_tlv_flash_bank.c index 92a64aa42..c19dce6e6 100644 --- a/platform/embedded/btstack_tlv_flash_bank.c +++ b/platform/embedded/btstack_tlv_flash_bank.c @@ -49,11 +49,15 @@ // Entries // - Tag: 32 bit // - Len: 32 bit -// - Delete: 32 delete field - only used with ENABLE_TLV_FLASH_EXPLICIT_DELETE_FIELD +// - if ENABLE_TLV_FLASH_EXPLICIT_DELETE_FIELD is used +// - padding to align delete field +// - Delete: 32 bit +// - padding to align value field // - Value: Len in bytes // Alignment -// Tag and Delete (if it exists) are aligned to the alignment from hal_flash_bank_t +// Tag is aligned to the alignment from hal_flash_bank_t +// If ENABLE_TLV_FLASH_EXPLICIT_DELETE_FIELD is used, both Delete and Value are aligned, too // ENABLE_TLV_FLASH_EXPLICIT_DELETE_FIELD // @@ -62,8 +66,8 @@ // - write value (1s -> 0s) // - overwrite value with zero (remaining 1s -> 0s) // -// We use the ability to overwrite a value with zeros to mark deleted enttries (by writing zero into the tag field). -// Some targets, E.g. Kinetix K64F, do enot allow for that. +// We use the ability to overwrite a value with zeros to mark deleted entries (by writing zero into the tag field). +// Some targets, E.g. Kinetix K64F, do not allow for that. // // With ENABLE_TLV_FLASH_EXPLICIT_DELETE_FIELD an extra field is reserved to indicate a deleted tag, while keeping main logic // @@ -78,7 +82,7 @@ #define BTSTACK_TLV_ENTRY_HEADER_LEN 8 #ifndef BTSTACK_FLASH_ALIGNMENT_MAX -#define BTSTACK_FLASH_ALIGNMENT_MAX 8 +#define BTSTACK_FLASH_ALIGNMENT_MAX 16 #endif static const char * btstack_tlv_header_magic = "BTstack"; @@ -180,7 +184,7 @@ static void btstack_tlv_flash_bank_iterator_fetch_tag_len(btstack_tlv_flash_bank static void btstack_tlv_flash_bank_iterator_init(btstack_tlv_flash_bank_t * self, tlv_iterator_t * it, int bank){ memset(it, 0, sizeof(tlv_iterator_t)); it->bank = bank; - it->offset = BTSTACK_TLV_BANK_HEADER_LEN; + it->offset = btstack_tlv_flash_bank_align_size(self, BTSTACK_TLV_BANK_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); } @@ -522,23 +526,24 @@ static const btstack_tlv_t btstack_tlv_flash_bank = { */ const btstack_tlv_t * btstack_tlv_flash_bank_init_instance(btstack_tlv_flash_bank_t * self, const hal_flash_bank_t * hal_flash_bank_impl, void * hal_flash_bank_context){ - self->hal_flash_bank_impl = hal_flash_bank_impl; - self->hal_flash_bank_context = hal_flash_bank_context; - self->delete_tag_len = 0; + self->hal_flash_bank_impl = hal_flash_bank_impl; + self->hal_flash_bank_context = hal_flash_bank_context; + self->delete_tag_len = 0; + + // BTSTACK_FLASH_ALIGNMENT_MAX must be larger than alignment + uint32_t alignment = self->hal_flash_bank_impl->get_alignment(self->hal_flash_bank_context); + btstack_assert(BTSTACK_FLASH_ALIGNMENT_MAX >= alignment); #ifdef ENABLE_TLV_FLASH_EXPLICIT_DELETE_FIELD - if (hal_flash_bank_impl->get_alignment(hal_flash_bank_context) > 8){ - log_error("Flash alignment > 8 with ENABLE_TLV_FLASH_EXPLICIT_DELETE_FIELD not supported"); - return NULL; - } // set delete tag len - uint32_t alignment = self->hal_flash_bank_impl->get_alignment(self->hal_flash_bank_context); self->delete_tag_len = (uint8_t) btstack_max(4, alignment); log_info("delete tag len %u", self->delete_tag_len); // set aligned entry header len self->entry_header_len = btstack_tlv_flash_bank_align_size(self, BTSTACK_TLV_ENTRY_HEADER_LEN); + log_info("entry header len %u", self->entry_header_len); #else + UNUSED(alignment); // data starts right after entry header self->entry_header_len = BTSTACK_TLV_ENTRY_HEADER_LEN; #endif @@ -592,7 +597,7 @@ const btstack_tlv_t * btstack_tlv_flash_bank_init_instance(btstack_tlv_flash_ban btstack_tlv_flash_bank_erase_bank(self, 0); self->current_bank = 0; btstack_tlv_flash_bank_write_header(self, self->current_bank, 0); // epoch = 0; - self->write_offset = BTSTACK_TLV_BANK_HEADER_LEN; + self->write_offset = btstack_tlv_flash_bank_align_size (self, BTSTACK_TLV_BANK_HEADER_LEN); } log_info("write offset %" PRIx32, self->write_offset);