The Freescale MCR20A Simple Media Access Controller (MCR20A SMAC) is a simple ANSI C based codebase available as sample source code. The MCR20A SMAC is used for developing proprietary RF transceiver applications using Freescale’s MCR20A 2.4 GHz transceiver 

Fork of fsl_smac by Freescale

The MCR20A SMAC is a small codebase that provides simple communication and test applications based on drivers, (802.15.4 compliant) PHY, and framework utilities available as source code. This environment is useful for hardware and RF debug, hardware standards certification, and developing proprietary applications. The MCR20A SMAC is provided as part of the Example Application Demos available for MCR20A and also as a standalone set of files.

SMAC features include:

  • Compact footprint.
  • Very low power, proprietary, bidirectional RF communication link.
  • The MCR20A radio allows packet filtering by hardware by checking the preamble and the synchronization word, which reduces software overhead and memory footprint.
  • Broadcast communication.
  • Unicast communication — MCR20A SMAC includes a Node Address 16-bit field. This allows SMAC to perform unicast transmissions. To change the address of a node, modify this constant: gNodeAddress_c inside the SMAC_Config.h file, or call SMACSetShortSrcAddress(uint16_t nwShortAddress). The address is set to 0xBEAD by default. Some of the Demo Applications allow the user to change this address at runtime.
  • Change of current PAN. The SMAC packet uses a short 802.15.4 compliant header with a hard-coded configuration for frame control which allows the user to switch between PANs. The PAN address has also 16 bits (gDefaultPanID_c). This address can be modified by changing the default value from SMAC_Config.h file or by calling SMACSetPanID(uint16_t nwShortPanID.
  • There are no blocking functions within the MCR20A SMAC.
  • Easy-to-use sample applications included.
  • Light-weight, custom LBT algorithm.
  • Light-weight, custom, AA mechanism which is transparent to the user after enabling the feature.
  • Encryption using Advanced Encryption Standard in Cipher Block Chaining mode with configurable initial vector and key.
  • Configurable number of retries and backoff interval.
  • Inter-layer communication using SAPs.
  • The MCR20A SMAC also filters packets that have correct addressing information (pass address filtering) but are not in the expected format (short addressing, no security, data frame).

Documentation

SMAC Reference Manual

Committer:
andreikovacs
Date:
Tue Aug 18 12:48:33 2015 +0000
Revision:
0:401ba973869e
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andreikovacs 0:401ba973869e 1 /**************************************************************************************************
andreikovacs 0:401ba973869e 2 * SMAC implementation.
andreikovacs 0:401ba973869e 3 *
andreikovacs 0:401ba973869e 4 * Freescale Semiconductor Inc.
andreikovacs 0:401ba973869e 5 * (c) Copyright 2004-2014 Freescale Semiconductor, Inc.
andreikovacs 0:401ba973869e 6 * ALL RIGHTS RESERVED.
andreikovacs 0:401ba973869e 7 *
andreikovacs 0:401ba973869e 8 ***************************************************************************************************
andreikovacs 0:401ba973869e 9 *
andreikovacs 0:401ba973869e 10 * THIS SOFTWARE IS PROVIDED BY FREESCALE "AS IS" AND ANY EXPRESSED OR
andreikovacs 0:401ba973869e 11 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
andreikovacs 0:401ba973869e 12 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
andreikovacs 0:401ba973869e 13 * IN NO EVENT SHALL FREESCALE OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
andreikovacs 0:401ba973869e 14 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
andreikovacs 0:401ba973869e 15 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
andreikovacs 0:401ba973869e 16 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
andreikovacs 0:401ba973869e 17 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
andreikovacs 0:401ba973869e 18 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
andreikovacs 0:401ba973869e 19 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
andreikovacs 0:401ba973869e 20 * THE POSSIBILITY OF SUCH DAMAGE.
andreikovacs 0:401ba973869e 21 *
andreikovacs 0:401ba973869e 22 ***********************************************************************************************//*!
andreikovacs 0:401ba973869e 23 **************************************************************************************************/
andreikovacs 0:401ba973869e 24 #include "SMAC.h"
andreikovacs 0:401ba973869e 25 #include "PhyInterface.h"
andreikovacs 0:401ba973869e 26 #include "EmbeddedTypes.h"
andreikovacs 0:401ba973869e 27
andreikovacs 0:401ba973869e 28 #include "SMAC_Config.h"
andreikovacs 0:401ba973869e 29
andreikovacs 0:401ba973869e 30 #include "MemManager.h"
andreikovacs 0:401ba973869e 31 #include "FunctionLib.h"
andreikovacs 0:401ba973869e 32 #if 0
andreikovacs 0:401ba973869e 33 #include "panic.h"
andreikovacs 0:401ba973869e 34 #endif
andreikovacs 0:401ba973869e 35
andreikovacs 0:401ba973869e 36 #include "cmsis_os.h"
andreikovacs 0:401ba973869e 37 #include "rtos.h"
andreikovacs 0:401ba973869e 38
andreikovacs 0:401ba973869e 39 /************************************************************************************
andreikovacs 0:401ba973869e 40 *************************************************************************************
andreikovacs 0:401ba973869e 41 * Public memory declarations
andreikovacs 0:401ba973869e 42 *************************************************************************************
andreikovacs 0:401ba973869e 43 ************************************************************************************/
andreikovacs 0:401ba973869e 44 uint8_t gTotalChannels;
andreikovacs 0:401ba973869e 45
andreikovacs 0:401ba973869e 46 /************************************************************************************
andreikovacs 0:401ba973869e 47 *************************************************************************************
andreikovacs 0:401ba973869e 48 * Private memory declarations
andreikovacs 0:401ba973869e 49 *************************************************************************************
andreikovacs 0:401ba973869e 50 ************************************************************************************/
andreikovacs 0:401ba973869e 51 static smacStates_t smacState;
andreikovacs 0:401ba973869e 52 /*volatile*/ static prssPacketPtr_t smacProccesPacketPtr;
andreikovacs 0:401ba973869e 53 static phyRxParams_t smacLastDataRxParams;
andreikovacs 0:401ba973869e 54 #if defined (gPHY_802_15_4g_d)
andreikovacs 0:401ba973869e 55 static smacPacket_t smacPacketConfig;
andreikovacs 0:401ba973869e 56 #endif
andreikovacs 0:401ba973869e 57 static macToPdDataMessage_t * gSmacDataMessage;
andreikovacs 0:401ba973869e 58 static macToPlmeMessage_t * gSmacMlmeMessage;
andreikovacs 0:401ba973869e 59
andreikovacs 0:401ba973869e 60 static uint16_t u16PanID;
andreikovacs 0:401ba973869e 61 static uint16_t u16ShortSrcAddress;
andreikovacs 0:401ba973869e 62
andreikovacs 0:401ba973869e 63 static uint8_t u8AckRetryCounter = 0;
andreikovacs 0:401ba973869e 64 static uint8_t u8CCARetryCounter = 0;
andreikovacs 0:401ba973869e 65
andreikovacs 0:401ba973869e 66 static uint8_t mSmacInitialized;
andreikovacs 0:401ba973869e 67 static uint8_t mSmacTimeoutAsked;
andreikovacs 0:401ba973869e 68 static uint8_t u8BackoffTimerId;
andreikovacs 0:401ba973869e 69 static txContextConfig_t txConfigurator;
andreikovacs 0:401ba973869e 70 static uint8_t u8SmacSeqNo;
andreikovacs 0:401ba973869e 71 //Sap Handlers Called by PHY
andreikovacs 0:401ba973869e 72 phyStatus_t PD_SMAC_SapHandler(void* pMsg, instanceId_t smacInstanceId);
andreikovacs 0:401ba973869e 73 phyStatus_t PLME_SMAC_SapHandler(void* pMsg, instanceId_t smacInstanceId);
andreikovacs 0:401ba973869e 74
andreikovacs 0:401ba973869e 75 /************************************************************************************
andreikovacs 0:401ba973869e 76 *************************************************************************************
andreikovacs 0:401ba973869e 77 * Private functions
andreikovacs 0:401ba973869e 78 *************************************************************************************
andreikovacs 0:401ba973869e 79 ************************************************************************************/
andreikovacs 0:401ba973869e 80 static bool_t SMACPacketCheck(pdDataToMacMessage_t* pMsgFromPhy);
andreikovacs 0:401ba973869e 81 static void BackoffTimeElapsed(void const *arg);
andreikovacs 0:401ba973869e 82
andreikovacs 0:401ba973869e 83 osTimerDef (SmacTimer, BackoffTimeElapsed);
andreikovacs 0:401ba973869e 84 /************************************************************************************
andreikovacs 0:401ba973869e 85 *************************************************************************************
andreikovacs 0:401ba973869e 86 * Interface functions
andreikovacs 0:401ba973869e 87 *************************************************************************************
andreikovacs 0:401ba973869e 88 ************************************************************************************/
andreikovacs 0:401ba973869e 89 uint8_t TMR_AllocateTimer
andreikovacs 0:401ba973869e 90 (
andreikovacs 0:401ba973869e 91 void
andreikovacs 0:401ba973869e 92 )
andreikovacs 0:401ba973869e 93 {
andreikovacs 0:401ba973869e 94 //RtosTimer smac_timer(u8BackoffTimerId, osTimerOnce , NULL);
andreikovacs 0:401ba973869e 95 return 0;
andreikovacs 0:401ba973869e 96 }
andreikovacs 0:401ba973869e 97
andreikovacs 0:401ba973869e 98 uint8_t TMR_StartSingleShotTimer
andreikovacs 0:401ba973869e 99 (
andreikovacs 0:401ba973869e 100 uint8_t timerID,
andreikovacs 0:401ba973869e 101 uint32_t timeInMilliseconds,
andreikovacs 0:401ba973869e 102 void (*pfTimerCallBack)(const void *),
andreikovacs 0:401ba973869e 103 void *param
andreikovacs 0:401ba973869e 104 )
andreikovacs 0:401ba973869e 105 {
andreikovacs 0:401ba973869e 106 //RtosTimer smac_timer(pfTimerCallBack, osTimerOnce , NULL);
andreikovacs 0:401ba973869e 107
andreikovacs 0:401ba973869e 108 osTimerId id = osTimerCreate (osTimer(SmacTimer), osTimerOnce, NULL);
andreikovacs 0:401ba973869e 109 osTimerStart (id, timeInMilliseconds);
andreikovacs 0:401ba973869e 110 return 0;
andreikovacs 0:401ba973869e 111 }
andreikovacs 0:401ba973869e 112
andreikovacs 0:401ba973869e 113
andreikovacs 0:401ba973869e 114 /***********************************************************************************/
andreikovacs 0:401ba973869e 115 /******************************** SMAC Data primitives *****************************/
andreikovacs 0:401ba973869e 116 /***********************************************************************************/
andreikovacs 0:401ba973869e 117
andreikovacs 0:401ba973869e 118 /************************************************************************************
andreikovacs 0:401ba973869e 119 * MCPSDataRequest
andreikovacs 0:401ba973869e 120 *
andreikovacs 0:401ba973869e 121 * This data primitive is used to send an over the air packet. This is an asynchronous
andreikovacs 0:401ba973869e 122 * function, it means it asks SMAC to transmit one OTA packet, but when the function
andreikovacs 0:401ba973869e 123 * returns it is not sent already.
andreikovacs 0:401ba973869e 124 *
andreikovacs 0:401ba973869e 125 ************************************************************************************/
andreikovacs 0:401ba973869e 126 smacErrors_t MCPSDataRequest
andreikovacs 0:401ba973869e 127 (
andreikovacs 0:401ba973869e 128 txPacket_t *psTxPacket //IN:Pointer to the packet to be transmitted
andreikovacs 0:401ba973869e 129 )
andreikovacs 0:401ba973869e 130 {
andreikovacs 0:401ba973869e 131 macToPdDataMessage_t *pMsg;
andreikovacs 0:401ba973869e 132 phyStatus_t u8PhyRes = gPhySuccess_c;
andreikovacs 0:401ba973869e 133
andreikovacs 0:401ba973869e 134 #if(TRUE == smacInitializationValidation_d)
andreikovacs 0:401ba973869e 135 if(FALSE == mSmacInitialized)
andreikovacs 0:401ba973869e 136 {
andreikovacs 0:401ba973869e 137 return gErrorNoValidCondition_c;
andreikovacs 0:401ba973869e 138 }
andreikovacs 0:401ba973869e 139 #endif /* TRUE == smacInitializationValidation_d */
andreikovacs 0:401ba973869e 140
andreikovacs 0:401ba973869e 141 #if(TRUE == smacParametersValidation_d)
andreikovacs 0:401ba973869e 142 uint8_t u8MaxLen=0;
andreikovacs 0:401ba973869e 143
andreikovacs 0:401ba973869e 144 u8MaxLen = gMaxSmacSDULength_c;
andreikovacs 0:401ba973869e 145
andreikovacs 0:401ba973869e 146 if((NULL == psTxPacket) || (u8MaxLen < psTxPacket->u8DataLength))
andreikovacs 0:401ba973869e 147 {
andreikovacs 0:401ba973869e 148 return gErrorOutOfRange_c;
andreikovacs 0:401ba973869e 149 }
andreikovacs 0:401ba973869e 150 #endif /* TRUE == smacParametersValidation_d */
andreikovacs 0:401ba973869e 151
andreikovacs 0:401ba973869e 152 if(mSmacStateIdle_c != smacState)
andreikovacs 0:401ba973869e 153 {
andreikovacs 0:401ba973869e 154 return gErrorBusy_c;
andreikovacs 0:401ba973869e 155 }
andreikovacs 0:401ba973869e 156
andreikovacs 0:401ba973869e 157 u8SmacSeqNo++;
andreikovacs 0:401ba973869e 158 u8AckRetryCounter = 0;
andreikovacs 0:401ba973869e 159 u8CCARetryCounter = 0;
andreikovacs 0:401ba973869e 160
andreikovacs 0:401ba973869e 161 psTxPacket->u8DataLength = psTxPacket->u8DataLength + gSmacHeaderBytes_c;
andreikovacs 0:401ba973869e 162
andreikovacs 0:401ba973869e 163 pMsg = (macToPdDataMessage_t*)MEM_BufferAlloc( sizeof(macToPdDataMessage_t) +
andreikovacs 0:401ba973869e 164 psTxPacket->u8DataLength);
andreikovacs 0:401ba973869e 165 if(pMsg == NULL )
andreikovacs 0:401ba973869e 166 {
andreikovacs 0:401ba973869e 167 return gErrorNoResourcesAvailable_c;
andreikovacs 0:401ba973869e 168 }
andreikovacs 0:401ba973869e 169 /* Fill with Phy related data */
andreikovacs 0:401ba973869e 170 pMsg->macInstance = smacInstance;
andreikovacs 0:401ba973869e 171 pMsg->msgType = gPdDataReq_c;
andreikovacs 0:401ba973869e 172 //SMAC doesn't use slotted mode
andreikovacs 0:401ba973869e 173 pMsg->msgData.dataReq.slottedTx = gPhyUnslottedMode_c;
andreikovacs 0:401ba973869e 174 //start transmission immediately
andreikovacs 0:401ba973869e 175 pMsg->msgData.dataReq.startTime = gPhySeqStartAsap_c;
andreikovacs 0:401ba973869e 176 #ifdef gPHY_802_15_4g_d
andreikovacs 0:401ba973869e 177 //for sub-Gig phy handles duration in case of ACK
andreikovacs 0:401ba973869e 178 pMsg->msgData.dataReq.txDuration = 0xFFFFFFFF;
andreikovacs 0:401ba973869e 179 #else
andreikovacs 0:401ba973869e 180 if(txConfigurator.autoAck &&
andreikovacs 0:401ba973869e 181 psTxPacket->smacHeader.destAddr != 0xFFFF &&
andreikovacs 0:401ba973869e 182 psTxPacket->smacHeader.panId != 0xFFFF)
andreikovacs 0:401ba973869e 183 {
andreikovacs 0:401ba973869e 184 //Turn@ + phy payload(symbols)+ Turn@ + ACK
andreikovacs 0:401ba973869e 185 pMsg->msgData.dataReq.txDuration = 12 + (6 + psTxPacket->u8DataLength + 2)*2 + 12 + 42;
andreikovacs 0:401ba973869e 186 if(txConfigurator.ccaBeforeTx)
andreikovacs 0:401ba973869e 187 {
andreikovacs 0:401ba973869e 188 pMsg->msgData.dataReq.txDuration += 0x08; //CCA Duration: 8 symbols
andreikovacs 0:401ba973869e 189 }
andreikovacs 0:401ba973869e 190 }
andreikovacs 0:401ba973869e 191 else
andreikovacs 0:401ba973869e 192 {
andreikovacs 0:401ba973869e 193 pMsg->msgData.dataReq.txDuration = 0xFFFFFFFF;
andreikovacs 0:401ba973869e 194 }
andreikovacs 0:401ba973869e 195 #endif
andreikovacs 0:401ba973869e 196 pMsg->msgData.dataReq.psduLength = psTxPacket->u8DataLength;
andreikovacs 0:401ba973869e 197 pMsg->msgData.dataReq.pPsdu = (uint8_t*)&pMsg->msgData.dataReq.pPsdu +
andreikovacs 0:401ba973869e 198 sizeof(pMsg->msgData.dataReq.pPsdu);
andreikovacs 0:401ba973869e 199
andreikovacs 0:401ba973869e 200 FLib_MemCpy(pMsg->msgData.dataReq.pPsdu, &(psTxPacket->smacHeader), gSmacHeaderBytes_c);
andreikovacs 0:401ba973869e 201 FLib_MemCpy(pMsg->msgData.dataReq.pPsdu + gSmacHeaderBytes_c,
andreikovacs 0:401ba973869e 202 &(psTxPacket->smacPdu),
andreikovacs 0:401ba973869e 203 psTxPacket->u8DataLength - gSmacHeaderBytes_c);
andreikovacs 0:401ba973869e 204
andreikovacs 0:401ba973869e 205 if(txConfigurator.ccaBeforeTx)
andreikovacs 0:401ba973869e 206 {
andreikovacs 0:401ba973869e 207 //tell phy to perform CCA before transmission
andreikovacs 0:401ba973869e 208 pMsg->msgData.dataReq.CCABeforeTx = gPhyCCAMode1_c;
andreikovacs 0:401ba973869e 209 }
andreikovacs 0:401ba973869e 210 else
andreikovacs 0:401ba973869e 211 {
andreikovacs 0:401ba973869e 212 pMsg->msgData.dataReq.CCABeforeTx = gPhyNoCCABeforeTx_c;
andreikovacs 0:401ba973869e 213 }
andreikovacs 0:401ba973869e 214
andreikovacs 0:401ba973869e 215 if(txConfigurator.autoAck &&
andreikovacs 0:401ba973869e 216 psTxPacket->smacHeader.destAddr != 0xFFFF &&
andreikovacs 0:401ba973869e 217 psTxPacket->smacHeader.panId != 0xFFFF)
andreikovacs 0:401ba973869e 218 {
andreikovacs 0:401ba973869e 219 //set frame control option: ACK.
andreikovacs 0:401ba973869e 220 pMsg->msgData.dataReq.pPsdu[0] |= FRAME_CTRL_ACK_FIELD_SET;
andreikovacs 0:401ba973869e 221 pMsg->msgData.dataReq.ackRequired = gPhyRxAckRqd_c;
andreikovacs 0:401ba973869e 222 }
andreikovacs 0:401ba973869e 223 else
andreikovacs 0:401ba973869e 224 {
andreikovacs 0:401ba973869e 225 pMsg->msgData.dataReq.ackRequired = gPhyNoAckRqd_c;
andreikovacs 0:401ba973869e 226 }
andreikovacs 0:401ba973869e 227 //set sequence number;
andreikovacs 0:401ba973869e 228 pMsg->msgData.dataReq.pPsdu[2] = u8SmacSeqNo;
andreikovacs 0:401ba973869e 229 gSmacDataMessage = pMsg; //Store pointer for freeing later
andreikovacs 0:401ba973869e 230 u8PhyRes = MAC_PD_SapHandler(pMsg, 0);
andreikovacs 0:401ba973869e 231
andreikovacs 0:401ba973869e 232 psTxPacket->u8DataLength -= gSmacHeaderBytes_c;
andreikovacs 0:401ba973869e 233
andreikovacs 0:401ba973869e 234 if(u8PhyRes == gPhySuccess_c)
andreikovacs 0:401ba973869e 235 {
andreikovacs 0:401ba973869e 236 smacState= mSmacStateTransmitting_c;
andreikovacs 0:401ba973869e 237 return gErrorNoError_c;
andreikovacs 0:401ba973869e 238 }
andreikovacs 0:401ba973869e 239 else
andreikovacs 0:401ba973869e 240 {
andreikovacs 0:401ba973869e 241 MEM_BufferFree(gSmacDataMessage);
andreikovacs 0:401ba973869e 242 gSmacDataMessage = NULL;
andreikovacs 0:401ba973869e 243 return gErrorNoResourcesAvailable_c;
andreikovacs 0:401ba973869e 244 }
andreikovacs 0:401ba973869e 245 }
andreikovacs 0:401ba973869e 246
andreikovacs 0:401ba973869e 247 /************************************************************************************
andreikovacs 0:401ba973869e 248 * MLMEConfigureTxContext
andreikovacs 0:401ba973869e 249 *
andreikovacs 0:401ba973869e 250 * This management primitive is used to configure the conditions under which SMAC will
andreikovacs 0:401ba973869e 251 * perform a transmission OTA.
andreikovacs 0:401ba973869e 252 *
andreikovacs 0:401ba973869e 253 ************************************************************************************/
andreikovacs 0:401ba973869e 254 smacErrors_t MLMEConfigureTxContext(txContextConfig_t* pTxConfig)
andreikovacs 0:401ba973869e 255 {
andreikovacs 0:401ba973869e 256 if( (pTxConfig->autoAck == FALSE && pTxConfig->retryCountAckFail !=0) ||
andreikovacs 0:401ba973869e 257 (pTxConfig->ccaBeforeTx == FALSE && pTxConfig->retryCountCCAFail !=0) )
andreikovacs 0:401ba973869e 258 {
andreikovacs 0:401ba973869e 259 return gErrorNoValidCondition_c;
andreikovacs 0:401ba973869e 260 }
andreikovacs 0:401ba973869e 261 if( pTxConfig->retryCountAckFail > gMaxRetriesAllowed_c ||
andreikovacs 0:401ba973869e 262 pTxConfig->retryCountCCAFail > gMaxRetriesAllowed_c)
andreikovacs 0:401ba973869e 263 {
andreikovacs 0:401ba973869e 264 return gErrorOutOfRange_c;
andreikovacs 0:401ba973869e 265 }
andreikovacs 0:401ba973869e 266 txConfigurator.autoAck = pTxConfig->autoAck;
andreikovacs 0:401ba973869e 267 txConfigurator.ccaBeforeTx = pTxConfig->ccaBeforeTx;
andreikovacs 0:401ba973869e 268 txConfigurator.retryCountAckFail = pTxConfig->retryCountAckFail;
andreikovacs 0:401ba973869e 269 txConfigurator.retryCountCCAFail = pTxConfig->retryCountCCAFail;
andreikovacs 0:401ba973869e 270
andreikovacs 0:401ba973869e 271 return gErrorNoError_c;
andreikovacs 0:401ba973869e 272 }
andreikovacs 0:401ba973869e 273
andreikovacs 0:401ba973869e 274 /************************************************************************************
andreikovacs 0:401ba973869e 275 * MLMERXEnableRequest
andreikovacs 0:401ba973869e 276 *
andreikovacs 0:401ba973869e 277 * Function used to place the radio into receive mode
andreikovacs 0:401ba973869e 278 *
andreikovacs 0:401ba973869e 279 ************************************************************************************/
andreikovacs 0:401ba973869e 280 smacErrors_t MLMERXEnableRequest
andreikovacs 0:401ba973869e 281 (
andreikovacs 0:401ba973869e 282 rxPacket_t *gsRxPacket, //OUT: Pointer to the structure where the reception results
andreikovacs 0:401ba973869e 283 // will be stored.
andreikovacs 0:401ba973869e 284 smacTime_t stTimeout //IN: 64-bit timeout value, absolute value in symbols
andreikovacs 0:401ba973869e 285 )
andreikovacs 0:401ba973869e 286 {
andreikovacs 0:401ba973869e 287
andreikovacs 0:401ba973869e 288 uint8_t u8PhyRes = 0;
andreikovacs 0:401ba973869e 289 macToPlmeMessage_t lMsg;
andreikovacs 0:401ba973869e 290
andreikovacs 0:401ba973869e 291 #if(TRUE == smacParametersValidation_d)
andreikovacs 0:401ba973869e 292 uint8_t u8MaxLen=0;
andreikovacs 0:401ba973869e 293
andreikovacs 0:401ba973869e 294 u8MaxLen = gMaxSmacSDULength_c;
andreikovacs 0:401ba973869e 295 #endif /* TRUE == smacParametersValidation_d */
andreikovacs 0:401ba973869e 296
andreikovacs 0:401ba973869e 297 #if(TRUE == smacParametersValidation_d)
andreikovacs 0:401ba973869e 298 if((NULL == gsRxPacket) || (u8MaxLen < gsRxPacket->u8MaxDataLength))
andreikovacs 0:401ba973869e 299 {
andreikovacs 0:401ba973869e 300 return gErrorOutOfRange_c;
andreikovacs 0:401ba973869e 301 }
andreikovacs 0:401ba973869e 302 #endif /* TRUE == smacParametersValidation_d */
andreikovacs 0:401ba973869e 303
andreikovacs 0:401ba973869e 304 #if(TRUE == smacInitializationValidation_d)
andreikovacs 0:401ba973869e 305 if(FALSE == mSmacInitialized)
andreikovacs 0:401ba973869e 306 {
andreikovacs 0:401ba973869e 307 return gErrorNoValidCondition_c;
andreikovacs 0:401ba973869e 308 }
andreikovacs 0:401ba973869e 309 #endif /* TRUE == smacInitializationValidation_d */
andreikovacs 0:401ba973869e 310
andreikovacs 0:401ba973869e 311 if(mSmacStateIdle_c != smacState)
andreikovacs 0:401ba973869e 312 {
andreikovacs 0:401ba973869e 313 return gErrorBusy_c;
andreikovacs 0:401ba973869e 314 }
andreikovacs 0:401ba973869e 315 if(stTimeout)
andreikovacs 0:401ba973869e 316 {
andreikovacs 0:401ba973869e 317 lMsg.msgType = gPlmeSetTRxStateReq_c;
andreikovacs 0:401ba973869e 318 lMsg.msgData.setTRxStateReq.startTime = gPhySeqStartAsap_c;
andreikovacs 0:401ba973869e 319 lMsg.macInstance = smacInstance;
andreikovacs 0:401ba973869e 320 lMsg.msgData.setTRxStateReq.state = gPhySetRxOn_c;
andreikovacs 0:401ba973869e 321 mSmacTimeoutAsked = TRUE;
andreikovacs 0:401ba973869e 322 lMsg.msgData.setTRxStateReq.rxDuration = stTimeout;
andreikovacs 0:401ba973869e 323 }
andreikovacs 0:401ba973869e 324 else
andreikovacs 0:401ba973869e 325 {
andreikovacs 0:401ba973869e 326 lMsg.msgType = gPlmeSetReq_c;
andreikovacs 0:401ba973869e 327 lMsg.msgData.setReq.PibAttribute = gPhyPibRxOnWhenIdle;
andreikovacs 0:401ba973869e 328 lMsg.msgData.setReq.PibAttributeValue = (uint64_t)1;
andreikovacs 0:401ba973869e 329 }
andreikovacs 0:401ba973869e 330 u8PhyRes = MAC_PLME_SapHandler(&lMsg, 0);
andreikovacs 0:401ba973869e 331 if(u8PhyRes == gPhySuccess_c)
andreikovacs 0:401ba973869e 332 {
andreikovacs 0:401ba973869e 333 gsRxPacket->rxStatus = rxProcessingReceptionStatus_c;
andreikovacs 0:401ba973869e 334 smacProccesPacketPtr.smacRxPacketPointer = gsRxPacket;
andreikovacs 0:401ba973869e 335
andreikovacs 0:401ba973869e 336 smacState= mSmacStateReceiving_c;
andreikovacs 0:401ba973869e 337 return gErrorNoError_c;
andreikovacs 0:401ba973869e 338 }
andreikovacs 0:401ba973869e 339 else
andreikovacs 0:401ba973869e 340 {
andreikovacs 0:401ba973869e 341 return gErrorNoResourcesAvailable_c;
andreikovacs 0:401ba973869e 342 }
andreikovacs 0:401ba973869e 343 }
andreikovacs 0:401ba973869e 344 #if defined (gPHY_802_15_4g_d)
andreikovacs 0:401ba973869e 345 /************************************************************************************
andreikovacs 0:401ba973869e 346 * MLMESetPreambleLength
andreikovacs 0:401ba973869e 347 *
andreikovacs 0:401ba973869e 348 * Function used to change the preamble size in the OTA Packet
andreikovacs 0:401ba973869e 349 *
andreikovacs 0:401ba973869e 350 ************************************************************************************/
andreikovacs 0:401ba973869e 351 smacErrors_t MLMESetPreambleLength
andreikovacs 0:401ba973869e 352 (
andreikovacs 0:401ba973869e 353 uint16_t u16preambleLength
andreikovacs 0:401ba973869e 354 )
andreikovacs 0:401ba973869e 355 {
andreikovacs 0:401ba973869e 356 #if(TRUE == smacInitializationValidation_d)
andreikovacs 0:401ba973869e 357 if(FALSE == mSmacInitialized)
andreikovacs 0:401ba973869e 358 {
andreikovacs 0:401ba973869e 359 return gErrorNoValidCondition_c;
andreikovacs 0:401ba973869e 360 }
andreikovacs 0:401ba973869e 361 #endif /* TRUE == smacInitializationValidation_d */
andreikovacs 0:401ba973869e 362
andreikovacs 0:401ba973869e 363 if(mSmacStateIdle_c != smacState)
andreikovacs 0:401ba973869e 364 {
andreikovacs 0:401ba973869e 365 return gErrorBusy_c;
andreikovacs 0:401ba973869e 366 }
andreikovacs 0:401ba973869e 367 smacPacketConfig.u16PreambleLength = u16preambleLength;
andreikovacs 0:401ba973869e 368 gPhyPib.mPIBphyFSKPreambleRepetitions = u16preambleLength;
andreikovacs 0:401ba973869e 369 PhyPib_RFUpdatePreambleLength();
andreikovacs 0:401ba973869e 370
andreikovacs 0:401ba973869e 371 return gErrorNoError_c;
andreikovacs 0:401ba973869e 372
andreikovacs 0:401ba973869e 373 }
andreikovacs 0:401ba973869e 374
andreikovacs 0:401ba973869e 375 /************************************************************************************
andreikovacs 0:401ba973869e 376 * MLMESetSyncWordSize
andreikovacs 0:401ba973869e 377 *
andreikovacs 0:401ba973869e 378 * Function used to change the synchronization word size. Values from 0 to 8 required.
andreikovacs 0:401ba973869e 379 * IMPORTANT-> Use below arguments only (indicating a direct value from 1-8 will not work)
andreikovacs 0:401ba973869e 380 * Inputs :
andreikovacs 0:401ba973869e 381 * SyncConfig_SyncSize_1
andreikovacs 0:401ba973869e 382 * SyncConfig_SyncSize_2
andreikovacs 0:401ba973869e 383 * SyncConfig_SyncSize_3
andreikovacs 0:401ba973869e 384 * SyncConfig_SyncSize_4
andreikovacs 0:401ba973869e 385 * SyncConfig_SyncSize_5
andreikovacs 0:401ba973869e 386 * SyncConfig_SyncSize_6
andreikovacs 0:401ba973869e 387 * SyncConfig_SyncSize_7
andreikovacs 0:401ba973869e 388 * SyncConfig_SyncSize_8
andreikovacs 0:401ba973869e 389 *
andreikovacs 0:401ba973869e 390 ************************************************************************************/
andreikovacs 0:401ba973869e 391 smacErrors_t MLMESetSyncWordSize
andreikovacs 0:401ba973869e 392 (
andreikovacs 0:401ba973869e 393 uint8_t u8syncWordSize
andreikovacs 0:401ba973869e 394 )
andreikovacs 0:401ba973869e 395 {
andreikovacs 0:401ba973869e 396
andreikovacs 0:401ba973869e 397 phyStatus_t status;
andreikovacs 0:401ba973869e 398 #if(TRUE == smacInitializationValidation_d)
andreikovacs 0:401ba973869e 399 if(FALSE == mSmacInitialized)
andreikovacs 0:401ba973869e 400 {
andreikovacs 0:401ba973869e 401 return gErrorNoValidCondition_c;
andreikovacs 0:401ba973869e 402 }
andreikovacs 0:401ba973869e 403 #endif /* TRUE == smacInitializationValidation_d */
andreikovacs 0:401ba973869e 404
andreikovacs 0:401ba973869e 405 if(mSmacStateIdle_c != smacState)
andreikovacs 0:401ba973869e 406 {
andreikovacs 0:401ba973869e 407 return gErrorBusy_c;
andreikovacs 0:401ba973869e 408 }
andreikovacs 0:401ba973869e 409
andreikovacs 0:401ba973869e 410 status = (phyStatus_t)Phy_SetSyncWordSize(u8syncWordSize);
andreikovacs 0:401ba973869e 411 if(status == gPhyInvalidParameter_c)
andreikovacs 0:401ba973869e 412 return gErrorOutOfRange_c;
andreikovacs 0:401ba973869e 413
andreikovacs 0:401ba973869e 414 smacPacketConfig.u8SyncWordSize = u8syncWordSize;
andreikovacs 0:401ba973869e 415
andreikovacs 0:401ba973869e 416 return gErrorNoError_c;
andreikovacs 0:401ba973869e 417
andreikovacs 0:401ba973869e 418 }
andreikovacs 0:401ba973869e 419
andreikovacs 0:401ba973869e 420 /************************************************************************************
andreikovacs 0:401ba973869e 421 * MLMESetSyncWordValue
andreikovacs 0:401ba973869e 422 *
andreikovacs 0:401ba973869e 423 * Function used to change the synchronization word value.
andreikovacs 0:401ba973869e 424 *
andreikovacs 0:401ba973869e 425 *
andreikovacs 0:401ba973869e 426 ************************************************************************************/
andreikovacs 0:401ba973869e 427 smacErrors_t MLMESetSyncWordValue
andreikovacs 0:401ba973869e 428 (
andreikovacs 0:401ba973869e 429 uint8_t *u8syncWordValue
andreikovacs 0:401ba973869e 430 )
andreikovacs 0:401ba973869e 431 {
andreikovacs 0:401ba973869e 432 uint8_t syncWordSizeTemp = smacPacketConfig.u8SyncWordSize;
andreikovacs 0:401ba973869e 433 uint8_t syncValueRegIndex = 0;
andreikovacs 0:401ba973869e 434
andreikovacs 0:401ba973869e 435 #if(TRUE == smacInitializationValidation_d)
andreikovacs 0:401ba973869e 436 if(FALSE == mSmacInitialized)
andreikovacs 0:401ba973869e 437 {
andreikovacs 0:401ba973869e 438 return gErrorNoValidCondition_c;
andreikovacs 0:401ba973869e 439 }
andreikovacs 0:401ba973869e 440 #endif /* TRUE == smacInitializationValidation_d */
andreikovacs 0:401ba973869e 441
andreikovacs 0:401ba973869e 442 if(mSmacStateIdle_c != smacState)
andreikovacs 0:401ba973869e 443 {
andreikovacs 0:401ba973869e 444 return gErrorBusy_c;
andreikovacs 0:401ba973869e 445 }
andreikovacs 0:401ba973869e 446
andreikovacs 0:401ba973869e 447 smacPacketConfig.u8SyncWordValue = u8syncWordValue;
andreikovacs 0:401ba973869e 448
andreikovacs 0:401ba973869e 449 while (syncWordSizeTemp--)
andreikovacs 0:401ba973869e 450 {
andreikovacs 0:401ba973869e 451 Phy_SetSyncWordValue(syncValueRegIndex, (uint8_t)*u8syncWordValue);
andreikovacs 0:401ba973869e 452 syncValueRegIndex++;
andreikovacs 0:401ba973869e 453 u8syncWordValue++;
andreikovacs 0:401ba973869e 454 }
andreikovacs 0:401ba973869e 455 while(syncValueRegIndex < 8)
andreikovacs 0:401ba973869e 456 {
andreikovacs 0:401ba973869e 457 Phy_SetSyncWordValue(syncValueRegIndex, 0x00);
andreikovacs 0:401ba973869e 458 syncValueRegIndex++;
andreikovacs 0:401ba973869e 459 }
andreikovacs 0:401ba973869e 460
andreikovacs 0:401ba973869e 461 return gErrorNoError_c;
andreikovacs 0:401ba973869e 462
andreikovacs 0:401ba973869e 463 }
andreikovacs 0:401ba973869e 464
andreikovacs 0:401ba973869e 465 /************************************************************************************
andreikovacs 0:401ba973869e 466 * MLMEPacketConfig
andreikovacs 0:401ba973869e 467 *
andreikovacs 0:401ba973869e 468 *
andreikovacs 0:401ba973869e 469 *
andreikovacs 0:401ba973869e 470 ************************************************************************************/
andreikovacs 0:401ba973869e 471 smacErrors_t MLMEPacketConfig
andreikovacs 0:401ba973869e 472 (
andreikovacs 0:401ba973869e 473 packetConfig_t *pPacketCfg
andreikovacs 0:401ba973869e 474 )
andreikovacs 0:401ba973869e 475 {
andreikovacs 0:401ba973869e 476 smacErrors_t err = gErrorNoError_c;
andreikovacs 0:401ba973869e 477 #if(TRUE == smacInitializationValidation_d)
andreikovacs 0:401ba973869e 478 if(FALSE == mSmacInitialized)
andreikovacs 0:401ba973869e 479 {
andreikovacs 0:401ba973869e 480 return gErrorNoValidCondition_c;
andreikovacs 0:401ba973869e 481 }
andreikovacs 0:401ba973869e 482 #endif /* TRUE == smacInitializationValidation_d */
andreikovacs 0:401ba973869e 483
andreikovacs 0:401ba973869e 484 if(mSmacStateIdle_c != smacState)
andreikovacs 0:401ba973869e 485 {
andreikovacs 0:401ba973869e 486 return gErrorBusy_c;
andreikovacs 0:401ba973869e 487 }
andreikovacs 0:401ba973869e 488 err = MLMESetSyncWordSize(pPacketCfg->u8SyncWordSize);
andreikovacs 0:401ba973869e 489 err |= MLMESetSyncWordValue(pPacketCfg->pu8SyncWord);
andreikovacs 0:401ba973869e 490 err |= MLMESetPreambleLength(pPacketCfg->u16PreambleSize);
andreikovacs 0:401ba973869e 491 if(err != gErrorNoError_c)
andreikovacs 0:401ba973869e 492 return gErrorOutOfRange_c;
andreikovacs 0:401ba973869e 493
andreikovacs 0:401ba973869e 494 return gErrorNoError_c;
andreikovacs 0:401ba973869e 495 }
andreikovacs 0:401ba973869e 496
andreikovacs 0:401ba973869e 497 #endif
andreikovacs 0:401ba973869e 498
andreikovacs 0:401ba973869e 499 /************************************************************************************
andreikovacs 0:401ba973869e 500 * MLMESetChannelRequest
andreikovacs 0:401ba973869e 501 *
andreikovacs 0:401ba973869e 502 *
andreikovacs 0:401ba973869e 503 *
andreikovacs 0:401ba973869e 504 ************************************************************************************/
andreikovacs 0:401ba973869e 505 smacErrors_t MLMESetChannelRequest
andreikovacs 0:401ba973869e 506 (
andreikovacs 0:401ba973869e 507 channels_t newChannel
andreikovacs 0:401ba973869e 508 )
andreikovacs 0:401ba973869e 509 {
andreikovacs 0:401ba973869e 510 uint8_t errorVal;
andreikovacs 0:401ba973869e 511 smacErrors_t err = gErrorNoError_c;
andreikovacs 0:401ba973869e 512
andreikovacs 0:401ba973869e 513 macToPlmeMessage_t lMsg;
andreikovacs 0:401ba973869e 514 #if(TRUE == smacInitializationValidation_d)
andreikovacs 0:401ba973869e 515 if(FALSE == mSmacInitialized)
andreikovacs 0:401ba973869e 516 {
andreikovacs 0:401ba973869e 517 return gErrorNoValidCondition_c;
andreikovacs 0:401ba973869e 518 }
andreikovacs 0:401ba973869e 519 #endif /* TRUE == smacInitializationValidation_d */
andreikovacs 0:401ba973869e 520 if(mSmacStateIdle_c != smacState)
andreikovacs 0:401ba973869e 521 {
andreikovacs 0:401ba973869e 522 return gErrorBusy_c;
andreikovacs 0:401ba973869e 523 }
andreikovacs 0:401ba973869e 524 lMsg.msgType = gPlmeSetReq_c;
andreikovacs 0:401ba973869e 525 lMsg.macInstance = smacInstance;
andreikovacs 0:401ba973869e 526 lMsg.msgData.setReq.PibAttribute = gPhyPibCurrentChannel_c;
andreikovacs 0:401ba973869e 527 lMsg.msgData.setReq.PibAttributeValue = (uint64_t) newChannel;
andreikovacs 0:401ba973869e 528
andreikovacs 0:401ba973869e 529 errorVal = MAC_PLME_SapHandler(&lMsg, 0);
andreikovacs 0:401ba973869e 530 switch (errorVal)
andreikovacs 0:401ba973869e 531 {
andreikovacs 0:401ba973869e 532 case gPhyBusy_c:
andreikovacs 0:401ba973869e 533 err = gErrorBusy_c;
andreikovacs 0:401ba973869e 534 break;
andreikovacs 0:401ba973869e 535
andreikovacs 0:401ba973869e 536 case gPhyInvalidParameter_c:
andreikovacs 0:401ba973869e 537 err = gErrorOutOfRange_c;
andreikovacs 0:401ba973869e 538 break;
andreikovacs 0:401ba973869e 539
andreikovacs 0:401ba973869e 540 case gPhySuccess_c:
andreikovacs 0:401ba973869e 541 err = gErrorNoError_c;
andreikovacs 0:401ba973869e 542 break;
andreikovacs 0:401ba973869e 543
andreikovacs 0:401ba973869e 544 default:
andreikovacs 0:401ba973869e 545 err = gErrorOutOfRange_c;
andreikovacs 0:401ba973869e 546 break;
andreikovacs 0:401ba973869e 547 }
andreikovacs 0:401ba973869e 548
andreikovacs 0:401ba973869e 549 return err;
andreikovacs 0:401ba973869e 550 }
andreikovacs 0:401ba973869e 551
andreikovacs 0:401ba973869e 552
andreikovacs 0:401ba973869e 553 /************************************************************************************
andreikovacs 0:401ba973869e 554 * MLMESetAdditionalRFOffset
andreikovacs 0:401ba973869e 555 *
andreikovacs 0:401ba973869e 556 *************************************************************************************/
andreikovacs 0:401ba973869e 557 smacErrors_t MLMESetAdditionalRFOffset (uint32_t additionalRFOffset)
andreikovacs 0:401ba973869e 558 {
andreikovacs 0:401ba973869e 559 #if(TRUE == smacInitializationValidation_d)
andreikovacs 0:401ba973869e 560 if(FALSE == mSmacInitialized)
andreikovacs 0:401ba973869e 561 {
andreikovacs 0:401ba973869e 562 return gErrorNoValidCondition_c;
andreikovacs 0:401ba973869e 563 }
andreikovacs 0:401ba973869e 564 #endif /* TRUE == smacInitializationValidation_d */
andreikovacs 0:401ba973869e 565
andreikovacs 0:401ba973869e 566 #ifdef gIncludeCalibrationOption
andreikovacs 0:401ba973869e 567 gPhyPib.mPIBAdditionalRFFrequencyOffset = additionalRFOffset;
andreikovacs 0:401ba973869e 568 return gErrorNoError_c;
andreikovacs 0:401ba973869e 569 #else
andreikovacs 0:401ba973869e 570 return gErrorNoResourcesAvailable_c;
andreikovacs 0:401ba973869e 571 #endif
andreikovacs 0:401ba973869e 572 }
andreikovacs 0:401ba973869e 573
andreikovacs 0:401ba973869e 574
andreikovacs 0:401ba973869e 575 /************************************************************************************
andreikovacs 0:401ba973869e 576 * MLMEGetAdditionalRFOffset
andreikovacs 0:401ba973869e 577 *
andreikovacs 0:401ba973869e 578 *************************************************************************************/
andreikovacs 0:401ba973869e 579 uint32_t MLMEGetAdditionalRFOffset( void )
andreikovacs 0:401ba973869e 580 {
andreikovacs 0:401ba973869e 581 #ifdef gIncludeCalibrationOption
andreikovacs 0:401ba973869e 582 return gPhyPib.mPIBAdditionalRFFrequencyOffset;
andreikovacs 0:401ba973869e 583 #else
andreikovacs 0:401ba973869e 584 return 0;
andreikovacs 0:401ba973869e 585 #endif
andreikovacs 0:401ba973869e 586 }
andreikovacs 0:401ba973869e 587
andreikovacs 0:401ba973869e 588 #if defined (gPHY_802_15_4g_d)
andreikovacs 0:401ba973869e 589 /************************************************************************************
andreikovacs 0:401ba973869e 590 * MLMESetFreqBand
andreikovacs 0:401ba973869e 591 *
andreikovacs 0:401ba973869e 592 ************************************************************************************/
andreikovacs 0:401ba973869e 593 smacErrors_t MLMESetFreqBand
andreikovacs 0:401ba973869e 594 (
andreikovacs 0:401ba973869e 595 smacFrequencyBands_t freqBand,
andreikovacs 0:401ba973869e 596 smacRFModes_t phyMode
andreikovacs 0:401ba973869e 597 )
andreikovacs 0:401ba973869e 598 {
andreikovacs 0:401ba973869e 599 return gErrorNoResourcesAvailable_c;
andreikovacs 0:401ba973869e 600 }
andreikovacs 0:401ba973869e 601
andreikovacs 0:401ba973869e 602 smacErrors_t MLMESetPhyMode(smacRFModes_t phyMode)
andreikovacs 0:401ba973869e 603 {
andreikovacs 0:401ba973869e 604 #if(TRUE == smacInitializationValidation_d)
andreikovacs 0:401ba973869e 605 if(FALSE == mSmacInitialized)
andreikovacs 0:401ba973869e 606 {
andreikovacs 0:401ba973869e 607 return gErrorNoValidCondition_c;
andreikovacs 0:401ba973869e 608 }
andreikovacs 0:401ba973869e 609 #endif /* TRUE == smacInitializationValidation_d */
andreikovacs 0:401ba973869e 610 phyStatus_t err;
andreikovacs 0:401ba973869e 611 macToPlmeMessage_t lMsg;
andreikovacs 0:401ba973869e 612
andreikovacs 0:401ba973869e 613 if(mSmacStateIdle_c != smacState)
andreikovacs 0:401ba973869e 614 {
andreikovacs 0:401ba973869e 615 return gErrorBusy_c;
andreikovacs 0:401ba973869e 616 }
andreikovacs 0:401ba973869e 617 lMsg.macInstance = smacInstance;
andreikovacs 0:401ba973869e 618 lMsg.msgType = gPlmeSetReq_c;
andreikovacs 0:401ba973869e 619 lMsg.msgData.setReq.PibAttribute = gPhyPibCurrentMode_c;
andreikovacs 0:401ba973869e 620 lMsg.msgData.setReq.PibAttributeValue = (uint64_t)phyMode;
andreikovacs 0:401ba973869e 621 err = MAC_PLME_SapHandler(&lMsg, 0);
andreikovacs 0:401ba973869e 622 if(err == gPhyInvalidParameter_c)
andreikovacs 0:401ba973869e 623 return gErrorOutOfRange_c;
andreikovacs 0:401ba973869e 624 if(err == gPhyBusy_c)
andreikovacs 0:401ba973869e 625 return gErrorBusy_c;
andreikovacs 0:401ba973869e 626
andreikovacs 0:401ba973869e 627 gTotalChannels = gPhyPib.pPIBphyRfConstants->totalNumChannels;
andreikovacs 0:401ba973869e 628
andreikovacs 0:401ba973869e 629 return gErrorNoError_c;
andreikovacs 0:401ba973869e 630 }
andreikovacs 0:401ba973869e 631
andreikovacs 0:401ba973869e 632 #endif
andreikovacs 0:401ba973869e 633 /************************************************************************************
andreikovacs 0:401ba973869e 634 * MLMEGetChannelRequest
andreikovacs 0:401ba973869e 635 *
andreikovacs 0:401ba973869e 636 *
andreikovacs 0:401ba973869e 637 *
andreikovacs 0:401ba973869e 638 ************************************************************************************/
andreikovacs 0:401ba973869e 639 channels_t MLMEGetChannelRequest
andreikovacs 0:401ba973869e 640 (
andreikovacs 0:401ba973869e 641 void
andreikovacs 0:401ba973869e 642 )
andreikovacs 0:401ba973869e 643 {
andreikovacs 0:401ba973869e 644 channels_t currentChannel;
andreikovacs 0:401ba973869e 645 macToPlmeMessage_t lMsg;
andreikovacs 0:401ba973869e 646 #if(TRUE == smacInitializationValidation_d)
andreikovacs 0:401ba973869e 647 if(FALSE == mSmacInitialized)
andreikovacs 0:401ba973869e 648 {
andreikovacs 0:401ba973869e 649 //panic(0,0,0,0);
andreikovacs 0:401ba973869e 650 }
andreikovacs 0:401ba973869e 651 #endif /* TRUE == smacInitializationValidation_d */
andreikovacs 0:401ba973869e 652 lMsg.msgType = gPlmeGetReq_c;
andreikovacs 0:401ba973869e 653 lMsg.macInstance = smacInstance;
andreikovacs 0:401ba973869e 654 lMsg.msgData.getReq.PibAttribute = gPhyPibCurrentChannel_c;
andreikovacs 0:401ba973869e 655 lMsg.msgData.getReq.pPibAttributeValue = (uint64_t*)&currentChannel;
andreikovacs 0:401ba973869e 656 MAC_PLME_SapHandler(&lMsg, 0);
andreikovacs 0:401ba973869e 657 return currentChannel;
andreikovacs 0:401ba973869e 658 }
andreikovacs 0:401ba973869e 659
andreikovacs 0:401ba973869e 660 #if defined (gPHY_802_15_4g_d)
andreikovacs 0:401ba973869e 661 /************************************************************************************
andreikovacs 0:401ba973869e 662 * MLMERssi
andreikovacs 0:401ba973869e 663 *
andreikovacs 0:401ba973869e 664 *
andreikovacs 0:401ba973869e 665 *
andreikovacs 0:401ba973869e 666 ************************************************************************************/
andreikovacs 0:401ba973869e 667 uint8_t MLMERssi(void )
andreikovacs 0:401ba973869e 668 {
andreikovacs 0:401ba973869e 669 uint8_t rssiVal;
andreikovacs 0:401ba973869e 670
andreikovacs 0:401ba973869e 671 #if(TRUE == smacInitializationValidation_d)
andreikovacs 0:401ba973869e 672 if(FALSE == mSmacInitialized)
andreikovacs 0:401ba973869e 673 {
andreikovacs 0:401ba973869e 674 return gErrorNoValidCondition_c;
andreikovacs 0:401ba973869e 675 }
andreikovacs 0:401ba973869e 676 #endif /* TRUE == smacInitializationValidation_d */
andreikovacs 0:401ba973869e 677
andreikovacs 0:401ba973869e 678 if(mSmacStateIdle_c != smacState)
andreikovacs 0:401ba973869e 679 {
andreikovacs 0:401ba973869e 680 return gErrorBusy_c;
andreikovacs 0:401ba973869e 681 }
andreikovacs 0:401ba973869e 682
andreikovacs 0:401ba973869e 683 rssiVal = Phy_GetRssi();
andreikovacs 0:401ba973869e 684 return rssiVal;
andreikovacs 0:401ba973869e 685 }
andreikovacs 0:401ba973869e 686
andreikovacs 0:401ba973869e 687 /************************************************************************************
andreikovacs 0:401ba973869e 688 * MLMESetCCADuration
andreikovacs 0:401ba973869e 689 *
andreikovacs 0:401ba973869e 690 *
andreikovacs 0:401ba973869e 691 *
andreikovacs 0:401ba973869e 692 ************************************************************************************/
andreikovacs 0:401ba973869e 693 smacErrors_t MLMESetCCADuration(uint64_t usCCADuration )
andreikovacs 0:401ba973869e 694 {
andreikovacs 0:401ba973869e 695 macToPlmeMessage_t lMsg;
andreikovacs 0:401ba973869e 696 phyStatus_t status;
andreikovacs 0:401ba973869e 697
andreikovacs 0:401ba973869e 698 #if(TRUE == smacInitializationValidation_d)
andreikovacs 0:401ba973869e 699 if(FALSE == mSmacInitialized)
andreikovacs 0:401ba973869e 700 {
andreikovacs 0:401ba973869e 701 return gErrorNoValidCondition_c;
andreikovacs 0:401ba973869e 702 }
andreikovacs 0:401ba973869e 703 #endif /* TRUE == smacInitializationValidation_d */
andreikovacs 0:401ba973869e 704
andreikovacs 0:401ba973869e 705 if(mSmacStateIdle_c != smacState)
andreikovacs 0:401ba973869e 706 {
andreikovacs 0:401ba973869e 707 return gErrorBusy_c;
andreikovacs 0:401ba973869e 708 }
andreikovacs 0:401ba973869e 709
andreikovacs 0:401ba973869e 710 usCCADuration = TIME_US_TO_TICKS(usCCADuration);
andreikovacs 0:401ba973869e 711 Phy_TimeDivider((phyTime_t*)&usCCADuration);
andreikovacs 0:401ba973869e 712
andreikovacs 0:401ba973869e 713 lMsg.msgType = gPlmeSetReq_c;
andreikovacs 0:401ba973869e 714 lMsg.msgData.setReq.PibAttribute = gPhyPibCCADuration_c;
andreikovacs 0:401ba973869e 715 lMsg.msgData.setReq.PibAttributeValue = usCCADuration;
andreikovacs 0:401ba973869e 716 status = MAC_PLME_SapHandler(&lMsg, 0);
andreikovacs 0:401ba973869e 717
andreikovacs 0:401ba973869e 718 if(status == gPhySuccess_c)
andreikovacs 0:401ba973869e 719 return gErrorNoError_c;
andreikovacs 0:401ba973869e 720 else
andreikovacs 0:401ba973869e 721 return gErrorNoResourcesAvailable_c;
andreikovacs 0:401ba973869e 722 }
andreikovacs 0:401ba973869e 723
andreikovacs 0:401ba973869e 724 /************************************************************************************
andreikovacs 0:401ba973869e 725 * MLMESetInterPacketRxDelay
andreikovacs 0:401ba973869e 726 *
andreikovacs 0:401ba973869e 727 * IMPORTANT-> Use below arguments only (indicating a direct value from 1-12 will not work)
andreikovacs 0:401ba973869e 728 * Inputs :
andreikovacs 0:401ba973869e 729 *
andreikovacs 0:401ba973869e 730 * InterPacketRxDelay_0
andreikovacs 0:401ba973869e 731 * InterPacketRxDelay_1
andreikovacs 0:401ba973869e 732 * InterPacketRxDelay_2
andreikovacs 0:401ba973869e 733 * InterPacketRxDelay_3
andreikovacs 0:401ba973869e 734 * InterPacketRxDelay_4
andreikovacs 0:401ba973869e 735 * InterPacketRxDelay_5
andreikovacs 0:401ba973869e 736 * InterPacketRxDelay_6
andreikovacs 0:401ba973869e 737 * InterPacketRxDelay_7
andreikovacs 0:401ba973869e 738 * InterPacketRxDelay_8
andreikovacs 0:401ba973869e 739 * InterPacketRxDelay_9
andreikovacs 0:401ba973869e 740 * InterPacketRxDelay_A
andreikovacs 0:401ba973869e 741 * InterPacketRxDelay_B
andreikovacs 0:401ba973869e 742 ************************************************************************************/
andreikovacs 0:401ba973869e 743 smacErrors_t MLMESetInterPacketRxDelay
andreikovacs 0:401ba973869e 744 (
andreikovacs 0:401ba973869e 745 uint8_t u8InterPacketRxDelay
andreikovacs 0:401ba973869e 746 )
andreikovacs 0:401ba973869e 747 {
andreikovacs 0:401ba973869e 748 #if(TRUE == smacInitializationValidation_d)
andreikovacs 0:401ba973869e 749 if(FALSE == mSmacInitialized)
andreikovacs 0:401ba973869e 750 {
andreikovacs 0:401ba973869e 751 return gErrorNoValidCondition_c;
andreikovacs 0:401ba973869e 752 }
andreikovacs 0:401ba973869e 753 #endif /* TRUE == smacInitializationValidation_d */
andreikovacs 0:401ba973869e 754
andreikovacs 0:401ba973869e 755 if(mSmacStateIdle_c != smacState)
andreikovacs 0:401ba973869e 756 {
andreikovacs 0:401ba973869e 757 return gErrorBusy_c;
andreikovacs 0:401ba973869e 758 }
andreikovacs 0:401ba973869e 759
andreikovacs 0:401ba973869e 760 if (gPhySuccess_c != Phy_SetInterPacketRxDelay(u8InterPacketRxDelay))
andreikovacs 0:401ba973869e 761 {
andreikovacs 0:401ba973869e 762 return gErrorOutOfRange_c;
andreikovacs 0:401ba973869e 763 }
andreikovacs 0:401ba973869e 764 return gErrorNoError_c;
andreikovacs 0:401ba973869e 765 }
andreikovacs 0:401ba973869e 766
andreikovacs 0:401ba973869e 767 #endif
andreikovacs 0:401ba973869e 768 /************************************************************************************
andreikovacs 0:401ba973869e 769 * MLMERXDisableRequest
andreikovacs 0:401ba973869e 770 *
andreikovacs 0:401ba973869e 771 * Returns the radio to idle mode from receive mode.
andreikovacs 0:401ba973869e 772 *
andreikovacs 0:401ba973869e 773 ************************************************************************************/
andreikovacs 0:401ba973869e 774 smacErrors_t MLMERXDisableRequest(void)
andreikovacs 0:401ba973869e 775 {
andreikovacs 0:401ba973869e 776 macToPlmeMessage_t lMsg;
andreikovacs 0:401ba973869e 777 phyStatus_t err;
andreikovacs 0:401ba973869e 778 #if(TRUE == smacInitializationValidation_d)
andreikovacs 0:401ba973869e 779 if(FALSE == mSmacInitialized)
andreikovacs 0:401ba973869e 780 {
andreikovacs 0:401ba973869e 781 return gErrorNoValidCondition_c;
andreikovacs 0:401ba973869e 782 }
andreikovacs 0:401ba973869e 783 #endif
andreikovacs 0:401ba973869e 784 if((mSmacStateReceiving_c != smacState) && (mSmacStateIdle_c != smacState))
andreikovacs 0:401ba973869e 785 {
andreikovacs 0:401ba973869e 786 return gErrorNoValidCondition_c;
andreikovacs 0:401ba973869e 787 }
andreikovacs 0:401ba973869e 788 lMsg.macInstance = smacInstance;
andreikovacs 0:401ba973869e 789 if(!mSmacTimeoutAsked)
andreikovacs 0:401ba973869e 790 {
andreikovacs 0:401ba973869e 791 lMsg.msgType = gPlmeSetReq_c;
andreikovacs 0:401ba973869e 792 lMsg.msgData.setReq.PibAttribute = gPhyPibRxOnWhenIdle;
andreikovacs 0:401ba973869e 793 lMsg.msgData.setReq.PibAttributeValue = (uint64_t)0;
andreikovacs 0:401ba973869e 794 err = MAC_PLME_SapHandler(&lMsg, 0);
andreikovacs 0:401ba973869e 795 if(err != gPhySuccess_c)
andreikovacs 0:401ba973869e 796 return gErrorBusy_c;
andreikovacs 0:401ba973869e 797 }
andreikovacs 0:401ba973869e 798 else
andreikovacs 0:401ba973869e 799 {
andreikovacs 0:401ba973869e 800 lMsg.msgType = gPlmeSetTRxStateReq_c;
andreikovacs 0:401ba973869e 801 lMsg.msgData.setTRxStateReq.state = gPhyForceTRxOff_c;
andreikovacs 0:401ba973869e 802 (void)MAC_PLME_SapHandler(&lMsg, 0);
andreikovacs 0:401ba973869e 803 mSmacTimeoutAsked = FALSE;
andreikovacs 0:401ba973869e 804 }
andreikovacs 0:401ba973869e 805 smacState= mSmacStateIdle_c;
andreikovacs 0:401ba973869e 806
andreikovacs 0:401ba973869e 807 return gErrorNoError_c;
andreikovacs 0:401ba973869e 808
andreikovacs 0:401ba973869e 809 }
andreikovacs 0:401ba973869e 810
andreikovacs 0:401ba973869e 811 /*@CMA, Conn Test Added*/
andreikovacs 0:401ba973869e 812 /************************************************************************************
andreikovacs 0:401ba973869e 813 * MLMETXDisableRequest
andreikovacs 0:401ba973869e 814 *
andreikovacs 0:401ba973869e 815 * Returns the radio to idle mode from Tx mode.
andreikovacs 0:401ba973869e 816 *
andreikovacs 0:401ba973869e 817 ************************************************************************************/
andreikovacs 0:401ba973869e 818 void MLMETXDisableRequest(void)
andreikovacs 0:401ba973869e 819 {
andreikovacs 0:401ba973869e 820 macToPlmeMessage_t lMsg;
andreikovacs 0:401ba973869e 821 lMsg.macInstance = smacInstance;
andreikovacs 0:401ba973869e 822 lMsg.msgType = gPlmeSetTRxStateReq_c;
andreikovacs 0:401ba973869e 823 lMsg.msgData.setTRxStateReq.state = gPhyForceTRxOff_c;
andreikovacs 0:401ba973869e 824 (void)MAC_PLME_SapHandler(&lMsg, 0);
andreikovacs 0:401ba973869e 825 if(gSmacDataMessage != NULL)
andreikovacs 0:401ba973869e 826 {
andreikovacs 0:401ba973869e 827 (void)MEM_BufferFree(gSmacDataMessage);
andreikovacs 0:401ba973869e 828 gSmacDataMessage = NULL;
andreikovacs 0:401ba973869e 829 }
andreikovacs 0:401ba973869e 830 smacState= mSmacStateIdle_c;
andreikovacs 0:401ba973869e 831 }
andreikovacs 0:401ba973869e 832
andreikovacs 0:401ba973869e 833 /************************************************************************************
andreikovacs 0:401ba973869e 834 * MLMELinkQuality
andreikovacs 0:401ba973869e 835 *
andreikovacs 0:401ba973869e 836 * This function returns an integer value that is the link quality from the last
andreikovacs 0:401ba973869e 837 * received packet of the form: dBm = (-Link Quality/2).
andreikovacs 0:401ba973869e 838 *
andreikovacs 0:401ba973869e 839 ************************************************************************************/
andreikovacs 0:401ba973869e 840 uint8_t MLMELinkQuality(void)
andreikovacs 0:401ba973869e 841 {
andreikovacs 0:401ba973869e 842 #if(TRUE == smacInitializationValidation_d)
andreikovacs 0:401ba973869e 843 if(FALSE == mSmacInitialized)
andreikovacs 0:401ba973869e 844 {
andreikovacs 0:401ba973869e 845 return 0;
andreikovacs 0:401ba973869e 846 }
andreikovacs 0:401ba973869e 847 #endif
andreikovacs 0:401ba973869e 848 return smacLastDataRxParams.linkQuality;
andreikovacs 0:401ba973869e 849 }
andreikovacs 0:401ba973869e 850
andreikovacs 0:401ba973869e 851 /************************************************************************************
andreikovacs 0:401ba973869e 852 * MLMEPAOutputAdjust
andreikovacs 0:401ba973869e 853 *
andreikovacs 0:401ba973869e 854 *
andreikovacs 0:401ba973869e 855 ************************************************************************************/
andreikovacs 0:401ba973869e 856 smacErrors_t MLMEPAOutputAdjust
andreikovacs 0:401ba973869e 857 (
andreikovacs 0:401ba973869e 858 uint8_t u8PaValue
andreikovacs 0:401ba973869e 859 )
andreikovacs 0:401ba973869e 860 {
andreikovacs 0:401ba973869e 861 macToPlmeMessage_t lMsg;
andreikovacs 0:401ba973869e 862 smacErrors_t err = gErrorNoError_c;
andreikovacs 0:401ba973869e 863 uint8_t errorVal;
andreikovacs 0:401ba973869e 864 #if(TRUE == smacInitializationValidation_d)
andreikovacs 0:401ba973869e 865 if(FALSE == mSmacInitialized)
andreikovacs 0:401ba973869e 866 {
andreikovacs 0:401ba973869e 867 return gErrorNoValidCondition_c;
andreikovacs 0:401ba973869e 868 }
andreikovacs 0:401ba973869e 869 #endif /* TRUE == smacInitializationValidation_d */
andreikovacs 0:401ba973869e 870
andreikovacs 0:401ba973869e 871 if(mSmacStateIdle_c != smacState)
andreikovacs 0:401ba973869e 872 {
andreikovacs 0:401ba973869e 873 return gErrorBusy_c;
andreikovacs 0:401ba973869e 874 }
andreikovacs 0:401ba973869e 875 lMsg.macInstance = smacInstance;
andreikovacs 0:401ba973869e 876 lMsg.msgType = gPlmeSetReq_c;
andreikovacs 0:401ba973869e 877 lMsg.msgData.setReq.PibAttribute = gPhyPibTransmitPower_c;
andreikovacs 0:401ba973869e 878 lMsg.msgData.setReq.PibAttributeValue = (uint64_t) u8PaValue;
andreikovacs 0:401ba973869e 879 errorVal = MAC_PLME_SapHandler(&lMsg, 0);
andreikovacs 0:401ba973869e 880 switch (errorVal)
andreikovacs 0:401ba973869e 881 {
andreikovacs 0:401ba973869e 882 case gPhyBusy_c:
andreikovacs 0:401ba973869e 883 err = gErrorBusy_c;
andreikovacs 0:401ba973869e 884 break;
andreikovacs 0:401ba973869e 885
andreikovacs 0:401ba973869e 886 case gPhyInvalidParameter_c:
andreikovacs 0:401ba973869e 887 err = gErrorOutOfRange_c;
andreikovacs 0:401ba973869e 888 break;
andreikovacs 0:401ba973869e 889
andreikovacs 0:401ba973869e 890 case gPhySuccess_c:
andreikovacs 0:401ba973869e 891 err = gErrorNoError_c;
andreikovacs 0:401ba973869e 892 break;
andreikovacs 0:401ba973869e 893
andreikovacs 0:401ba973869e 894 default:
andreikovacs 0:401ba973869e 895 err = gErrorOutOfRange_c;
andreikovacs 0:401ba973869e 896 break;
andreikovacs 0:401ba973869e 897 }
andreikovacs 0:401ba973869e 898
andreikovacs 0:401ba973869e 899 return err;
andreikovacs 0:401ba973869e 900 }
andreikovacs 0:401ba973869e 901
andreikovacs 0:401ba973869e 902 /************************************************************************************
andreikovacs 0:401ba973869e 903 * MLMEScanRequest
andreikovacs 0:401ba973869e 904 *
andreikovacs 0:401ba973869e 905 * This function returns the RSSI value of the channel passes as a parameter
andreikovacs 0:401ba973869e 906 *
andreikovacs 0:401ba973869e 907 *
andreikovacs 0:401ba973869e 908 ************************************************************************************/
andreikovacs 0:401ba973869e 909 smacErrors_t MLMEScanRequest(channels_t u8ChannelToScan)
andreikovacs 0:401ba973869e 910 {
andreikovacs 0:401ba973869e 911 smacErrors_t err = gErrorNoError_c;
andreikovacs 0:401ba973869e 912 phyStatus_t u8PhyRes;
andreikovacs 0:401ba973869e 913 #if(TRUE == smacInitializationValidation_d)
andreikovacs 0:401ba973869e 914 if(FALSE == mSmacInitialized)
andreikovacs 0:401ba973869e 915 {
andreikovacs 0:401ba973869e 916 return gErrorNoValidCondition_c;
andreikovacs 0:401ba973869e 917 }
andreikovacs 0:401ba973869e 918 #endif /* TRUE == smacInitializationValidation_d */
andreikovacs 0:401ba973869e 919
andreikovacs 0:401ba973869e 920 if(mSmacStateIdle_c != smacState)
andreikovacs 0:401ba973869e 921 {
andreikovacs 0:401ba973869e 922 return gErrorBusy_c;
andreikovacs 0:401ba973869e 923 }
andreikovacs 0:401ba973869e 924 if(u8ChannelToScan != MLMEGetChannelRequest())
andreikovacs 0:401ba973869e 925 err = MLMESetChannelRequest(u8ChannelToScan);
andreikovacs 0:401ba973869e 926 if(err != gErrorNoError_c)
andreikovacs 0:401ba973869e 927 return err;
andreikovacs 0:401ba973869e 928
andreikovacs 0:401ba973869e 929 macToPlmeMessage_t* pMsg = (macToPlmeMessage_t*)MEM_BufferAlloc(sizeof(macToPlmeMessage_t));
andreikovacs 0:401ba973869e 930 pMsg->msgType = gPlmeEdReq_c;
andreikovacs 0:401ba973869e 931 pMsg->msgData.edReq.startTime = gPhySeqStartAsap_c;
andreikovacs 0:401ba973869e 932 pMsg->macInstance = smacInstance;
andreikovacs 0:401ba973869e 933 gSmacMlmeMessage = pMsg;
andreikovacs 0:401ba973869e 934 u8PhyRes = MAC_PLME_SapHandler(pMsg,0);
andreikovacs 0:401ba973869e 935 if(u8PhyRes != gPhySuccess_c)
andreikovacs 0:401ba973869e 936 {
andreikovacs 0:401ba973869e 937 MEM_BufferFree(gSmacMlmeMessage);
andreikovacs 0:401ba973869e 938 gSmacMlmeMessage = NULL;
andreikovacs 0:401ba973869e 939 return gErrorBusy_c;
andreikovacs 0:401ba973869e 940 }
andreikovacs 0:401ba973869e 941 smacState = mSmacStateScanningChannels_c;
andreikovacs 0:401ba973869e 942 return gErrorNoError_c;
andreikovacs 0:401ba973869e 943 }
andreikovacs 0:401ba973869e 944
andreikovacs 0:401ba973869e 945
andreikovacs 0:401ba973869e 946 /************************************************************************************
andreikovacs 0:401ba973869e 947 * MLMECcaRequest
andreikovacs 0:401ba973869e 948 *
andreikovacs 0:401ba973869e 949 * This function performs Clear Channel Assessment on the active channel
andreikovacs 0:401ba973869e 950 *
andreikovacs 0:401ba973869e 951 *
andreikovacs 0:401ba973869e 952 ************************************************************************************/
andreikovacs 0:401ba973869e 953 smacErrors_t MLMECcaRequest()
andreikovacs 0:401ba973869e 954 {
andreikovacs 0:401ba973869e 955 phyStatus_t u8PhyRes;
andreikovacs 0:401ba973869e 956 #if(TRUE == smacInitializationValidation_d)
andreikovacs 0:401ba973869e 957 if(FALSE == mSmacInitialized)
andreikovacs 0:401ba973869e 958 {
andreikovacs 0:401ba973869e 959 return gErrorNoValidCondition_c;
andreikovacs 0:401ba973869e 960 }
andreikovacs 0:401ba973869e 961 #endif /* TRUE == smacInitializationValidation_d */
andreikovacs 0:401ba973869e 962
andreikovacs 0:401ba973869e 963 if(mSmacStateIdle_c != smacState)
andreikovacs 0:401ba973869e 964 {
andreikovacs 0:401ba973869e 965 return gErrorBusy_c;
andreikovacs 0:401ba973869e 966 }
andreikovacs 0:401ba973869e 967 macToPlmeMessage_t* pMsg = (macToPlmeMessage_t*)MEM_BufferAlloc(sizeof(macToPlmeMessage_t));
andreikovacs 0:401ba973869e 968 pMsg->msgType = gPlmeCcaReq_c;
andreikovacs 0:401ba973869e 969 pMsg->msgData.ccaReq.ccaType = gPhyCCAMode1_c;
andreikovacs 0:401ba973869e 970 pMsg->msgData.ccaReq.contCcaMode = gPhyContCcaDisabled;
andreikovacs 0:401ba973869e 971 pMsg->macInstance = smacInstance;
andreikovacs 0:401ba973869e 972 gSmacMlmeMessage = pMsg;
andreikovacs 0:401ba973869e 973 u8PhyRes = MAC_PLME_SapHandler(pMsg,0);
andreikovacs 0:401ba973869e 974 if(u8PhyRes != gPhySuccess_c)
andreikovacs 0:401ba973869e 975 {
andreikovacs 0:401ba973869e 976 MEM_BufferFree(gSmacMlmeMessage);
andreikovacs 0:401ba973869e 977 gSmacMlmeMessage = NULL;
andreikovacs 0:401ba973869e 978 return gErrorBusy_c;
andreikovacs 0:401ba973869e 979 }
andreikovacs 0:401ba973869e 980 smacState = mSmacStatePerformingCca_c;
andreikovacs 0:401ba973869e 981 return gErrorNoError_c;
andreikovacs 0:401ba973869e 982 }
andreikovacs 0:401ba973869e 983 /************************************************************************************
andreikovacs 0:401ba973869e 984 * MLMEPhySoftReset
andreikovacs 0:401ba973869e 985 *
andreikovacs 0:401ba973869e 986 * This function performs a software reset on the radio, PHY and SMAC state machines.
andreikovacs 0:401ba973869e 987 *
andreikovacs 0:401ba973869e 988 *
andreikovacs 0:401ba973869e 989 ************************************************************************************/
andreikovacs 0:401ba973869e 990 smacErrors_t MLMEPhySoftReset
andreikovacs 0:401ba973869e 991 (
andreikovacs 0:401ba973869e 992 void
andreikovacs 0:401ba973869e 993 )
andreikovacs 0:401ba973869e 994 {
andreikovacs 0:401ba973869e 995 macToPlmeMessage_t lMsg;
andreikovacs 0:401ba973869e 996 #if(TRUE == smacInitializationValidation_d)
andreikovacs 0:401ba973869e 997 if(FALSE == mSmacInitialized)
andreikovacs 0:401ba973869e 998 {
andreikovacs 0:401ba973869e 999 return gErrorNoValidCondition_c;
andreikovacs 0:401ba973869e 1000 }
andreikovacs 0:401ba973869e 1001 #endif /* TRUE == smacInitializationValidation_d */
andreikovacs 0:401ba973869e 1002 //
andreikovacs 0:401ba973869e 1003 // if(mSmacStateIdle_c != smacState)
andreikovacs 0:401ba973869e 1004 // {
andreikovacs 0:401ba973869e 1005 // return gErrorBusy_c;
andreikovacs 0:401ba973869e 1006 // }
andreikovacs 0:401ba973869e 1007 lMsg.macInstance = smacInstance;
andreikovacs 0:401ba973869e 1008 lMsg.msgType = gPlmeSetTRxStateReq_c;
andreikovacs 0:401ba973869e 1009 lMsg.msgData.setTRxStateReq.state = gPhyForceTRxOff_c;
andreikovacs 0:401ba973869e 1010 (void)MAC_PLME_SapHandler(&lMsg, 0);
andreikovacs 0:401ba973869e 1011 smacState= mSmacStateIdle_c;
andreikovacs 0:401ba973869e 1012
andreikovacs 0:401ba973869e 1013 return gErrorNoError_c;
andreikovacs 0:401ba973869e 1014 }
andreikovacs 0:401ba973869e 1015 /************************************************************************************
andreikovacs 0:401ba973869e 1016 * PD_SMAC_SapHandler
andreikovacs 0:401ba973869e 1017 *
andreikovacs 0:401ba973869e 1018 * This SAP handles data confirm and data indication from PHY.
andreikovacs 0:401ba973869e 1019 *
andreikovacs 0:401ba973869e 1020 ************************************************************************************/
andreikovacs 0:401ba973869e 1021 phyStatus_t PD_SMAC_SapHandler(void* pMsg, instanceId_t smacInstanceId)
andreikovacs 0:401ba973869e 1022 {
andreikovacs 0:401ba973869e 1023 phyStatus_t status = gPhyInvalidPrimitive_c;
andreikovacs 0:401ba973869e 1024 smacToAppDataMessage_t* pSmacMsg;
andreikovacs 0:401ba973869e 1025 pdDataToMacMessage_t* pDataMsg = (pdDataToMacMessage_t*)pMsg;
andreikovacs 0:401ba973869e 1026 (void)smacInstanceId;
andreikovacs 0:401ba973869e 1027
andreikovacs 0:401ba973869e 1028 switch(pDataMsg->msgType)
andreikovacs 0:401ba973869e 1029 {
andreikovacs 0:401ba973869e 1030 case gPdDataCnf_c:
andreikovacs 0:401ba973869e 1031 //no data request was fired
andreikovacs 0:401ba973869e 1032 if(NULL == gSmacDataMessage)
andreikovacs 0:401ba973869e 1033 {
andreikovacs 0:401ba973869e 1034 status = gPhySuccess_c;
andreikovacs 0:401ba973869e 1035 }
andreikovacs 0:401ba973869e 1036 else
andreikovacs 0:401ba973869e 1037 {
andreikovacs 0:401ba973869e 1038 //phy finished work with the data request packet so it can be freed
andreikovacs 0:401ba973869e 1039 MEM_BufferFree(gSmacDataMessage);
andreikovacs 0:401ba973869e 1040 gSmacDataMessage = NULL;
andreikovacs 0:401ba973869e 1041
andreikovacs 0:401ba973869e 1042 pSmacMsg = (smacToAppDataMessage_t*)MEM_BufferAlloc(sizeof(smacToAppDataMessage_t));
andreikovacs 0:401ba973869e 1043 if(pSmacMsg == NULL)
andreikovacs 0:401ba973869e 1044 {
andreikovacs 0:401ba973869e 1045 status = gPhySuccess_c;
andreikovacs 0:401ba973869e 1046 }
andreikovacs 0:401ba973869e 1047 else
andreikovacs 0:401ba973869e 1048 {
andreikovacs 0:401ba973869e 1049 pSmacMsg->msgType = gMcpsDataCnf_c;
andreikovacs 0:401ba973869e 1050 pSmacMsg->msgData.dataCnf.status = gErrorNoError_c;
andreikovacs 0:401ba973869e 1051 // call App Sap
andreikovacs 0:401ba973869e 1052 gSMAC_APP_MCPS_SapHandler(pSmacMsg,smacInstance);
andreikovacs 0:401ba973869e 1053 }
andreikovacs 0:401ba973869e 1054 smacState = mSmacStateIdle_c;
andreikovacs 0:401ba973869e 1055 }
andreikovacs 0:401ba973869e 1056 break;
andreikovacs 0:401ba973869e 1057 case gPdDataInd_c:
andreikovacs 0:401ba973869e 1058 if(FALSE == SMACPacketCheck(pDataMsg))
andreikovacs 0:401ba973869e 1059 {
andreikovacs 0:401ba973869e 1060 MEM_BufferFree(pDataMsg);
andreikovacs 0:401ba973869e 1061 status = gPhySuccess_c;
andreikovacs 0:401ba973869e 1062 }
andreikovacs 0:401ba973869e 1063 else
andreikovacs 0:401ba973869e 1064 {
andreikovacs 0:401ba973869e 1065 smacLastDataRxParams.linkQuality = ((pdDataToMacMessage_t*)pMsg)->msgData.dataInd.ppduLinkQuality;
andreikovacs 0:401ba973869e 1066 smacLastDataRxParams.timeStamp = (phyTime_t)((pdDataToMacMessage_t*)pMsg)->msgData.dataInd.timeStamp;
andreikovacs 0:401ba973869e 1067 smacProccesPacketPtr.smacRxPacketPointer->rxStatus = rxSuccessStatus_c;
andreikovacs 0:401ba973869e 1068
andreikovacs 0:401ba973869e 1069 // in case no timeout was asked we need to unset RXOnWhenIdle Pib.
andreikovacs 0:401ba973869e 1070 if(!mSmacTimeoutAsked)
andreikovacs 0:401ba973869e 1071 {
andreikovacs 0:401ba973869e 1072 (void)MLMERXDisableRequest();
andreikovacs 0:401ba973869e 1073 }
andreikovacs 0:401ba973869e 1074 smacProccesPacketPtr.smacRxPacketPointer->u8DataLength =
andreikovacs 0:401ba973869e 1075 pDataMsg->msgData.dataInd.psduLength - gSmacHeaderBytes_c;
andreikovacs 0:401ba973869e 1076 FLib_MemCpy(&smacProccesPacketPtr.smacRxPacketPointer->smacHeader,
andreikovacs 0:401ba973869e 1077 ((smacHeader_t*)pDataMsg->msgData.dataInd.pPsdu),
andreikovacs 0:401ba973869e 1078 gSmacHeaderBytes_c);
andreikovacs 0:401ba973869e 1079 FLib_MemCpy(&smacProccesPacketPtr.smacRxPacketPointer->smacPdu,
andreikovacs 0:401ba973869e 1080 ((smacPdu_t*)(pDataMsg->msgData.dataInd.pPsdu + gSmacHeaderBytes_c)),
andreikovacs 0:401ba973869e 1081 smacProccesPacketPtr.smacRxPacketPointer->u8DataLength);
andreikovacs 0:401ba973869e 1082
andreikovacs 0:401ba973869e 1083 pSmacMsg = (smacToAppDataMessage_t*)MEM_BufferAlloc(sizeof(smacToAppDataMessage_t));
andreikovacs 0:401ba973869e 1084 if(pSmacMsg == NULL)
andreikovacs 0:401ba973869e 1085 {
andreikovacs 0:401ba973869e 1086 status = gPhySuccess_c;
andreikovacs 0:401ba973869e 1087 }
andreikovacs 0:401ba973869e 1088 else
andreikovacs 0:401ba973869e 1089 {
andreikovacs 0:401ba973869e 1090 pSmacMsg->msgType = gMcpsDataInd_c;
andreikovacs 0:401ba973869e 1091 pSmacMsg->msgData.dataInd.pRxPacket = smacProccesPacketPtr.smacRxPacketPointer;
andreikovacs 0:401ba973869e 1092 pSmacMsg->msgData.dataInd.u8LastRxRssi = PhyGetLastRxRssiValue();
andreikovacs 0:401ba973869e 1093 gSMAC_APP_MCPS_SapHandler(pSmacMsg,smacInstance);
andreikovacs 0:401ba973869e 1094 }
andreikovacs 0:401ba973869e 1095 smacState = mSmacStateIdle_c;
andreikovacs 0:401ba973869e 1096 }
andreikovacs 0:401ba973869e 1097 break;
andreikovacs 0:401ba973869e 1098 default:
andreikovacs 0:401ba973869e 1099 break;
andreikovacs 0:401ba973869e 1100 }
andreikovacs 0:401ba973869e 1101 MEM_BufferFree(pMsg);
andreikovacs 0:401ba973869e 1102 return status;
andreikovacs 0:401ba973869e 1103 }
andreikovacs 0:401ba973869e 1104
andreikovacs 0:401ba973869e 1105 /************************************************************************************
andreikovacs 0:401ba973869e 1106 * PLME_SMAC_SapHandler
andreikovacs 0:401ba973869e 1107 *
andreikovacs 0:401ba973869e 1108 * This SAP handles management for confirms and indications from PHY.
andreikovacs 0:401ba973869e 1109 *
andreikovacs 0:401ba973869e 1110 ************************************************************************************/
andreikovacs 0:401ba973869e 1111
andreikovacs 0:401ba973869e 1112 phyStatus_t PLME_SMAC_SapHandler(void* pMsg, instanceId_t smacInstanceId)
andreikovacs 0:401ba973869e 1113 {
andreikovacs 0:401ba973869e 1114 MEM_BufferFree(gSmacMlmeMessage);
andreikovacs 0:401ba973869e 1115 gSmacMlmeMessage = NULL;
andreikovacs 0:401ba973869e 1116 uint32_t backOffTime;
andreikovacs 0:401ba973869e 1117
andreikovacs 0:401ba973869e 1118 plmeToMacMessage_t* pPlmeMsg = (plmeToMacMessage_t*)pMsg;
andreikovacs 0:401ba973869e 1119
andreikovacs 0:401ba973869e 1120 smacToAppMlmeMessage_t* pSmacToApp;
andreikovacs 0:401ba973869e 1121 smacToAppDataMessage_t* pSmacMsg;
andreikovacs 0:401ba973869e 1122 switch(pPlmeMsg->msgType)
andreikovacs 0:401ba973869e 1123 {
andreikovacs 0:401ba973869e 1124 case gPlmeCcaCnf_c:
andreikovacs 0:401ba973869e 1125 if(pPlmeMsg->msgData.ccaCnf.status == gPhyChannelBusy_c &&
andreikovacs 0:401ba973869e 1126 smacState == mSmacStateTransmitting_c)
andreikovacs 0:401ba973869e 1127 {
andreikovacs 0:401ba973869e 1128 if(txConfigurator.ccaBeforeTx)
andreikovacs 0:401ba973869e 1129 {
andreikovacs 0:401ba973869e 1130 if(txConfigurator.retryCountCCAFail > u8CCARetryCounter)
andreikovacs 0:401ba973869e 1131 {
andreikovacs 0:401ba973869e 1132 //increment cca fail counter
andreikovacs 0:401ba973869e 1133 u8CCARetryCounter++;
andreikovacs 0:401ba973869e 1134 //get random number for backoff time.
andreikovacs 0:401ba973869e 1135 RNG_GetRandomNo(&backOffTime);
andreikovacs 0:401ba973869e 1136 //start event timer. After time elapses, Data request will be fired.
andreikovacs 0:401ba973869e 1137 TMR_StartSingleShotTimer(u8BackoffTimerId, ((backOffTime & gMaxBackoffTime_c) + gMinBackoffTime_c), BackoffTimeElapsed, NULL);
andreikovacs 0:401ba973869e 1138 }
andreikovacs 0:401ba973869e 1139 else
andreikovacs 0:401ba973869e 1140 {
andreikovacs 0:401ba973869e 1141 MEM_BufferFree(gSmacDataMessage);
andreikovacs 0:401ba973869e 1142 gSmacDataMessage = NULL;
andreikovacs 0:401ba973869e 1143
andreikovacs 0:401ba973869e 1144 //retries failed so create message for the application
andreikovacs 0:401ba973869e 1145 pSmacMsg = (smacToAppDataMessage_t*)MEM_BufferAlloc(sizeof(smacToAppDataMessage_t));
andreikovacs 0:401ba973869e 1146 if(pSmacMsg != NULL)
andreikovacs 0:401ba973869e 1147 {
andreikovacs 0:401ba973869e 1148 //error type : Channel Busy
andreikovacs 0:401ba973869e 1149 pSmacMsg->msgData.dataCnf.status = gErrorChannelBusy_c;
andreikovacs 0:401ba973869e 1150 //type is Data Confirm
andreikovacs 0:401ba973869e 1151 pSmacMsg->msgType = gMcpsDataCnf_c;
andreikovacs 0:401ba973869e 1152 gSMAC_APP_MCPS_SapHandler(pSmacMsg, smacInstance);
andreikovacs 0:401ba973869e 1153 }
andreikovacs 0:401ba973869e 1154 //place SMAC into idle state
andreikovacs 0:401ba973869e 1155 smacState = mSmacStateIdle_c;
andreikovacs 0:401ba973869e 1156 }
andreikovacs 0:401ba973869e 1157 }
andreikovacs 0:401ba973869e 1158 MEM_BufferFree(pMsg);
andreikovacs 0:401ba973869e 1159 return gPhySuccess_c;
andreikovacs 0:401ba973869e 1160 }
andreikovacs 0:401ba973869e 1161 //if SMAC isn't in TX then definitely it is a CCA confirm
andreikovacs 0:401ba973869e 1162 //allocate a message for the application
andreikovacs 0:401ba973869e 1163 pSmacToApp = (smacToAppMlmeMessage_t*)MEM_BufferAlloc(sizeof(smacToAppMlmeMessage_t));
andreikovacs 0:401ba973869e 1164 if(pSmacToApp != NULL)
andreikovacs 0:401ba973869e 1165 {
andreikovacs 0:401ba973869e 1166 //type is CCA Confirm
andreikovacs 0:401ba973869e 1167 pSmacToApp->msgType = gMlmeCcaCnf_c;
andreikovacs 0:401ba973869e 1168 //Channel status translated into SMAC messages: idle channel means no error.
andreikovacs 0:401ba973869e 1169 if(pPlmeMsg->msgData.ccaCnf.status == gPhyChannelIdle_c)
andreikovacs 0:401ba973869e 1170 {
andreikovacs 0:401ba973869e 1171 pSmacToApp->msgData.ccaCnf.status = gErrorNoError_c;
andreikovacs 0:401ba973869e 1172 }
andreikovacs 0:401ba973869e 1173 else
andreikovacs 0:401ba973869e 1174 {
andreikovacs 0:401ba973869e 1175 pSmacToApp->msgData.ccaCnf.status = gErrorChannelBusy_c;
andreikovacs 0:401ba973869e 1176 }
andreikovacs 0:401ba973869e 1177 }
andreikovacs 0:401ba973869e 1178 break;
andreikovacs 0:401ba973869e 1179 case gPlmeEdCnf_c:
andreikovacs 0:401ba973869e 1180 //allocate a message for the application
andreikovacs 0:401ba973869e 1181 pSmacToApp = (smacToAppMlmeMessage_t*)MEM_BufferAlloc(sizeof(smacToAppMlmeMessage_t));
andreikovacs 0:401ba973869e 1182 if(pSmacToApp != NULL)
andreikovacs 0:401ba973869e 1183 {
andreikovacs 0:401ba973869e 1184 //message type is ED Confirm
andreikovacs 0:401ba973869e 1185 pSmacToApp->msgType = gMlmeEdCnf_c;
andreikovacs 0:401ba973869e 1186 if(pPlmeMsg->msgData.edCnf.status == gPhySuccess_c)
andreikovacs 0:401ba973869e 1187 {
andreikovacs 0:401ba973869e 1188 pSmacToApp->msgData.edCnf.status = gErrorNoError_c;
andreikovacs 0:401ba973869e 1189 pSmacToApp->msgData.edCnf.energyLevel = pPlmeMsg->msgData.edCnf.energyLevel;
andreikovacs 0:401ba973869e 1190 pSmacToApp->msgData.edCnf.energyLeveldB = pPlmeMsg->msgData.edCnf.energyLeveldB;
andreikovacs 0:401ba973869e 1191 pSmacToApp->msgData.edCnf.scannedChannel = MLMEGetChannelRequest();
andreikovacs 0:401ba973869e 1192 }
andreikovacs 0:401ba973869e 1193 else
andreikovacs 0:401ba973869e 1194 {
andreikovacs 0:401ba973869e 1195 pSmacToApp->msgData.edCnf.status = gErrorBusy_c;
andreikovacs 0:401ba973869e 1196 }
andreikovacs 0:401ba973869e 1197 }
andreikovacs 0:401ba973869e 1198 break;
andreikovacs 0:401ba973869e 1199 case gPlmeTimeoutInd_c:
andreikovacs 0:401ba973869e 1200 if(smacState == mSmacStateTransmitting_c)
andreikovacs 0:401ba973869e 1201 {
andreikovacs 0:401ba973869e 1202 if(txConfigurator.autoAck)
andreikovacs 0:401ba973869e 1203 {
andreikovacs 0:401ba973869e 1204 //re-arm retries for channel busy at retransmission.
andreikovacs 0:401ba973869e 1205 u8CCARetryCounter = 0;
andreikovacs 0:401ba973869e 1206
andreikovacs 0:401ba973869e 1207 if(txConfigurator.retryCountAckFail > u8AckRetryCounter)
andreikovacs 0:401ba973869e 1208 {
andreikovacs 0:401ba973869e 1209 u8AckRetryCounter++;
andreikovacs 0:401ba973869e 1210
andreikovacs 0:401ba973869e 1211 RNG_GetRandomNo(&backOffTime);
andreikovacs 0:401ba973869e 1212 //start event timer. After time elapses, Data request will be fired.
andreikovacs 0:401ba973869e 1213 TMR_StartSingleShotTimer(u8BackoffTimerId, ((backOffTime & gMaxBackoffTime_c) + gMinBackoffTime_c), BackoffTimeElapsed, NULL);
andreikovacs 0:401ba973869e 1214 }
andreikovacs 0:401ba973869e 1215 else
andreikovacs 0:401ba973869e 1216 {
andreikovacs 0:401ba973869e 1217 (void)MEM_BufferFree(gSmacDataMessage);
andreikovacs 0:401ba973869e 1218 gSmacDataMessage = NULL;
andreikovacs 0:401ba973869e 1219
andreikovacs 0:401ba973869e 1220 //retries failed so create message for the application
andreikovacs 0:401ba973869e 1221 pSmacMsg = (smacToAppDataMessage_t*)MEM_BufferAlloc(sizeof(smacToAppDataMessage_t));
andreikovacs 0:401ba973869e 1222 if(pSmacMsg != NULL)
andreikovacs 0:401ba973869e 1223 {
andreikovacs 0:401ba973869e 1224 //set error code: No Ack
andreikovacs 0:401ba973869e 1225 pSmacMsg->msgData.dataCnf.status = gErrorNoAck_c;
andreikovacs 0:401ba973869e 1226 //type is Data Confirm
andreikovacs 0:401ba973869e 1227 pSmacMsg->msgType = gMcpsDataCnf_c;
andreikovacs 0:401ba973869e 1228
andreikovacs 0:401ba973869e 1229 gSMAC_APP_MCPS_SapHandler(pSmacMsg, smacInstance);
andreikovacs 0:401ba973869e 1230 }
andreikovacs 0:401ba973869e 1231 //place SMAC into idle state
andreikovacs 0:401ba973869e 1232 smacState = mSmacStateIdle_c;
andreikovacs 0:401ba973869e 1233 }
andreikovacs 0:401ba973869e 1234 }
andreikovacs 0:401ba973869e 1235 MEM_BufferFree(pMsg);
andreikovacs 0:401ba973869e 1236 return gPhySuccess_c;
andreikovacs 0:401ba973869e 1237 }
andreikovacs 0:401ba973869e 1238 //if no ack timeout was received then it is definitely a RX timeout
andreikovacs 0:401ba973869e 1239 pSmacToApp = (smacToAppMlmeMessage_t*)MEM_BufferAlloc(sizeof(smacToAppMlmeMessage_t));
andreikovacs 0:401ba973869e 1240 if(pSmacToApp != NULL)
andreikovacs 0:401ba973869e 1241 {
andreikovacs 0:401ba973869e 1242 if(smacState == mSmacStateReceiving_c)
andreikovacs 0:401ba973869e 1243 {
andreikovacs 0:401ba973869e 1244 smacProccesPacketPtr.smacRxPacketPointer->rxStatus = rxTimeOutStatus_c;
andreikovacs 0:401ba973869e 1245 }
andreikovacs 0:401ba973869e 1246 pSmacToApp->msgType = gMlmeTimeoutInd_c;
andreikovacs 0:401ba973869e 1247 }
andreikovacs 0:401ba973869e 1248 break;
andreikovacs 0:401ba973869e 1249 case gPlme_UnexpectedRadioResetInd_c:
andreikovacs 0:401ba973869e 1250 pSmacToApp = (smacToAppMlmeMessage_t*)MEM_BufferAlloc(sizeof(smacToAppMlmeMessage_t));
andreikovacs 0:401ba973869e 1251 if(pSmacToApp != NULL)
andreikovacs 0:401ba973869e 1252 pSmacToApp->msgType = gMlme_UnexpectedRadioResetInd_c;
andreikovacs 0:401ba973869e 1253 break;
andreikovacs 0:401ba973869e 1254 default:
andreikovacs 0:401ba973869e 1255 //MEM_BufferFree(pSmacToApp);
andreikovacs 0:401ba973869e 1256 MEM_BufferFree(pMsg);
andreikovacs 0:401ba973869e 1257 return gPhySuccess_c;
andreikovacs 0:401ba973869e 1258 }
andreikovacs 0:401ba973869e 1259 smacState = mSmacStateIdle_c;
andreikovacs 0:401ba973869e 1260 //send message to upper layer if it is not NULL
andreikovacs 0:401ba973869e 1261 if(pSmacToApp != NULL)
andreikovacs 0:401ba973869e 1262 (gSMAC_APP_MLME_SapHandler)(pSmacToApp,0);
andreikovacs 0:401ba973869e 1263 MEM_BufferFree(pMsg);
andreikovacs 0:401ba973869e 1264 return gPhySuccess_c;
andreikovacs 0:401ba973869e 1265 }
andreikovacs 0:401ba973869e 1266
andreikovacs 0:401ba973869e 1267 /************************************************************************************
andreikovacs 0:401ba973869e 1268 * Smac_RegisterSapHandlers
andreikovacs 0:401ba973869e 1269 *
andreikovacs 0:401ba973869e 1270 * This function helps the user register the handlers for the messages that come from
andreikovacs 0:401ba973869e 1271 * SMAC.
andreikovacs 0:401ba973869e 1272 *
andreikovacs 0:401ba973869e 1273 ************************************************************************************/
andreikovacs 0:401ba973869e 1274
andreikovacs 0:401ba973869e 1275 void Smac_RegisterSapHandlers(
andreikovacs 0:401ba973869e 1276 SMAC_APP_MCPS_SapHandler_t pSMAC_APP_MCPS_SapHandler,
andreikovacs 0:401ba973869e 1277 SMAC_APP_MLME_SapHandler_t pSMAC_APP_MLME_SapHandler,
andreikovacs 0:401ba973869e 1278 instanceId_t smacInstanceId
andreikovacs 0:401ba973869e 1279 )
andreikovacs 0:401ba973869e 1280 {
andreikovacs 0:401ba973869e 1281 gSMAC_APP_MCPS_SapHandler = pSMAC_APP_MCPS_SapHandler;
andreikovacs 0:401ba973869e 1282 gSMAC_APP_MLME_SapHandler = pSMAC_APP_MLME_SapHandler;
andreikovacs 0:401ba973869e 1283 (void)smacInstanceId;
andreikovacs 0:401ba973869e 1284 }
andreikovacs 0:401ba973869e 1285
andreikovacs 0:401ba973869e 1286 /************************************************************************************
andreikovacs 0:401ba973869e 1287 * SMACFillHeader
andreikovacs 0:401ba973869e 1288 *
andreikovacs 0:401ba973869e 1289 * This function helps the user fill the SMAC header(short hardcoded MAC header) with
andreikovacs 0:401ba973869e 1290 * the desired short destination address.
andreikovacs 0:401ba973869e 1291 *
andreikovacs 0:401ba973869e 1292 ************************************************************************************/
andreikovacs 0:401ba973869e 1293
andreikovacs 0:401ba973869e 1294 void SMACFillHeader(smacHeader_t* pSmacHeader, uint16_t destAddr)
andreikovacs 0:401ba973869e 1295 {
andreikovacs 0:401ba973869e 1296 pSmacHeader->frameControl = gSmacDefaultFrameCtrl;
andreikovacs 0:401ba973869e 1297 pSmacHeader->panId = u16PanID;
andreikovacs 0:401ba973869e 1298 pSmacHeader->seqNo = gSmacDefaultSeqNo;
andreikovacs 0:401ba973869e 1299 pSmacHeader->srcAddr = u16ShortSrcAddress;
andreikovacs 0:401ba973869e 1300 pSmacHeader->destAddr = destAddr;
andreikovacs 0:401ba973869e 1301 }
andreikovacs 0:401ba973869e 1302
andreikovacs 0:401ba973869e 1303 /************************************************************************************
andreikovacs 0:401ba973869e 1304 * InitSmac
andreikovacs 0:401ba973869e 1305 *
andreikovacs 0:401ba973869e 1306 * Basic SMAC initialisation.
andreikovacs 0:401ba973869e 1307 *
andreikovacs 0:401ba973869e 1308 ************************************************************************************/
andreikovacs 0:401ba973869e 1309 void InitSmac(void)
andreikovacs 0:401ba973869e 1310 {
andreikovacs 0:401ba973869e 1311 /* SMAC Initialization */
andreikovacs 0:401ba973869e 1312 smacState = mSmacStateIdle_c;
andreikovacs 0:401ba973869e 1313 smacLastDataRxParams.linkQuality = 0;
andreikovacs 0:401ba973869e 1314 smacLastDataRxParams.timeStamp = 0;
andreikovacs 0:401ba973869e 1315 uint32_t u32RandomNo;
andreikovacs 0:401ba973869e 1316 #if defined(gPHY_802_15_4g_d)
andreikovacs 0:401ba973869e 1317 gTotalChannels = gPhyPib.pPIBphyRfConstants->totalNumChannels;
andreikovacs 0:401ba973869e 1318 #else
andreikovacs 0:401ba973869e 1319 gTotalChannels = 26;
andreikovacs 0:401ba973869e 1320 #endif
andreikovacs 0:401ba973869e 1321
andreikovacs 0:401ba973869e 1322
andreikovacs 0:401ba973869e 1323 #if(TRUE == smacInitializationValidation_d)
andreikovacs 0:401ba973869e 1324 mSmacInitialized = TRUE;
andreikovacs 0:401ba973869e 1325 #endif
andreikovacs 0:401ba973869e 1326 txConfigurator.autoAck = FALSE;
andreikovacs 0:401ba973869e 1327 txConfigurator.ccaBeforeTx = FALSE;
andreikovacs 0:401ba973869e 1328 txConfigurator.retryCountAckFail = 0;
andreikovacs 0:401ba973869e 1329 txConfigurator.retryCountCCAFail = 0;
andreikovacs 0:401ba973869e 1330 u8BackoffTimerId = (uint8_t)TMR_AllocateTimer();
andreikovacs 0:401ba973869e 1331 RNG_Init();
andreikovacs 0:401ba973869e 1332 RNG_GetRandomNo(&u32RandomNo);
andreikovacs 0:401ba973869e 1333 u8SmacSeqNo = (uint8_t)u32RandomNo;
andreikovacs 0:401ba973869e 1334 //Notify the PHY what function to call for communicating with SMAC
andreikovacs 0:401ba973869e 1335 Phy_RegisterSapHandlers((PD_MAC_SapHandler_t)PD_SMAC_SapHandler, (PLME_MAC_SapHandler_t)PLME_SMAC_SapHandler, 0);
andreikovacs 0:401ba973869e 1336 u16PanID = gDefaultPanID_c;
andreikovacs 0:401ba973869e 1337 u16ShortSrcAddress = gNodeAddress_c;
andreikovacs 0:401ba973869e 1338 (void)SMACSetShortSrcAddress(u16ShortSrcAddress);
andreikovacs 0:401ba973869e 1339 (void)SMACSetPanID(u16PanID);
andreikovacs 0:401ba973869e 1340 }
andreikovacs 0:401ba973869e 1341
andreikovacs 0:401ba973869e 1342 /************************************************************************************
andreikovacs 0:401ba973869e 1343 * SMACSetShortSrcAddress
andreikovacs 0:401ba973869e 1344 *
andreikovacs 0:401ba973869e 1345 * This function sets the short source address so that PHY can perform filtering
andreikovacs 0:401ba973869e 1346 *
andreikovacs 0:401ba973869e 1347 ************************************************************************************/
andreikovacs 0:401ba973869e 1348
andreikovacs 0:401ba973869e 1349 smacErrors_t SMACSetShortSrcAddress(uint16_t nwShortAddress)
andreikovacs 0:401ba973869e 1350 {
andreikovacs 0:401ba973869e 1351 macToPlmeMessage_t lMsg;
andreikovacs 0:401ba973869e 1352 lMsg.msgType = gPlmeSetReq_c;
andreikovacs 0:401ba973869e 1353 lMsg.msgData.setReq.PibAttribute = gPhyPibShortAddress_c;
andreikovacs 0:401ba973869e 1354 lMsg.msgData.setReq.PibAttributeValue = (uint64_t)nwShortAddress;
andreikovacs 0:401ba973869e 1355
andreikovacs 0:401ba973869e 1356 phyStatus_t u8PhyRes = MAC_PLME_SapHandler(&lMsg,0);
andreikovacs 0:401ba973869e 1357 if(u8PhyRes == gPhyBusy_c || u8PhyRes == gPhyBusyTx_c || u8PhyRes == gPhyBusyRx_c)
andreikovacs 0:401ba973869e 1358 return gErrorBusy_c;
andreikovacs 0:401ba973869e 1359 if(u8PhyRes != gPhySuccess_c)
andreikovacs 0:401ba973869e 1360 return gErrorNoResourcesAvailable_c;
andreikovacs 0:401ba973869e 1361 u16ShortSrcAddress = nwShortAddress;
andreikovacs 0:401ba973869e 1362 return gErrorNoError_c;
andreikovacs 0:401ba973869e 1363 }
andreikovacs 0:401ba973869e 1364
andreikovacs 0:401ba973869e 1365 /************************************************************************************
andreikovacs 0:401ba973869e 1366 * SMACSetPanID
andreikovacs 0:401ba973869e 1367 *
andreikovacs 0:401ba973869e 1368 * This function sets the pan ID so that PHY can perform filtering
andreikovacs 0:401ba973869e 1369 *
andreikovacs 0:401ba973869e 1370 ************************************************************************************/
andreikovacs 0:401ba973869e 1371
andreikovacs 0:401ba973869e 1372 smacErrors_t SMACSetPanID(uint16_t nwShortPanID)
andreikovacs 0:401ba973869e 1373 {
andreikovacs 0:401ba973869e 1374 macToPlmeMessage_t lMsg;
andreikovacs 0:401ba973869e 1375 lMsg.msgType = gPlmeSetReq_c;
andreikovacs 0:401ba973869e 1376 lMsg.msgData.setReq.PibAttribute = gPhyPibPanId_c;
andreikovacs 0:401ba973869e 1377 lMsg.msgData.setReq.PibAttributeValue = (uint64_t)nwShortPanID;
andreikovacs 0:401ba973869e 1378
andreikovacs 0:401ba973869e 1379 phyStatus_t u8PhyRes = MAC_PLME_SapHandler(&lMsg,0);
andreikovacs 0:401ba973869e 1380 if(u8PhyRes == gPhyBusy_c || u8PhyRes == gPhyBusyTx_c || u8PhyRes == gPhyBusyRx_c)
andreikovacs 0:401ba973869e 1381 return gErrorBusy_c;
andreikovacs 0:401ba973869e 1382 if(u8PhyRes != gPhySuccess_c)
andreikovacs 0:401ba973869e 1383 return gErrorNoResourcesAvailable_c;
andreikovacs 0:401ba973869e 1384 u16PanID = nwShortPanID;
andreikovacs 0:401ba973869e 1385 return gErrorNoError_c;
andreikovacs 0:401ba973869e 1386 }
andreikovacs 0:401ba973869e 1387
andreikovacs 0:401ba973869e 1388 void BackoffTimeElapsed(void const *arg)
andreikovacs 0:401ba973869e 1389 {
andreikovacs 0:401ba973869e 1390 uint8_t u8PhyRes = MAC_PD_SapHandler(gSmacDataMessage, 0);
andreikovacs 0:401ba973869e 1391 if(u8PhyRes != gPhySuccess_c)
andreikovacs 0:401ba973869e 1392 {
andreikovacs 0:401ba973869e 1393 smacState = mSmacStateIdle_c;
andreikovacs 0:401ba973869e 1394 MEM_BufferFree(gSmacDataMessage);
andreikovacs 0:401ba973869e 1395 gSmacDataMessage = NULL;
andreikovacs 0:401ba973869e 1396 }
andreikovacs 0:401ba973869e 1397 }
andreikovacs 0:401ba973869e 1398
andreikovacs 0:401ba973869e 1399 /************************************************************************************
andreikovacs 0:401ba973869e 1400 * SMACPacketCheck
andreikovacs 0:401ba973869e 1401 *
andreikovacs 0:401ba973869e 1402 * This function returns TRUE if Phy payload can be of SMAC packet type
andreikovacs 0:401ba973869e 1403 *
andreikovacs 0:401ba973869e 1404 ************************************************************************************/
andreikovacs 0:401ba973869e 1405
andreikovacs 0:401ba973869e 1406 bool_t SMACPacketCheck(pdDataToMacMessage_t* pMsgFromPhy)
andreikovacs 0:401ba973869e 1407 {
andreikovacs 0:401ba973869e 1408 //check if packet is of type Data
andreikovacs 0:401ba973869e 1409 if( (pMsgFromPhy->msgData.dataInd.pPsdu[0] & 0x07) != 0x01 )
andreikovacs 0:401ba973869e 1410 return FALSE;
andreikovacs 0:401ba973869e 1411 //check if PSDU length is at least of smac header size.
andreikovacs 0:401ba973869e 1412 if( (pMsgFromPhy->msgData.dataInd.psduLength < gSmacHeaderBytes_c) )
andreikovacs 0:401ba973869e 1413 return FALSE;
andreikovacs 0:401ba973869e 1414
andreikovacs 0:401ba973869e 1415 return TRUE;
andreikovacs 0:401ba973869e 1416 }