/** * Copyright (c) 2016 - 2018 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh. * * All Rights Reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form, except as embedded into a Nordic * Semiconductor ASA integrated circuit in a product or a software update for * such product, 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. * * 3. Neither the name of Nordic Semiconductor ASA nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * 4. This software, with or without modification, must only be used with a * Nordic Semiconductor ASA integrated circuit. * * 5. Any software provided in binary form under this license must not be reverse * engineered, decompiled, modified and/or disassembled. * * * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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 PHY_COMMON_H_INCLUDED #define PHY_COMMON_H_INCLUDED /** @file * This file contains declarations of commonly used PHY routines and necessary macros/types. * * @defgroup phy_common PHY Common API * @ingroup phy_15_4 * @{ * @brief Module to declare Common PHY API * @details The Common PHY module contains declarations of commonly used PHY routines and necessary macros/types. */ /**@brief The maximum PSDU size (in octets) the PHY shall be able to receive (aMaxPHYPacketSize). * * @details See Table 22 - PHY constants. */ #define PHY_MAX_PACKET_SIZE 127 /**@brief The maximum PHR size (in octets). * * @details See 6.3 PPDU format. */ #define PHY_MAX_HEADER_SIZE 1 /**@brief Maximum PPDU size */ #define PHY_MAX_PPDU_SIZE (PHY_MAX_HEADER_SIZE + PHY_MAX_PACKET_SIZE) /**@brief Position of PHY header related to income PPDU start pointer.*/ #define PHY_HEADER_POS (-1) /**@brief Size of PHY header in bytes.*/ #define PHY_HEADER_SIZE 1 /**@brief Maximum channel number.*/ #define PHY_MAX_CHANNEL_NUM 0x1Au /**@brief Minimum channel number.*/ #define PHY_MIN_CHANNEL_NUM 0x0Bu // for 2400 MHz O-QPSK 1 octet = 2 symbols 1 symbol = 32bits chip #define aMaxPHYPacketSize PHY_MAX_PACKET_SIZE // in octets #define aTurnaroundTime 12 // in symbols #define aTurnaroundTimeUs 192 // in us // Read only parameters #define PHY_CURRENT_PAGE 0x0u #define PHY_CHANNEL_SUPPORTED 0x07FFF800ul #define PHY_SHR_DURATION 10u #define PHY_MAX_FRAME_DURATION (PHY_SHR_DURATION + (int)((aMaxPHYPacketSize + 1) * PHY_SYMBOLS_PER_OCTET)) #define PHY_SYMBOLS_PER_OCTET 2u // CCA values #define PHY_TRX_CCA_MODE0 0 #define PHY_TRX_CCA_MODE1 1 #define PHY_TRX_CCA_MODE2 2 #define PHY_TRX_CCA_MODE3 3 /** @brief Minimum value that can be used to set radio transmit power. Equals * to -32 dBm. * * This is a combination of digits which includes: * 2 MSBs represent the tolerance on the transmit power * 6 LSBs which may be written to, represent a signed integer in twos-complement format, * corresponding to the nominal transmit power of the device in decibels relative to 1 mW. * All combinations less than 0xBF are valid. */ #define PHY_MIN_TX_POWER 0x20 /** @brief Internal parameter of the PHY layer. * * @details Position of the sign bit inside transmit power attribute.*/ #define PHY_TRANSMIT_POWER_SIGN_BIT_POS 5 /** @brief Internal parameter of the PHY layer. * * @details This mask hides transmit power from transmit power attribute value, * but leaves precision bitfield. */ #define PHY_TRANSMIT_POWER_MASK 0xC0 /** @brief Internal parameter of the PHY layer. * * @details This mask hides precision bitfield from transmit power attribute value, * leaving transmit power unchanged. */ #define PHY_TRANSMIT_POWER_MASK_INV 0x3F // Possible transmit power #define DBM_11 ( 11 & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_10 ( 10 & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_9 ( 9 & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_8 ( 8 & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_7 ( 7 & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_6 ( 6 & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_5 ( 5 & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_4 ( 4 & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_3 ( 3 & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_2 ( 2 & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_1 ( 1 & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_0 ( 0 & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_1 (( -1) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_2 (( -2) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_3 (( -3) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_4 (( -4) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_5 (( -5) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_6 (( -6) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_7 (( -7) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_8 (( -8) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_9 (( -9) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_10 ((-10) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_11 ((-11) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_12 ((-12) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_13 ((-13) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_14 ((-14) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_15 ((-15) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_16 ((-16) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_17 ((-17) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_18 ((-18) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_19 ((-19) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_20 ((-20) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_21 ((-21) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_22 ((-22) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_23 ((-23) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_24 ((-24) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_25 ((-25) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_26 ((-26) & PHY_TRANSMIT_POWER_MASK_INV) #define DBM_MIN_27 ((-27) & PHY_TRANSMIT_POWER_MASK_INV) /**@brief Common PHY enumerations description used in various PHY primitives. * * @details See Table 18-PHY enumerations description for detailed info on the statuses up to PHY_READ_ONLY. * The statuses with higher numbers are implementation specific and used for synchronous API only. */ typedef enum { /** The CCA attempt has detected a busy channel. */ PHY_BUSY = 0x00, /** The transceiver is asked to change its state while receiving. */ PHY_BUSY_RX = 0x01, /** The transceiver is asked to change its state while transmitting. */ PHY_BUSY_TX = 0x02, /** The transceiver is to be switched off immediately. */ PHY_FORCE_TRX_OFF = 0x03, /** The CCA attempt has detected an idle channel. */ PHY_IDLE = 0x04, /** A SET/GET request was issued with a parameter in the primitive that is out of the valid range. */ PHY_INVALID_PARAMETER = 0x05, /** The transceiver is in or is to be configured into the receiver enabled state. */ PHY_RX_ON = 0x06, /** A SET/GET, an ED operation, or a transceiver state change was successful. */ PHY_SUCCESS = 0x07, /** The transceiver is in or is to be configured into the transceiver disabled state. */ PHY_TRX_OFF = 0x08, /** The transceiver is in or is to be configured into the transmitter enabled state. */ PHY_TX_ON = 0x09, /** A SET/GET request was issued with the identifier of an attribute that is not supported. */ PHY_UNSUPPORTED_ATTRIBUTE = 0x0A, /** A SET/GET request was issued with the identifier of an attribute that is read-only.*/ PHY_READ_ONLY = 0x0B, /* Statuses out of the standard. They are used for synchronous API */ /** Transceiver is forced to change it's state to PHY_TX_ON (potential packet drop). */ PHY_FORCE_TX_ON = 0xFC, /** Data cannot be sent due to failed CCA results.*/ PHY_CHANNEL_ACCESS_FAILURE = 0xFD, /** Data had been sent but ACK frame hasn't been received.*/ PHY_NO_ACK = 0xFE, /** PHY is not available for synchronous access */ PHY_IS_NOT_AVAILABLE = 0xFF } phy_enum_t; /**@brief PHY status type.*/ typedef phy_enum_t phy_status_t; /** @} */ #endif // PHY_COMMON_H_INCLUDED