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 --- .../Components/ConfigServer/src/csPersistentMem.c | 221 +++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 digital/zigbit/bitcloud/stack/Components/ConfigServer/src/csPersistentMem.c (limited to 'digital/zigbit/bitcloud/stack/Components/ConfigServer/src/csPersistentMem.c') diff --git a/digital/zigbit/bitcloud/stack/Components/ConfigServer/src/csPersistentMem.c b/digital/zigbit/bitcloud/stack/Components/ConfigServer/src/csPersistentMem.c new file mode 100644 index 00000000..a6f5fb34 --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ConfigServer/src/csPersistentMem.c @@ -0,0 +1,221 @@ +/****************************************************************************** + \file csPersistentMem.c + + \brief + Configuration Server persistent memory to store in EEPROM + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2010 , Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 28.10.10 A. Razinkov - Created. +******************************************************************************/ + +/****************************************************************************** + Includes section +******************************************************************************/ +#include +#include +#ifndef _MAC2_ +#include +#include +#endif +#include +#include +#ifndef _MAC2_ +#include +#endif + +/****************************************************************************** + Defines section +******************************************************************************/ +/* Macros used to define records in csPersistentMemTable table*/ +#define PERSISTREC(id, address) {address, RECORD_OFFSET(CS_PersistentDataOffsets_t, id)} +#define RECORD_OFFSET(struct_type, field_name) (offsetof(struct_type, field_name) + SYSTEM_BASE_EEPROM_ADDRESS) + +#ifdef _COMMISSIONING_ +#define PERSISTENT_ITEMS_AMOUNT (ARRAY_SIZE(csPersistentMemTable)) +#define PERSISTENT_MEMORY_SIZE (sizeof(CS_PersistentDataOffsets_t)) +#else +#define PERSISTENT_ITEMS_AMOUNT 0U +#define PERSISTENT_MEMORY_SIZE 0U +#endif /* _COMMISSIONING_ */ + +/****************************************************************************** + Types section +******************************************************************************/ +/* + * Persistence module used to save some of ConfigServer items to EEPROM. + * Items to save enumerated in csPersistentMemTable, stored in FLASH. + * This table consists of CS_PersistantData_t records. + * Every record have 2 values: address (in RAM) of item to save and the offset - address in + * EEPROM, were item will be placed. + * Size of area occupied by item calculated by difference from offset of next item. + * + * Macros PERSISTREC(id, address) is used to mount records in csPersistentMemTable. + * It automatically calculates the offsets for each item with the help of RECORD_OFFSET macros. + * When all macroses gets expanded, code looks like this: + * + * typedef struct { + * uint8_t id1, + * uint16_t id2, + * ExtAddr_t id3 + * } CS_PersistentDataOffsets_t ; + * csPersistentMemTable = + * { + * address1, __field_offset(CS_PersistentDataOffsets_t, id1), + * address2, __field_offset(CS_PersistentDataOffsets_t, id2), + * address3, __field_offset(CS_PersistentDataOffsets_t, id3), + * }; + * + * Please pay attention: records in csPersistentMemTable must be in the same order and under + * the same features as defined in CS_PersistentDataOffsets_t offsets structure. + */ + +/* CS_PersistentDataOffsets_t structure used to automatically calculate + * offsets for csPersistentMemTable. + * Variables of this structure never instantiated. */ +#ifdef _COMMISSIONING_ +BEGIN_PACK +typedef struct PACK +{ + ExtAddr_t CS_UID_ID; + int8_t CS_RF_TX_POWER_ID; +#ifndef _MAC2_ + ExtPanId_t CS_EXT_PANID_ID; + uint32_t CS_CHANNEL_MASK_ID; + uint8_t CS_CHANNEL_PAGE_ID; + DeviceType_t CS_DEVICE_TYPE_ID; + bool CS_RX_ON_WHEN_IDLE_ID; + bool CS_COMPLEX_DESCRIPTOR_AVAILABLE_ID; + bool CS_USER_DESCRIPTOR_AVAILABLE_ID; + UserDescriptor_t CS_ZDP_USER_DESCRIPTOR_ID; + PanId_t CS_NWK_PANID_ID; + bool CS_NWK_PREDEFINED_PANID_ID; + ShortAddr_t CS_NWK_ADDR_ID; + bool CS_NWK_UNIQUE_ADDR_ID; + bool CS_DTR_WAKEUP_ID; +#if defined(_POWER_FAILURE_) + ShortAddr_t CS_NWK_PARENT_ADDR_ID; + uint8_t CS_NWK_DEPTH_ID; + ExtPanId_t CS_NWK_EXT_PANID_ID; + uint8_t CS_NWK_LOGICAL_CHANNEL_ID; + uint8_t CS_POWER_FAILURE_ID; +#endif /* _POWER_FAILURE_ */ +#if defined(_SECURITY_) + ExtAddr_t CS_APS_TRUST_CENTER_ADDRESS_ID; + uint8_t CS_ZDO_SECURITY_STATUS_ID; +#endif /* _SECURITY_ */ +#if defined(_POWER_FAILURE_) + uint8_t CS_NEIB_TABLE_ID[CS_NEIB_TABLE_SIZE * sizeof(Neib_t)]; + #if defined(_BINDING_) && (CS_APS_BINDING_TABLE_SIZE > 0) + ApsBindingEntry_t CS_APS_BINDING_TABLE_ID[CS_APS_BINDING_TABLE_SIZE]; + #endif /* _BINDING_ */ + #if defined(_SECURITY_) + NWK_SecurityIB_t CS_NWK_SECURITY_IB_ID; + NWK_SecurityKey_t CS_NWK_SECURITY_KEYS_ID[CS_NWK_SECURITY_KEYS_AMOUNT]; + #endif /* _SECURITY_ */ +#endif /* _POWER_FAILURE_ */ +#if defined (_GROUP_TABLE_) + uint8_t CS_GROUP_TABLE_ID[(CS_GROUP_TABLE_SIZE * sizeof(NWK_GroupTableEntry_t))]; +#endif /* _GROUP_TABLE_ */ +#if defined(_SECURITY_) + #if defined(_TC_PERMISSION_TABLE_) && CS_MAX_TC_ALLOWED_DEVICES_AMOUNT > 0 + uint8_t CS_TC_PERMISSION_TABLE_ID[sizeof(ExtAddr_t) * CS_MAX_TC_ALLOWED_DEVICES_AMOUNT]; + #endif + #if defined _LINK_SECURITY_ && CS_APS_KEY_PAIR_DESCRIPTORS_AMOUNT > 0 + + uint8_t CS_APS_KEY_PAIR_DESCRIPTORS_ID[(CS_APS_KEY_PAIR_DESCRIPTORS_AMOUNT * sizeof(ApsKeyPairDescriptor_t))]; + #endif +#endif /* _SECURITY_ */ +#endif /* _MAC2_ */ +} CS_PersistentDataOffsets_t; +END_PACK +/****************************************************************************** + External variables section +******************************************************************************/ +extern SIB_t csSIB; +extern NIB_t csNIB; +extern ZIB_t csZIB; +extern PIB_t csPIB; +extern CS_StackBuffers_t stackBuffers; +#ifdef _LINK_SECURITY_ +extern CS_ReadOnlyItems_t PROGMEM_DECLARE(csReadOnlyItems); +#endif + +/****************************************************************************** + Global variables section +******************************************************************************/ +/* Table of Configuration Server persistent parameters, stored in FLASH. + * This table is used by Persist Data Server, which performs parameters storing + * and backuping from persistent memory. + * */ +PROGMEM_DECLARE(const CS_PersistantData_t csPersistentMemTable[]) = +{ + PERSISTREC(CS_UID_ID, &csPIB.macAttr.extAddr), + PERSISTREC(CS_RF_TX_POWER_ID, &csSIB.csRfTxPower), +#ifndef _MAC2_ + PERSISTREC(CS_EXT_PANID_ID, &csSIB.csExtPANID), + PERSISTREC(CS_CHANNEL_MASK_ID, &csZIB.channelMask), + PERSISTREC(CS_CHANNEL_PAGE_ID, &csNIB.channelPage), + PERSISTREC(CS_DEVICE_TYPE_ID, &csNIB.deviceType), + PERSISTREC(CS_RX_ON_WHEN_IDLE_ID, &csSIB.csRxOnWhenIdle), + PERSISTREC(CS_COMPLEX_DESCRIPTOR_AVAILABLE_ID, &csSIB.csComplexDescriptorAvailable), + PERSISTREC(CS_USER_DESCRIPTOR_AVAILABLE_ID, &csSIB.csUserDescriptorAvailable), + PERSISTREC(CS_ZDP_USER_DESCRIPTOR_ID, &csSIB.csUserDescriptor), + PERSISTREC(CS_NWK_PANID_ID, &csSIB.csNwkPanid), + PERSISTREC(CS_NWK_PREDEFINED_PANID_ID, &csSIB.csNwkPredefinedPanid), + PERSISTREC(CS_NWK_ADDR_ID, &csNIB.networkAddress), + PERSISTREC(CS_NWK_UNIQUE_ADDR_ID, &csNIB.uniqueAddr), + PERSISTREC(CS_DTR_WAKEUP_ID, &csSIB.csDtrWakeup), +#if defined(_POWER_FAILURE_) + PERSISTREC(CS_NWK_PARENT_ADDR_ID, &csNIB.parentNetworkAddress), + PERSISTREC(CS_NWK_DEPTH_ID, &csNIB.depth), + PERSISTREC(CS_NWK_EXT_PANID_ID, &csNIB.extendedPanId), + PERSISTREC(CS_NWK_LOGICAL_CHANNEL_ID, &csSIB.csNwkLogicalChannel), + PERSISTREC(CS_POWER_FAILURE_ID, &csSIB.csPowerFailure), +#endif /* _POWER_FAILURE_ */ +#if defined(_SECURITY_) + PERSISTREC(CS_APS_TRUST_CENTER_ADDRESS_ID, &csAIB.trustCenterAddress), + PERSISTREC(CS_ZDO_SECURITY_STATUS_ID, &csSIB.csZdoSecurityStatus), +#endif /* _SECURITY_ */ + +#if defined(_POWER_FAILURE_) + PERSISTREC(CS_NEIB_TABLE_ID, &stackBuffers.csNeibTable), + #if defined(_BINDING_) && (CS_APS_BINDING_TABLE_SIZE > 0) + PERSISTREC(CS_APS_BINDING_TABLE_ID, &stackBuffers.csApsBindingTable), + #endif /* _BINDING_ */ + #if defined(_SECURITY_) + PERSISTREC(CS_NWK_SECURITY_IB_ID, &csNIB.securityIB), + PERSISTREC(CS_NWK_SECURITY_KEYS_ID, &stackBuffers.csNwkSecKeys), + #endif /* _SECURITY_ */ +#endif /* _POWER_FAILURE_ */ +#if defined (_GROUP_TABLE_) + PERSISTREC(CS_GROUP_TABLE_ID, &stackBuffers.csGroupTable), +#endif /* _GROUP_TABLE_ */ +#if defined(_SECURITY_) + #if defined(_TC_PERMISSION_TABLE_) && CS_MAX_TC_ALLOWED_DEVICES_AMOUNT > 0 + PERSISTREC(CS_TC_PERMISSION_TABLE_ID, &stackBuffers.csTcDevicePermissionTable), + #endif /* _TC_PERMISSION_TABLE_ */ + #if defined _LINK_SECURITY_ && CS_APS_KEY_PAIR_DESCRIPTORS_AMOUNT > 0 + + PERSISTREC(CS_APS_KEY_PAIR_DESCRIPTORS_ID, &stackBuffers.csApsKeyPairDescriptors), + #endif /* _LINK_SECURITY_ */ + +#endif /* _SECURITY_ */ +#endif /* _MAC2_ */ +}; +#endif /* _COMMISSIONING_ */ + +/* Number of records in csPersistentMemTable*/ +const uint8_t csPersistentItemsAmount = PERSISTENT_ITEMS_AMOUNT; + +/* Total size of memory occupied by persistent parameters */ +const uint16_t csPersistentMemorySize = PERSISTENT_MEMORY_SIZE + SYSTEM_BASE_EEPROM_ADDRESS; + +/* eof csPersistentMem.c */ -- cgit v1.2.3