import missing libraries
SX1276_LoRaRadio.h@0:52c6206e8bde, 2021-07-12 (annotated)
- Committer:
- akramaliomar
- Date:
- Mon Jul 12 13:24:25 2021 +0000
- Revision:
- 0:52c6206e8bde
import missing libraries
Who changed what in which revision?
User | Revision | Line number | New 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_ |