Skip to content

Commit baabb52

Browse files
authored
Merge pull request #11 from ARMmbed/david_fix_init
Add some logic related to initialization
2 parents ec21750 + c768574 commit baabb52

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

DataFlashBlockDevice.cpp

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616

1717
#include "DataFlashBlockDevice.h"
18+
#include "mbed_critical.h"
1819

1920
#include <inttypes.h>
2021

@@ -138,7 +139,11 @@ DataFlashBlockDevice::DataFlashBlockDevice(PinName mosi,
138139
: _spi(mosi, miso, sclk),
139140
_cs(cs, 1),
140141
_nwp(nwp),
141-
_device_size(0)
142+
_device_size(0),
143+
_page_size(0),
144+
_block_size(0),
145+
_is_initialized(0),
146+
_init_ref_count(0)
142147
{
143148
/* check that frequency is within range */
144149
if (freq > DATAFLASH_LOW_FREQUENCY) {
@@ -161,6 +166,16 @@ int DataFlashBlockDevice::init()
161166
{
162167
DEBUG_PRINTF("init\r\n");
163168

169+
if (!_is_initialized) {
170+
_init_ref_count = 0;
171+
}
172+
173+
uint32_t val = core_util_atomic_incr_u32(&_init_ref_count, 1);
174+
175+
if (val != 1) {
176+
return BD_ERROR_OK;
177+
}
178+
164179
int result = BD_ERROR_DEVICE_ERROR;
165180

166181
/* read ID register to validate model and set dimensions */
@@ -262,20 +277,40 @@ int DataFlashBlockDevice::init()
262277
/* write protect device when idle */
263278
_write_enable(false);
264279

280+
if (result == BD_ERROR_OK) {
281+
_is_initialized = true;
282+
}
283+
265284
return result;
266285
}
267286

268287
int DataFlashBlockDevice::deinit()
269288
{
270289
DEBUG_PRINTF("deinit\r\n");
271290

291+
if (!_is_initialized) {
292+
_init_ref_count = 0;
293+
return BD_ERROR_OK;
294+
}
295+
296+
uint32_t val = core_util_atomic_decr_u32(&_init_ref_count, 1);
297+
298+
if (val) {
299+
return BD_ERROR_OK;
300+
}
301+
302+
_is_initialized = false;
272303
return BD_ERROR_OK;
273304
}
274305

275306
int DataFlashBlockDevice::read(void *buffer, bd_addr_t addr, bd_size_t size)
276307
{
277308
DEBUG_PRINTF("read: %p %" PRIX64 " %" PRIX64 "\r\n", buffer, addr, size);
278309

310+
if (!_is_initialized) {
311+
return BD_ERROR_DEVICE_ERROR;
312+
}
313+
279314
int result = BD_ERROR_DEVICE_ERROR;
280315

281316
/* check parameters are valid and the read is within bounds */
@@ -317,6 +352,10 @@ int DataFlashBlockDevice::program(const void *buffer, bd_addr_t addr, bd_size_t
317352
{
318353
DEBUG_PRINTF("program: %p %" PRIX64 " %" PRIX64 "\r\n", buffer, addr, size);
319354

355+
if (!_is_initialized) {
356+
return BD_ERROR_DEVICE_ERROR;
357+
}
358+
320359
int result = BD_ERROR_DEVICE_ERROR;
321360

322361
/* check parameters are valid and the write is within bounds */
@@ -379,6 +418,10 @@ int DataFlashBlockDevice::erase(bd_addr_t addr, bd_size_t size)
379418
{
380419
DEBUG_PRINTF("erase: %" PRIX64 " %" PRIX64 "\r\n", addr, size);
381420

421+
if (!_is_initialized) {
422+
return BD_ERROR_DEVICE_ERROR;
423+
}
424+
382425
int result = BD_ERROR_DEVICE_ERROR;
383426

384427
/* check parameters are valid and the erase is within bounds */

DataFlashBlockDevice.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,8 @@ class DataFlashBlockDevice : public BlockDevice {
163163
uint32_t _device_size;
164164
uint16_t _page_size;
165165
uint16_t _block_size;
166+
bool _is_initialized;
167+
uint32_t _init_ref_count;
166168

167169
// Internal functions
168170
uint16_t _get_register(uint8_t opcode);

0 commit comments

Comments
 (0)