<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-trx/+/18721">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, but someone else must approve
  neels: Looks good to me, but someone else must approve
  pespin: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">UHDDevice: Implement getNominalTxPower() based on TxFrequency<br><br>The table with nominal UHD Tx Gains and real transmit power is filled<br>with values measured experimentally. More information can be found in<br>OS#4583.<br><br>Related: OS#4583<br><br>Change-Id: If7ef5bf95ffe4afe5864c0f051853aa38b9639eb<br>---<br>M Transceiver52M/device/uhd/UHDDevice.cpp<br>M Transceiver52M/device/uhd/UHDDevice.h<br>2 files changed, 90 insertions(+), 6 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Transceiver52M/device/uhd/UHDDevice.cpp b/Transceiver52M/device/uhd/UHDDevice.cpp</span><br><span>index 2970173..93dde4b 100644</span><br><span>--- a/Transceiver52M/device/uhd/UHDDevice.cpp</span><br><span>+++ b/Transceiver52M/device/uhd/UHDDevice.cpp</span><br><span>@@ -33,6 +33,10 @@</span><br><span> #include "config.h"</span><br><span> #endif</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> #ifdef USE_UHD_3_11</span><br><span> #include <uhd/utils/log_add.hpp></span><br><span> #include <uhd/utils/thread.hpp></span><br><span>@@ -123,6 +127,26 @@</span><br><span>        { std::make_tuple(B2XX_MCBTS, 4, 4), { 1, 51.2e6, MCBTS_SPACING*4, B2XX_TIMING_MCBTS, "B200/B210 4 SPS Multi-ARFCN" } },</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+typedef std::tuple<uhd_dev_type, enum gsm_band> dev_band_key;</span><br><span style="color: hsl(120, 100%, 40%);">+/* Maximum UHD Tx Gain which can be set/used without distorting the</span><br><span style="color: hsl(120, 100%, 40%);">+   output signal, and the resulting real output power measured when that</span><br><span style="color: hsl(120, 100%, 40%);">+   gain is used. Correct measured values only provided for B210 so far. */</span><br><span style="color: hsl(120, 100%, 40%);">+struct dev_band_desc {</span><br><span style="color: hsl(120, 100%, 40%);">+  double nom_uhd_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(B200, GSM_BAND_850),  { 89.75, 13.3 } },</span><br><span style="color: hsl(120, 100%, 40%);">+    { std::make_tuple(B200, GSM_BAND_900),  { 89.75, 13.3 } },</span><br><span style="color: hsl(120, 100%, 40%);">+    { std::make_tuple(B200, GSM_BAND_1800), { 89.75, 7.5 } },</span><br><span style="color: hsl(120, 100%, 40%);">+     { std::make_tuple(B200, GSM_BAND_1900), { 89.75, 7.7 } },</span><br><span style="color: hsl(120, 100%, 40%);">+     { std::make_tuple(B210, GSM_BAND_850),  { 89.75, 13.3 } },</span><br><span style="color: hsl(120, 100%, 40%);">+    { std::make_tuple(B210, GSM_BAND_900),  { 89.75, 13.3 } },</span><br><span style="color: hsl(120, 100%, 40%);">+    { std::make_tuple(B210, GSM_BAND_1800), { 89.75, 7.5 } },</span><br><span style="color: hsl(120, 100%, 40%);">+     { std::make_tuple(B210, GSM_BAND_1900), { 89.75, 7.7 } },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void *async_event_loop(uhd_device *dev)</span><br><span> {</span><br><span>      set_selfthread_name("UHDAsyncEvent");</span><br><span>@@ -195,7 +219,7 @@</span><br><span>        : RadioDevice(tx_sps, rx_sps, iface, chan_num, lo_offset, tx_paths, rx_paths),</span><br><span>         tx_gain_min(0.0), tx_gain_max(0.0),</span><br><span>          rx_gain_min(0.0), rx_gain_max(0.0),</span><br><span style="color: hsl(0, 100%, 40%);">-     tx_spp(0), rx_spp(0),</span><br><span style="color: hsl(120, 100%, 40%);">+         band((enum gsm_band)0), tx_spp(0), rx_spp(0),</span><br><span>        started(false), aligned(false), drop_cnt(0),</span><br><span>         prev_ts(0,0), ts_initial(0), ts_offset(0), async_event_thrd(NULL)</span><br><span> {</span><br><span>@@ -209,6 +233,27 @@</span><br><span>              delete rx_buffers[i];</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void uhd_device::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(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(dev_key(dev_type, tx_sps, rx_sps));</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.str << " on band " << gsm_band_name(req_band)</span><br><span style="color: hsl(120, 100%, 40%);">+                             << ", using B210 ones as fallback";</span><br><span style="color: hsl(120, 100%, 40%);">+               it = dev_band_nom_power_param_map.find(dev_band_key(B210, 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> void uhd_device::init_gains()</span><br><span> {</span><br><span>     uhd::gain_range_t range;</span><br><span>@@ -343,10 +388,10 @@</span><br><span> </span><br><span> int uhd_device::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> /*</span><br><span>@@ -960,13 +1005,44 @@</span><br><span> </span><br><span> bool uhd_device::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%);">+       dev_band_desc desc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        if (chan >= tx_freqs.size()) {</span><br><span>            LOGC(DDEV, ALERT) << "Requested non-existent channel " << chan;</span><br><span>                return false;</span><br><span>        }</span><br><span>    ScopedLock lock(tune_lock);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return set_freq(wFreq, chan, true);</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 style="color: hsl(120, 100%, 40%);">+   if (!set_freq(wFreq, chan, true))</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%);">+       band = req_band;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Update Max Tx Gain */</span><br><span style="color: hsl(120, 100%, 40%);">+      get_dev_band_desc(desc);</span><br><span style="color: hsl(120, 100%, 40%);">+      tx_gain_max = desc.nom_uhd_tx_gain;</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGCHAN(chan, DDEV, INFO) << "Updating max Gain to " << tx_gain_max</span><br><span style="color: hsl(120, 100%, 40%);">+                                << " dB based on GSM band information";</span><br><span style="color: hsl(120, 100%, 40%);">+    return true;</span><br><span> }</span><br><span> </span><br><span> bool uhd_device::setRxFreq(double wFreq, size_t chan)</span><br><span>diff --git a/Transceiver52M/device/uhd/UHDDevice.h b/Transceiver52M/device/uhd/UHDDevice.h</span><br><span>index 01d71a0..8a2d592 100644</span><br><span>--- a/Transceiver52M/device/uhd/UHDDevice.h</span><br><span>+++ b/Transceiver52M/device/uhd/UHDDevice.h</span><br><span>@@ -37,6 +37,10 @@</span><br><span> #include <uhd/property_tree.hpp></span><br><span> #include <uhd/usrp/multi_usrp.hpp></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> </span><br><span> enum uhd_dev_type {</span><br><span>     USRP1,</span><br><span>@@ -52,6 +56,8 @@</span><br><span>   LIMESDR,</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> /*</span><br><span>     uhd_device - UHD implementation of the Device interface. Timestamped samples</span><br><span>                 are sent to and received from the device. An intermediate buffer</span><br><span>@@ -143,6 +149,7 @@</span><br><span> </span><br><span>  std::vector<double> tx_gains, rx_gains;</span><br><span>        std::vector<double> tx_freqs, rx_freqs;</span><br><span style="color: hsl(120, 100%, 40%);">+ enum gsm_band band;</span><br><span>  size_t tx_spp, rx_spp;</span><br><span> </span><br><span>   bool started;</span><br><span>@@ -171,6 +178,7 @@</span><br><span> </span><br><span>      uhd::tune_request_t select_freq(double wFreq, size_t chan, bool tx);</span><br><span>         bool set_freq(double freq, size_t chan, bool tx);</span><br><span style="color: hsl(120, 100%, 40%);">+     void get_dev_band_desc(dev_band_desc& desc);</span><br><span> </span><br><span>         Thread *async_event_thrd;</span><br><span>    Mutex tune_lock;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-trx/+/18721">change 18721</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/+/18721"/><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: If7ef5bf95ffe4afe5864c0f051853aa38b9639eb </div>
<div style="display:none"> Gerrit-Change-Number: 18721 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: roh <jsteiger@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: tnt <tnt@246tNt.com> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>