/**
* \file mimac_at86rf.h
*
* \brief MAC Layer Abstraction for AT86RFx interface
*
* Copyright (c) 2018 - 2019 Microchip Technology Inc. and its subsidiaries.
*
* \asf_license_start
*
* \page License
*
* Subject to your compliance with these terms, you may use Microchip
* software and any derivatives exclusively with Microchip products.
* It is your responsibility to comply with third party license terms applicable
* to your use of third party software (including open source software) that
* may accompany Microchip software.
*
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
*
* \asf_license_stop
*
*/
/*
* Support and FAQ: visit Microchip Support
*/
#ifndef __MIMAC_AT86RF_H
#define __MIMAC_AT86RF_H
#include "miwi_config.h"
#include "sysTimer.h"
#if defined(PROTOCOL_P2P) || defined (PROTOCOL_STAR)
#include "miwi_p2p_star.h"
#include "miwi_config_p2p.h"
#endif
#if defined(PROTOCOL_MESH)
//#include "miwi_config_mesh.h"
//#include "miwi_mesh.h"
#endif
#if (defined(PHY_AT86RF212B))
#define FULL_CHANNEL_MAP 0x000007FF
#define FIRST_CHANNEL_NUM 0
#define LAST_CHANNEL_NUM 10
#define MAX_FRAME_TX_TIME 10
#elif (defined(PHY_AT86RF233))
#define FULL_CHANNEL_MAP 0x07FFF800
#define FIRST_CHANNEL_NUM 11
#define LAST_CHANNEL_NUM 26
#define MAX_FRAME_TX_TIME 5
#endif
#define ANUMSUPERFRAMESLOTS (16)
#define ABASESLOTDURATION (60)
#define ABASESUPERFRAMEDURATION (ABASESLOTDURATION * ANUMSUPERFRAMESLOTS )
#ifdef PHY_AT86RF233
#define SYMBOLS_TO_TICKS(a) ((a)*(16*ONE_MICRO_SECOND))
#define TICKS_TO_SYMBOLS(a) ((a)/(16*ONE_MICRO_SECOND))
#elif (defined PHY_AT86RF212B )
#define SYMBOLS_TO_TICKS(a) ((currentChannel == 0)?((a)*(50*ONE_MICRO_SECOND)):((a)*(25*ONE_MICRO_SECOND)))
#define TICKS_TO_SYMBOLS(a) ((currentChannel == 0)?((a)/(50*ONE_MICRO_SECOND)):((a)/(25*ONE_MICRO_SECOND)))
#endif
#define CHANNEL_ASSESSMENT_CARRIER_SENSE 0x00
#define CHANNEL_ASSESSMENT_ENERGY_DETECT 0x01
#define POWER_STATE_DEEP_SLEEP 0x00
#define POWER_STATE_OPERATE 0xFF
#define PACKET_TYPE_MASK 0x03
#define BROADCAST_MASK 0x04
#define SECURITY_MASK 0x08
#define REPEAT_MASK 0x10
#define ACK_MASK 0x20
#define DSTPRSNT_MASK 0x40
#define SRCPRSNT_MASK 0x80
#define PACKET_TYPE_DATA 0x00
#define PACKET_TYPE_COMMAND 0x01
#define PACKET_TYPE_ACK 0x02
#define PACKET_TYPE_RESERVE 0x03
// DOM-IGNORE-BEGIN
/*********************************************************************
Overview: Data types for drivers. This will facilitate easy
access smaller chunks of larger data types when sending
or receiving data (for example byte sized send/receive
over parallel 8-bit interface.
*********************************************************************/
// DOM-IGNORE-END
typedef union _DRIVER_UINT8_UNION_
{
uint8_t Val;
struct
{
uint8_t b0:1;
uint8_t b1:1;
uint8_t b2:1;
uint8_t b3:1;
uint8_t b4:1;
uint8_t b5:1;
uint8_t b6:1;
uint8_t b7:1;
} bits;
} DRIVER_UINT8_UNION;
/*- Types ------------------------------------------------------------------*/
/***************************************************************************
* Parameters to Transmit a Packet
*
* This structure contains configurations to transmit a packet
**************************************************************************/
typedef struct
{
union
{
uint8_t Val;
struct
{
uint8_t packetType : 2; // type of packet. Possible types are
// * PACKET_TYPE_DATA - Data type
// * PACKET_TYPE_COMMAND - Command type
// * PACKET_TYPE_ACK - Acknowledgement type
// * PACKET_TYPE_RESERVE - Reserved type
uint8_t broadcast : 1; // 1: broadcast, 0: unicast
uint8_t secEn : 1; // 1: secure the MAC payload, 0: send plain text
uint8_t repeat : 1; // 1: allow repeaters to forward the message, 0: send message directly
uint8_t ackReq : 1; // 1: acknowledgement required, 0: no acknowldgement
uint8_t destPrsnt : 1; // 1: destination address in the packet, 0: destination address not in the packet
uint8_t sourcePrsnt : 1; // 1: source address in the packet, 0: source address not in the packet
} bits;
} flags;
uint8_t *DestAddress; // destination address
#if defined(IEEE_802_15_4)
bool altDestAddr; // use the alternative network address as destination in the packet
bool altSrcAddr; // use the alternative network address as source in the packet
API_UINT16_UNION DestPANID; // PAN identifier of the destination
#endif
} MAC_TRANS_PARAM;
/***************************************************************************
* Content of the Received Message
*
* This structure contains all information of the received message
**************************************************************************/
typedef struct
{
union
{
uint8_t Val;
struct
{
uint8_t packetType :2; // type of packet. Possible types are
// * PACKET_TYPE_DATA - Data type
// * PACKET_TYPE_COMMAND - Command type
// * PACKET_TYPE_ACK - Acknowledgement type
// * PACKET_TYPE_RESERVE - Reserved type
uint8_t broadcast :1; // 1: broadcast, 0: unicast
uint8_t secEn :1; // 1: secure the MAC payload, 0: send plain text
uint8_t repeat :1; // 1: allow repeaters to forward the message, 0: send message directly
uint8_t ackReq :1; // 1: acknowledgement required, 0: no acknowldgement
uint8_t destPrsnt :1; // 1: destination address in the packet, 0: destination address not in the packet
uint8_t sourcePrsnt :1; // 1: source address in the packet, 0: source address not in the packet
} bits;
} flags;
uint8_t * SourceAddress; // Address of the Sender
uint8_t * Payload; // Pointer to the payload
uint8_t PayloadLen; // Payload size
uint8_t RSSIValue; // RSSI value for the received packet
uint8_t LQIValue; // LQI value for the received packet
#if defined(IEEE_802_15_4)
bool altSourceAddress; // Source address is the alternative network address
API_UINT16_UNION SourcePANID; // PAN ID of the sender
#endif
} MAC_RECEIVED_PACKET;
/***************************************************************************
* Initialization Parameters for MAC
*
* This structure contains parameters in the initialization
**************************************************************************/
typedef struct
{
union
{
uint8_t Val;
struct
{
uint8_t RepeaterMode :1; // 1: Allow to act as repeater, 0: disable repeater function
uint8_t CCAEnable :1; // 1: Enable Clear Channel Assessment, 0: Disable CCA
uint8_t NetworkFreezer :1;
uint8_t PAddrLength :4; // Length of the permanent address, range from 1 to 8.
} bits;
} actionFlags;
uint8_t *PAddress; // Permenet transceiver address
} MACINIT_PARAM;
extern MAC_RECEIVED_PACKET MACRxPacket;
enum mac_set_params
{
MAC_CHANNEL
};
typedef enum mac_set_params mac_set_params_t;
/************************************************************************************
* Function:
* bool MiMAC_Set(mac_set_params_t id, uint8_t *value);
*
* Summary:
* This function sets the values
*
* Description:
* This is the primary MiMAC interface for the protocol layer to
* set the valuesr. for ex:Valid channel
* number are from 0 to 31. For different frequency band, data rate
* and other RF settings, some channels from 0 to 31 might be
* unavailable. Paramater offsetFreq is used to fine tune the center
* frequency across the frequency band. For transceivers that follow
* strict definition of channels, this parameter may be discarded.
* The center frequency is calculated as
* (LowestFrequency + Channel * ChannelGap + offsetFreq)
*
* PreCondition:
* Hardware initialization on MCU has been done.
*
* Parameters:
* set_params id - The identifier of the value to be set
* value - value to be set
*
* Returns:
* A boolean to indicates if channel setting is successful.
*
* Example:
*
* // Set center frequency to be exactly channel 12
* MiMAC_Set(CHANNEL, &channel);
*
*
* Remarks:
* None
*
*****************************************************************************************/
bool MiMAC_Set(mac_set_params_t id, uint8_t *value);
/************************************************************************************
* Function:
* bool MiMAC_SetPower(uint8_t outputPower)
*
* Summary:
* This function set the output power for the RF transceiver
*
* Description:
* This is the primary MiMAC interface for the protocol layer to
* set the output power for the RF transceiver. Whether the RF
* transceiver can adjust output power depends on the hardware
* implementation.
*
* PreCondition:
* MiMAC initialization has been done.
*
* Parameters:
* uint8_t outputPower - RF transceiver output power.
*
* Returns:
* A boolean to indicates if setting output power is successful.
*
* Example:
*
* // Set output power to be 0dBm
* MiMAC_SetPower(TX_POWER_0_DB);
*
*
* Remarks:
* None
*
*****************************************************************************************/
bool MiMAC_SetPower(uint8_t outputPower);
/************************************************************************************
* Function:
* bool MiMAC_SetAltAddress(uint8_t *Address, uint8_t *PANID)
*
* Summary:
* This function set the alternative network address and PAN identifier if
* applicable
*
* Description:
* This is the primary MiMAC interface for the protocol layer to
* set alternative network address and/or PAN identifier. This function
* call applies to only IEEE 802.15.4 compliant RF transceivers. In case
* alternative network address is not supported, this function will return
* FALSE.
*
* PreCondition:
* MiMAC initialization has been done.
*
* Parameters:
* uint8_t * Address - The alternative network address of the host device.
* uint8_t * PANID - The PAN identifier of the host device
*
* Returns:
* A boolean to indicates if setting alternative network address is successful.
*
* Example:
*
* uint16_t NetworkAddress = 0x0000;
* uint16_t PANID = 0x1234;
* MiMAC_SetAltAddress(&NetworkAddress, &PANID);
*
*
* Remarks:
* None
*
*****************************************************************************************/
bool MiMAC_SetAltAddress(uint8_t *Address, uint8_t *PANID);
/************************************************************************************
* Function:
* bool MiMAC_Init(MACINIT_PARAM initValue)
*
* Summary:
* This function initialize MiMAC layer
*
* Description:
* This is the primary MiMAC interface for the protocol layer to
* initialize the MiMAC layer. The initialization parameter is
* assigned in the format of structure MACINIT_PARAM.
*
* PreCondition:
* MCU initialization has been done.
*
* Parameters:
* MACINIT_PARAM initValue - Initialization value for MiMAC layer
*
* Returns:
* A boolean to indicates if initialization is successful.
*
* Example:
*
* MiMAC_Init(initParameter);
*
*
* Remarks:
* None
*
*****************************************************************************************/
bool MiMAC_Init(MACINIT_PARAM initValue);
/************************************************************************************
* Function:
* uint8_t MiMAC_ChannelAssessment(uint8_t AssessmentMode)
*
* Summary:
* This function perform the noise detection on current operating channel
*
* Description:
* This is the primary MiMAC interface for the protocol layer to
* perform the noise detection scan. Not all assessment modes are supported
* for all RF transceivers.
*
* PreCondition:
* MiMAC initialization has been done.
*
* Parameters:
* uint8_t AssessmentMode - The mode to perform noise assessment. The possible
* assessment modes are
* * CHANNEL_ASSESSMENT_CARRIER_SENSE Carrier sense detection mode
* * CHANNEL_ASSESSMENT_ENERGY_DETECT Energy detection mode
*
* Returns:
* A byte to indicate the noise level at current channel.
*
* Example:
*
* NoiseLevel = MiMAC_ChannelAssessment(CHANNEL_ASSESSMENT_CARRIER_SENSE);
*
*
* Remarks:
* None
*
*****************************************************************************************/
uint8_t MiMAC_ChannelAssessment(uint8_t AssessmentMode);
/************************************************************************************
* Function:
* uint32_t MiMAC_SymbolToTicks(uint32_t symbols)
*
* Summary:
* This function converts symbol to ticks
*
* Description:
* This is the primary MiMAC interface for the protocol layer to
* convert symbol to ticks for all RF transceivers.
*
* Parameters:
* uint8_t symbols - The number of symbols to convert
*
* Returns:
* converted value in uint32.
*****************************************************************************************/
uint32_t MiMAC_SymbolToTicks(uint32_t symbols);
/************************************************************************************
* Function:
* uint32_t MiMAC_GetPHYChannelInfo(uint32_t supportedChannelMap)
*
* Summary:
* This function gets the supported channel map
*
* Description:
* This is the primary MiMAC interface for the protocol layer to
* get the supported channel mask
*
* Parameters:
* None
*
* Returns:
* channel map uint32.
*****************************************************************************************/
uint32_t MiMAC_GetPHYChannelInfo(void);
/************************************************************************************
* Function:
* void MiMAC_DiscardPacket(void)
*
* Summary:
* This function discard the current packet received from the RF transceiver
*
* Description:
* This is the primary MiMAC interface for the protocol layer to
* discard the current packet received from the RF transceiver.
*
* PreCondition:
* MiMAC initialization has been done.
*
* Parameters:
* None
*
* Returns:
* None
*
* Example:
*
* if( TRUE == MiMAC_ReceivedPacket() )
* {
* // handle the raw data from RF transceiver
*
* // discard the current packet
* MiMAC_DiscardPacket();
* }
*
*
* Remarks:
* None
*
*****************************************************************************************/
void MiMAC_DiscardPacket(void);
/************************************************************************************
* Function:
* bool MiMAC_ReceivedPacket(void)
*
* Summary:
* This function check if a new packet has been received by the RF transceiver
*
* Description:
* This is the primary MiMAC interface for the protocol layer to
* check if a packet has been received by the RF transceiver. When a packet has
* been received, all information will be stored in the global variable
* MACRxPacket in the format of MAC_RECEIVED_PACKET;
*
* PreCondition:
* MiMAC initialization has been done.
*
* Parameters:
* None
*
* Returns:
* A boolean to indicate if a packet has been received by the RF transceiver.
*
* Example:
*
* if( true == MiMAC_ReceivedPacket() )
* {
* // handle the raw data from RF transceiver
*
* // discard the current packet
* MiMAC_DiscardPacket();
* }
*
*
* Remarks:
* None
*
*****************************************************************************************/
bool MiMAC_ReceivedPacket(void);
/************************************************************************************
* Function:
* BOOL MiMAC_SendPacket( MAC_TRANS_PARAM transParam,
* uint8_t *MACPayload, uint8_t MACPayloadLen,
uint8_t msghandle,MiMacDataConf_callback_t ConfCallback)
*
* Summary:
* This function transmit a packet
*
* Description:
* This is the primary MiMAC interface for the protocol layer to
* send a packet. Input parameter transParam configure the way
* to transmit the packet.
*
* PreCondition:
* MiMAC initialization has been done.
*
* Parameters:
* MAC_TRANS_PARAM transParam - The struture to configure the transmission way
* uint8_t * MACPaylaod - Pointer to the buffer of MAC payload
* uint8_t MACPayloadLen - The size of the MAC payload
* uint8_t msghandle Message handle
* MiMacDataConf_callback_t ConfCallback Callback function to be called once packet is sent
*
* Returns:
* A boolean to indicate if a packet has been received by the RF transceiver.
*
* Example:
*
* MiMAC_SendPacket(transParam, MACPayload, MACPayloadLen, 6, callback);
*
*
* Remarks:
* None
*
*****************************************************************************************/
bool MiMAC_SendPacket(MAC_TRANS_PARAM transParam, uint8_t *MACPayload, uint8_t MACPayloadLen, uint8_t msghandle,
DataConf_callback_t ConfCallback);
/************************************************************************************
* Function:
* bool MiMAC_PowerState(uint8_t PowerState)
*
* Summary:
* This function puts the RF transceiver into sleep or wake it up
*
* Description:
* This is the primary MiMAC interface for the protocol layer to
* set different power state for the RF transceiver. There are minimal
* power states defined as deep sleep and operating mode. Additional
* power states can be defined for individual RF transceiver depends
* on hardware design.
*
* PreCondition:
* MiMAC initialization has been done.
*
* Parameters:
* uint8_t PowerState - The power state of the RF transceiver to be set to.
* The minimum definitions for all RF transceivers are
* * POWER_STATE_DEEP_SLEEP RF transceiver deep sleep mode.
* * POWER_STATE_OPERATE RF transceiver operating mode.
* Returns:
* A boolean to indicate if chaning power state of RF transceiver is successful.
*
* Example:
*
* // Put RF transceiver into sleep
* MiMAC_PowerState(POWER_STATE_DEEP_SLEEP);
* // Put MCU to sleep
* Sleep();
* // Wake up the MCU by WDT, external interrupt or any other means
*
* // Wake up the RF transceiver
* MiMAC_PowerState(POWER_STATE_OPERATE);
*
*
* Remarks:
* None
*
*****************************************************************************************/
bool MiMAC_PowerState(uint8_t PowerState);
#if defined(IEEE_802_15_4)
#undef MY_ADDRESS_LENGTH
#define MY_ADDRESS_LENGTH 8
#endif
#if defined(ENABLE_SECURITY)
extern API_UINT32_UNION IncomingFrameCounter[CONNECTION_SIZE];
#endif
void UserInterruptHandler(void);
void MiMAC_Task(void);
#endif