import missing libraries

Committer:
akramaliomar
Date:
Mon Jul 12 13:24:25 2021 +0000
Revision:
0:52c6206e8bde
import missing libraries

Who changed what in which revision?

UserRevisionLine numberNew contents of line
akramaliomar 0:52c6206e8bde 1 /**
akramaliomar 0:52c6206e8bde 2 / _____) _ | |
akramaliomar 0:52c6206e8bde 3 ( (____ _____ ____ _| |_ _____ ____| |__
akramaliomar 0:52c6206e8bde 4 \____ \| ___ | (_ _) ___ |/ ___) _ \
akramaliomar 0:52c6206e8bde 5 _____) ) ____| | | || |_| ____( (___| | | |
akramaliomar 0:52c6206e8bde 6 (______/|_____)_|_|_| \__)_____)\____)_| |_|
akramaliomar 0:52c6206e8bde 7 (C)2013 Semtech
akramaliomar 0:52c6206e8bde 8 ___ _____ _ ___ _ _____ ___ ___ ___ ___
akramaliomar 0:52c6206e8bde 9 / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __|
akramaliomar 0:52c6206e8bde 10 \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _|
akramaliomar 0:52c6206e8bde 11 |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___|
akramaliomar 0:52c6206e8bde 12 embedded.connectivity.solutions===============
akramaliomar 0:52c6206e8bde 13 Description: LoRaWAN stack layer that controls both MAC and PHY underneath
akramaliomar 0:52c6206e8bde 14 License: Revised BSD License, see LICENSE.TXT file include in the project
akramaliomar 0:52c6206e8bde 15 Maintainer: Miguel Luis ( Semtech ), Gregory Cristian ( Semtech ) and Daniel Jaeckle ( STACKFORCE )
akramaliomar 0:52c6206e8bde 16 Copyright (c) 2017, Arm Limited and affiliates.
akramaliomar 0:52c6206e8bde 17 SPDX-License-Identifier: BSD-3-Clause
akramaliomar 0:52c6206e8bde 18 */
akramaliomar 0:52c6206e8bde 19
akramaliomar 0:52c6206e8bde 20 #ifndef SX1276_LORARADIO_H_
akramaliomar 0:52c6206e8bde 21 #define SX1276_LORARADIO_H_
akramaliomar 0:52c6206e8bde 22
akramaliomar 0:52c6206e8bde 23 #include "PinNames.h"
akramaliomar 0:52c6206e8bde 24 #include "InterruptIn.h"
akramaliomar 0:52c6206e8bde 25 #include "DigitalOut.h"
akramaliomar 0:52c6206e8bde 26 #include "DigitalInOut.h"
akramaliomar 0:52c6206e8bde 27 #include "SPI.h"
akramaliomar 0:52c6206e8bde 28 #include "platform/PlatformMutex.h"
akramaliomar 0:52c6206e8bde 29 #ifdef MBED_CONF_RTOS_PRESENT
akramaliomar 0:52c6206e8bde 30 #include "rtos/Thread.h"
akramaliomar 0:52c6206e8bde 31 #endif
akramaliomar 0:52c6206e8bde 32
akramaliomar 0:52c6206e8bde 33 #include "lorawan/LoRaRadio.h"
akramaliomar 0:52c6206e8bde 34
akramaliomar 0:52c6206e8bde 35 #ifdef MBED_CONF_SX1276_LORA_DRIVER_BUFFER_SIZE
akramaliomar 0:52c6206e8bde 36 #define MAX_DATA_BUFFER_SIZE_SX1276 MBED_CONF_SX1276_LORA_DRIVER_BUFFER_SIZE
akramaliomar 0:52c6206e8bde 37 #else
akramaliomar 0:52c6206e8bde 38 #define MAX_DATA_BUFFER_SIZE_SX1276 255
akramaliomar 0:52c6206e8bde 39 #endif
akramaliomar 0:52c6206e8bde 40
akramaliomar 0:52c6206e8bde 41 #if DEVICE_LPTICKER
akramaliomar 0:52c6206e8bde 42 #include "LowPowerTimeout.h"
akramaliomar 0:52c6206e8bde 43 #define ALIAS_LORAWAN_TIMER mbed::LowPowerTimeout
akramaliomar 0:52c6206e8bde 44 #else
akramaliomar 0:52c6206e8bde 45 #include "Timeout.h"
akramaliomar 0:52c6206e8bde 46 #define ALIAS_LORAWAN_TIMER mbed::Timeout
akramaliomar 0:52c6206e8bde 47 #endif
akramaliomar 0:52c6206e8bde 48
akramaliomar 0:52c6206e8bde 49 /**
akramaliomar 0:52c6206e8bde 50 * Radio driver implementation for Semtech SX1272 plus variants.
akramaliomar 0:52c6206e8bde 51 * Supports only SPI at the moment. Implements pure virtual LoRaRadio class.
akramaliomar 0:52c6206e8bde 52 */
akramaliomar 0:52c6206e8bde 53 class SX1276_LoRaRadio: public LoRaRadio {
akramaliomar 0:52c6206e8bde 54 public:
akramaliomar 0:52c6206e8bde 55 /**
akramaliomar 0:52c6206e8bde 56 * Use this constructor if pin definitions are provided manually.
akramaliomar 0:52c6206e8bde 57 * The pins that are marked NC are optional. It is assumed that these
akramaliomar 0:52c6206e8bde 58 * pins are not connected until/unless configured otherwise.
akramaliomar 0:52c6206e8bde 59 *
akramaliomar 0:52c6206e8bde 60 * Note: Pin ant_switch is equivalent to RxTx pin at
akramaliomar 0:52c6206e8bde 61 * https://developer.mbed.org/components/SX1276MB1xAS/.
akramaliomar 0:52c6206e8bde 62 * Reading the state of this pin indicates if the radio module type is
akramaliomar 0:52c6206e8bde 63 * SX1276MB1LAS(North American frequency band supported) or SX1276MAS
akramaliomar 0:52c6206e8bde 64 * (European frequency band supported).
akramaliomar 0:52c6206e8bde 65 * Pin dio4 can be mapped to multiple pins on the board, please refer to
akramaliomar 0:52c6206e8bde 66 * schematic of your board. For reference look at
akramaliomar 0:52c6206e8bde 67 * https://developer.mbed.org/components/SX1276MB1xAS/
akramaliomar 0:52c6206e8bde 68 *
akramaliomar 0:52c6206e8bde 69 * Most of the radio module control pins are not being used at the moment as
akramaliomar 0:52c6206e8bde 70 * the SX1276MB1xAS shield has not connected them. For consistency and future
akramaliomar 0:52c6206e8bde 71 * use we are leaving the pins in the constructor. For example, if in some
akramaliomar 0:52c6206e8bde 72 * setting SX1276 radio module gets connected to an external power amplifier
akramaliomar 0:52c6206e8bde 73 * or radio latch controls are connected.
akramaliomar 0:52c6206e8bde 74 */
akramaliomar 0:52c6206e8bde 75 SX1276_LoRaRadio(PinName mosi,
akramaliomar 0:52c6206e8bde 76 PinName miso,
akramaliomar 0:52c6206e8bde 77 PinName sclk,
akramaliomar 0:52c6206e8bde 78 PinName nss,
akramaliomar 0:52c6206e8bde 79 PinName reset,
akramaliomar 0:52c6206e8bde 80 PinName dio0,
akramaliomar 0:52c6206e8bde 81 PinName dio1,
akramaliomar 0:52c6206e8bde 82 PinName dio2,
akramaliomar 0:52c6206e8bde 83 PinName dio3,
akramaliomar 0:52c6206e8bde 84 PinName dio4,
akramaliomar 0:52c6206e8bde 85 PinName dio5,
akramaliomar 0:52c6206e8bde 86 PinName rf_switch_ctl1 = NC,
akramaliomar 0:52c6206e8bde 87 PinName rf_switch_ctl2 = NC,
akramaliomar 0:52c6206e8bde 88 PinName txctl = NC,
akramaliomar 0:52c6206e8bde 89 PinName rxctl = NC,
akramaliomar 0:52c6206e8bde 90 PinName ant_switch = NC,
akramaliomar 0:52c6206e8bde 91 PinName pwr_amp_ctl = NC,
akramaliomar 0:52c6206e8bde 92 PinName tcxo = NC);
akramaliomar 0:52c6206e8bde 93
akramaliomar 0:52c6206e8bde 94 /**
akramaliomar 0:52c6206e8bde 95 * Destructor
akramaliomar 0:52c6206e8bde 96 */
akramaliomar 0:52c6206e8bde 97 virtual ~SX1276_LoRaRadio();
akramaliomar 0:52c6206e8bde 98
akramaliomar 0:52c6206e8bde 99 /**
akramaliomar 0:52c6206e8bde 100 * Registers radio events with the Mbed LoRaWAN stack and
akramaliomar 0:52c6206e8bde 101 * undergoes initialization steps if any
akramaliomar 0:52c6206e8bde 102 *
akramaliomar 0:52c6206e8bde 103 * @param events Structure containing the driver callback functions
akramaliomar 0:52c6206e8bde 104 */
akramaliomar 0:52c6206e8bde 105 virtual void init_radio(radio_events_t *events);
akramaliomar 0:52c6206e8bde 106
akramaliomar 0:52c6206e8bde 107 /**
akramaliomar 0:52c6206e8bde 108 * Resets the radio module
akramaliomar 0:52c6206e8bde 109 */
akramaliomar 0:52c6206e8bde 110 virtual void radio_reset();
akramaliomar 0:52c6206e8bde 111
akramaliomar 0:52c6206e8bde 112 /**
akramaliomar 0:52c6206e8bde 113 * Put the RF module in sleep mode
akramaliomar 0:52c6206e8bde 114 */
akramaliomar 0:52c6206e8bde 115 virtual void sleep(void);
akramaliomar 0:52c6206e8bde 116
akramaliomar 0:52c6206e8bde 117 /**
akramaliomar 0:52c6206e8bde 118 * Sets the radio in standby mode
akramaliomar 0:52c6206e8bde 119 */
akramaliomar 0:52c6206e8bde 120 virtual void standby(void);
akramaliomar 0:52c6206e8bde 121
akramaliomar 0:52c6206e8bde 122 /**
akramaliomar 0:52c6206e8bde 123 * Sets the reception parameters
akramaliomar 0:52c6206e8bde 124 *
akramaliomar 0:52c6206e8bde 125 * @param modem Radio modem to be used [0: FSK, 1: LoRa]
akramaliomar 0:52c6206e8bde 126 * @param bandwidth Sets the bandwidth
akramaliomar 0:52c6206e8bde 127 * FSK : >= 2600 and <= 250000 Hz
akramaliomar 0:52c6206e8bde 128 * LoRa: [0: 125 kHz, 1: 250 kHz,
akramaliomar 0:52c6206e8bde 129 * 2: 500 kHz, 3: Reserved]
akramaliomar 0:52c6206e8bde 130 * @param datarate Sets the Datarate
akramaliomar 0:52c6206e8bde 131 * FSK : 600..300000 bits/s
akramaliomar 0:52c6206e8bde 132 * LoRa: [6: 64, 7: 128, 8: 256, 9: 512,
akramaliomar 0:52c6206e8bde 133 * 10: 1024, 11: 2048, 12: 4096 chips]
akramaliomar 0:52c6206e8bde 134 * @param coderate Sets the coding rate ( LoRa only )
akramaliomar 0:52c6206e8bde 135 * FSK : N/A ( set to 0 )
akramaliomar 0:52c6206e8bde 136 * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
akramaliomar 0:52c6206e8bde 137 * @param bandwidth_afc Sets the AFC Bandwidth ( FSK only )
akramaliomar 0:52c6206e8bde 138 * FSK : >= 2600 and <= 250000 Hz
akramaliomar 0:52c6206e8bde 139 * LoRa: N/A ( set to 0 )
akramaliomar 0:52c6206e8bde 140 * @param preamble_len Sets the Preamble length ( LoRa only )
akramaliomar 0:52c6206e8bde 141 * FSK : N/A ( set to 0 )
akramaliomar 0:52c6206e8bde 142 * LoRa: Length in symbols ( the hardware adds 4 more symbols )
akramaliomar 0:52c6206e8bde 143 * @param symb_timeout Sets the RxSingle timeout value
akramaliomar 0:52c6206e8bde 144 * FSK : timeout number of bytes
akramaliomar 0:52c6206e8bde 145 * LoRa: timeout in symbols
akramaliomar 0:52c6206e8bde 146 * @param fixLen Fixed length packets [0: variable, 1: fixed]
akramaliomar 0:52c6206e8bde 147 * @param payload_len Sets payload length when fixed lenght is used
akramaliomar 0:52c6206e8bde 148 * @param crc_on Enables/Disables the CRC [0: OFF, 1: ON]
akramaliomar 0:52c6206e8bde 149 * @param freq_hop_on Enables disables the intra-packet frequency hopping [0: OFF, 1: ON] (LoRa only)
akramaliomar 0:52c6206e8bde 150 * @param hop_period Number of symbols bewteen each hop (LoRa only)
akramaliomar 0:52c6206e8bde 151 * @param iq_inverted Inverts IQ signals ( LoRa only )
akramaliomar 0:52c6206e8bde 152 * FSK : N/A ( set to 0 )
akramaliomar 0:52c6206e8bde 153 * LoRa: [0: not inverted, 1: inverted]
akramaliomar 0:52c6206e8bde 154 * @param rx_continuous Sets the reception in continuous mode
akramaliomar 0:52c6206e8bde 155 * [false: single mode, true: continuous mode]
akramaliomar 0:52c6206e8bde 156 */
akramaliomar 0:52c6206e8bde 157 virtual void set_rx_config(radio_modems_t modem, uint32_t bandwidth,
akramaliomar 0:52c6206e8bde 158 uint32_t datarate, uint8_t coderate,
akramaliomar 0:52c6206e8bde 159 uint32_t bandwidth_afc, uint16_t preamble_len,
akramaliomar 0:52c6206e8bde 160 uint16_t symb_timeout, bool fix_len,
akramaliomar 0:52c6206e8bde 161 uint8_t payload_len,
akramaliomar 0:52c6206e8bde 162 bool crc_on, bool freq_hop_on, uint8_t hop_period,
akramaliomar 0:52c6206e8bde 163 bool iq_inverted, bool rx_continuous);
akramaliomar 0:52c6206e8bde 164
akramaliomar 0:52c6206e8bde 165 /**
akramaliomar 0:52c6206e8bde 166 * Sets the transmission parameters
akramaliomar 0:52c6206e8bde 167 *
akramaliomar 0:52c6206e8bde 168 * @param modem Radio modem to be used [0: FSK, 1: LoRa]
akramaliomar 0:52c6206e8bde 169 * @param power Sets the output power [dBm]
akramaliomar 0:52c6206e8bde 170 * @param fdev Sets the frequency deviation ( FSK only )
akramaliomar 0:52c6206e8bde 171 * FSK : [Hz]
akramaliomar 0:52c6206e8bde 172 * LoRa: 0
akramaliomar 0:52c6206e8bde 173 * @param bandwidth Sets the bandwidth ( LoRa only )
akramaliomar 0:52c6206e8bde 174 * FSK : 0
akramaliomar 0:52c6206e8bde 175 * LoRa: [0: 125 kHz, 1: 250 kHz,
akramaliomar 0:52c6206e8bde 176 * 2: 500 kHz, 3: Reserved]
akramaliomar 0:52c6206e8bde 177 * @param datarate Sets the Datarate
akramaliomar 0:52c6206e8bde 178 * FSK : 600..300000 bits/s
akramaliomar 0:52c6206e8bde 179 * LoRa: [6: 64, 7: 128, 8: 256, 9: 512,
akramaliomar 0:52c6206e8bde 180 * 10: 1024, 11: 2048, 12: 4096 chips]
akramaliomar 0:52c6206e8bde 181 * @param coderate Sets the coding rate ( LoRa only )
akramaliomar 0:52c6206e8bde 182 * FSK : N/A ( set to 0 )
akramaliomar 0:52c6206e8bde 183 * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
akramaliomar 0:52c6206e8bde 184 * @param preamble_len Sets the preamble length
akramaliomar 0:52c6206e8bde 185 * @param fix_len Fixed length packets [0: variable, 1: fixed]
akramaliomar 0:52c6206e8bde 186 * @param crc_on Enables disables the CRC [0: OFF, 1: ON]
akramaliomar 0:52c6206e8bde 187 * @param freq_hop_on Enables disables the intra-packet frequency hopping [0: OFF, 1: ON] (LoRa only)
akramaliomar 0:52c6206e8bde 188 * @param hop_period Number of symbols bewteen each hop (LoRa only)
akramaliomar 0:52c6206e8bde 189 * @param iq_inverted Inverts IQ signals ( LoRa only )
akramaliomar 0:52c6206e8bde 190 * FSK : N/A ( set to 0 )
akramaliomar 0:52c6206e8bde 191 * LoRa: [0: not inverted, 1: inverted]
akramaliomar 0:52c6206e8bde 192 * @param timeout Transmission timeout [ms]
akramaliomar 0:52c6206e8bde 193 */
akramaliomar 0:52c6206e8bde 194 virtual void set_tx_config(radio_modems_t modem, int8_t power, uint32_t fdev,
akramaliomar 0:52c6206e8bde 195 uint32_t bandwidth, uint32_t datarate,
akramaliomar 0:52c6206e8bde 196 uint8_t coderate, uint16_t preamble_len,
akramaliomar 0:52c6206e8bde 197 bool fix_len, bool crc_on, bool freq_hop_on,
akramaliomar 0:52c6206e8bde 198 uint8_t hop_period, bool iq_inverted, uint32_t timeout);
akramaliomar 0:52c6206e8bde 199
akramaliomar 0:52c6206e8bde 200 /**
akramaliomar 0:52c6206e8bde 201 * Sends the buffer of size
akramaliomar 0:52c6206e8bde 202 *
akramaliomar 0:52c6206e8bde 203 * Prepares the packet to be sent and sets the radio in transmission
akramaliomar 0:52c6206e8bde 204 *
akramaliomar 0:52c6206e8bde 205 * @param buffer Buffer pointer
akramaliomar 0:52c6206e8bde 206 * @param size Buffer size
akramaliomar 0:52c6206e8bde 207 */
akramaliomar 0:52c6206e8bde 208 virtual void send(uint8_t *buffer, uint8_t size);
akramaliomar 0:52c6206e8bde 209
akramaliomar 0:52c6206e8bde 210 /**
akramaliomar 0:52c6206e8bde 211 * For backwards compatibility
akramaliomar 0:52c6206e8bde 212 */
akramaliomar 0:52c6206e8bde 213 virtual void receive(uint32_t timeout)
akramaliomar 0:52c6206e8bde 214 {
akramaliomar 0:52c6206e8bde 215 (void) timeout;
akramaliomar 0:52c6206e8bde 216 receive();
akramaliomar 0:52c6206e8bde 217 }
akramaliomar 0:52c6206e8bde 218
akramaliomar 0:52c6206e8bde 219 /**
akramaliomar 0:52c6206e8bde 220 * Sets the radio to receive
akramaliomar 0:52c6206e8bde 221 *
akramaliomar 0:52c6206e8bde 222 * All necessary configuration options for reception are set in
akramaliomar 0:52c6206e8bde 223 * 'set_rx_config(parameters)' API.
akramaliomar 0:52c6206e8bde 224 */
akramaliomar 0:52c6206e8bde 225 virtual void receive(void);
akramaliomar 0:52c6206e8bde 226
akramaliomar 0:52c6206e8bde 227 /**
akramaliomar 0:52c6206e8bde 228 * Sets the carrier frequency
akramaliomar 0:52c6206e8bde 229 *
akramaliomar 0:52c6206e8bde 230 * @param freq Channel RF frequency
akramaliomar 0:52c6206e8bde 231 */
akramaliomar 0:52c6206e8bde 232 virtual void set_channel(uint32_t freq);
akramaliomar 0:52c6206e8bde 233
akramaliomar 0:52c6206e8bde 234 /**
akramaliomar 0:52c6206e8bde 235 * Generates a 32 bits random value based on the RSSI readings
akramaliomar 0:52c6206e8bde 236 *
akramaliomar 0:52c6206e8bde 237 * Remark this function sets the radio in LoRa modem mode and disables
akramaliomar 0:52c6206e8bde 238 * all interrupts.
akramaliomar 0:52c6206e8bde 239 * After calling this function either Radio.SetRxConfig or
akramaliomar 0:52c6206e8bde 240 * Radio.SetTxConfig functions must be called.
akramaliomar 0:52c6206e8bde 241 *
akramaliomar 0:52c6206e8bde 242 * @return 32 bits random value
akramaliomar 0:52c6206e8bde 243 */
akramaliomar 0:52c6206e8bde 244 virtual uint32_t random(void);
akramaliomar 0:52c6206e8bde 245
akramaliomar 0:52c6206e8bde 246 /**
akramaliomar 0:52c6206e8bde 247 * Get radio status
akramaliomar 0:52c6206e8bde 248 *
akramaliomar 0:52c6206e8bde 249 * @param status Radio status [RF_IDLE, RF_RX_RUNNING, RF_TX_RUNNING]
akramaliomar 0:52c6206e8bde 250 * @return Return current radio status
akramaliomar 0:52c6206e8bde 251 */
akramaliomar 0:52c6206e8bde 252 virtual uint8_t get_status(void);
akramaliomar 0:52c6206e8bde 253
akramaliomar 0:52c6206e8bde 254 /**
akramaliomar 0:52c6206e8bde 255 * Sets the maximum payload length
akramaliomar 0:52c6206e8bde 256 *
akramaliomar 0:52c6206e8bde 257 * @param modem Radio modem to be used [0: FSK, 1: LoRa]
akramaliomar 0:52c6206e8bde 258 * @param max Maximum payload length in bytes
akramaliomar 0:52c6206e8bde 259 */
akramaliomar 0:52c6206e8bde 260 virtual void set_max_payload_length(radio_modems_t modem, uint8_t max);
akramaliomar 0:52c6206e8bde 261
akramaliomar 0:52c6206e8bde 262 /**
akramaliomar 0:52c6206e8bde 263 * Sets the network to public or private
akramaliomar 0:52c6206e8bde 264 *
akramaliomar 0:52c6206e8bde 265 * Updates the sync byte. Applies to LoRa modem only
akramaliomar 0:52c6206e8bde 266 *
akramaliomar 0:52c6206e8bde 267 * @param enable if true, it enables a public network
akramaliomar 0:52c6206e8bde 268 */
akramaliomar 0:52c6206e8bde 269 virtual void set_public_network(bool enable);
akramaliomar 0:52c6206e8bde 270
akramaliomar 0:52c6206e8bde 271 /**
akramaliomar 0:52c6206e8bde 272 * Computes the packet time on air for the given payload
akramaliomar 0:52c6206e8bde 273 *
akramaliomar 0:52c6206e8bde 274 * Remark can only be called once SetRxConfig or SetTxConfig have been called
akramaliomar 0:52c6206e8bde 275 *
akramaliomar 0:52c6206e8bde 276 * @param modem Radio modem to be used [0: FSK, 1: LoRa]
akramaliomar 0:52c6206e8bde 277 * @param pkt_len Packet payload length
akramaliomar 0:52c6206e8bde 278 * @return Computed airTime for the given packet payload length
akramaliomar 0:52c6206e8bde 279 */
akramaliomar 0:52c6206e8bde 280 virtual uint32_t time_on_air(radio_modems_t modem, uint8_t pkt_len);
akramaliomar 0:52c6206e8bde 281
akramaliomar 0:52c6206e8bde 282 /**
akramaliomar 0:52c6206e8bde 283 * Perform carrier sensing
akramaliomar 0:52c6206e8bde 284 *
akramaliomar 0:52c6206e8bde 285 * Checks for a certain time if the RSSI is above a given threshold.
akramaliomar 0:52c6206e8bde 286 * This threshold determines if there is already a transmission going on
akramaliomar 0:52c6206e8bde 287 * in the channel or not.
akramaliomar 0:52c6206e8bde 288 *
akramaliomar 0:52c6206e8bde 289 * @param modem Type of the radio modem
akramaliomar 0:52c6206e8bde 290 * @param freq Carrier frequency
akramaliomar 0:52c6206e8bde 291 * @param rssi_threshold Threshold value of RSSI
akramaliomar 0:52c6206e8bde 292 * @param max_carrier_sense_time time to sense the channel
akramaliomar 0:52c6206e8bde 293 *
akramaliomar 0:52c6206e8bde 294 * @return true if there is no active transmission
akramaliomar 0:52c6206e8bde 295 * in the channel, false otherwise
akramaliomar 0:52c6206e8bde 296 */
akramaliomar 0:52c6206e8bde 297 virtual bool perform_carrier_sense(radio_modems_t modem,
akramaliomar 0:52c6206e8bde 298 uint32_t freq,
akramaliomar 0:52c6206e8bde 299 int16_t rssi_threshold,
akramaliomar 0:52c6206e8bde 300 uint32_t max_carrier_sense_time);
akramaliomar 0:52c6206e8bde 301
akramaliomar 0:52c6206e8bde 302 /**
akramaliomar 0:52c6206e8bde 303 * Sets the radio in CAD mode
akramaliomar 0:52c6206e8bde 304 *
akramaliomar 0:52c6206e8bde 305 */
akramaliomar 0:52c6206e8bde 306 virtual void start_cad(void);
akramaliomar 0:52c6206e8bde 307
akramaliomar 0:52c6206e8bde 308 /**
akramaliomar 0:52c6206e8bde 309 * Check if the given RF is in range
akramaliomar 0:52c6206e8bde 310 *
akramaliomar 0:52c6206e8bde 311 * @param frequency frequency needed to be checked
akramaliomar 0:52c6206e8bde 312 */
akramaliomar 0:52c6206e8bde 313 virtual bool check_rf_frequency(uint32_t frequency);
akramaliomar 0:52c6206e8bde 314
akramaliomar 0:52c6206e8bde 315 /** Sets the radio in continuous wave transmission mode
akramaliomar 0:52c6206e8bde 316 *
akramaliomar 0:52c6206e8bde 317 * @param freq Channel RF frequency
akramaliomar 0:52c6206e8bde 318 * @param power Sets the output power [dBm]
akramaliomar 0:52c6206e8bde 319 * @param time Transmission mode timeout [s]
akramaliomar 0:52c6206e8bde 320 */
akramaliomar 0:52c6206e8bde 321 virtual void set_tx_continuous_wave(uint32_t freq, int8_t power, uint16_t time);
akramaliomar 0:52c6206e8bde 322
akramaliomar 0:52c6206e8bde 323 /**
akramaliomar 0:52c6206e8bde 324 * Acquire exclusive access
akramaliomar 0:52c6206e8bde 325 */
akramaliomar 0:52c6206e8bde 326 virtual void lock(void);
akramaliomar 0:52c6206e8bde 327
akramaliomar 0:52c6206e8bde 328 /**
akramaliomar 0:52c6206e8bde 329 * Release exclusive access
akramaliomar 0:52c6206e8bde 330 */
akramaliomar 0:52c6206e8bde 331 virtual void unlock(void);
akramaliomar 0:52c6206e8bde 332
akramaliomar 0:52c6206e8bde 333 private:
akramaliomar 0:52c6206e8bde 334
akramaliomar 0:52c6206e8bde 335 // SPI and chip select control
akramaliomar 0:52c6206e8bde 336 mbed::SPI _spi;
akramaliomar 0:52c6206e8bde 337 mbed::DigitalOut _chip_select;
akramaliomar 0:52c6206e8bde 338
akramaliomar 0:52c6206e8bde 339 // module rest control
akramaliomar 0:52c6206e8bde 340 mbed::DigitalInOut _reset_ctl;
akramaliomar 0:52c6206e8bde 341
akramaliomar 0:52c6206e8bde 342 // Interrupt controls
akramaliomar 0:52c6206e8bde 343 mbed::InterruptIn _dio0_ctl;
akramaliomar 0:52c6206e8bde 344 mbed::InterruptIn _dio1_ctl;
akramaliomar 0:52c6206e8bde 345 mbed::InterruptIn _dio2_ctl;
akramaliomar 0:52c6206e8bde 346 mbed::InterruptIn _dio3_ctl;
akramaliomar 0:52c6206e8bde 347 mbed::InterruptIn _dio4_ctl;
akramaliomar 0:52c6206e8bde 348 mbed::InterruptIn _dio5_ctl;
akramaliomar 0:52c6206e8bde 349
akramaliomar 0:52c6206e8bde 350 // Radio specific controls
akramaliomar 0:52c6206e8bde 351 mbed::DigitalOut _rf_switch_ctl1;
akramaliomar 0:52c6206e8bde 352 mbed::DigitalOut _rf_switch_ctl2;
akramaliomar 0:52c6206e8bde 353 mbed::DigitalOut _txctl;
akramaliomar 0:52c6206e8bde 354 mbed::DigitalOut _rxctl;
akramaliomar 0:52c6206e8bde 355 mbed::DigitalInOut _ant_switch;
akramaliomar 0:52c6206e8bde 356 mbed::DigitalOut _pwr_amp_ctl;
akramaliomar 0:52c6206e8bde 357 mbed::DigitalOut _tcxo;
akramaliomar 0:52c6206e8bde 358
akramaliomar 0:52c6206e8bde 359 // Contains all RF control pin names
akramaliomar 0:52c6206e8bde 360 // This storage is needed even after assigning the
akramaliomar 0:52c6206e8bde 361 // pins to corresponding object, as the driver needs to know
akramaliomar 0:52c6206e8bde 362 // which control pins are connected and which are not. This
akramaliomar 0:52c6206e8bde 363 // variation is inherent to driver because of target configuration.
akramaliomar 0:52c6206e8bde 364 rf_ctrls _rf_ctrls;
akramaliomar 0:52c6206e8bde 365
akramaliomar 0:52c6206e8bde 366 // We need these PinNames as not all modules have those connected
akramaliomar 0:52c6206e8bde 367 PinName _dio4_pin;
akramaliomar 0:52c6206e8bde 368 PinName _dio5_pin;
akramaliomar 0:52c6206e8bde 369
akramaliomar 0:52c6206e8bde 370 // Structure containing all user and network specified settings
akramaliomar 0:52c6206e8bde 371 // for radio module
akramaliomar 0:52c6206e8bde 372 radio_settings_t _rf_settings;
akramaliomar 0:52c6206e8bde 373
akramaliomar 0:52c6206e8bde 374 // Structure containing function pointers to the stack callbacks
akramaliomar 0:52c6206e8bde 375 radio_events_t *_radio_events;
akramaliomar 0:52c6206e8bde 376
akramaliomar 0:52c6206e8bde 377 // Data buffer used for both TX and RX
akramaliomar 0:52c6206e8bde 378 // Size of this buffer is configurable via Mbed config system
akramaliomar 0:52c6206e8bde 379 // Default is 255 bytes
akramaliomar 0:52c6206e8bde 380 uint8_t _data_buffer[MAX_DATA_BUFFER_SIZE_SX1276];
akramaliomar 0:52c6206e8bde 381
akramaliomar 0:52c6206e8bde 382 // TX timer in ms. This timer is used as a fail safe for TX.
akramaliomar 0:52c6206e8bde 383 // If the chip fails to transmit, its a fatal error, reflecting
akramaliomar 0:52c6206e8bde 384 // some catastrophic bus failure etc. We wish to have the control
akramaliomar 0:52c6206e8bde 385 // back from the driver in such a case.
akramaliomar 0:52c6206e8bde 386 ALIAS_LORAWAN_TIMER tx_timeout_timer;
akramaliomar 0:52c6206e8bde 387
akramaliomar 0:52c6206e8bde 388 #ifdef MBED_CONF_RTOS_PRESENT
akramaliomar 0:52c6206e8bde 389 // Thread to handle interrupts
akramaliomar 0:52c6206e8bde 390 rtos::Thread irq_thread;
akramaliomar 0:52c6206e8bde 391 #endif
akramaliomar 0:52c6206e8bde 392
akramaliomar 0:52c6206e8bde 393 // Access protection
akramaliomar 0:52c6206e8bde 394 PlatformMutex mutex;
akramaliomar 0:52c6206e8bde 395
akramaliomar 0:52c6206e8bde 396 uint8_t radio_variant;
akramaliomar 0:52c6206e8bde 397
akramaliomar 0:52c6206e8bde 398 // helper functions
akramaliomar 0:52c6206e8bde 399 void setup_registers();
akramaliomar 0:52c6206e8bde 400 void default_antenna_switch_ctrls();
akramaliomar 0:52c6206e8bde 401 void set_antenna_switch(uint8_t operation_mode);
akramaliomar 0:52c6206e8bde 402 void setup_spi();
akramaliomar 0:52c6206e8bde 403 void gpio_init();
akramaliomar 0:52c6206e8bde 404 void gpio_deinit();
akramaliomar 0:52c6206e8bde 405 void setup_interrupts();
akramaliomar 0:52c6206e8bde 406 void set_operation_mode(uint8_t operation_mode);
akramaliomar 0:52c6206e8bde 407 void set_low_power_mode();
akramaliomar 0:52c6206e8bde 408 void set_sx1276_variant_type();
akramaliomar 0:52c6206e8bde 409 uint8_t get_pa_conf_reg(uint32_t channel);
akramaliomar 0:52c6206e8bde 410 void set_rf_tx_power(int8_t power);
akramaliomar 0:52c6206e8bde 411 int16_t get_rssi(radio_modems_t modem);
akramaliomar 0:52c6206e8bde 412 uint8_t get_fsk_bw_reg_val(uint32_t bandwidth);
akramaliomar 0:52c6206e8bde 413 void write_to_register(uint8_t addr, uint8_t data);
akramaliomar 0:52c6206e8bde 414 void write_to_register(uint8_t addr, uint8_t *data, uint8_t size);
akramaliomar 0:52c6206e8bde 415 uint8_t read_register(uint8_t addr);
akramaliomar 0:52c6206e8bde 416 void read_register(uint8_t addr, uint8_t *buffer, uint8_t size);
akramaliomar 0:52c6206e8bde 417 void write_fifo(uint8_t *buffer, uint8_t size);
akramaliomar 0:52c6206e8bde 418 void read_fifo(uint8_t *buffer, uint8_t size);
akramaliomar 0:52c6206e8bde 419 void transmit(uint32_t timeout);
akramaliomar 0:52c6206e8bde 420 void rf_irq_task(void);
akramaliomar 0:52c6206e8bde 421 void set_modem(uint8_t modem);
akramaliomar 0:52c6206e8bde 422 void rx_chain_calibration(void);
akramaliomar 0:52c6206e8bde 423
akramaliomar 0:52c6206e8bde 424 // ISRs
akramaliomar 0:52c6206e8bde 425 void dio0_irq_isr();
akramaliomar 0:52c6206e8bde 426 void dio1_irq_isr();
akramaliomar 0:52c6206e8bde 427 void dio2_irq_isr();
akramaliomar 0:52c6206e8bde 428 void dio3_irq_isr();
akramaliomar 0:52c6206e8bde 429 void dio4_irq_isr();
akramaliomar 0:52c6206e8bde 430 void dio5_irq_isr();
akramaliomar 0:52c6206e8bde 431 void timeout_irq_isr();
akramaliomar 0:52c6206e8bde 432
akramaliomar 0:52c6206e8bde 433 // Handlers called by thread in response to signal
akramaliomar 0:52c6206e8bde 434 void handle_dio0_irq();
akramaliomar 0:52c6206e8bde 435 void handle_dio1_irq();
akramaliomar 0:52c6206e8bde 436 void handle_dio2_irq();
akramaliomar 0:52c6206e8bde 437 void handle_dio3_irq();
akramaliomar 0:52c6206e8bde 438 void handle_dio4_irq();
akramaliomar 0:52c6206e8bde 439 void handle_dio5_irq();
akramaliomar 0:52c6206e8bde 440 void handle_timeout_irq();
akramaliomar 0:52c6206e8bde 441 };
akramaliomar 0:52c6206e8bde 442
akramaliomar 0:52c6206e8bde 443 #endif // SX1276_LORARADIO_H_