Skip to content

Commit 54602f5

Browse files
authored
Merge pull request #10108 from theamirocohen/fix_is_valid_erase
Fix functionality for FlashIAPBD & SlicingBD
2 parents a23d105 + 4d6240d commit 54602f5

File tree

5 files changed

+75
-7
lines changed

5 files changed

+75
-7
lines changed

components/storage/blockdevice/COMPONENT_FLASHIAP/FlashIAPBlockDevice.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,4 +256,14 @@ const char *FlashIAPBlockDevice::get_type() const
256256
return "FLASHIAP";
257257
}
258258

259+
bool FlashIAPBlockDevice::is_valid_erase(bd_addr_t addr, bd_size_t size) const
260+
{
261+
/* Calculate address alignment for the full flash */
262+
bd_addr_t base_addr = addr + (_base - _flash.get_flash_start());
263+
264+
return (
265+
addr + size <= this->size() &&
266+
base_addr % get_erase_size(addr) == 0 &&
267+
(base_addr + size) % get_erase_size(addr + size - 1) == 0);
268+
}
259269
#endif /* DEVICE_FLASH */

components/storage/blockdevice/COMPONENT_FLASHIAP/FlashIAPBlockDevice.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,15 @@ class FlashIAPBlockDevice : public mbed::BlockDevice {
127127
*/
128128
virtual const char *get_type() const;
129129

130+
/** Convenience function for checking block erase validity
131+
*
132+
* @param addr Address of block to begin erasing
133+
* @param size Size to erase in bytes
134+
* @return True if erase is valid for underlying block device
135+
*/
136+
virtual bool is_valid_erase(bd_addr_t addr, bd_size_t size) const;
137+
138+
130139
private:
131140
// Device configuration
132141
mbed::FlashIAP _flash;

features/storage/blockdevice/BlockDevice.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ class BlockDevice {
198198
* @param size Size to read in bytes
199199
* @return True if read is valid for underlying block device
200200
*/
201-
bool is_valid_read(bd_addr_t addr, bd_size_t size) const
201+
virtual bool is_valid_read(bd_addr_t addr, bd_size_t size) const
202202
{
203203
return (
204204
addr % get_read_size() == 0 &&
@@ -212,7 +212,7 @@ class BlockDevice {
212212
* @param size Size to write in bytes
213213
* @return True if program is valid for underlying block device
214214
*/
215-
bool is_valid_program(bd_addr_t addr, bd_size_t size) const
215+
virtual bool is_valid_program(bd_addr_t addr, bd_size_t size) const
216216
{
217217
return (
218218
addr % get_program_size() == 0 &&
@@ -226,7 +226,7 @@ class BlockDevice {
226226
* @param size Size to erase in bytes
227227
* @return True if erase is valid for underlying block device
228228
*/
229-
bool is_valid_erase(bd_addr_t addr, bd_size_t size) const
229+
virtual bool is_valid_erase(bd_addr_t addr, bd_size_t size) const
230230
{
231231
return (
232232
addr % get_erase_size(addr) == 0 &&

features/storage/blockdevice/SlicingBlockDevice.cpp

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ int SlicingBlockDevice::init()
5858
}
5959

6060
// Check that block addresses are valid
61-
MBED_ASSERT(_bd->is_valid_erase(_start, _stop - _start));
61+
MBED_ASSERT(is_valid_erase(_start, _stop - _start));
6262

6363
return 0;
6464
}
@@ -75,22 +75,46 @@ int SlicingBlockDevice::sync()
7575

7676
int SlicingBlockDevice::read(void *b, bd_addr_t addr, bd_size_t size)
7777
{
78-
MBED_ASSERT(is_valid_read(addr, size));
78+
MBED_ASSERT(is_valid_read(addr + _start, size));
7979
return _bd->read(b, addr + _start, size);
8080
}
8181

8282
int SlicingBlockDevice::program(const void *b, bd_addr_t addr, bd_size_t size)
8383
{
84-
MBED_ASSERT(is_valid_program(addr, size));
84+
MBED_ASSERT(is_valid_program(addr + _start, size));
8585
return _bd->program(b, addr + _start, size);
8686
}
8787

8888
int SlicingBlockDevice::erase(bd_addr_t addr, bd_size_t size)
8989
{
90-
MBED_ASSERT(is_valid_erase(addr, size));
90+
MBED_ASSERT(is_valid_erase(addr + _start, size));
9191
return _bd->erase(addr + _start, size);
9292
}
9393

94+
bool SlicingBlockDevice::is_valid_read(bd_addr_t addr, bd_size_t size) const
95+
{
96+
return (
97+
addr % get_read_size() == 0 &&
98+
size % get_read_size() == 0 &&
99+
addr + size <= (this->size() + _start));
100+
}
101+
102+
bool SlicingBlockDevice::is_valid_program(bd_addr_t addr, bd_size_t size) const
103+
{
104+
return (
105+
addr % get_program_size() == 0 &&
106+
size % get_program_size() == 0 &&
107+
addr + size <= (this->size() + _start));
108+
}
109+
110+
bool SlicingBlockDevice::is_valid_erase(bd_addr_t addr, bd_size_t size) const
111+
{
112+
return (
113+
addr % get_erase_size(addr) == 0 &&
114+
(addr + size) % get_erase_size(addr + size - 1) == 0 &&
115+
addr + size <= (this->size() + _start));
116+
}
117+
94118
bd_size_t SlicingBlockDevice::get_read_size() const
95119
{
96120
return _bd->get_read_size();

features/storage/blockdevice/SlicingBlockDevice.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,31 @@ class SlicingBlockDevice : public BlockDevice {
151151
*/
152152
virtual const char *get_type() const;
153153

154+
/** Convenience function for checking block program validity
155+
*
156+
* @param addr Address of block to begin writing to
157+
* @param size Size to write in bytes
158+
* @return True if program is valid for underlying block device
159+
*/
160+
virtual bool is_valid_program(bd_addr_t addr, bd_size_t size) const;
161+
162+
/** Convenience function for checking block read validity
163+
*
164+
* @param addr Address of block to begin reading from
165+
* @param size Size to read in bytes
166+
* @return True if read is valid for underlying block device
167+
*/
168+
virtual bool is_valid_read(bd_addr_t addr, bd_size_t size) const;
169+
170+
/** Convenience function for checking block erase validity
171+
*
172+
* @param addr Address of block to begin erasing
173+
* @param size Size to erase in bytes
174+
* @return True if erase is valid for underlying block device
175+
*/
176+
virtual bool is_valid_erase(bd_addr_t addr, bd_size_t size) const;
177+
178+
154179
protected:
155180
BlockDevice *_bd;
156181
bool _start_from_end;

0 commit comments

Comments
 (0)