The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.
Dependents: hello SerialTestv11 SerialTestv12 Sierpinski ... more
mbed 2
This is the mbed 2 library. If you'd like to learn about Mbed OS please see the mbed-os docs.
Diff: TARGET_TB_SENSE_1/TOOLCHAIN_IAR/rail_chip_specific.h
- Revision:
- 171:3a7713b1edbc
- Parent:
- 167:84c0a372a020
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TARGET_TB_SENSE_1/TOOLCHAIN_IAR/rail_chip_specific.h Thu Nov 08 11:45:42 2018 +0000 @@ -0,0 +1,427 @@ +/***************************************************************************//** + * @file rail_chip_specific.h + * @brief This file contains the type definitions for EFR32 chip specific + * aspects of RAIL. + * @copyright Copyright 2015 Silicon Laboratories, Inc. www.silabs.com + ******************************************************************************/ + +#ifndef __RAIL_CHIP_SPECIFIC_H_ +#define __RAIL_CHIP_SPECIFIC_H_ + +// Include standard type headers to help define structures +#include <stdint.h> +#include <stdbool.h> +#include <stddef.h> + +#include "em_gpio.h" + +#include "rail_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// ----------------------------------------------------------------------------- +// Multiprotocol +// ----------------------------------------------------------------------------- +/** + * @addtogroup Multiprotocol_EFR32 EFR32 + * @{ + * @brief EFR32 Specific multiprotocol support defines + * @ingroup Multiprotocol + */ + +/** + * Placeholder for a chip specific RAIL handle. Using NULL as a RAIL handle is + * frowned upon, so we use another value that can't be de-referenced. + */ +#define RAIL_EFR32_HANDLE ((RAIL_Handle_t)0xFFFFFFFFUL) + +/** @} */ // end of group Multiprotocol_EFR32 + +// ----------------------------------------------------------------------------- +// Calibration +// ----------------------------------------------------------------------------- +/** + * @addtogroup Calibration_EFR32 EFR32 + * @{ + * @brief EFR32 Specific Calibrations + * @ingroup Calibration + * + * The EFR32 has two supported calibrations. There is the Image Rejection (IR) + * calibration and a temperature dependent calibration. The IR calibration is + * something that can be computed once and stored off or computed each time at + * startup. It is PHY specific and provides sensitivity improvements so we + * highly recommend using it. The IR calibration should only be run when the + * radio is IDLE. + * + * The temperature dependent calibrations are used to recalibrate the synth if + * the temperature crosses 0C or the temperature delta since the last + * calibration exceeds 70C while sitting in receive. RAIL will run VCO + * calibration automatically upon entering receive state so the application can + * omit this calibration if the stack will re-enter receive with enough + * frequency to not hit this temperature delta. If the application does not + * calibrate for temperature, it's possible to miss receive packets due to + * drift in the carrier frequency. + */ + +/** EFR32 specific temperature calibration bit */ +#define RAIL_CAL_TEMP_VCO (0x00000001U) +/** EFR32 specific IR calibration bit */ +#define RAIL_CAL_ONETIME_IRCAL (0x00010000U) + +/** Mask to run temperature dependent calibrations */ +#define RAIL_CAL_TEMP (RAIL_CAL_TEMP_VCO) +/** Mask to run one time calibrations */ +#define RAIL_CAL_ONETIME (RAIL_CAL_ONETIME_IRCAL) +/** Mask to run optional performance calibrations */ +#define RAIL_CAL_PERF (0) +/** Mask for calibrations that require the radio to be off */ +#define RAIL_CAL_OFFLINE (RAIL_CAL_ONETIME_IRCAL) +/** Mask to run all possible calibrations for this chip */ +#define RAIL_CAL_ALL (RAIL_CAL_TEMP | RAIL_CAL_ONETIME) +/** Mask to run all pending calibrations */ +#define RAIL_CAL_ALL_PENDING (0x00000000U) +/** Invalid calibration value */ +#define RAIL_CAL_INVALID_VALUE (0xFFFFFFFFU) + +/** + * Applies a given image rejection calibration value. + * + * @param[in] railHandle A RAIL instance handle. + * @param[in] imageRejection The image rejection value to apply. + * @return Status code indicating success of the function call. + * + * Take an image rejection calibration value and apply it. This value should be + * determined from a previous run of \ref RAIL_CalibrateIr on the same + * physical device with the same radio configuration. The imageRejection value + * will also be stored to the \ref RAIL_ChannelConfigEntry_t::attr, if possible. + * + * If multiple protocols are used, this function will return + * \ref RAIL_STATUS_INVALID_STATE if it is called and the given railHandle is + * not active. The caller must attempt to re-call this function later, in that + * case. + */ +RAIL_Status_t RAIL_ApplyIrCalibration(RAIL_Handle_t railHandle, + uint32_t imageRejection); + +/** + * Run the image rejection calibration + * + * @param[in] railHandle A RAIL instance handle. + * @param[out] imageRejection The result of the image rejection calibration. + * @return Status code indicating success of the function call. + * + * Run the image rejection calibration, and apply the resulting value. If the + * imageRejection parameter is non-NULL, then also store the value at that + * location. The imageRejection value will also be stored to the + * \ref RAIL_ChannelConfigEntry_t::attr, if possible. This is a long-running + * calibration that adds significant code space when run, and can be run with a + * separate firmware image on each device in order to save code space in the + * final image. + * + * If multiple protocols are used, this function will return + * \ref RAIL_STATUS_INVALID_STATE if it is called and the given railHandle is + * not active. The caller must attempt to re-call this function later, in that + * case. + */ +RAIL_Status_t RAIL_CalibrateIr(RAIL_Handle_t railHandle, + uint32_t *imageRejection); + +/** + * Run the temperature calibration + * + * @param[in] railHandle A RAIL instance handle. + * @return Status code indicating success of the function call. + * + * Run the temperature calibration, which needs to recalibrate the synth if + * the temperature crosses 0C or the temperature delta since the last + * calibration exceeds 70C while sitting in receive. RAIL will run VCO + * calibration automatically upon entering receive state so the application can + * omit this calibration if the stack will re-enter receive with enough + * frequency to not hit this temperature delta. If the application does not + * calibrate for temperature, it's possible to miss receive packets due to + * drift in the carrier frequency. + * + * If multiple protocols are used, this function will return + * \ref RAIL_STATUS_INVALID_STATE if it is called and the given railHandle is + * not active. In that case the calibration will be automatically performed the + * next time the radio enters receive. + */ +RAIL_Status_t RAIL_CalibrateTemp(RAIL_Handle_t railHandle); + +/** + * @struct RAIL_CalValues_t + * @brief Calibration value structure + * + * This structure contains the set of persistent calibration values for the + * EFR32. You can set these before hand and apply them at startup to save the + * time required to compute them. Any of these values may be set to + * RAIL_CAL_INVALID_VALUE to force the code to compute that calibration value. + */ +typedef struct RAIL_CalValues { + uint32_t imageRejection; /**< Image Rejection (IR) calibration value */ +} RAIL_CalValues_t; + +/** + * A define to set all RAIL_CalValues_t values to uninitialized. + * + * This define can be used when you have no data to pass to the calibration + * routines but wish to compute and save all possible calibrations. + */ +#define RAIL_CALVALUES_UNINIT (RAIL_CalValues_t){ \ + RAIL_CAL_INVALID_VALUE, \ +} + +/** @} */ // end of group Calibration_EFR32 + +// ----------------------------------------------------------------------------- +// Diagnostic +// ----------------------------------------------------------------------------- +/** + * @addtogroup Diagnostic_EFR32 EFR32 + * @{ + * @brief Types specific to the EFR32 for the diagnostic routines. + * @ingroup Diagnostic + */ + +/** + * @typedef RAIL_FrequencyOffset_t + * @brief Chip-specific type that represents the number of Frequency Offset + * units. It is used with \ref RAIL_GetRxFreqOffset() and + * \ref RAIL_SetFreqOffset(). + * + * The units on this chip are radio synthesizer resolution steps (synthTicks). + * On EFR32 (at least for now), the frequency offset is limited to 15 bits + * (size of SYNTH_CALOFFSET). A value of \ref RAIL_FREQUENCY_OFFSET_INVALID + * means that this value is invalid. + */ +typedef int16_t RAIL_FrequencyOffset_t; + +/** + * Specifies an invalid frequency offset value. This will be returned if you + * call \ref RAIL_GetRxFreqOffset() at an invalid time. + */ +#define RAIL_FREQUENCY_OFFSET_INVALID ((int16_t)0xFFFF) + +/** @} */ // end of group Diagnostic_EFR32 + +// ----------------------------------------------------------------------------- +// Radio Configuration +// ----------------------------------------------------------------------------- +/** + * @addtogroup Radio_Configuration_EFR32 EFR32 + * @{ + * @ingroup Radio_Configuration + * @brief Types specific to the EFR32 for radio configuration. + */ + +/** + * @brief Radio Configuration structure + * + * The radio configuration is generated in order to properly configure the + * radio for operation on a protocol. These configurations should not be + * created or edited by hand. + */ +typedef const uint32_t *RAIL_RadioConfig_t; + +/** @} */ // end of group Radio_Configuration_EFR32 + +// ----------------------------------------------------------------------------- +// Transmit +// ----------------------------------------------------------------------------- +/** + * @addtogroup PA_EFR32 EFR32 + * @{ + * @ingroup PA + * @brief Types specific to the EFR32 for dealing with the on chip PAs. + */ + +/** + * Raw power levels used directly by the RAIL_Get/SetTxPower API where a higher + * numerical value corresponds to a higher output power. These are referred to + * as 'raw (values/units)'. On the EFR32 they can range from one of \ref + * RAIL_TX_POWER_LEVEL_LP_MIN, \ref RAIL_TX_POWER_LEVEL_HP_MIN, or + * \ref RAIL_TX_POWER_LEVEL_SUBGIG_MIN to one of \ref + * RAIL_TX_POWER_LEVEL_LP_MAX, \ref RAIL_TX_POWER_LEVEL_HP_MAX, and \ref + * RAIL_TX_POWER_LEVEL_SUBGIG_MAX, respectively, depending on the selected \ref + * RAIL_TxPowerMode_t. + */ +typedef uint8_t RAIL_TxPowerLevel_t; + +/** + * The maximum valid value for the \ref RAIL_TxPowerLevel_t when in \ref + * RAIL_TX_POWER_MODE_2P4_LP mode. + */ +#define RAIL_TX_POWER_LEVEL_LP_MAX 7 +/** + * The maximum valid value for the \ref RAIL_TxPowerLevel_t when in \ref + * RAIL_TX_POWER_MODE_2P4_HP mode. + */ +#define RAIL_TX_POWER_LEVEL_HP_MAX 252 +/** + * The maximum valid value for the \ref RAIL_TxPowerLevel_t when in \ref + * RAIL_TX_POWER_MODE_SUBGIG mode. + */ +#define RAIL_TX_POWER_LEVEL_SUBGIG_MAX 248 +/** + * The minimum valid value for the \ref RAIL_TxPowerLevel_t when in \ref + * RAIL_TX_POWER_MODE_2P4_LP mode. + */ +#define RAIL_TX_POWER_LEVEL_HP_MIN 0 +/** + * The minimum valid value for the \ref RAIL_TxPowerLevel_t when in \ref + * RAIL_TX_POWER_MODE_2P4_HP mode. + */ +#define RAIL_TX_POWER_LEVEL_LP_MIN 1 +/** + * The minimum valid value for the \ref RAIL_TxPowerLevel_t when in \ref + * RAIL_TX_POWER_MODE_SUBGIG mode. + */ +#define RAIL_TX_POWER_LEVEL_SUBGIG_MIN 0 +/** + * Invalid RAIL_TxPowerLevel_t value returned when there is an error + * with RAIL_GetTxPower + */ +#define RAIL_TX_POWER_LEVEL_INVALID 255 + +/** + * @enum RAIL_TxPowerMode_t + * @brief Enumeration of the EFR32 power modes. + * + * The power modes on the EFR32 correspond to the different on-chip PA's that + * are available. For more information about the power and performance + * characteristics of a given amplifier, please consult the data sheet. + */ +RAIL_ENUM(RAIL_TxPowerMode_t) { + /** High power amplifier, up to 20dBm, raw values: 0-252 */ + RAIL_TX_POWER_MODE_2P4_HP, + /** Low power amplifier, up to 0dBm, raw values: 1-7 */ + RAIL_TX_POWER_MODE_2P4_LP, + /** SubGig amplifier, up to 20dBm, raw values: 0-248 */ + RAIL_TX_POWER_MODE_SUBGIG, + /** Invalid amplifier Selection */ + RAIL_TX_POWER_MODE_NONE +}; + +/** + * @struct RAIL_TxPowerConfig_t + * + * @brief Structure containing values used to initialize the power amplifiers. + */ +typedef struct RAIL_TxPowerConfig { + /** Tx power mode */ + RAIL_TxPowerMode_t mode; + /** Power amplifier supply voltage in mV, generally: + * DCDC supply ~ 1800mV (1.8V) + * Battery supply ~ 3300mV (3.3V) + */ + uint16_t voltage; + /** The amount of time to spend ramping for Tx in uS. */ + uint16_t rampTime; +} RAIL_TxPowerConfig_t; + +/** @} */ // end of group PA_EFR32 + +// ----------------------------------------------------------------------------- +// PTI +// ----------------------------------------------------------------------------- +/** + * @addtogroup PTI_EFR32 EFR32 + * @{ + * @brief EFR32 PTI functionality + * @ingroup PTI + * + * These enums and structures are used with RAIL PTI API. EFR32 supports + * SPI and UART PTI, and is configurable in terms of baud rates and pin PTI + * pin locations. + */ + +/** Channel type enumeration. */ +RAIL_ENUM(RAIL_PtiMode_t) { + /** Turn PTI off entirely */ + RAIL_PTI_MODE_DISABLED, + /** SPI mode. */ + RAIL_PTI_MODE_SPI, + /** UART mode. */ + RAIL_PTI_MODE_UART, + /** 9bit UART mode. */ + RAIL_PTI_MODE_UART_ONEWIRE +}; + +/** + * @struct RAIL_PtiConfig_t + * @brief Configuration for PTI. + */ +typedef struct RAIL_PtiConfig { + /** Packet Trace mode (UART or SPI) */ + RAIL_PtiMode_t mode; + /** Output baudrate for PTI in Hz */ + uint32_t baud; + /** Data output (DOUT) location for pin/port */ + uint8_t doutLoc; + /** Data output (DOUT) GPIO port */ + GPIO_Port_TypeDef doutPort; + /** Data output (DOUT) GPIO pin */ + uint8_t doutPin; + /** Data clock (DCLK) location for pin/port. Only used in SPI mode */ + uint8_t dclkLoc; + /** Data clock (DCLK) GPIO port. Only used in SPI mode */ + GPIO_Port_TypeDef dclkPort; + /** Data clock (DCLK) GPIO pin. Only used in SPI mode */ + uint8_t dclkPin; + /** Data frame (DFRAME) location for pin/port. Only used for */ + uint8_t dframeLoc; + /** Data frame (DFRAME) GPIO port */ + GPIO_Port_TypeDef dframePort; + /** Data frame (DFRAME) GPIO pin */ + uint8_t dframePin; +} RAIL_PtiConfig_t; + +/** @} */ // end of group PTI_EFR32 + +// ----------------------------------------------------------------------------- +// Antenna Control +// ----------------------------------------------------------------------------- +/** + * @addtogroup Antenna_Control_EFR32 EFR32 + * @{ + * @brief EFR32 Antenna Control functionality + * @ingroup Antenna + * + * These enums and structures are used with RAIL Antenna Control API. EFR32 supports + * up to two antennas and with configurable pin locations. + */ + +/** + * @struct RAIL_AntennaConfig_t + * @brief Configuration for Antenna switch pins. + */ +typedef struct RAIL_AntennaConfig { + /** MODEM_ROUTEPEN fields */ + /** Antenna 0 Pin Enable */ + bool ant0PinEn; + /** Antenna 1 Pin Enable */ + bool ant1PinEn; + /** MODEM_ROUTELOC1 fields */ + /** Antenna 0 location for pin/port */ + uint8_t ant0Loc; + /** Antenna 0 output GPIO port */ + GPIO_Port_TypeDef ant0Port; + /** Antenna 0 output GPIO pin */ + uint8_t ant0Pin; + /** Antenna 1 location for pin/port */ + uint8_t ant1Loc; + /** Antenna 1 output GPIO port */ + GPIO_Port_TypeDef ant1Port; + /** Antenna 1 output GPIO pin */ + uint8_t ant1Pin; +} RAIL_AntennaConfig_t; + +/** @} */ // end of group Antenna_Control_EFR32 + +#ifdef __cplusplus +} +#endif + +#endif