common_lib.h 7.96 KB
Newer Older
1
/*******************************************************************************
2
    OpenAirInterface
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    Copyright(c) 1999 - 2014 Eurecom

    OpenAirInterface is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.


    OpenAirInterface is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
17
18
    along with OpenAirInterface.The full GNU General Public License is
    included in this distribution in the file called "COPYING". If not,
19
20
21
22
23
24
    see <http://www.gnu.org/licenses/>.

   Contact Information
   OpenAirInterface Admin: openair_admin@eurecom.fr
   OpenAirInterface Tech : openair_tech@eurecom.fr
   OpenAirInterface Dev  : openair4g-devel@eurecom.fr
25

ghaddab's avatar
ghaddab committed
26
   Address      : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
27
28

 *******************************************************************************/
29
30
31
32
33
34
35
36
37
38
/*! \file common_lib.h 
 * \brief common APIs for different RF frontend device 
 * \author HongliangXU, Navid Nikaein
 * \date 2015
 * \version 0.2
 * \company Eurecom
 * \maintainer:  navid.nikaein@eurecom.fr
 * \note
 * \warning
 */
39

knopp's avatar
   
knopp committed
40
41
42
#ifndef COMMON_LIB_H
#define COMMON_LIB_H
#include <stdint.h>
knopp's avatar
   
knopp committed
43
44

typedef int64_t openair0_timestamp;
45
typedef volatile int64_t openair0_vtimestamp;
knopp's avatar
   
knopp committed
46
47
48
typedef struct openair0_device_t openair0_device;
/* structrue holds the parameters to configure USRP devices
 */
knopp's avatar
   
knopp committed
49

50
#ifndef EXMIMO
51
52
53
#define MAX_CARDS 1
#endif

54
//#define USRP_GAIN_OFFSET (56.0)  // 86 calibrated for USRP B210 @ 2.6 GHz to get equivalent RS EPRE in OAI to SMBV100 output
knopp's avatar
   
knopp committed
55

knopp's avatar
   
knopp committed
56
57
58
59
typedef enum {
  max_gain=0,med_gain,byp_gain
} rx_gain_t;

60
61
62
63
64
65
typedef struct {
  //! Frequency for which RX chain was calibrated
  double freq;
  //! Offset to be applied to RX gain
  double offset;
} rx_gain_calib_table_t;
knopp's avatar
   
knopp committed
66

knopp's avatar
   
knopp committed
67
typedef struct {
gauthier's avatar
gauthier committed
68
  //! Module ID for this configuration
knopp's avatar
knopp committed
69
  int Mod_id;
70
71
  // device log level
  int log_level;
72
73
74
75
  //! number of downlink resource blocks
  int num_rb_dl;
  //! number of samples per frame 
  unsigned int  samples_per_frame;
gauthier's avatar
gauthier committed
76
  //! the sample rate for both transmit and receive.
knopp's avatar
   
knopp committed
77
  double sample_rate;
gauthier's avatar
gauthier committed
78
  //! number of samples per RX/TX packet (USRP + Ethernet)
knopp's avatar
knopp committed
79
  int samples_per_packet;
80
81
82
83
  // delay in sending samples (write)  due to hardware access, softmodem processing and fronthaul delay if exist
  int   	tx_delay;
  //! adjust the position of the samples after delay when sending   
  unsigned int	tx_forward_nsamps;
gauthier's avatar
gauthier committed
84
  //! number of RX channels (=RX antennas)
knopp's avatar
   
knopp committed
85
  int rx_num_channels;
gauthier's avatar
gauthier committed
86
  //! number of TX channels (=TX antennas)
knopp's avatar
   
knopp committed
87
  int tx_num_channels;
gauthier's avatar
gauthier committed
88
89
  //! \brief Center frequency in Hz for RX.
  //! index: [0..rx_num_channels[
knopp's avatar
   
knopp committed
90
  double rx_freq[4];
gauthier's avatar
gauthier committed
91
92
  //! \brief Center frequency in Hz for TX.
  //! index: [0..rx_num_channels[ !!! see lte-ue.c:427 FIXME iterates over rx_num_channels
knopp's avatar
   
knopp committed
93
  double tx_freq[4];
94
  //! mode for rxgain (ExpressMIMO2) 
knopp's avatar
   
knopp committed
95
  rx_gain_t rxg_mode[4];
gauthier's avatar
gauthier committed
96
  //! \brief Gain for RX in dB.
97
  //! index: [0..rx_num_channels]
knopp's avatar
   
knopp committed
98
  double rx_gain[4];
99
100
101
  //! \brief Gain offset (for calibration) in dB
  //! index: [0..rx_num_channels]
  double rx_gain_offset[4];
gauthier's avatar
gauthier committed
102
  //! gain for TX in dB
knopp's avatar
   
knopp committed
103
  double tx_gain[4];
gauthier's avatar
gauthier committed
104
  //! RX bandwidth in Hz
knopp's avatar
   
knopp committed
105
  double rx_bw;
gauthier's avatar
gauthier committed
106
  //! TX bandwidth in Hz
knopp's avatar
   
knopp committed
107
  double tx_bw;
108
109
  //! Auto calibration flag
  int autocal[4];
gauthier's avatar
gauthier committed
110
  //! RRH IP addr for Ethernet interface
111
  char *remote_ip;
gauthier's avatar
gauthier committed
112
  //! RRH port number for Ethernet interface
113
114
115
116
117
118
  int remote_port;
  //! my IP addr for Ethernet interface (eNB/BBU, UE)
  char *my_ip;
  //! my port number for Ethernet interface (eNB/BBU, UE)
  int my_port;

knopp's avatar
   
knopp committed
119
120
} openair0_config_t;

