Skip to content

Commit dee00cd

Browse files
committed
CodeFlashBlockDevice: Allow writes aligned to program size
Former-commit-id: 07a583b
1 parent c197bbe commit dee00cd

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

Diff for: libraries/BlockDevices/CodeFlashBlockDevice.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ const char *CodeFlashBlockDevice::get_type() const
341341

342342
bool CodeFlashBlockDevice::is_valid_program(bd_addr_t addr, bd_size_t size) const
343343
{
344-
return (addr % get_program_size() == 0 && size % get_program_size() == 0 && addr + size <= this->size() && addr % get_erase_size(addr) == 0);
344+
return (addr % get_program_size() == 0 && size % get_program_size() == 0 && addr + size <= this->size());
345345
}
346346

347347
bool CodeFlashBlockDevice::is_valid_erase(bd_addr_t addr, bd_size_t size) const

Diff for: libraries/Storage/examples/TestCodeFlash/TestCodeFlash.ino

+16-6
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,14 @@ void loop() {
4949

5050
// Select a random start address in region 0 after the bootloader and compute block start offset
5151
int address = random(0x00004000, 0x00010000 - WRITE_SIZE);
52-
int offset = address & ~(root.get_erase_size(address) - 1);
52+
int offset = address & ~(root.get_program_size() - 1);
5353

5454
// Start Test
5555
erase_write_read_compare(pattern, offset, repeat);
5656

5757
// Select a random start address in region 1 after the sketch and compute block start offset
5858
address = random(0x000A0000, root.size() - WRITE_SIZE);
59-
offset = address & ~(root.get_erase_size(address) - 1);
59+
offset = address & ~(root.get_program_size() - 1);
6060

6161
// Start Test
6262
erase_write_read_compare(pattern, offset, repeat);
@@ -72,13 +72,23 @@ void erase_write_read_compare(byte pattern, int offset, int repeat) {
7272

7373
memset(&w_buffer[0], pattern, repeat);
7474

75+
// Double check we are using only one memory region for each test run
76+
if(root.get_erase_size(offset) != root.get_erase_size(offset + repeat )) {
77+
Serial.println("Error: different secotr size not handled");
78+
return;
79+
}
80+
// Start offset is aligned to program size but erase command needs to be
81+
// aligned to erase block size
82+
int erase_start = offset & ~(root.get_erase_size(offset) - 1);
83+
// Since we are using only one memory reagion erase size is always the same
84+
int erase_size = root.get_erase_size(erase_start);
7585
// Check if we need to delete more consecutive blocks
7686
// Should happen only in region 0 due to write buffer size
77-
int erase_size = root.get_erase_size(offset);
78-
while(erase_size < repeat) {
79-
erase_size += erase_size;
87+
int erased = 0;
88+
while(erase_start + erased < offset + repeat ) {
89+
root.erase(erase_start + erased, erase_size);
90+
erased += erase_size;
8091
}
81-
root.erase(offset, erase_size);
8292

8393
// Write pattern
8494
root.program(&w_buffer[0], offset, repeat);

0 commit comments

Comments
 (0)