From b24866225a6301d3a663f874725e83c012dc25d3 Mon Sep 17 00:00:00 2001 From: Florent Duchon Date: Wed, 26 Dec 2012 17:36:00 +0100 Subject: digital/beacon: add bitcloud stack into common directory digital/zigbit --- .../stack/Components/HAL/avr/common/src/eeprom.c | 156 +++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 digital/zigbit/bitcloud/stack/Components/HAL/avr/common/src/eeprom.c (limited to 'digital/zigbit/bitcloud/stack/Components/HAL/avr/common/src/eeprom.c') diff --git a/digital/zigbit/bitcloud/stack/Components/HAL/avr/common/src/eeprom.c b/digital/zigbit/bitcloud/stack/Components/HAL/avr/common/src/eeprom.c new file mode 100644 index 00000000..8e17055b --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/HAL/avr/common/src/eeprom.c @@ -0,0 +1,156 @@ +/**************************************************************************//** + \file eeprom.c + + \brief Implementation of the EEPROM interface. + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 5/12/07 A. Khromykh - Created + ******************************************************************************/ +/****************************************************************************** + * WARNING: CHANGING THIS FILE MAY AFFECT CORE FUNCTIONALITY OF THE STACK. * + * EXPERT USERS SHOULD PROCEED WITH CAUTION. * + ******************************************************************************/ + +/****************************************************************************** + Includes section +******************************************************************************/ +#include + +/****************************************************************************** + Types section +******************************************************************************/ +typedef enum +{ + EEPROM_IDLE = 0, + EEPROM_BUSY +} EepromState_t; + +/****************************************************************************** + Global variables section +******************************************************************************/ +EepromState_t halEepromState = EEPROM_IDLE; // state +HAL_EepromParams_t halEepromParams; +void (*halEepromDone)(); + +/****************************************************************************** + Implementations section +******************************************************************************/ +/****************************************************************************** +Reads some number of bytes defined by HAL_EepromParams_t from the EEPROM. +Parameters: + params - address of HAL_EepromParams_t defined by user. + readDone - callback method +Returns: + 0 - success. + -1 - the EEPROM has request that was not completed, + number of byte to read too much. + -2 - eeprom is busy +******************************************************************************/ +int HAL_ReadEeprom(HAL_EepromParams_t *params, void (*readDone)()) +{ + uint16_t i; + + if (EEPROM_IDLE != halEepromState) + return -2; + if (NULL == params) + return -1; + if ((uint16_t)(params->address + params->length) > EEPROM_DATA_MEMORY_SIZE) + return -1; + + halEepromState = EEPROM_BUSY; + halEepromDone = readDone; + halEepromParams = *params; + halWaitEepromReady(); // wait for completion of previous operation + for (i = 0; i < halEepromParams.length; i++) + { + halEepromParams.data[i] = halReadEeprom(halEepromParams.address++); + } + halEepromParams.length = 0; + halPostTask3(HAL_EE_READY); + + return 0; +} + +/****************************************************************************** +Writes number of bytes defined by HAL_EepromParams_t to EEPROM. +By writeDone parameter user can control if write operation will be asynchronous +or synchronous. +Parameters: + params - address of HAL_EepromParams_t defined by user. + writeDone - address of callback. if writeDone is NULL write operation will be + synchronous. +Returns: + 0 - success. + -1 - the EEPROM has request that was not completed, + number of byte to write too much. + -2 - eeprom is busy +******************************************************************************/ +int HAL_WriteEeprom(HAL_EepromParams_t *params, void (*writeDone)()) +{ + uint16_t i; + + if (EEPROM_IDLE != halEepromState) + return -2; + if (NULL == params) + return -1; + if ((uint16_t)(params->address + params->length) > EEPROM_DATA_MEMORY_SIZE) + return -1; + + halEepromState = EEPROM_BUSY; + halEepromParams = *params; + halEepromDone = writeDone; + if (halEepromDone) + {// asynchronous operation + halEepromWrite(HAL_EEPROM_WRITE_MASK_INT, halEepromParams.address++, *halEepromParams.data++); + halEepromParams.length--; + return 0; + } + for (i = 0; i < halEepromParams.length; i++) + { + halEepromWrite(HAL_EEPROM_WRITE_MASK, halEepromParams.address++, *halEepromParams.data++); + } + halWaitEepromReady(); // wait for completion of previous write + halEepromState = EEPROM_IDLE; + + return 0; +} + +/****************************************************************************** +Checks the eeprom state. + +Returns: + true - eeprom is busy; + false - eeprom is free; +******************************************************************************/ +bool HAL_IsEepromBusy(void) +{ + if (EEPROM_BUSY == halEepromState) + return true; + else + return false; +} + +/****************************************************************************** +Interrupt handler about write completion to EEPROM. +******************************************************************************/ +void halSigEepromReadyHandler(void) +{ + if (!halEepromParams.length) + { + halEepromState = EEPROM_IDLE; + if (NULL != halEepromDone) + halEepromDone(); + return; + } + halEepromWrite(HAL_EEPROM_WRITE_MASK_INT, halEepromParams.address++, *halEepromParams.data++); + halEepromParams.length--; +} +//eof eeprom.c -- cgit v1.2.3