blob: 30e0f43b8ecfd93e14e8c11ef6a020583ef0d08f [file] [log] [blame]
dburgessb3a0ca42011-10-12 07:44:40 +00001/*
2* Copyright 2008 Free Software Foundation, Inc.
3*
4* This software is distributed under multiple licenses; see the COPYING file in the main directory for licensing information for this specific distribuion.
5*
6* This use of this software may be subject to additional restrictions.
7* See the LEGAL file in the main directory for details.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13*/
14
15#ifndef __RADIO_DEVICE_H__
16#define __RADIO_DEVICE_H__
17
ttsouf60dafa2012-10-22 00:07:14 +000018#include <string>
Thomas Tsou204a9f12013-10-29 18:34:16 -040019#include <vector>
dburgessb3a0ca42011-10-12 07:44:40 +000020
Pau Espin Pedrole564f0f2018-04-24 18:43:51 +020021#include "GSMCommon.h"
Harald Welte24073142018-06-13 19:32:15 +020022#include "Logger.h"
Pau Espin Pedrole564f0f2018-04-24 18:43:51 +020023
Pau Espin Pedrolefac20b2018-02-21 14:59:19 +010024extern "C" {
25#include "config_defs.h"
26}
27
dburgessb3a0ca42011-10-12 07:44:40 +000028#ifdef HAVE_CONFIG_H
29#include "config.h"
30#endif
31
Alexander Chemerisf931cf22016-06-18 10:42:33 +030032#define GSMRATE (1625e3/6)
Tom Tsou76764272016-06-24 14:25:39 -070033#define MCBTS_SPACING 800000.0
Thomas Tsoucb69f082013-04-08 14:18:26 -040034
dburgessb3a0ca42011-10-12 07:44:40 +000035/** a 64-bit virtual timestamp for radio data */
36typedef unsigned long long TIMESTAMP;
37
38/** A class to handle a USRP rev 4, with a two RFX900 daughterboards */
39class RadioDevice {
40
41 public:
kurtis.heimerle380af32011-11-26 03:18:55 +000042 /* Available transport bus types */
Pau Espin Pedrolc7a0bf12018-04-25 12:17:10 +020043 enum TxWindowType { TX_WINDOW_USRP1, TX_WINDOW_FIXED, TX_WINDOW_LMS1 };
kurtis.heimerle380af32011-11-26 03:18:55 +000044
Thomas Tsoucb69f082013-04-08 14:18:26 -040045 /* Radio interface types */
Tom Tsou05c6feb2016-06-22 16:09:44 -070046 enum InterfaceType {
47 NORMAL,
48 RESAMP_64M,
49 RESAMP_100M,
Tom Tsou76764272016-06-24 14:25:39 -070050 MULTI_ARFCN,
Tom Tsou05c6feb2016-06-22 16:09:44 -070051 };
Thomas Tsoucb69f082013-04-08 14:18:26 -040052
Tom Tsou05c6feb2016-06-22 16:09:44 -070053 static RadioDevice *make(size_t tx_sps, size_t rx_sps, InterfaceType type,
Pau Espin Pedrol77ce99a2018-02-05 13:05:06 +010054 size_t chans = 1, double offset = 0.0,
55 const std::vector<std::string>& tx_paths = std::vector<std::string>(1, ""),
56 const std::vector<std::string>& rx_paths = std::vector<std::string>(1, ""));
kurtis.heimerl965e7572011-11-26 03:16:54 +000057
kurtis.heimerldb2aae52011-11-26 03:17:13 +000058 /** Initialize the USRP */
Tom Tsou2f3e60b2016-07-17 19:29:08 -070059 virtual int open(const std::string &args, int ref, bool swap_channels)=0;
dburgessb3a0ca42011-10-12 07:44:40 +000060
Thomas Tsou8c336792013-11-15 16:26:05 -050061 virtual ~RadioDevice() { }
62
dburgessb3a0ca42011-10-12 07:44:40 +000063 /** Start the USRP */
64 virtual bool start()=0;
65
66 /** Stop the USRP */
67 virtual bool stop()=0;
68
Thomas Tsou02d88d12013-04-05 15:36:30 -040069 /** Get the Tx window type */
70 virtual enum TxWindowType getWindowType()=0;
kurtis.heimerle380af32011-11-26 03:18:55 +000071
kurtis.heimerldb2aae52011-11-26 03:17:13 +000072 /** Enable thread priority */
Thomas Tsou7553aa92013-11-08 12:50:03 -050073 virtual void setPriority(float prio = 0.5) = 0;
kurtis.heimerldb2aae52011-11-26 03:17:13 +000074
dburgessb3a0ca42011-10-12 07:44:40 +000075 /**
76 Read samples from the radio.
77 @param buf preallocated buf to contain read result
78 @param len number of samples desired
79 @param overrun Set if read buffer has been overrun, e.g. data not being read fast enough
80 @param timestamp The timestamp of the first samples to be read
81 @param underrun Set if radio does not have data to transmit, e.g. data not being sent fast enough
82 @param RSSI The received signal strength of the read result
83 @return The number of samples actually read
84 */
Thomas Tsou204a9f12013-10-29 18:34:16 -040085 virtual int readSamples(std::vector<short *> &bufs, int len, bool *overrun,
86 TIMESTAMP timestamp = 0xffffffff, bool *underrun = 0,
87 unsigned *RSSI = 0) = 0;
dburgessb3a0ca42011-10-12 07:44:40 +000088 /**
89 Write samples to the radio.
90 @param buf Contains the data to be written.
91 @param len number of samples to write.
92 @param underrun Set if radio does not have data to transmit, e.g. data not being sent fast enough
93 @param timestamp The timestamp of the first sample of the data buffer.
94 @param isControl Set if data is a control packet, e.g. a ping command
95 @return The number of samples actually written
96 */
Thomas Tsou204a9f12013-10-29 18:34:16 -040097 virtual int writeSamples(std::vector<short *> &bufs, int len, bool *underrun,
98 TIMESTAMP timestamp, bool isControl = false) = 0;
99
dburgessb3a0ca42011-10-12 07:44:40 +0000100 /** Update the alignment between the read and write timestamps */
101 virtual bool updateAlignment(TIMESTAMP timestamp)=0;
Thomas Tsou204a9f12013-10-29 18:34:16 -0400102
dburgessb3a0ca42011-10-12 07:44:40 +0000103 /** Set the transmitter frequency */
Thomas Tsou204a9f12013-10-29 18:34:16 -0400104 virtual bool setTxFreq(double wFreq, size_t chan = 0) = 0;
dburgessb3a0ca42011-10-12 07:44:40 +0000105
106 /** Set the receiver frequency */
Thomas Tsou204a9f12013-10-29 18:34:16 -0400107 virtual bool setRxFreq(double wFreq, size_t chan = 0) = 0;
dburgessb3a0ca42011-10-12 07:44:40 +0000108
109 /** Returns the starting write Timestamp*/
110 virtual TIMESTAMP initialWriteTimestamp(void)=0;
111
112 /** Returns the starting read Timestamp*/
113 virtual TIMESTAMP initialReadTimestamp(void)=0;
114
115 /** returns the full-scale transmit amplitude **/
116 virtual double fullScaleInputValue()=0;
117
118 /** returns the full-scale receive amplitude **/
119 virtual double fullScaleOutputValue()=0;
120
121 /** sets the receive chan gain, returns the gain setting **/
Thomas Tsou204a9f12013-10-29 18:34:16 -0400122 virtual double setRxGain(double dB, size_t chan = 0) = 0;
dburgessb3a0ca42011-10-12 07:44:40 +0000123
124 /** gets the current receive gain **/
Thomas Tsou204a9f12013-10-29 18:34:16 -0400125 virtual double getRxGain(size_t chan = 0) = 0;
dburgessb3a0ca42011-10-12 07:44:40 +0000126
127 /** return maximum Rx Gain **/
128 virtual double maxRxGain(void) = 0;
129
130 /** return minimum Rx Gain **/
131 virtual double minRxGain(void) = 0;
132
133 /** sets the transmit chan gain, returns the gain setting **/
Thomas Tsou204a9f12013-10-29 18:34:16 -0400134 virtual double setTxGain(double dB, size_t chan = 0) = 0;
dburgessb3a0ca42011-10-12 07:44:40 +0000135
136 /** return maximum Tx Gain **/
137 virtual double maxTxGain(void) = 0;
138
139 /** return minimum Tx Gain **/
140 virtual double minTxGain(void) = 0;
141
Pau Espin Pedrol77ce99a2018-02-05 13:05:06 +0100142 /** sets the RX path to use, returns true if successful and false otherwise */
143 virtual bool setRxAntenna(const std::string &ant, size_t chan = 0) = 0;
144
145 /** return the used RX path */
146 virtual std::string getRxAntenna(size_t chan = 0) = 0;
147
148 /** sets the RX path to use, returns true if successful and false otherwise */
149 virtual bool setTxAntenna(const std::string &ant, size_t chan = 0) = 0;
150
151 /** return the used RX path */
152 virtual std::string getTxAntenna(size_t chan = 0) = 0;
153
Pau Espin Pedrol0fc20d12018-04-24 17:48:52 +0200154 /** return whether user drives synchronization of Tx/Rx of USRP */
155 virtual bool requiresRadioAlign() = 0;
156
Pau Espin Pedrole564f0f2018-04-24 18:43:51 +0200157 /** Minimum latency that the device can achieve */
158 virtual GSM::Time minLatency() = 0;
159
dburgessb3a0ca42011-10-12 07:44:40 +0000160 /** Return internal status values */
Thomas Tsou204a9f12013-10-29 18:34:16 -0400161 virtual double getTxFreq(size_t chan = 0) = 0;
162 virtual double getRxFreq(size_t chan = 0) = 0;
dburgessb3a0ca42011-10-12 07:44:40 +0000163 virtual double getSampleRate()=0;
dburgessb3a0ca42011-10-12 07:44:40 +0000164
Harald Welte61707e82018-06-13 23:21:57 +0200165 protected:
166 size_t tx_sps, rx_sps;
167 InterfaceType iface;
168 size_t chans;
169 double lo_offset;
Harald Welte24073142018-06-13 19:32:15 +0200170 std::vector<std::string> tx_paths, rx_paths;
Harald Welte61707e82018-06-13 23:21:57 +0200171
172 RadioDevice(size_t tx_sps, size_t rx_sps, InterfaceType type, size_t chans, double offset,
173 const std::vector<std::string>& tx_paths,
174 const std::vector<std::string>& rx_paths):
175 tx_sps(tx_sps), rx_sps(rx_sps), iface(type), chans(chans), lo_offset(offset),
176 tx_paths(tx_paths), rx_paths(rx_paths)
177 { }
178
Harald Welte24073142018-06-13 19:32:15 +0200179 bool set_antennas() {
180 unsigned int i;
181
182 for (i = 0; i < tx_paths.size(); i++) {
183 if (tx_paths[i] == "")
184 continue;
185 LOG(DEBUG) << "Configuring channel " << i << " with antenna " << tx_paths[i];
186 if (!setTxAntenna(tx_paths[i], i)) {
187 LOG(ALERT) << "Failed configuring channel " << i << " with antenna " << tx_paths[i];
188 return false;
189 }
190 }
191
192 for (i = 0; i < rx_paths.size(); i++) {
193 if (rx_paths[i] == "")
194 continue;
195 LOG(DEBUG) << "Configuring channel " << i << " with antenna " << rx_paths[i];
196 if (!setRxAntenna(rx_paths[i], i)) {
197 LOG(ALERT) << "Failed configuring channel " << i << " with antenna " << rx_paths[i];
198 return false;
199 }
200 }
201 LOG(INFO) << "Antennas configured successfully";
202 return true;
203 }
204
205
dburgessb3a0ca42011-10-12 07:44:40 +0000206};
207
208#endif