121
122
123
124
125
126
127
128
129
typedef struct {
  /* card id */
  int card;
  /* rf chain id */
  int chain;
} openair0_rf_map;



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/*!\brief device type */
typedef enum {
  MIN_DEV_TYPE = 0,
  /*!\brief device is ETH */
  ETH_IF,
  /*!\brief device is ExpressMIMO */
  EXMIMO_IF,
  /*!\brief device is USRP*/
  USRP_IF,
  /*!\brief device is BLADE RF*/
  BLADERF_IF,
  /*!\brief device is NONE*/
  NONE_IF,
  MAX_DEV_TYPE

} dev_type_t;

/*!\brief  type */
typedef enum {
  MIN_FUNC_TYPE = 0,
  BBU_FUNC,
  RRH_FUNC,
  MAX_FUNC_TYPE

}func_type_t;

knopp's avatar
   
knopp committed
156
struct openair0_device_t {
knopp's avatar
knopp committed
157
158
  /* Module ID of this device */
  int Mod_id;
knopp's avatar
   
knopp committed
159

160
161
162
163
164
165
  /* Type of this device */
  func_type_t func_type;
  
  /* Type of this device */
  dev_type_t type;

knopp's avatar
knopp committed
166
167
  /* RF frontend parameters set by application */
  openair0_config_t openair0_cfg;
168

knopp's avatar
   
knopp committed
169
170
171
172
173
174
175
176
  /* Can be used by driver to hold internal structure*/
  void *priv;

  /* Functions API, which are called by the application*/

  /* Called to start the transceiver. Return 0 if OK, < 0 if error */
  int (*trx_start_func)(openair0_device *device);

177
178
179
180
181
182
183
184
185
  /* Called to initiate transceiver threads */
  void (*trx_thread_func)(openair0_device *device, unsigned int rt_period, uint8_t RT_flag,uint8_t NRT_flag);
    
  /* Called to request connection from the transceiver/RRH. Return 0 if OK, < 0 if error */
  int (*trx_request_func)(openair0_device *device);

  /* Called to reply back to connection state to eNB/BBU. Return 0 if OK, < 0 if error */
  int (*trx_reply_func)(openair0_device *openair0);

knopp's avatar
   
knopp committed
186
187
188
189
  /* Write 'nsamps' samples on each channel from buffers. buff[0] is the array for
   * the first channel. timestamp if the time (in samples) at which the first sample
   * MUST be sent
   * use flags = 1 to send as timestamp specfied*/
190
  int (*trx_write_func)(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int antenna_id, int flags);
knopp's avatar
   
knopp committed
191

gauthier's avatar
gauthier committed
192
193
  /*! \brief Receive samples from hardware.
   * Read \ref nsamps samples from each channel to buffers. buff[0] is the array for
knopp's avatar
   
knopp committed
194
195
   * the first channel. *ptimestamp is the time at which the first sample
   * was received.
gauthier's avatar
gauthier committed
196
197
198
199
200
201
202
   * \param device the hardware to use
   * \param[out] ptimestamp the time at which the first sample was received.
   * \param[out] An array of pointers to buffers for received samples. The buffers must be large enough to hold the number of samples \ref nsamps.
   * \param nsamps Number of samples. One sample is 2 byte I + 2 byte Q => 4 byte.
   * \param cc Number of channels. If cc == 1, only buff[0] is filled with samples.
   * \returns the number of sample read
   */
203
204
205
206
207
208
209
210
211
212
213
214
215
  int (*trx_read_func)(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps,int antenna_id);

  /*! \brief print the device statistics  
   * \param device the hardware to use
   * \returns  0 on success
   */
  int (*trx_get_stats_func)(openair0_device *device);

  /*! \brief Reset device statistics  
   * \param device the hardware to use
   * \returns 0 in success 
   */
  int (*trx_reset_stats_func)(openair0_device *device);
knopp's avatar
   
knopp committed
216
217
218
219
220
221
222
223
224

  /* Terminate operation of the transceiver -- free all associated resources */
  void (*trx_end_func)(openair0_device *device);
};


#ifdef __cplusplus
extern "C"
{
gauthier's avatar
gauthier committed
225
226
#endif

227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
/* return 0 if OK */

int openair0_device_init(openair0_device* device, openair0_config_t *openair0_cfg);
openair0_timestamp get_usrp_time(openair0_device *device);

//EXMIMO
//int openair0_dev_init_exmimo(openair0_device *device, openair0_config_t *openair0_cfg);
//USPRP
//int openair0_dev_init_usrp(openair0_device* device, openair0_config_t *openair0_cfg);
//BLADERF
//int openair0_dev_init_bladerf(openair0_device* device, openair0_config_t *openair0_cfg);

//ETHERNET
int openair0_dev_init_eth(openair0_device *device, openair0_config_t *openair0_cfg);

int openair0_set_frequencies(openair0_device* device, openair0_config_t *openair0_cfg,int exmimo_dump_config);

int openair0_set_rx_frequencies(openair0_device* device, openair0_config_t *openair0_cfg);

int openair0_set_gains(openair0_device* device, openair0_config_t *openair0_cfg);

int openair0_print_stats(openair0_device* device);

int openair0_reset_stats(openair0_device* device);

int openair0_stop(int card);

gauthier's avatar
gauthier committed
254
#ifdef __cplusplus
knopp's avatar
   
knopp committed
255
256
257
}
#endif

knopp's avatar
   
knopp committed
258
#endif // COMMON_LIB_H
259