/****************************************************************************** * Filename: ieee_cmd.h * Revised: $ $ * Revision: $ $ * * Description: CC26xx/CC13xx API for IEEE 802.15.4 commands * * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef IEEE_CMD_H_ #define IEEE_CMD_H_ #ifndef __RFC_STRUCT #ifdef __GNUC__ #define __RFC_STRUCT __attribute__ ((aligned (4))) #else #define __RFC_STRUCT #endif #endif //! \addtogroup rfc //! @{ //! \addtogroup ieee_cmd //! @{ #include #include "mailbox.h" #include "common_cmd.h" typedef struct __RFC_STRUCT rfc_CMD_IEEE_RX_s rfc_CMD_IEEE_RX_t; typedef struct __RFC_STRUCT rfc_CMD_IEEE_ED_SCAN_s rfc_CMD_IEEE_ED_SCAN_t; typedef struct __RFC_STRUCT rfc_CMD_IEEE_TX_s rfc_CMD_IEEE_TX_t; typedef struct __RFC_STRUCT rfc_CMD_IEEE_CSMA_s rfc_CMD_IEEE_CSMA_t; typedef struct __RFC_STRUCT rfc_CMD_IEEE_RX_ACK_s rfc_CMD_IEEE_RX_ACK_t; typedef struct __RFC_STRUCT rfc_CMD_IEEE_ABORT_BG_s rfc_CMD_IEEE_ABORT_BG_t; typedef struct __RFC_STRUCT rfc_CMD_IEEE_MOD_CCA_s rfc_CMD_IEEE_MOD_CCA_t; typedef struct __RFC_STRUCT rfc_CMD_IEEE_MOD_FILT_s rfc_CMD_IEEE_MOD_FILT_t; typedef struct __RFC_STRUCT rfc_CMD_IEEE_MOD_SRC_MATCH_s rfc_CMD_IEEE_MOD_SRC_MATCH_t; typedef struct __RFC_STRUCT rfc_CMD_IEEE_ABORT_FG_s rfc_CMD_IEEE_ABORT_FG_t; typedef struct __RFC_STRUCT rfc_CMD_IEEE_STOP_FG_s rfc_CMD_IEEE_STOP_FG_t; typedef struct __RFC_STRUCT rfc_CMD_IEEE_CCA_REQ_s rfc_CMD_IEEE_CCA_REQ_t; typedef struct __RFC_STRUCT rfc_ieeeRxOutput_s rfc_ieeeRxOutput_t; typedef struct __RFC_STRUCT rfc_shortAddrEntry_s rfc_shortAddrEntry_t; typedef struct __RFC_STRUCT rfc_ieeeRxCorrCrc_s rfc_ieeeRxCorrCrc_t; //! \addtogroup CMD_IEEE_RX //! @{ #define CMD_IEEE_RX 0x2801 struct __RFC_STRUCT rfc_CMD_IEEE_RX_s { uint16_t commandNo; //!< The command ID number 0x2801 uint16_t status; //!< \brief An integer telling the status of the command. This value is //!< updated by the radio CPU during operation and may be read by the //!< system CPU at any time. rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) struct { uint8_t triggerType:4; //!< The type of trigger uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
//!< 1: CMD_TRIGGER can be used as an alternative trigger uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
//!< 1: A trigger in the past is triggered as soon as possible } startTrigger; //!< Identification of the trigger that starts the operation struct { uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed uint8_t nSkip:4; //!< Number of skips if the rule involves skipping } condition; uint8_t channel; //!< \brief Channel to tune to in the start of the operation
//!< 0: Use existing channel
//!< 11–26: Use as IEEE 802.15.4 channel, i.e. frequency is (2405 + 5 × (channel - 11)) MHz
//!< 60–207: Frequency is (2300 + channel) MHz
//!< Others: Reserved struct { uint8_t bAutoFlushCrc:1; //!< If 1, automatically remove packets with CRC error from Rx queue uint8_t bAutoFlushIgn:1; //!< If 1, automatically remove packets that can be ignored according to frame filtering from Rx queue uint8_t bIncludePhyHdr:1; //!< If 1, include the received PHY header field in the stored packet; otherwise discard it uint8_t bIncludeCrc:1; //!< If 1, include the received CRC field in the stored packet; otherwise discard it uint8_t bAppendRssi:1; //!< If 1, append an RSSI byte to the packet in the Rx queue uint8_t bAppendCorrCrc:1; //!< If 1, append a correlation value and CRC result byte to the packet in the Rx queue uint8_t bAppendSrcInd:1; //!< If 1, append an index from the source matching algorithm uint8_t bAppendTimestamp:1; //!< If 1, append a timestamp to the packet in the Rx queue } rxConfig; dataQueue_t* pRxQ; //!< Pointer to receive queue rfc_ieeeRxOutput_t *pOutput; //!< Pointer to output structure (NULL: Do not store results) struct { uint16_t frameFiltEn:1; //!< \brief 0: Disable frame filtering
//!< 1: Enable frame filtering uint16_t frameFiltStop:1; //!< \brief 0: Receive all packets to the end
//!< 1: Stop receiving frame once frame filtering has caused the frame to be rejected. uint16_t autoAckEn:1; //!< \brief 0: Disable auto ACK
//!< 1: Enable auto ACK. uint16_t slottedAckEn:1; //!< \brief 0: Non-slotted ACK
//!< 1: Slotted ACK. uint16_t autoPendEn:1; //!< \brief 0: Auto-pend disabled
//!< 1: Auto-pend enabled uint16_t defaultPend:1; //!< The value of the pending data bit in auto ACK packets that are not subject to auto-pend uint16_t bPendDataReqOnly:1; //!< \brief 0: Use auto-pend for any packet
//!< 1: Use auto-pend for data request packets only uint16_t bPanCoord:1; //!< \brief 0: Device is not PAN coordinator
//!< 1: Device is PAN coordinator uint16_t maxFrameVersion:2; //!< Reject frames where the frame version field in the FCF is greater than this value uint16_t fcfReservedMask:3; //!< Value to be AND-ed with the reserved part of the FCF; frame rejected if result is non-zero uint16_t modifyFtFilter:2; //!< \brief Treatment of MSB of frame type field before frame-type filtering:
//!< 0: No modification
//!< 1: Invert MSB
//!< 2: Set MSB to 0
//!< 3: Set MSB to 1 uint16_t bStrictLenFilter:1; //!< \brief 0: Accept acknowledgement frames of any length >= 5
//!< 1: Accept only acknowledgement frames of length 5 } frameFiltOpt; //!< Frame filtering options struct { uint8_t bAcceptFt0Beacon:1; //!< \brief Treatment of frames with frame type 000 (beacon):
//!< 0: Reject
//!< 1: Accept uint8_t bAcceptFt1Data:1; //!< \brief Treatment of frames with frame type 001 (data):
//!< 0: Reject
//!< 1: Accept uint8_t bAcceptFt2Ack:1; //!< \brief Treatment of frames with frame type 010 (ACK):
//!< 0: Reject, unless running ACK receive command
//!< 1: Always accept uint8_t bAcceptFt3MacCmd:1; //!< \brief Treatment of frames with frame type 011 (MAC command):
//!< 0: Reject
//!< 1: Accept uint8_t bAcceptFt4Reserved:1; //!< \brief Treatment of frames with frame type 100 (reserved):
//!< 0: Reject
//!< 1: Accept uint8_t bAcceptFt5Reserved:1; //!< \brief Treatment of frames with frame type 101 (reserved):
//!< 0: Reject
//!< 1: Accept uint8_t bAcceptFt6Reserved:1; //!< \brief Treatment of frames with frame type 110 (reserved):
//!< 0: Reject
//!< 1: Accept uint8_t bAcceptFt7Reserved:1; //!< \brief Treatment of frames with frame type 111 (reserved):
//!< 0: Reject
//!< 1: Accept } frameTypes; //!< Frame types to receive in frame filtering struct { uint8_t ccaEnEnergy:1; //!< Enable energy scan as CCA source uint8_t ccaEnCorr:1; //!< Enable correlator based carrier sense as CCA source uint8_t ccaEnSync:1; //!< Enable sync found based carrier sense as CCA source uint8_t ccaCorrOp:1; //!< \brief Operator to use between energy based and correlator based CCA
//!< 0: Report busy channel if either ccaEnergy or ccaCorr are busy
//!< 1: Report busy channel if both ccaEnergy and ccaCorr are busy uint8_t ccaSyncOp:1; //!< \brief Operator to use between sync found based CCA and the others
//!< 0: Always report busy channel if ccaSync is busy
//!< 1: Always report idle channel if ccaSync is idle uint8_t ccaCorrThr:2; //!< Threshold for number of correlation peaks in correlator based carrier sense } ccaOpt; //!< CCA options int8_t ccaRssiThr; //!< RSSI threshold for CCA uint8_t __dummy0; uint8_t numExtEntries; //!< Number of extended address entries uint8_t numShortEntries; //!< Number of short address entries uint32_t* pExtEntryList; //!< Pointer to list of extended address entries rfc_shortAddrEntry_t *pShortEntryList;//!< Pointer to list of short address entries uint64_t localExtAddr; //!< The extended address of the local device uint16_t localShortAddr; //!< The short address of the local device uint16_t localPanID; //!< The PAN ID of the local device uint16_t __dummy1; uint8_t __dummy2; struct { uint8_t triggerType:4; //!< The type of trigger uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
//!< 1: CMD_TRIGGER can be used as an alternative trigger uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
//!< 1: A trigger in the past is triggered as soon as possible } endTrigger; //!< Trigger that causes the device to end the Rx operation ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to end the Rx //!< operation }; //! @} //! \addtogroup CMD_IEEE_ED_SCAN //! @{ #define CMD_IEEE_ED_SCAN 0x2802 struct __RFC_STRUCT rfc_CMD_IEEE_ED_SCAN_s { uint16_t commandNo; //!< The command ID number 0x2802 uint16_t status; //!< \brief An integer telling the status of the command. This value is //!< updated by the radio CPU during operation and may be read by the //!< system CPU at any time. rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) struct { uint8_t triggerType:4; //!< The type of trigger uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
//!< 1: CMD_TRIGGER can be used as an alternative trigger uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
//!< 1: A trigger in the past is triggered as soon as possible } startTrigger; //!< Identification of the trigger that starts the operation struct { uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed uint8_t nSkip:4; //!< Number of skips if the rule involves skipping } condition; uint8_t channel; //!< \brief Channel to tune to in the start of the operation
//!< 0: Use existing channel
//!< 11–26: Use as IEEE 802.15.4 channel, i.e. frequency is (2405 + 5 × (channel - 11)) MHz
//!< 60–207: Frequency is (2300 + channel) MHz
//!< Others: Reserved struct { uint8_t ccaEnEnergy:1; //!< Enable energy scan as CCA source uint8_t ccaEnCorr:1; //!< Enable correlator based carrier sense as CCA source uint8_t ccaEnSync:1; //!< Enable sync found based carrier sense as CCA source uint8_t ccaCorrOp:1; //!< \brief Operator to use between energy based and correlator based CCA
//!< 0: Report busy channel if either ccaEnergy or ccaCorr are busy
//!< 1: Report busy channel if both ccaEnergy and ccaCorr are busy uint8_t ccaSyncOp:1; //!< \brief Operator to use between sync found based CCA and the others
//!< 0: Always report busy channel if ccaSync is busy
//!< 1: Always report idle channel if ccaSync is idle uint8_t ccaCorrThr:2; //!< Threshold for number of correlation peaks in correlator based carrier sense } ccaOpt; //!< CCA options int8_t ccaRssiThr; //!< RSSI threshold for CCA uint8_t __dummy0; int8_t maxRssi; //!< The maximum RSSI recorded during the ED scan struct { uint8_t triggerType:4; //!< The type of trigger uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
//!< 1: CMD_TRIGGER can be used as an alternative trigger uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
//!< 1: A trigger in the past is triggered as soon as possible } endTrigger; //!< Trigger that causes the device to end the Rx operation ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to end the Rx //!< operation }; //! @} //! \addtogroup CMD_IEEE_TX //! @{ #define CMD_IEEE_TX 0x2C01 struct __RFC_STRUCT rfc_CMD_IEEE_TX_s { uint16_t commandNo; //!< The command ID number 0x2C01 uint16_t status; //!< \brief An integer telling the status of the command. This value is //!< updated by the radio CPU during operation and may be read by the //!< system CPU at any time. rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) struct { uint8_t triggerType:4; //!< The type of trigger uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
//!< 1: CMD_TRIGGER can be used as an alternative trigger uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
//!< 1: A trigger in the past is triggered as soon as possible } startTrigger; //!< Identification of the trigger that starts the operation struct { uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed uint8_t nSkip:4; //!< Number of skips if the rule involves skipping } condition; struct { uint8_t bIncludePhyHdr:1; //!< \brief 0: Find PHY header automatically
//!< 1: Insert PHY header from the buffer uint8_t bIncludeCrc:1; //!< \brief 0: Append automatically calculated CRC
//!< 1: Insert FCS (CRC) from the buffer uint8_t :1; uint8_t payloadLenMsb:5; //!< \brief Most significant bits of payload length. Should only be non-zero to create long //!< non-standard packets for test purposes } txOpt; uint8_t payloadLen; //!< Number of bytes in the payload uint8_t* pPayload; //!< Pointer to payload buffer of size payloadLen ratmr_t timeStamp; //!< Time stamp of transmitted frame }; //! @} //! \addtogroup CMD_IEEE_CSMA //! @{ #define CMD_IEEE_CSMA 0x2C02 struct __RFC_STRUCT rfc_CMD_IEEE_CSMA_s { uint16_t commandNo; //!< The command ID number 0x2C02 uint16_t status; //!< \brief An integer telling the status of the command. This value is //!< updated by the radio CPU during operation and may be read by the //!< system CPU at any time. rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) struct { uint8_t triggerType:4; //!< The type of trigger uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
//!< 1: CMD_TRIGGER can be used as an alternative trigger uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
//!< 1: A trigger in the past is triggered as soon as possible } startTrigger; //!< Identification of the trigger that starts the operation struct { uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed uint8_t nSkip:4; //!< Number of skips if the rule involves skipping } condition; uint16_t randomState; //!< The state of the pseudo-random generator uint8_t macMaxBE; //!< The IEEE 802.15.4 MAC parameter macMaxBE uint8_t macMaxCSMABackoffs; //!< The IEEE 802.15.4 MAC parameter macMaxCSMABackoffs struct { uint8_t initCW:5; //!< The initialization value for the CW parameter uint8_t bSlotted:1; //!< \brief 0: non-slotted CSMA
//!< 1: slotted CSMA uint8_t rxOffMode:2; //!< \brief 0: RX stays on during CSMA backoffs
//!< 1: The CSMA-CA algorithm will suspend the receiver if no frame is being received
//!< 2: The CSMA-CA algorithm will suspend the receiver if no frame is being received, //!< or after finishing it (including auto ACK) otherwise
//!< 3: The CSMA-CA algorithm will suspend the receiver immediately during back-offs } csmaConfig; uint8_t NB; //!< The NB parameter from the IEEE 802.15.4 CSMA-CA algorithm uint8_t BE; //!< The BE parameter from the IEEE 802.15.4 CSMA-CA algorithm uint8_t remainingPeriods; //!< The number of remaining periods from a paused backoff countdown int8_t lastRssi; //!< RSSI measured at the last CCA operation struct { uint8_t triggerType:4; //!< The type of trigger uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
//!< 1: CMD_TRIGGER can be used as an alternative trigger uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
//!< 1: A trigger in the past is triggered as soon as possible } endTrigger; //!< Trigger that causes the device to end the CSMA-CA operation ratmr_t lastTimeStamp; //!< Time of the last CCA operation ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to end the //!< CSMA-CA operation }; //! @} //! \addtogroup CMD_IEEE_RX_ACK //! @{ #define CMD_IEEE_RX_ACK 0x2C03 struct __RFC_STRUCT rfc_CMD_IEEE_RX_ACK_s { uint16_t commandNo; //!< The command ID number 0x2C03 uint16_t status; //!< \brief An integer telling the status of the command. This value is //!< updated by the radio CPU during operation and may be read by the //!< system CPU at any time. rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) struct { uint8_t triggerType:4; //!< The type of trigger uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
//!< 1: CMD_TRIGGER can be used as an alternative trigger uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
//!< 1: A trigger in the past is triggered as soon as possible } startTrigger; //!< Identification of the trigger that starts the operation struct { uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed uint8_t nSkip:4; //!< Number of skips if the rule involves skipping } condition; uint8_t seqNo; //!< Sequence number to expect struct { uint8_t triggerType:4; //!< The type of trigger uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
//!< 1: CMD_TRIGGER can be used as an alternative trigger uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
//!< 1: A trigger in the past is triggered as soon as possible } endTrigger; //!< Trigger that causes the device to give up acknowledgement reception ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to give up //!< acknowledgement reception }; //! @} //! \addtogroup CMD_IEEE_ABORT_BG //! @{ #define CMD_IEEE_ABORT_BG 0x2C04 struct __RFC_STRUCT rfc_CMD_IEEE_ABORT_BG_s { uint16_t commandNo; //!< The command ID number 0x2C04 uint16_t status; //!< \brief An integer telling the status of the command. This value is //!< updated by the radio CPU during operation and may be read by the //!< system CPU at any time. rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) struct { uint8_t triggerType:4; //!< The type of trigger uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
//!< 1: CMD_TRIGGER can be used as an alternative trigger uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
//!< 1: A trigger in the past is triggered as soon as possible } startTrigger; //!< Identification of the trigger that starts the operation struct { uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed uint8_t nSkip:4; //!< Number of skips if the rule involves skipping } condition; }; //! @} //! \addtogroup CMD_IEEE_MOD_CCA //! @{ #define CMD_IEEE_MOD_CCA 0x2001 struct __RFC_STRUCT rfc_CMD_IEEE_MOD_CCA_s { uint16_t commandNo; //!< The command ID number 0x2001 struct { uint8_t ccaEnEnergy:1; //!< Enable energy scan as CCA source uint8_t ccaEnCorr:1; //!< Enable correlator based carrier sense as CCA source uint8_t ccaEnSync:1; //!< Enable sync found based carrier sense as CCA source uint8_t ccaCorrOp:1; //!< \brief Operator to use between energy based and correlator based CCA
//!< 0: Report busy channel if either ccaEnergy or ccaCorr are busy
//!< 1: Report busy channel if both ccaEnergy and ccaCorr are busy uint8_t ccaSyncOp:1; //!< \brief Operator to use between sync found based CCA and the others
//!< 0: Always report busy channel if ccaSync is busy
//!< 1: Always report idle channel if ccaSync is idle uint8_t ccaCorrThr:2; //!< Threshold for number of correlation peaks in correlator based carrier sense } newCcaOpt; //!< New value of ccaOpt for the running background level operation int8_t newCcaRssiThr; //!< New value of ccaRssiThr for the running background level operation }; //! @} //! \addtogroup CMD_IEEE_MOD_FILT //! @{ #define CMD_IEEE_MOD_FILT 0x2002 struct __RFC_STRUCT rfc_CMD_IEEE_MOD_FILT_s { uint16_t commandNo; //!< The command ID number 0x2002 struct { uint16_t frameFiltEn:1; //!< \brief 0: Disable frame filtering
//!< 1: Enable frame filtering uint16_t frameFiltStop:1; //!< \brief 0: Receive all packets to the end
//!< 1: Stop receiving frame once frame filtering has caused the frame to be rejected. uint16_t autoAckEn:1; //!< \brief 0: Disable auto ACK
//!< 1: Enable auto ACK. uint16_t slottedAckEn:1; //!< \brief 0: Non-slotted ACK
//!< 1: Slotted ACK. uint16_t autoPendEn:1; //!< \brief 0: Auto-pend disabled
//!< 1: Auto-pend enabled uint16_t defaultPend:1; //!< The value of the pending data bit in auto ACK packets that are not subject to auto-pend uint16_t bPendDataReqOnly:1; //!< \brief 0: Use auto-pend for any packet
//!< 1: Use auto-pend for data request packets only uint16_t bPanCoord:1; //!< \brief 0: Device is not PAN coordinator
//!< 1: Device is PAN coordinator uint16_t maxFrameVersion:2; //!< Reject frames where the frame version field in the FCF is greater than this value uint16_t fcfReservedMask:3; //!< Value to be AND-ed with the reserved part of the FCF; frame rejected if result is non-zero uint16_t modifyFtFilter:2; //!< \brief Treatment of MSB of frame type field before frame-type filtering:
//!< 0: No modification
//!< 1: Invert MSB
//!< 2: Set MSB to 0
//!< 3: Set MSB to 1 uint16_t bStrictLenFilter:1; //!< \brief 0: Accept acknowledgement frames of any length >= 5
//!< 1: Accept only acknowledgement frames of length 5 } newFrameFiltOpt; //!< New value of frameFiltOpt for the running background level operation struct { uint8_t bAcceptFt0Beacon:1; //!< \brief Treatment of frames with frame type 000 (beacon):
//!< 0: Reject
//!< 1: Accept uint8_t bAcceptFt1Data:1; //!< \brief Treatment of frames with frame type 001 (data):
//!< 0: Reject
//!< 1: Accept uint8_t bAcceptFt2Ack:1; //!< \brief Treatment of frames with frame type 010 (ACK):
//!< 0: Reject, unless running ACK receive command
//!< 1: Always accept uint8_t bAcceptFt3MacCmd:1; //!< \brief Treatment of frames with frame type 011 (MAC command):
//!< 0: Reject
//!< 1: Accept uint8_t bAcceptFt4Reserved:1; //!< \brief Treatment of frames with frame type 100 (reserved):
//!< 0: Reject
//!< 1: Accept uint8_t bAcceptFt5Reserved:1; //!< \brief Treatment of frames with frame type 101 (reserved):
//!< 0: Reject
//!< 1: Accept uint8_t bAcceptFt6Reserved:1; //!< \brief Treatment of frames with frame type 110 (reserved):
//!< 0: Reject
//!< 1: Accept uint8_t bAcceptFt7Reserved:1; //!< \brief Treatment of frames with frame type 111 (reserved):
//!< 0: Reject
//!< 1: Accept } newFrameTypes; //!< New value of frameTypes for the running background level operation }; //! @} //! \addtogroup CMD_IEEE_MOD_SRC_MATCH //! @{ #define CMD_IEEE_MOD_SRC_MATCH 0x2003 struct __RFC_STRUCT rfc_CMD_IEEE_MOD_SRC_MATCH_s { uint16_t commandNo; //!< The command ID number 0x2003 struct { uint8_t bEnable:1; //!< \brief 0: Disable entry
//!< 1: Enable entry uint8_t srcPend:1; //!< New value of the pending bit for the entry uint8_t entryType:1; //!< \brief 0: Extended address
//!< 1: Short address } options; uint8_t entryNo; //!< Index of entry to enable or disable }; //! @} //! \addtogroup CMD_IEEE_ABORT_FG //! @{ #define CMD_IEEE_ABORT_FG 0x2401 struct __RFC_STRUCT rfc_CMD_IEEE_ABORT_FG_s { uint16_t commandNo; //!< The command ID number 0x2401 }; //! @} //! \addtogroup CMD_IEEE_STOP_FG //! @{ #define CMD_IEEE_STOP_FG 0x2402 struct __RFC_STRUCT rfc_CMD_IEEE_STOP_FG_s { uint16_t commandNo; //!< The command ID number 0x2402 }; //! @} //! \addtogroup CMD_IEEE_CCA_REQ //! @{ #define CMD_IEEE_CCA_REQ 0x2403 struct __RFC_STRUCT rfc_CMD_IEEE_CCA_REQ_s { uint16_t commandNo; //!< The command ID number 0x2403 int8_t currentRssi; //!< The RSSI currently observed on the channel int8_t maxRssi; //!< The maximum RSSI observed on the channel since Rx was started struct { uint8_t ccaState:2; //!< \brief Value of the current CCA state
//!< 0: Idle
//!< 1: Busy
//!< 2: Invalid uint8_t ccaEnergy:2; //!< \brief Value of the current energy detect CCA state
//!< 0: Idle
//!< 1: Busy
//!< 2: Invalid uint8_t ccaCorr:2; //!< \brief Value of the current correlator based carrier sense CCA state
//!< 0: Idle
//!< 1: Busy
//!< 2: Invalid uint8_t ccaSync:1; //!< \brief Value of the current sync found based carrier sense CCA state
//!< 0: Idle
//!< 1: Busy } ccaInfo; }; //! @} //! \addtogroup ieeeRxOutput //! @{ //! Output structure for CMD_IEEE_RX struct __RFC_STRUCT rfc_ieeeRxOutput_s { uint8_t nTxAck; //!< Total number of transmitted ACK frames uint8_t nRxBeacon; //!< Number of received beacon frames uint8_t nRxData; //!< Number of received data frames uint8_t nRxAck; //!< Number of received acknowledgement frames uint8_t nRxMacCmd; //!< Number of received MAC command frames uint8_t nRxReserved; //!< Number of received frames with reserved frame type uint8_t nRxNok; //!< Number of received frames with CRC error uint8_t nRxIgnored; //!< Number of frames received that are to be ignored uint8_t nRxBufFull; //!< Number of received frames discarded because the Rx buffer was full int8_t lastRssi; //!< RSSI of last received frame int8_t maxRssi; //!< Highest RSSI observed in the operation uint8_t __dummy0; ratmr_t beaconTimeStamp; //!< Time stamp of last received beacon frame }; //! @} //! \addtogroup shortAddrEntry //! @{ //! Structure for short address entries struct __RFC_STRUCT rfc_shortAddrEntry_s { uint16_t shortAddr; //!< Short address uint16_t panId; //!< PAN ID }; //! @} //! \addtogroup ieeeRxCorrCrc //! @{ //! Receive status byte that may be appended to message in receive buffer struct __RFC_STRUCT rfc_ieeeRxCorrCrc_s { struct { uint8_t corr:6; //!< The correlation value uint8_t bIgnore:1; //!< 1 if the packet should be rejected by frame filtering, 0 otherwise uint8_t bCrcErr:1; //!< 1 if the packet was received with CRC error, 0 otherwise } status; }; //! @} //! @} //! @} #endif /* IEEE_CMD_H_ */