summaryrefslogtreecommitdiff
path: root/libloragw/inc/loragw_hal.h
diff options
context:
space:
mode:
Diffstat (limited to 'libloragw/inc/loragw_hal.h')
-rw-r--r--libloragw/inc/loragw_hal.h168
1 files changed, 116 insertions, 52 deletions
diff --git a/libloragw/inc/loragw_hal.h b/libloragw/inc/loragw_hal.h
index 022313f..27ca1a2 100644
--- a/libloragw/inc/loragw_hal.h
+++ b/libloragw/inc/loragw_hal.h
@@ -4,10 +4,10 @@
\____ \| ___ | (_ _) ___ |/ ___) _ \
_____) ) ____| | | || |_| ____( (___| | | |
(______/|_____)_|_|_| \__)_____)\____)_| |_|
- ©2013 Semtech-Cycleo
+ (C)2013 Semtech-Cycleo
Description:
- Lora gateway Hardware Abstraction Layer
+ LoRa concentrator Hardware Abstraction Layer
License: Revised BSD License, see LICENSE.TXT file include in the project
Maintainer: Sylvain Miermont
@@ -23,12 +23,14 @@ Maintainer: Sylvain Miermont
#include <stdint.h> /* C99 types */
#include <stdbool.h> /* bool type */
+#include "config.h" /* library configuration options (dynamically generated) */
+
/* -------------------------------------------------------------------------- */
/* --- PUBLIC MACROS -------------------------------------------------------- */
#define IS_LORA_BW(bw) ((bw == BW_125KHZ) || (bw == BW_250KHZ) || (bw == BW_500KHZ))
#define IS_LORA_STD_DR(dr) ((dr == DR_LORA_SF7) || (dr == DR_LORA_SF8) || (dr == DR_LORA_SF9) || (dr == DR_LORA_SF10) || (dr == DR_LORA_SF11) || (dr == DR_LORA_SF12))
-#define IS_LORA_MULTI_DR(dr) ((dr & ~DR_LORA_MULTI) == 0) /* ones outside of DR_LORA_MULTI bitmask -> not a combination of Lora datarates */
+#define IS_LORA_MULTI_DR(dr) ((dr & ~DR_LORA_MULTI) == 0) /* ones outside of DR_LORA_MULTI bitmask -> not a combination of LoRa datarates */
#define IS_LORA_CR(cr) ((cr == CR_LORA_4_5) || (cr == CR_LORA_4_6) || (cr == CR_LORA_4_7) || (cr == CR_LORA_4_8))
#define IS_FSK_BW(bw) ((bw >= 1) && (bw <= 7))
@@ -43,42 +45,104 @@ Maintainer: Sylvain Miermont
#define LGW_HAL_SUCCESS 0
#define LGW_HAL_ERROR -1
-/* hardware characteristics */
-#define LGW_RF_CHAIN_NB 2 /* number of RF chains */
-#define LGW_IF_CHAIN_NB 10 /* number of IF+modem RX chains */
-#define LGW_MULTI_NB 4 /* number of Lora 'multi SF' chains */
-
-#define LGW_PKT_FIFO_SIZE 8 /* depth of the RX packet FIFO */
-#define LGW_DATABUFF_SIZE 1024 /* size in bytes of the RX data buffer (contains payload & metadata) */
-#define LGW_REF_BW 125000 /* typical bandwidth of data channel */
-#define LGW_XTAL_FREQU 32000000 /* frequency of the RF reference oscillator */
+/* radio-specific parameters */
+#if ((CFG_RADIO_1257 == 1) || (CFG_RADIO_1255 == 1))
+ #define LGW_XTAL_FREQU 32000000 /* frequency of the RF reference oscillator */
+ #define LGW_RF_CHAIN_NB 2 /* number of RF chains */
+ #define LGW_RF_RX_BANDWIDTH { 1000000, 1000000} /* bandwidth of the radios */
+#endif
-/* to use those parameters, declare a local constant, and use 'rf_chain' as index */
-#define LGW_RF_RX_LOWFREQ {863000000, 863000000} /* lower limit of the usable band in RX for each radio */
-#define LGW_RF_RX_UPFREQ {870000000, 870000000} /* upper limit of the usable band in RX for each radio */
-#define LGW_RF_RX_BANDWIDTH {800000, 800000} /* bandwidth of the radios */
-#define LGW_RF_TX_LOWFREQ {863000000, 863000000} /* lower limit of the usable band in TX for each radio */
-#define LGW_RF_TX_UPFREQ {870000000, 870000000} /* upper limit of the usable band in TX for each radio */
+/* band-specific parameters */
+/* to use array parameters, declare a local const and use 'rf_chain' as index */
+#if (CFG_BAND_FULL == 1)
+ #if (CFG_RADIO_1257 == 1)
+ #define LGW_RF_RX_LOWFREQ { 862000000, 862000000} /* lower limit of the usable band in RX for each radio */
+ #define LGW_RF_RX_UPFREQ {1020000000,1020000000} /* upper limit of the usable band in RX for each radio */
+ #define LGW_RF_TX_LOWFREQ { 862000000, 862000000} /* lower limit of the usable band in TX for each radio */
+ #define LGW_RF_TX_UPFREQ {1020000000,1020000000} /* upper limit of the usable band in TX for each radio */
+ #elif (CFG_RADIO_1255 == 1)
+ #define LGW_RF_RX_LOWFREQ { 400000000, 400000000}
+ #define LGW_RF_RX_UPFREQ { 510000000, 510000000}
+ #define LGW_RF_TX_LOWFREQ { 400000000, 400000000}
+ #define LGW_RF_TX_UPFREQ { 510000000, 510000000}
+ #endif
+#elif (CFG_BAND_868 == 1)
+ #define LGW_RF_RX_LOWFREQ { 863000000, 863000000}
+ #define LGW_RF_RX_UPFREQ { 870000000, 870000000}
+ #define LGW_RF_TX_LOWFREQ { 863000000, 863000000}
+ #define LGW_RF_TX_UPFREQ { 870000000, 870000000}
+#elif (CFG_BAND_915 == 1)
+ #define LGW_RF_RX_LOWFREQ { 902000000, 902000000}
+ #define LGW_RF_RX_UPFREQ { 928000000, 928000000}
+ #define LGW_RF_TX_LOWFREQ { 902000000, 902000000}
+ #define LGW_RF_TX_UPFREQ { 928000000, 928000000}
+#elif (CFG_BAND_470 == 1)
+ #define LGW_RF_RX_LOWFREQ { 470000000, 470000000}
+ #define LGW_RF_RX_UPFREQ { 510000000, 510000000}
+ #define LGW_RF_TX_LOWFREQ { 470000000, 470000000}
+ #define LGW_RF_TX_UPFREQ { 510000000, 510000000}
+#elif (CFG_BAND_433 == 1)
+ #define LGW_RF_RX_LOWFREQ { 433050000, 433050000}
+ #define LGW_RF_RX_UPFREQ { 434790000, 434790000}
+ #define LGW_RF_TX_LOWFREQ { 433050000, 433050000}
+ #define LGW_RF_TX_UPFREQ { 434790000, 434790000}
+#endif
/* type of if_chain + modem */
#define IF_UNDEFINED 0
-#define IF_LORA_STD 0x10 /* if + standard single-SF Lora modem */
-#define IF_LORA_MULTI 0x11 /* if + Lora receiver with multi-SF capability */
+#define IF_LORA_STD 0x10 /* if + standard single-SF LoRa modem */
+#define IF_LORA_MULTI 0x11 /* if + LoRa receiver with multi-SF capability */
#define IF_FSK_STD 0x20 /* if + standard FSK modem */
-/* configuration of available IF chains and modems on the hardware */
-/* to use, declare a local constant, and use 'if_chain' as index */
-#define LGW_IFMODEM_CONFIG {\
- IF_LORA_MULTI, \
- IF_LORA_MULTI, \
- IF_LORA_MULTI, \
- IF_LORA_MULTI, \
- IF_UNDEFINED, \
- IF_UNDEFINED, \
- IF_UNDEFINED, \
- IF_UNDEFINED, \
- IF_LORA_STD, \
- IF_FSK_STD }
+/* concentrator chipset-specific parameters */
+/* to use array parameters, declare a local const and use 'if_chain' as index */
+#if ((CFG_CHIP_1301 == 1) || (CFG_CHIP_FPGA == 1))
+ #define LGW_IF_CHAIN_NB 10 /* number of IF+modem RX chains */
+ #define LGW_PKT_FIFO_SIZE 8 /* depth of the RX packet FIFO */
+ #define LGW_DATABUFF_SIZE 1024 /* size in bytes of the RX data buffer (contains payload & metadata) */
+ #define LGW_REF_BW 125000 /* typical bandwidth of data channel */
+#endif
+
+#if (CFG_CHIP_1301 == 1)
+ #define LGW_MULTI_NB 8 /* number of LoRa 'multi SF' chains */
+ #define LGW_IFMODEM_CONFIG {\
+ IF_LORA_MULTI, \
+ IF_LORA_MULTI, \
+ IF_LORA_MULTI, \
+ IF_LORA_MULTI, \
+ IF_LORA_MULTI, \
+ IF_LORA_MULTI, \
+ IF_LORA_MULTI, \
+ IF_LORA_MULTI, \
+ IF_LORA_STD, \
+ IF_FSK_STD } /* configuration of available IF chains and modems on the hardware */
+#elif (CFG_CHIP_FPGA == 1)
+ #define LGW_MULTI_NB 4 /* number of LoRa 'multi SF' chains */
+ #define LGW_IFMODEM_CONFIG {\
+ IF_LORA_MULTI, \
+ IF_LORA_MULTI, \
+ IF_LORA_MULTI, \
+ IF_LORA_MULTI, \
+ IF_UNDEFINED, \
+ IF_UNDEFINED, \
+ IF_UNDEFINED, \
+ IF_UNDEFINED, \
+ IF_LORA_STD, \
+ IF_FSK_STD } /* configuration of available IF chains and modems on the hardware */
+#endif
+
+/* board-specific parameters */
+/* to use array parameters, declare a local const and use 'rf_chain' as index */
+#if (CFG_BRD_NANO868 == 1)
+ #define LGW_RF_TX_ENABLE { true, true} /* both radio A and B are usable in TX */
+ #define LGW_RF_CLKOUT { true, true} /* both radios have clkout enabled */
+#elif (CFG_BRD_REF1301 == 1)
+ #define LGW_RF_TX_ENABLE { true,false} /* radio B TX output is disconnected */
+ #define LGW_RF_CLKOUT {false, true} /* radio A clkout disabled for spur optimization */
+#elif (CFG_BRD_NONE == 1)
+ #define LGW_RF_TX_ENABLE { true, true} /* both radio A and B are usable in TX */
+ #define LGW_RF_CLKOUT { true, true} /* both radios have clkout enabled */
+#endif
/* values available for the 'modulation' parameters */
/* NOTE: arbitrary values */
@@ -86,7 +150,7 @@ Maintainer: Sylvain Miermont
#define MOD_LORA 0x10
#define MOD_FSK 0x20
-/* values available for the 'bandwidth' parameters (Lora & FSK) */
+/* values available for the 'bandwidth' parameters (LoRa & FSK) */
/* NOTE: directly encode FSK RX bandwidth, do not change */
#define BW_UNDEFINED 0
#define BW_500KHZ 0x01
@@ -98,7 +162,7 @@ Maintainer: Sylvain Miermont
#define BW_7K8HZ 0x07
/* values available for the 'datarate' parameters */
-/* NOTE: Lora values used directly to code SF bitmask in 'multi' modem, do not change */
+/* NOTE: LoRa values used directly to code SF bitmask in 'multi' modem, do not change */
#define DR_UNDEFINED 0
#define DR_LORA_SF7 0x02
#define DR_LORA_SF8 0x04
@@ -111,7 +175,7 @@ Maintainer: Sylvain Miermont
#define DR_FSK_MIN 500
#define DR_FSK_MAX 250000
-/* values available for the 'coderate' parameters (Lora only) */
+/* values available for the 'coderate' parameters (LoRa only) */
/* NOTE: arbitrary values */
#define CR_UNDEFINED 0
#define CR_LORA_4_5 0x01
@@ -185,16 +249,16 @@ struct lgw_pkt_rx_s {
uint32_t freq_hz; /*!> central frequency of the IF chain */
uint8_t if_chain; /*!> by which IF chain was packet received */
uint8_t status; /*!> status of the received packet */
- uint32_t count_us; /*!> internal gateway counter for timestamping, 1 microsecond resolution */
+ uint32_t count_us; /*!> internal concentrator counter for timestamping, 1 microsecond resolution */
uint8_t rf_chain; /*!> through which RF chain the packet was received */
uint8_t modulation; /*!> modulation used by the packet */
- uint8_t bandwidth; /*!> modulation bandwidth (Lora only) */
- uint32_t datarate; /*!> RX datarate of the packet (SF for Lora) */
- uint8_t coderate; /*!> error-correcting code of the packet (Lora only) */
+ uint8_t bandwidth; /*!> modulation bandwidth (LoRa only) */
+ uint32_t datarate; /*!> RX datarate of the packet (SF for LoRa) */
+ uint8_t coderate; /*!> error-correcting code of the packet (LoRa only) */
float rssi; /*!> average packet RSSI in dB */
- float snr; /*!> average packet SNR, in dB (Lora only) */
- float snr_min; /*!> minimum packet SNR, in dB (Lora only) */
- float snr_max; /*!> maximum packet SNR, in dB (Lora only) */
+ float snr; /*!> average packet SNR, in dB (LoRa only) */
+ float snr_min; /*!> minimum packet SNR, in dB (LoRa only) */
+ float snr_max; /*!> maximum packet SNR, in dB (LoRa only) */
uint16_t crc; /*!> CRC that was received in the payload */
uint16_t size; /*!> payload size in bytes */
uint8_t payload[256]; /*!> buffer containing the payload */
@@ -211,14 +275,14 @@ struct lgw_pkt_tx_s {
uint8_t rf_chain; /*!> through which RF chain will the packet be sent */
int8_t rf_power; /*!> TX power, in dBm */
uint8_t modulation; /*!> modulation to use for the packet */
- uint8_t bandwidth; /*!> modulation bandwidth (Lora only) */
- uint32_t datarate; /*!> TX datarate (baudrate for FSK, SF for Lora) */
- uint8_t coderate; /*!> error-correcting code of the packet (Lora only) */
- bool invert_pol; /*!> invert signal polarity, for orthogonal downlinks (Lora only) */
+ uint8_t bandwidth; /*!> modulation bandwidth (LoRa only) */
+ uint32_t datarate; /*!> TX datarate (baudrate for FSK, SF for LoRa) */
+ uint8_t coderate; /*!> error-correcting code of the packet (LoRa only) */
+ bool invert_pol; /*!> invert signal polarity, for orthogonal downlinks (LoRa only) */
uint8_t f_dev; /*!> frequency deviation, in kHz (FSK only) */
uint16_t preamble; /*!> set the preamble length, 0 for default */
bool no_crc; /*!> if true, do not send a CRC in the packet */
- bool no_header; /*!> if true, enable implicit header mode (Lora), fixed length (FSK) */
+ bool no_header; /*!> if true, enable implicit header mode (LoRa), fixed length (FSK) */
uint16_t size; /*!> payload size in bytes */
uint8_t payload[256]; /*!> buffer containing the payload */
};
@@ -243,19 +307,19 @@ int lgw_rxrf_setconf(uint8_t rf_chain, struct lgw_conf_rxrf_s conf);
int lgw_rxif_setconf(uint8_t if_chain, struct lgw_conf_rxif_s conf);
/**
-@brief Connect to the Lora gateway, reset it and configure it according to previously set parameters
+@brief Connect to the LoRa concentrator, reset it and configure it according to previously set parameters
@return LGW_HAL_ERROR id the operation failed, LGW_HAL_SUCCESS else
*/
int lgw_start(void);
/**
-@brief Stop the Lora gateway and disconnect it
+@brief Stop the LoRa concentrator and disconnect it
@return LGW_HAL_ERROR id the operation failed, LGW_HAL_SUCCESS else
*/
int lgw_stop(void);
/**
-@brief A non-blocking function that will fetch up to 'max_pkt' packets from the Lora gateway FIFO and data buffer
+@brief A non-blocking function that will fetch up to 'max_pkt' packets from the LoRa concentrator FIFO and data buffer
@param max_pkt maximum number of packet that must be retrieved (equal to the size of the array of struct)
@param pkt_data pointer to an array of struct that will receive the packet metadata and payload pointers
@return LGW_HAL_ERROR id the operation failed, else the number of packets retrieved
@@ -270,7 +334,7 @@ int lgw_receive(uint8_t max_pkt, struct lgw_pkt_rx_s *pkt_data);
int lgw_send(struct lgw_pkt_tx_s pkt_data);
/**
-@brief Give the the status of different part of the Lora gateway
+@brief Give the the status of different part of the LoRa concentrator
@param select is used to select what status we want to know
@param code is used to return the status code
@return LGW_HAL_ERROR id the operation failed, LGW_HAL_SUCCESS else