<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-trx/+/18918">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">LMSDevice: Compute TxGain on LimeSuite API based on expected Tx output power<br><br>Right now, according to a few measurements taken on LimeMicro devices, we<br>expect the Tx Gain at UHD level to relate 1:1 with the slope in Tx output<br>power given a specific band.<br><br>If more fine-grained results are wanted or some device doesn't follow a<br>1:1 slope relationship, functions TxGain2TxPower and TxPower2TxGain need<br>to be adapted/improved.<br><br>This patch is basically doing the same thing as was done previously for<br>UHDDevice in 992c9bd1cea410e2dd42ce7566299104b5648aff.<br><br>Related: OS#4583<br>Change-Id: If154fe4d4cd118aa30ea43c22ee7119117b77da6<br>---<br>M Transceiver52M/device/lms/LMSDevice.cpp<br>M Transceiver52M/device/lms/LMSDevice.h<br>2 files changed, 144 insertions(+), 51 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-trx refs/changes/18/18918/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Transceiver52M/device/lms/LMSDevice.cpp b/Transceiver52M/device/lms/LMSDevice.cpp</span><br><span>index 355c8e4..8bb5316 100644</span><br><span>--- a/Transceiver52M/device/lms/LMSDevice.cpp</span><br><span>+++ b/Transceiver52M/device/lms/LMSDevice.cpp</span><br><span>@@ -65,8 +65,6 @@</span><br><span>        * LimeNET-Micro does not like selecting internal clock</span><br><span>       */</span><br><span>  bool clock_src_int_usable;</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Device specific maximum tx levels selected by phasenoise measurements, in dB */</span><br><span style="color: hsl(0, 100%, 40%);">-      double max_tx_gain;</span><br><span>  /* Sample rate coef (without having TX/RX samples per symbol into account) */</span><br><span>        double rate;</span><br><span>         /* Sample rate coef (without having TX/RX samples per symbol into account), if multi-arfcn is enabled */</span><br><span>@@ -80,12 +78,48 @@</span><br><span> };</span><br><span> </span><br><span> static const std::map<enum lms_dev_type, struct dev_desc> dev_param_map {</span><br><span style="color: hsl(0, 100%, 40%);">-     { LMS_DEV_SDR_USB,   { true,  true,  73.0, GSMRATE, MCBTS_SPACING, 8.9e-5, 7.9e-5, LMS_DEV_SDR_USB_PREFIX_NAME } },</span><br><span style="color: hsl(0, 100%, 40%);">-     { LMS_DEV_SDR_MINI,  { false, true,  66.0, GSMRATE, MCBTS_SPACING, 8.9e-5, 8.2e-5, LMS_DEV_SDR_MINI_PREFIX_NAME } },</span><br><span style="color: hsl(0, 100%, 40%);">-    { LMS_DEV_NET_MICRO, { true,  false, 71.0, GSMRATE, MCBTS_SPACING, 8.9e-5, 7.9e-5, LMS_DEV_NET_MICRO_PREFIX_NAME } },</span><br><span style="color: hsl(0, 100%, 40%);">-   { LMS_DEV_UNKNOWN,   { true,  true,  73.0, GSMRATE, MCBTS_SPACING, 8.9e-5, 7.9e-5, "UNKNOWN" } },</span><br><span style="color: hsl(120, 100%, 40%);">+   { LMS_DEV_SDR_USB,   { true,  true,  GSMRATE, MCBTS_SPACING, 8.9e-5, 7.9e-5, LMS_DEV_SDR_USB_PREFIX_NAME } },</span><br><span style="color: hsl(120, 100%, 40%);">+ { LMS_DEV_SDR_MINI,  { false, true,  GSMRATE, MCBTS_SPACING, 8.9e-5, 8.2e-5, LMS_DEV_SDR_MINI_PREFIX_NAME } },</span><br><span style="color: hsl(120, 100%, 40%);">+        { LMS_DEV_NET_MICRO, { true,  false, GSMRATE, MCBTS_SPACING, 8.9e-5, 7.9e-5, LMS_DEV_NET_MICRO_PREFIX_NAME } },</span><br><span style="color: hsl(120, 100%, 40%);">+       { LMS_DEV_UNKNOWN,   { true,  true,  GSMRATE, MCBTS_SPACING, 8.9e-5, 7.9e-5, "UNKNOWN" } },</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+typedef std::tuple<lms_dev_type, enum gsm_band> dev_band_key;</span><br><span style="color: hsl(120, 100%, 40%);">+/* Maximum LimeSuite Tx Gain which can be set/used without distorting the output</span><br><span style="color: hsl(120, 100%, 40%);">+ * signal, and the resulting real output power measured when that gain is used.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+struct dev_band_desc {</span><br><span style="color: hsl(120, 100%, 40%);">+  double nom_lms_tx_gain;  /* dB */</span><br><span style="color: hsl(120, 100%, 40%);">+     double nom_out_tx_power; /* dBm */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+typedef std::map<dev_band_key, dev_band_desc>::const_iterator dev_band_map_it;</span><br><span style="color: hsl(120, 100%, 40%);">+static const std::map<dev_band_key, dev_band_desc> dev_band_nom_power_param_map {</span><br><span style="color: hsl(120, 100%, 40%);">+ { std::make_tuple(LMS_DEV_SDR_USB, GSM_BAND_850),       { 73.0, 11.2 } },</span><br><span style="color: hsl(120, 100%, 40%);">+     { std::make_tuple(LMS_DEV_SDR_USB, GSM_BAND_900),       { 73.0, 10.8 } },</span><br><span style="color: hsl(120, 100%, 40%);">+     { std::make_tuple(LMS_DEV_SDR_USB, GSM_BAND_1800),      { 65.0, -3.5 } }, /* FIXME: OS#4583: 1800Mhz is failing above TxGain=65, which is around -3.5dBm (already < 0 dBm) */</span><br><span style="color: hsl(120, 100%, 40%);">+      { std::make_tuple(LMS_DEV_SDR_USB, GSM_BAND_1900),      { 73.0, 1.7 } }, /* FIXME: OS#4583: 1900MHz is failing in all TxGain values */</span><br><span style="color: hsl(120, 100%, 40%);">+        { std::make_tuple(LMS_DEV_SDR_MINI, GSM_BAND_850),      { 66.0, 3.1 } }, /* FIXME: OS#4583: Ensure BAND2 is used at startup */</span><br><span style="color: hsl(120, 100%, 40%);">+        { std::make_tuple(LMS_DEV_SDR_MINI, GSM_BAND_900),      { 66.0, 2.8 } }, /* FIXME: OS#4583: Ensure BAND2 is used at startup */</span><br><span style="color: hsl(120, 100%, 40%);">+        { std::make_tuple(LMS_DEV_SDR_MINI, GSM_BAND_1800),     { 66.0, -11.6 } }, /* OS#4583: Any of BAND1 or BAND2 is fine */</span><br><span style="color: hsl(120, 100%, 40%);">+       { std::make_tuple(LMS_DEV_SDR_MINI, GSM_BAND_1900),     { 66.0, -9.2 } }, /* FIXME: OS#4583: Ensure BAND1 is used at startup */</span><br><span style="color: hsl(120, 100%, 40%);">+       { std::make_tuple(LMS_DEV_NET_MICRO, GSM_BAND_850),     { 71.0, 6.8 } },</span><br><span style="color: hsl(120, 100%, 40%);">+      { std::make_tuple(LMS_DEV_NET_MICRO, GSM_BAND_900),     { 71.0, 6.8 } },</span><br><span style="color: hsl(120, 100%, 40%);">+      { std::make_tuple(LMS_DEV_NET_MICRO, GSM_BAND_1800),    { 65.0, -10.5 } }, /* OS#4583: TxGain=71 (-4.4dBm) FAIL rms phase errors ~10° */</span><br><span style="color: hsl(120, 100%, 40%);">+     { std::make_tuple(LMS_DEV_NET_MICRO, GSM_BAND_1900),    { 71.0, -6.3 } }, /* FIXME: OS#4583: all FAIL, BAND1/BAND2 rms phase errors >23° */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* So far measurements done for B210 show really close to linear relationship</span><br><span style="color: hsl(120, 100%, 40%);">+ * between gain and real output power, so we simply adjust the measured offset</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static double TxGain2TxPower(const dev_band_desc &desc, double tx_gain_db)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  return desc.nom_out_tx_power - (desc.nom_lms_tx_gain - tx_gain_db);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+static double TxPower2TxGain(const dev_band_desc &desc, double tx_power_dbm)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   return desc.nom_lms_tx_gain - (desc.nom_out_tx_power - tx_power_dbm);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static enum lms_dev_type parse_dev_type(lms_device_t *m_lms_dev)</span><br><span> {</span><br><span>  std::map<enum lms_dev_type, struct dev_desc>::const_iterator it = dev_param_map.begin();</span><br><span>@@ -110,7 +144,7 @@</span><br><span>                      const std::vector<std::string>& tx_paths,</span><br><span>                  const std::vector<std::string>& rx_paths):</span><br><span>    RadioDevice(tx_sps, rx_sps, iface, chan_num, lo_offset, tx_paths, rx_paths),</span><br><span style="color: hsl(0, 100%, 40%);">-    m_lms_dev(NULL), started(false), m_dev_type(LMS_DEV_UNKNOWN)</span><br><span style="color: hsl(120, 100%, 40%);">+  m_lms_dev(NULL), started(false), band((enum gsm_band)0), m_dev_type(LMS_DEV_UNKNOWN)</span><br><span> {</span><br><span>    LOGC(DDEV, INFO) << "creating LMS device...";</span><br><span> </span><br><span>@@ -197,6 +231,27 @@</span><br><span>     return -1;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void LMSDevice::get_dev_band_desc(dev_band_desc& desc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    dev_band_map_it it;</span><br><span style="color: hsl(120, 100%, 40%);">+   enum gsm_band req_band = band;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (req_band == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGC(DDEV, ERROR) << "Nominal Tx Power requested before Tx Frequency was set! Providing band 900 by default... ";</span><br><span style="color: hsl(120, 100%, 40%);">+             req_band = GSM_BAND_900;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     it = dev_band_nom_power_param_map.find(dev_band_key(m_dev_type, req_band));</span><br><span style="color: hsl(120, 100%, 40%);">+   if (it == dev_band_nom_power_param_map.end()) {</span><br><span style="color: hsl(120, 100%, 40%);">+               dev_desc desc = dev_param_map.at(m_dev_type);</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGC(DDEV, ERROR) << "No Tx Power measurements exist for device "</span><br><span style="color: hsl(120, 100%, 40%);">+                                 << desc.name_prefix << " on band " << gsm_band_name(req_band)</span><br><span style="color: hsl(120, 100%, 40%);">+                             << ", using LimeSDR-USB ones as fallback";</span><br><span style="color: hsl(120, 100%, 40%);">+                it = dev_band_nom_power_param_map.find(dev_band_key(LMS_DEV_SDR_USB, req_band));</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(it != dev_band_nom_power_param_map.end())</span><br><span style="color: hsl(120, 100%, 40%);">+ desc = it->second;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int LMSDevice::open(const std::string &args, int ref, bool swap_channels)</span><br><span> {</span><br><span>     lms_info_str_t* info_list;</span><br><span>@@ -322,17 +377,20 @@</span><br><span>   LOGC(DDEV, INFO) << "starting LMS...";</span><br><span> </span><br><span>   unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+       dev_band_desc desc;</span><br><span> </span><br><span>      if (started) {</span><br><span>               LOGC(DDEV, ERR) << "Device already started";</span><br><span>                 return false;</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ get_dev_band_desc(desc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   /* configure the channels/streams */</span><br><span>         for (i=0; i<chans; i++) {</span><br><span>                 /* Set gains for calibration/filter setup */</span><br><span>                 /* TX gain to maximum */</span><br><span style="color: hsl(0, 100%, 40%);">-                setTxGain(maxTxGain(), i);</span><br><span style="color: hsl(120, 100%, 40%);">+            LMS_SetGaindB(m_lms_dev, LMS_CH_TX, i, TxPower2TxGain(desc, desc.nom_out_tx_power));</span><br><span>                 /* RX gain to midpoint */</span><br><span>            setRxGain((minRxGain() + maxRxGain()) / 2, i);</span><br><span> </span><br><span>@@ -477,17 +535,6 @@</span><br><span>    return true;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-double LMSDevice::maxTxGain()</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     return dev_param_map.at(m_dev_type).max_tx_gain;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-double LMSDevice::minTxGain()</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return 0.0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> double LMSDevice::maxRxGain()</span><br><span> {</span><br><span>   return 73.0;</span><br><span>@@ -498,22 +545,6 @@</span><br><span>  return 0.0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-double LMSDevice::setTxGain(double dB, size_t chan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        if (dB > maxTxGain())</span><br><span style="color: hsl(0, 100%, 40%);">-                dB = maxTxGain();</span><br><span style="color: hsl(0, 100%, 40%);">-       if (dB < minTxGain())</span><br><span style="color: hsl(0, 100%, 40%);">-                dB = minTxGain();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       LOGCHAN(chan, DDEV, NOTICE) << "Setting TX gain to " << dB << " dB";</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (LMS_SetGaindB(m_lms_dev, LMS_CH_TX, chan, dB) < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGCHAN(chan, DDEV, ERR) << "Error setting TX gain to " << dB << " dB";</span><br><span style="color: hsl(0, 100%, 40%);">-   else</span><br><span style="color: hsl(0, 100%, 40%);">-            tx_gains[chan] = dB;</span><br><span style="color: hsl(0, 100%, 40%);">-    return tx_gains[chan];</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> double LMSDevice::setRxGain(double dB, size_t chan)</span><br><span> {</span><br><span>  if (dB > maxRxGain())</span><br><span>@@ -530,12 +561,45 @@</span><br><span>     return rx_gains[chan];</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+double LMSDevice::setPowerAttenuation(int atten, size_t chan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     double dB;</span><br><span style="color: hsl(120, 100%, 40%);">+    dev_band_desc desc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (chan >= tx_gains.size()) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGC(DDEV, ALERT) << "Requested non-existent channel " << chan;</span><br><span style="color: hsl(120, 100%, 40%);">+         return 0.0f;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   get_dev_band_desc(desc);</span><br><span style="color: hsl(120, 100%, 40%);">+      dB = TxPower2TxGain(desc, desc.nom_out_tx_power - atten);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGCHAN(chan, DDEV, NOTICE) << "Setting TX gain to " << dB << " dB";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (LMS_SetGaindB(m_lms_dev, LMS_CH_TX, chan, dB) < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGCHAN(chan, DDEV, ERR) << "Error setting TX gain to " << dB << " dB";</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+          tx_gains[chan] = dB;</span><br><span style="color: hsl(120, 100%, 40%);">+  return desc.nom_out_tx_power - TxGain2TxPower(desc, tx_gains[chan]);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+double LMSDevice::getPowerAttenuation(size_t chan) {</span><br><span style="color: hsl(120, 100%, 40%);">+       dev_band_desc desc;</span><br><span style="color: hsl(120, 100%, 40%);">+   if (chan >= tx_gains.size()) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGC(DDEV, ALERT) << "Requested non-existent channel " << chan;</span><br><span style="color: hsl(120, 100%, 40%);">+         return 0.0f;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   get_dev_band_desc(desc);</span><br><span style="color: hsl(120, 100%, 40%);">+      return desc.nom_out_tx_power - TxGain2TxPower(desc, tx_gains[chan]);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int LMSDevice::getNominalTxPower(size_t chan)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- /* TODO: return value based on some experimentally generated table depending on</span><br><span style="color: hsl(0, 100%, 40%);">-  * band/arfcn, which is known here thanks to TXTUNE</span><br><span style="color: hsl(0, 100%, 40%);">-      */</span><br><span style="color: hsl(0, 100%, 40%);">-     return 23;</span><br><span style="color: hsl(120, 100%, 40%);">+    dev_band_desc desc;</span><br><span style="color: hsl(120, 100%, 40%);">+   get_dev_band_desc(desc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    return desc.nom_out_tx_power;</span><br><span> }</span><br><span> </span><br><span> void LMSDevice::log_ant_list(bool dir_tx, size_t chan, std::ostringstream& os)</span><br><span>@@ -904,13 +968,39 @@</span><br><span> </span><br><span> bool LMSDevice::setTxFreq(double wFreq, size_t chan)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t req_arfcn;</span><br><span style="color: hsl(120, 100%, 40%);">+   enum gsm_band req_band;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (chan >= chans) {</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGC(DDEV, ALERT) << "Requested non-existent channel " << chan;</span><br><span style="color: hsl(120, 100%, 40%);">+         return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  LOGCHAN(chan, DDEV, NOTICE) << "Setting Tx Freq to " << wFreq << " Hz";</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     req_arfcn = gsm_freq102arfcn(wFreq / 1000 / 100 , 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (req_arfcn == 0xffff) {</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGCHAN(chan, DDEV, ALERT) << "Unknown ARFCN for Tx Frequency " << wFreq / 1000 << " kHz";</span><br><span style="color: hsl(120, 100%, 40%);">+              return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (gsm_arfcn2band_rc(req_arfcn, &req_band) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGCHAN(chan, DDEV, ALERT) << "Unknown GSM band for Tx Frequency " << wFreq</span><br><span style="color: hsl(120, 100%, 40%);">+                                        << " Hz (ARFCN " << req_arfcn << " )";</span><br><span style="color: hsl(120, 100%, 40%);">+               return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (band != 0 && req_band != band) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGCHAN(chan, DDEV, ALERT) << "Requesting Tx Frequency " << wFreq</span><br><span style="color: hsl(120, 100%, 40%);">+                                          << " Hz different from previous band " << gsm_band_name(band);</span><br><span style="color: hsl(120, 100%, 40%);">+               return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (LMS_SetLOFrequency(m_lms_dev, LMS_CH_TX, chan, wFreq) < 0) {</span><br><span>          LOGCHAN(chan, DDEV, ERROR) << "Error setting Tx Freq to " << wFreq << " Hz";</span><br><span>           return false;</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ band = req_band;</span><br><span>     return true;</span><br><span> }</span><br><span> </span><br><span>diff --git a/Transceiver52M/device/lms/LMSDevice.h b/Transceiver52M/device/lms/LMSDevice.h</span><br><span>index c83fed2..b6a6ab9 100644</span><br><span>--- a/Transceiver52M/device/lms/LMSDevice.h</span><br><span>+++ b/Transceiver52M/device/lms/LMSDevice.h</span><br><span>@@ -32,6 +32,10 @@</span><br><span> #include <iostream></span><br><span> #include <lime/LimeSuite.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+extern "C" {</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm_utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Definition of LIMESDR_TX_AMPL limits maximum amplitude of I and Q</span><br><span>  * channels separately. Hence LIMESDR_TX_AMPL value must be 1/sqrt(2) =</span><br><span>  * 0.7071.... to get an amplitude of 1 of the complex signal:</span><br><span>@@ -48,6 +52,8 @@</span><br><span>     LMS_DEV_UNKNOWN,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct dev_band_desc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /** A class to handle a LimeSuite supported device */</span><br><span> class LMSDevice:public RadioDevice {</span><br><span> </span><br><span>@@ -66,6 +72,7 @@</span><br><span>         TIMESTAMP ts_initial, ts_offset;</span><br><span> </span><br><span>         std::vector<double> tx_gains, rx_gains;</span><br><span style="color: hsl(120, 100%, 40%);">+ enum gsm_band band;</span><br><span> </span><br><span>      enum lms_dev_type m_dev_type;</span><br><span> </span><br><span>@@ -77,19 +84,11 @@</span><br><span>      void update_stream_stats_rx(size_t chan, bool *overrun);</span><br><span>     void update_stream_stats_tx(size_t chan, bool *underrun);</span><br><span>    bool do_clock_src_freq(enum ReferenceType ref, double freq);</span><br><span style="color: hsl(0, 100%, 40%);">-    /** sets the transmit chan gain, returns the gain setting **/</span><br><span style="color: hsl(0, 100%, 40%);">-   double setTxGain(double dB, size_t chan = 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ void get_dev_band_desc(dev_band_desc& desc);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    /** get transmit gain */</span><br><span style="color: hsl(0, 100%, 40%);">-        double getTxGain(size_t chan = 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-             return tx_gains[chan];</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /** return maximum Tx Gain **/</span><br><span style="color: hsl(0, 100%, 40%);">-  double maxTxGain(void);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /** return minimum Rx Gain **/</span><br><span style="color: hsl(0, 100%, 40%);">-  double minTxGain(void);</span><br><span style="color: hsl(120, 100%, 40%);">+       double setTxGain(double db, size_t chan) {OSMO_ASSERT(false); return 0.0f; }</span><br><span style="color: hsl(120, 100%, 40%);">+  double getTxGain(size_t chan = 0) { OSMO_ASSERT(false); return 0.0f; };</span><br><span style="color: hsl(120, 100%, 40%);">+       double maxTxGain(void) { OSMO_ASSERT(false); return 0.0f; };</span><br><span> </span><br><span> public:</span><br><span> </span><br><span>@@ -178,6 +177,10 @@</span><br><span>       /** return minimum Rx Gain **/</span><br><span>       double minRxGain(void);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ double setPowerAttenuation(int atten, size_t chan);</span><br><span style="color: hsl(120, 100%, 40%);">+   double getPowerAttenuation(size_t chan = 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       int getNominalTxPower(size_t chan = 0);</span><br><span> </span><br><span>  /** sets the RX path to use, returns true if successful and false otherwise */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-trx/+/18918">change 18918</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-trx/+/18918"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-trx </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: If154fe4d4cd118aa30ea43c22ee7119117b77da6 </div>
<div style="display:none"> Gerrit-Change-Number: 18918 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>