mirror of https://github.com/ARMmbed/mbed-os.git
ExhaustibleBlockDevice: revert commit 10481f2
Reverts commit 10481f2f7e
partially.
Changes made to ExhaustibleBlockDevice hides simulated flash degradation
which is the assumed behavior. Converted back to original behavior.
pull/12919/head
parent
af4c8a94f3
commit
0278e38896
|
@ -21,31 +21,13 @@
|
||||||
namespace mbed {
|
namespace mbed {
|
||||||
|
|
||||||
ExhaustibleBlockDevice::ExhaustibleBlockDevice(BlockDevice *bd, uint32_t erase_cycles)
|
ExhaustibleBlockDevice::ExhaustibleBlockDevice(BlockDevice *bd, uint32_t erase_cycles)
|
||||||
: _bd(bd), _erase_array(NULL), _programmable_array(NULL), _erase_cycles(erase_cycles),
|
: _bd(bd), _erase_array(NULL), _erase_cycles(erase_cycles), _init_ref_count(0), _is_initialized(false)
|
||||||
_init_ref_count(0), _is_initialized(false)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
ExhaustibleBlockDevice::~ExhaustibleBlockDevice()
|
ExhaustibleBlockDevice::~ExhaustibleBlockDevice()
|
||||||
{
|
{
|
||||||
delete[] _erase_array;
|
delete[] _erase_array;
|
||||||
delete[] _programmable_array;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t ExhaustibleBlockDevice::get_erase_cycles(bd_addr_t addr) const
|
|
||||||
{
|
|
||||||
if (!_is_initialized) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return _erase_array[addr / get_erase_size()];
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExhaustibleBlockDevice::set_erase_cycles(bd_addr_t addr, uint32_t cycles)
|
|
||||||
{
|
|
||||||
if (!_is_initialized) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
_erase_array[addr / get_erase_size()] = cycles;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int ExhaustibleBlockDevice::init()
|
int ExhaustibleBlockDevice::init()
|
||||||
|
@ -70,13 +52,6 @@ int ExhaustibleBlockDevice::init()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_programmable_array) {
|
|
||||||
_programmable_array = new bool[_bd->size() / _bd->get_erase_size()];
|
|
||||||
for (size_t i = 0; i < _bd->size() / _bd->get_erase_size(); i++) {
|
|
||||||
_programmable_array[i] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_is_initialized = true;
|
_is_initialized = true;
|
||||||
return BD_ERROR_OK;
|
return BD_ERROR_OK;
|
||||||
|
|
||||||
|
@ -133,20 +108,10 @@ int ExhaustibleBlockDevice::program(const void *buffer, bd_addr_t addr, bd_size_
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_erase_array[addr / get_erase_size()] == 0) {
|
if (_erase_array[addr / get_erase_size()] == 0) {
|
||||||
return BD_ERROR_DEVICE_ERROR;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_programmable_array[addr / get_erase_size()]) {
|
return _bd->program(buffer, addr, size);
|
||||||
return BD_ERROR_DEVICE_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ret = _bd->program(buffer, addr, size);
|
|
||||||
|
|
||||||
if (ret == BD_ERROR_OK) {
|
|
||||||
_programmable_array[addr / get_erase_size()] = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int ExhaustibleBlockDevice::erase(bd_addr_t addr, bd_size_t size)
|
int ExhaustibleBlockDevice::erase(bd_addr_t addr, bd_size_t size)
|
||||||
|
@ -164,13 +129,13 @@ int ExhaustibleBlockDevice::erase(bd_addr_t addr, bd_size_t size)
|
||||||
// use an erase cycle
|
// use an erase cycle
|
||||||
if (_erase_array[addr / eu_size] > 0) {
|
if (_erase_array[addr / eu_size] > 0) {
|
||||||
_erase_array[addr / eu_size] -= 1;
|
_erase_array[addr / eu_size] -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_erase_array[addr / eu_size] > 0) {
|
||||||
int err = _bd->erase(addr, eu_size);
|
int err = _bd->erase(addr, eu_size);
|
||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
_programmable_array[addr / get_erase_size()] = true;
|
|
||||||
} else {
|
|
||||||
return BD_ERROR_DEVICE_ERROR;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
addr += eu_size;
|
addr += eu_size;
|
||||||
|
|
|
@ -158,7 +158,6 @@ public:
|
||||||
private:
|
private:
|
||||||
BlockDevice *_bd;
|
BlockDevice *_bd;
|
||||||
uint32_t *_erase_array;
|
uint32_t *_erase_array;
|
||||||
bool *_programmable_array;
|
|
||||||
uint32_t _erase_cycles;
|
uint32_t _erase_cycles;
|
||||||
uint32_t _init_ref_count;
|
uint32_t _init_ref_count;
|
||||||
bool _is_initialized;
|
bool _is_initialized;
|
||||||
|
|
Loading…
Reference in New Issue