Concentrator Design v1.5

Station is able to support the concentrator reference design v1.5 as a compile-time option. The JSON configuration is very close to what the Semtech Packet Forwarder accepts for the v1.5 design.

Support for the v1.5 design comes in two compile time variants: (1) Single board, and (2) Multi board. The multi-board build MAY also handle a single board, of course, but it REQUIRES an additional configuration file (slave-0.conf).

Station further contains a statically linked version of the lora_gateway library to interact with the concentrator boards.

This section lists the available object types and fields with their possible values as understood by Station when parsing configuration files. The semantics of the fields is discussed elsewhere (cf. the respective documentation of the radio board). Only additional fields or extensions that are specific to Station are briefly explained.

A configuration NEED NOT specify any frequencies or enablement for IFCONF or RFCONF objects. This information is submitted by the LNS based on the channel plan assigned to a gateway. The channel-plan settings are merged with the local configuration before the concentrator board is being initialized.

The concentrator configuration is embedded into station.conf or slave-N.conf files in the following way:

{
  ...                    // possibly other fields e.g. "station_conf"
  "radio_conf"  : CONF
  "sx1301_conf" : CONF   // alias for radio_conf
  "SX1301_conf" : CONF   // alias for radio_conf
}

CONF Object

{
  "device"        : STRING   // station specific
  "pps"           : BOOL     // station specific
  "lorawan_public": BOOL
  "clksrc"        : INT
  "tx_gain_lut"   : [ TX_GAIN_LUT, .. ]
  "chan_FSK"      : IFCONF
  "chan_Lora_std" : IFCONF
  "chan_multiSF_X": IFCONF   // X in {0..7}
  "radio_0"       : RFCONF
  "radio_1"       : RFCONF
}

The device field specifies the SPI device which is used to communicate with the radio board. If multiple radio boards are used, the wildcard character ? is replaced with the actual board index. The board index is inferred from the name of the slave config file slave-N.conf.

If the gateway has a PPS signal (GPS device or some other source), the concentrator board that has access to this signal MUST have the field pps set to true. No more than one board MUST have this field set to true.

Note: Station does NOT REQUIRE access to a GPS device to maintain a global GPS time for Class B operation. A PPS aligned with the GPS time is sufficient.

TX_GAIN_LUT Object

{
  "pa_gain" : INT[0..3]
  "dig_gain": INT[0..3]
  "dac_gain": INT[0..3]
  "mix_gain": INT[0..3]
  "rf_power": INT[-128..127]
}

All of the fields of TX_GAIN_LUT are optional. If a field is missing, its value is read as zero.

RFCONF Object

{
  "enable"         : BOOL
  "tx_enable"      : BOOL
  "txpow_adjust"   : INT   // alias for antenna_gain
  "antenna_gain"   : INT
  "antenna_type"   : "omni" | "sector"    // station specific
  "freq"           : INT
  "tx_notch_freq"  : INT
  "rssi_offset"    : INT
  "rssi_offset_lbt": INT
  "type"           : "SX1255" | "SX1257" | "SX1272" | "SX1276"
}

All of the fields of RFCONF are optional and missing fields are read as false or 0. If antenna_type or type is missing, the value is undefined. txpow_adjust is just an alias for antenna_gain.

Station targets a specific output power to be dissipated. The values of the fields txpow_adjust and antenna_gain are subtracted from this target value to account for any gains by the antenna and any losses by the cable.

The field antenna_type specifies the nature of the antenna. The response to an uplink frame received via a sector antenna is always sent back over the same antenna. This is also the preferred behavior for an antenna labeled omni. If the antenna is blocked (e.g., due to duty-cycle limitations or being busy with another transmit), Station MAY transfer the downlink transmit to another omni antenna.

IFCONF Object

{
  "enable"        : BOOL
  "radio"         : INT       // alias for rf_chain
  "rf_chain"      : INT
  "freq"          : INT
  "bandwidth"     : INT(125000,250000,500000)
  "spread_factor" : INT(7..12)
  "datarate"      : INT
  "sync_word"     : INT
  "sync_word_size": INT
}

Single-Board Sample Configuration

Below is a sample configuration for a single board:

 {
   ...
   "radio_conf": {                      /* Actual channel plan is controlled by server */
       "lorawan_public": true,      /* is default */
       "clksrc": 1,                 /* radio_1 provides clock to concentrator */
       "device": "spidev",          /* default SPI device is platform specific */
       "radio_0": {
           /* freq/enable provided by LNS - only HW specific settings listed here */
           "type": "SX1257",
           "rssi_offset": -166.0,
           "tx_enable": true,
           "antenna_gain": 0
       },
       "radio_1": {
           "type": "SX1257",
           "rssi_offset": -166.0,
           "tx_enable": false
       }
       /* chan_multiSF_X, chan_Lora_std, chan_FSK provided by LNS */
   }
   ...
}

The configuration only contains board-specific settings. All parameters related to a channel plan are omitted because they are provided by the LNS and merged on the fly.

Multi-Board Sample Configuration

The multi-board Station variant requires additional configuration files slave-N.conf for each board where N={0,1,..}. The settings of the field radio_conf are merged with station.conf and the fields in station.conf provide default values for the respective slave files.

Below is a sample configuration for two boards:

 {
   ...
   "radio_conf": {
       "clksrc": 1,                 /* radio_1 provides clock to concentrator */
       "device": "spidev?.0",       /* ? is replace with the save index */
       "radio_0": {
           "rssi_offset": -166.0,
           "tx_enable": true,
           "antenna_gain": 0
           "antenna_type": "omni",
       },
       "radio_1": {
           "rssi_offset": -166.0,
           "tx_enable": false
       }
   }
   ...
}

Example slave-0.conf which overrides the antenna gain:

 {
   "SX1301_conf": {
       "radio_0": {
           "antenna_gain": 3.0
       }
   }
}

and a slave-1.conf which reuses all values from station.conf:

{}

Note: The SPI device in station.conf contains a wildcard ? which is being replaced by the slave index (0, 1, ..). In the example setup, Station would access the devices /dev/spidev0.0 and `/dev/spidev1.0. If SPI device paths of the different boards are not compatible with this wildcard scheme, the device name MUST be explicitly specified in each of the slave configuration files.