pw_kvs: Alignment handling adjustments
- Rename multi-span Write to WriteAligned to reflect that the number of
bytes written may be larger than the input due to padding.
- Make alignment_bytes_ a member of FlashPartition instead of a virtual
function.
- Enable tests that now pass.
Change-Id: Iad985988ef97607b38fb0c84589cabe752de71a2
diff --git a/pw_kvs/public/pw_kvs/flash_memory.h b/pw_kvs/public/pw_kvs/flash_memory.h
index 01c0120..3bc2a2b 100644
--- a/pw_kvs/public/pw_kvs/flash_memory.h
+++ b/pw_kvs/public/pw_kvs/flash_memory.h
@@ -57,7 +57,10 @@
alignment_(alignment),
start_address_(start_address),
start_sector_(sector_start),
- erased_memory_content_(erased_memory_content) {}
+ erased_memory_content_(erased_memory_content) {
+ // TODO: The smallest possible alignment is 1 B; 0 is invalid.
+ // DCHECK_NE(alignment_, 0);
+ }
virtual ~FlashMemory() = default;
@@ -138,24 +141,15 @@
FlashMemory* flash,
uint32_t start_sector_index,
uint32_t sector_count,
+ uint32_t alignment_bytes = 0, // Defaults to flash alignment
PartitionPermission permission = PartitionPermission::kReadAndWrite)
: flash_(*flash),
start_sector_index_(start_sector_index),
sector_count_(sector_count),
+ alignment_bytes_(alignment_bytes == 0 ? flash_.alignment_bytes()
+ : alignment_bytes),
permission_(permission) {}
-#if 0
- constexpr FlashPartition(
- FlashMemory* flash,
- uint32_t start_sector_index,
- uint32_t end_sector_index,
- PartitionPermission permission = PartitionPermission::kReadAndWrite)
- : flash_(*flash),
- start_sector_index_(start_sector_index),
- sector_count_(end_sector_index - start_sector_index + 1),
- permission_(permission) {}
-#endif
-
virtual ~FlashPartition() = default;
// Performs any required partition or flash-level initialization.
@@ -191,8 +185,9 @@
// UNKNOWN, on HAL error
virtual StatusWithSize Write(Address address, span<const std::byte> data);
- StatusWithSize Write(Address start_address,
- std::initializer_list<span<const std::byte>> data);
+ // Returns the total number of bytes written, including any padding.
+ StatusWithSize WriteAligned(
+ Address start_address, std::initializer_list<span<const std::byte>> data);
// Check to see if chunk of flash memory is erased. Address and len need to
// be aligned with FlashMemory.
@@ -214,9 +209,9 @@
size_t size_bytes() const { return sector_count() * sector_size_bytes(); }
- virtual size_t alignment_bytes() const { return flash_.alignment_bytes(); }
+ size_t alignment_bytes() const { return alignment_bytes_; }
- virtual size_t sector_count() const { return sector_count_; }
+ size_t sector_count() const { return sector_count_; }
// Convert a FlashMemory::Address to an MCU pointer, this can be used for
// memory mapped reads. Return NULL if the memory is not memory mapped.
@@ -247,6 +242,7 @@
FlashMemory& flash_;
const uint32_t start_sector_index_;
const uint32_t sector_count_;
+ const uint32_t alignment_bytes_;
const PartitionPermission permission_;
};