mirror of https://github.com/ARMmbed/mbed-os.git
Merge pull request #11 from ARMmbed/david_fix_init
Add some logic related to initializationpull/7774/head
commit
baabb52097
|
@ -15,6 +15,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "DataFlashBlockDevice.h"
|
#include "DataFlashBlockDevice.h"
|
||||||
|
#include "mbed_critical.h"
|
||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
@ -138,7 +139,11 @@ DataFlashBlockDevice::DataFlashBlockDevice(PinName mosi,
|
||||||
: _spi(mosi, miso, sclk),
|
: _spi(mosi, miso, sclk),
|
||||||
_cs(cs, 1),
|
_cs(cs, 1),
|
||||||
_nwp(nwp),
|
_nwp(nwp),
|
||||||
_device_size(0)
|
_device_size(0),
|
||||||
|
_page_size(0),
|
||||||
|
_block_size(0),
|
||||||
|
_is_initialized(0),
|
||||||
|
_init_ref_count(0)
|
||||||
{
|
{
|
||||||
/* check that frequency is within range */
|
/* check that frequency is within range */
|
||||||
if (freq > DATAFLASH_LOW_FREQUENCY) {
|
if (freq > DATAFLASH_LOW_FREQUENCY) {
|
||||||
|
@ -161,6 +166,16 @@ int DataFlashBlockDevice::init()
|
||||||
{
|
{
|
||||||
DEBUG_PRINTF("init\r\n");
|
DEBUG_PRINTF("init\r\n");
|
||||||
|
|
||||||
|
if (!_is_initialized) {
|
||||||
|
_init_ref_count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t val = core_util_atomic_incr_u32(&_init_ref_count, 1);
|
||||||
|
|
||||||
|
if (val != 1) {
|
||||||
|
return BD_ERROR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
int result = BD_ERROR_DEVICE_ERROR;
|
int result = BD_ERROR_DEVICE_ERROR;
|
||||||
|
|
||||||
/* read ID register to validate model and set dimensions */
|
/* read ID register to validate model and set dimensions */
|
||||||
|
@ -262,6 +277,10 @@ int DataFlashBlockDevice::init()
|
||||||
/* write protect device when idle */
|
/* write protect device when idle */
|
||||||
_write_enable(false);
|
_write_enable(false);
|
||||||
|
|
||||||
|
if (result == BD_ERROR_OK) {
|
||||||
|
_is_initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,6 +288,18 @@ int DataFlashBlockDevice::deinit()
|
||||||
{
|
{
|
||||||
DEBUG_PRINTF("deinit\r\n");
|
DEBUG_PRINTF("deinit\r\n");
|
||||||
|
|
||||||
|
if (!_is_initialized) {
|
||||||
|
_init_ref_count = 0;
|
||||||
|
return BD_ERROR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t val = core_util_atomic_decr_u32(&_init_ref_count, 1);
|
||||||
|
|
||||||
|
if (val) {
|
||||||
|
return BD_ERROR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
_is_initialized = false;
|
||||||
return BD_ERROR_OK;
|
return BD_ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -276,6 +307,10 @@ int DataFlashBlockDevice::read(void *buffer, bd_addr_t addr, bd_size_t size)
|
||||||
{
|
{
|
||||||
DEBUG_PRINTF("read: %p %" PRIX64 " %" PRIX64 "\r\n", buffer, addr, size);
|
DEBUG_PRINTF("read: %p %" PRIX64 " %" PRIX64 "\r\n", buffer, addr, size);
|
||||||
|
|
||||||
|
if (!_is_initialized) {
|
||||||
|
return BD_ERROR_DEVICE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
int result = BD_ERROR_DEVICE_ERROR;
|
int result = BD_ERROR_DEVICE_ERROR;
|
||||||
|
|
||||||
/* check parameters are valid and the read is within bounds */
|
/* 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
|
||||||
{
|
{
|
||||||
DEBUG_PRINTF("program: %p %" PRIX64 " %" PRIX64 "\r\n", buffer, addr, size);
|
DEBUG_PRINTF("program: %p %" PRIX64 " %" PRIX64 "\r\n", buffer, addr, size);
|
||||||
|
|
||||||
|
if (!_is_initialized) {
|
||||||
|
return BD_ERROR_DEVICE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
int result = BD_ERROR_DEVICE_ERROR;
|
int result = BD_ERROR_DEVICE_ERROR;
|
||||||
|
|
||||||
/* check parameters are valid and the write is within bounds */
|
/* 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)
|
||||||
{
|
{
|
||||||
DEBUG_PRINTF("erase: %" PRIX64 " %" PRIX64 "\r\n", addr, size);
|
DEBUG_PRINTF("erase: %" PRIX64 " %" PRIX64 "\r\n", addr, size);
|
||||||
|
|
||||||
|
if (!_is_initialized) {
|
||||||
|
return BD_ERROR_DEVICE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
int result = BD_ERROR_DEVICE_ERROR;
|
int result = BD_ERROR_DEVICE_ERROR;
|
||||||
|
|
||||||
/* check parameters are valid and the erase is within bounds */
|
/* check parameters are valid and the erase is within bounds */
|
||||||
|
|
|
@ -163,6 +163,8 @@ private:
|
||||||
uint32_t _device_size;
|
uint32_t _device_size;
|
||||||
uint16_t _page_size;
|
uint16_t _page_size;
|
||||||
uint16_t _block_size;
|
uint16_t _block_size;
|
||||||
|
bool _is_initialized;
|
||||||
|
uint32_t _init_ref_count;
|
||||||
|
|
||||||
// Internal functions
|
// Internal functions
|
||||||
uint16_t _get_register(uint8_t opcode);
|
uint16_t _get_register(uint8_t opcode);
|
||||||
|
|
Loading…
Reference in New Issue