BBR 1 Ebene

Revision:
0:fbdae7e6d805
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-os/features/lorawan/LoRaRadio.h	Mon May 14 11:29:06 2018 +0000
@@ -0,0 +1,419 @@
+/**
+ * Copyright (c) 2017, Arm Limited and affiliates.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef LORARADIO_H_
+#define LORARADIO_H_
+
+#include "platform/Callback.h"
+#include "PinNames.h"
+
+/**
+ * Structure to hold RF controls for LoRa Radio.
+ * SX1276 have an extra control for the crystal (used in DOSCO-L072CZ)
+ */
+typedef struct {
+    PinName rf_switch_ctl1;
+    PinName rf_switch_ctl2;
+    PinName txctl;
+    PinName rxctl;
+    PinName ant_switch;
+    PinName pwr_amp_ctl;
+    PinName tcxo;
+} rf_ctrls;
+
+/** Radio driver internal state.
+ * State machine states definition.
+ */
+typedef enum radio_state {
+    RF_IDLE = 0,
+    RF_RX_RUNNING,
+    RF_TX_RUNNING,
+    RF_CAD,
+} radio_state_t;
+
+/** Type of the modem.
+ *  [LORA/FSK]
+ */
+typedef enum modem_type {
+    MODEM_FSK = 0,
+    MODEM_LORA
+} radio_modems_t;
+
+/** Radio FSK modem parameters.
+ *
+ */
+typedef struct radio_fsk_settings {
+    int8_t   power;
+    uint32_t f_dev;
+    uint32_t bandwidth;
+    uint32_t bandwidth_afc;
+    uint32_t datarate;
+    uint16_t preamble_len;
+    bool     fix_len;
+    uint8_t  payload_len;
+    bool     crc_on;
+    bool     iq_inverted;
+    bool     rx_continuous;
+    uint32_t tx_timeout;
+    uint32_t rx_single_timeout;
+} radio_fsk_settings_t;
+
+/** Radio FSK packet handler state.
+ *
+ */
+typedef struct radio_fsk_packet_handler {
+    uint8_t  preamble_detected;
+    uint8_t  sync_word_detected;
+    int8_t   rssi_value;
+    int32_t  afc_value;
+    uint8_t  rx_gain;
+    uint16_t size;
+    uint16_t nb_bytes;
+    uint8_t  fifo_thresh;
+    uint8_t  chunk_size;
+} radio_fsk_packet_handler_t;
+
+/** Radio LoRa modem parameters.
+ *
+ */
+typedef struct radio_lora_settings {
+    int8_t   power;
+    uint32_t bandwidth;
+    uint32_t datarate;
+    bool     low_datarate_optimize;
+    uint8_t  coderate;
+    uint16_t preamble_len;
+    bool     fix_len;
+    uint8_t  payload_len;
+    bool     crc_on;
+    bool     freq_hop_on;
+    uint8_t  hop_period;
+    bool     iq_inverted;
+    bool     rx_continuous;
+    uint32_t tx_timeout;
+    bool     public_network;
+} radio_lora_settings_t;
+
+/** Radio LoRa packet handler state.
+ *
+ */
+typedef struct radio_lora_packet_handler {
+    int8_t  snr_value;
+    int8_t  rssi_value;
+    uint8_t size;
+} radio_lora_packet_handler_t;
+
+/** Radio settings.
+ *
+ */
+typedef struct radio_settings {
+    uint8_t                     state;
+    uint8_t                     modem;
+    uint32_t                    channel;
+    radio_fsk_settings_t        fsk;
+    radio_fsk_packet_handler_t  fsk_packet_handler;
+    radio_lora_settings_t       lora;
+    radio_lora_packet_handler_t lora_packet_handler;
+} radio_settings_t;
+
+/** Radio driver callback functions.
+ *
+ */
+typedef struct radio_events {
+    /**
+     * Callback when Transmission is done
+     */
+    mbed::Callback<void()> tx_done;
+
+    /**
+     * Callback when Transmission is timed out
+     */
+    mbed::Callback<void()> tx_timeout;
+
+    /**
+     * Rx Done callback prototype.
+     *
+     *  @param payload Received buffer pointer.
+     *  @param size    Received buffer size.
+     *  @param rssi    RSSI value computed while receiving the frame [dBm].
+     *  @param snr     Raw SNR value given by the radio hardware.
+     *                     FSK : N/A (set to 0)
+     *                     LoRa: SNR value in dB
+     */
+    mbed::Callback<void(const uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)> rx_done;
+
+    /**
+     * Callback when Reception is timed out
+     */
+    mbed::Callback<void()> rx_timeout;
+
+    /**
+     * Callback when Reception ends up in error
+     */
+    mbed::Callback<void()> rx_error;
+
+   /**
+    * FHSS Change Channel callback prototype.
+    *
+    *  @param current_channel   The index number of the current channel.
+    */
+    mbed::Callback<void(uint8_t current_channel)> fhss_change_channel;
+
+    /**
+     * CAD Done callback prototype.
+     *
+     *  @param channel_busy    True, if Channel activity detected.
+     */
+    mbed::Callback<void(bool channel_busy)> cad_done;
+} radio_events_t;
+
+/**
+ *    Interface for the radios, contains the main functions that a radio needs, and five callback functions.
+ */
+class LoRaRadio
+{
+
+public:
+
+    /**
+     * Registers radio events with the Mbed LoRaWAN stack and undergoes the initialization steps if any.
+     *
+     *  @param events The structure containing the driver callback functions.
+     */
+    virtual void init_radio(radio_events_t *events) = 0;
+
+    /**
+     * Resets the radio module.
+     */
+    virtual void radio_reset() = 0;
+
+    /**
+     *  Put the RF module in the sleep mode.
+     */
+    virtual void sleep(void) = 0;
+
+    /**
+     *  Sets the radio in the standby mode.
+     */
+    virtual void standby(void) = 0;
+
+    /**
+     *  Sets the reception parameters.
+     *
+     *  @param modem         The radio modem to be used [0: FSK, 1: LoRa].
+     *  @param bandwidth     Sets the bandwidth.
+     *                          FSK : >= 2600 and <= 250000 Hz
+     *                          LoRa: [0: 125 kHz, 1: 250 kHz,
+     *                                 2: 500 kHz, 3: Reserved]
+     *  @param datarate      Sets the datarate.
+     *                          FSK : 600..300000 bits/s
+     *                          LoRa: [6: 64, 7: 128, 8: 256, 9: 512,
+     *                                10: 1024, 11: 2048, 12: 4096  chips]
+     *  @param coderate      Sets the coding rate (LoRa only).
+     *                          FSK : N/A ( set to 0 )
+     *                          LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
+     *  @param bandwidth_afc Sets the AFC bandwidth (FSK only).
+     *                          FSK : >= 2600 and <= 250000 Hz
+     *                          LoRa: N/A (set to 0)
+     *  @param preamble_len  Sets the preamble length (LoRa only).
+     *                          FSK : N/A (set to 0)
+     *                          LoRa: Length in symbols (the hardware adds four more symbols).
+     *  @param symb_timeout  Sets the RxSingle timeout value.
+     *                          FSK : Timeout number of bytes
+     *                          LoRa: Timeout in symbols
+     *  @param fix_len        Fixed length packets [0: variable, 1: fixed].
+     *  @param payload_len   Sets the payload length when fixed length is used.
+     *  @param crc_on        Enables/disables the CRC [0: OFF, 1: ON].
+     *  @param freq_hop_on   Enables/disables the intra-packet frequency hopping [0: OFF, 1: ON] (LoRa only).
+     *  @param hop_period    The number of symbols bewteen each hop (LoRa only).
+     *  @param iq_inverted   Inverts the IQ signals (LoRa only).
+     *                          FSK : N/A (set to 0)
+     *                          LoRa: [0: not inverted, 1: inverted]
+     *  @param rx_continuous Sets the reception in continuous mode.
+     *                          [false: single mode, true: continuous mode]
+     */
+    virtual void set_rx_config (radio_modems_t modem, uint32_t bandwidth,
+                               uint32_t datarate, uint8_t coderate,
+                               uint32_t bandwidth_afc, uint16_t preamble_len,
+                               uint16_t symb_timeout, bool fix_len,
+                               uint8_t payload_len,
+                               bool crc_on, bool freq_hop_on, uint8_t hop_period,
+                               bool iq_inverted, bool rx_continuous) = 0;
+
+    /**
+     *  Sets the transmission parameters.
+     *
+     *  @param modem         The radio modem to be used [0: FSK, 1: LoRa].
+     *  @param power         Sets the output power [dBm].
+     *  @param fdev          Sets the frequency deviation (FSK only).
+     *                          FSK : [Hz]
+     *                          LoRa: 0
+     *  @param bandwidth     Sets the bandwidth (LoRa only).
+     *                          FSK : 0
+     *                          LoRa: [0: 125 kHz, 1: 250 kHz,
+     *                                 2: 500 kHz, 3: Reserved]
+     *  @param datarate      Sets the datarate.
+     *                          FSK : 600..300000 bits/s
+     *                          LoRa: [6: 64, 7: 128, 8: 256, 9: 512,
+     *                                10: 1024, 11: 2048, 12: 4096  chips]
+     *  @param coderate      Sets the coding rate (LoRa only).
+     *                          FSK : N/A ( set to 0 )
+     *                          LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
+     *  @param preamble_len  Sets the preamble length.
+     *  @param fix_len       Fixed length packets [0: variable, 1: fixed].
+     *  @param crc_on        Enables/disables the CRC [0: OFF, 1: ON].
+     *  @param freq_hop_on   Enables/disables the intra-packet frequency hopping [0: OFF, 1: ON] (LoRa only).
+     *  @param hop_period    The number of symbols between each hop (LoRa only).
+     *  @param iq_inverted   Inverts IQ signals (LoRa only)
+     *                          FSK : N/A (set to 0).
+     *                          LoRa: [0: not inverted, 1: inverted]
+     *  @param timeout       The transmission timeout [us].
+     */
+    virtual void set_tx_config(radio_modems_t modem, int8_t power, uint32_t fdev,
+                              uint32_t bandwidth, uint32_t datarate,
+                              uint8_t coderate, uint16_t preamble_len,
+                              bool fix_len, bool crc_on, bool freq_hop_on,
+                              uint8_t hop_period, bool iq_inverted, uint32_t timeout) = 0;
+
+    /**
+     *  Sends the buffer of size
+     *
+     *  Prepares the packet to be sent and sets the radio in transmission.
+     *
+     *  @param buffer        A pointer to the buffer.
+     *  @param size          The buffer size.
+     */
+    virtual void send(uint8_t *buffer, uint8_t size) = 0;
+
+    /**
+     *  Sets the radio in reception mode for a given time.
+     *
+     *  If the timeout is set to 0, it essentially puts the receiver in continuous mode and it should
+     *  be treated as if in continuous mode. However, an appropriate way to set the receiver in continuous mode is
+     *  to use the `set_rx_config()` API.
+     *
+     *  @param timeout       Reception timeout [ms].
+     *
+     */
+    virtual void receive(uint32_t timeout) = 0;
+
+    /**
+     *  Sets the carrier frequency
+     *
+     *  @param freq          Channel RF frequency.
+     */
+    virtual void set_channel(uint32_t freq) = 0;
+
+    /**
+     *  Generates a 32 bit random value based on the RSSI readings.
+     *
+     *  \remark This function sets the radio in LoRa modem mode and disables all interrupts.
+     *          After calling this function, either `Radio.SetRxConfig` or
+     *         `Radio.SetTxConfig` functions must be called.
+     *
+     *  @return             A 32 bit random value.
+     */
+    virtual uint32_t random(void) = 0;
+
+    /**
+     *  Gets the radio status.
+     *
+     *  @return              The current radio status.
+     */
+    virtual uint8_t get_status(void) = 0;
+
+    /**
+     *  Sets the maximum payload length.
+     *
+     *  @param modem         The radio modem to be used [0: FSK, 1: LoRa].
+     *  @param max           The maximum payload length in bytes.
+     */
+    virtual void set_max_payload_length(radio_modems_t modem, uint8_t max) = 0;
+
+    /**
+     *  Sets the network to public or private.
+     *
+     *  Updates the sync byte. Applies to LoRa modem only.
+     *
+     *  @param enable        If true, it enables a public network.
+     */
+    virtual void set_public_network(bool enable) = 0;
+
+    /**
+     *  Computes the packet time on air for the given payload.
+     *
+     *  \remark This can only be called once `SetRxConfig` or `SetTxConfig` have been called.
+     *
+     *  @param modem         The radio modem to be used [0: FSK, 1: LoRa].
+     *  @param pkt_len       The packet payload length.
+     *  @return              The computed `airTime` for the given packet payload length.
+     */
+    virtual uint32_t time_on_air(radio_modems_t modem, uint8_t pkt_len) = 0;
+
+    /**
+     * Performs carrier sensing.
+     *
+     * Checks for a certain time if the RSSI is above a given threshold.
+     * This threshold determines whether or not there is a transmission going on
+     * in the channel already.
+     *
+     * @param modem                     The type of the radio modem.
+     * @param freq                      The carrier frequency.
+     * @param rssi_threshold            The threshold value of RSSI.
+     * @param max_carrier_sense_time    The time set for sensing the channel (ms).
+     *
+     * @return                          True if there is no active transmission
+     *                                  in the channel, otherwise false.
+     */
+    virtual bool perform_carrier_sense(radio_modems_t modem,
+                                       uint32_t freq,
+                                       int16_t rssi_threshold,
+                                       uint32_t max_carrier_sense_time) = 0;
+
+    /**
+     *  Sets the radio in CAD mode.
+     *
+     */
+    virtual void start_cad(void) = 0;
+
+    /**
+     *  Checks whether the given RF is in range.
+     *
+     *  @param frequency       The frequency to be checked.
+     */
+    virtual bool check_rf_frequency(uint32_t frequency) = 0;
+
+    /** Sets the radio in continuous wave transmission mode.
+     *
+     *  @param freq          The RF frequency of the channel.
+     *  @param power         The output power [dBm].
+     *  @param time          The transmission mode timeout [s].
+     */
+    virtual void set_tx_continuous_wave(uint32_t freq, int8_t power, uint16_t time) = 0;
+
+    /**
+     * Acquires exclusive access to this radio.
+     */
+    virtual void lock(void) = 0;
+
+    /**
+     * Releases the exclusive access to this radio.
+     */
+    virtual void unlock(void) = 0;
+};
+
+#endif // LORARADIO_H_