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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">UHDDevice: Compute TxGain on UHD API based on expected Tx output power<br><br>Right now, according to a few measurements taken on B210, we expect the<br>Tx Gain at UHD level to relate 1:1 with the slope in Tx output power<br>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>Change-Id: I6f432465dce5c6ec1f1bc4653f6149efb18c3f43<br>---<br>M Transceiver52M/device/uhd/UHDDevice.cpp<br>M Transceiver52M/device/uhd/UHDDevice.h<br>2 files changed, 58 insertions(+), 47 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 93dde4b..d1f61d3 100644</span><br><span>--- a/Transceiver52M/device/uhd/UHDDevice.cpp</span><br><span>+++ b/Transceiver52M/device/uhd/UHDDevice.cpp</span><br><span>@@ -212,12 +212,23 @@</span><br><span> }</span><br><span> #endif</span><br><span> </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_uhd_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_uhd_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> uhd_device::uhd_device(size_t tx_sps, size_t rx_sps,</span><br><span>                  InterfaceType iface, size_t chan_num, double lo_offset,</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%);">-    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>          band((enum gsm_band)0), tx_spp(0), rx_spp(0),</span><br><span>        started(false), aligned(false), drop_cnt(0),</span><br><span>@@ -256,6 +267,7 @@</span><br><span> </span><br><span> void uhd_device::init_gains()</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+        double tx_gain_min, tx_gain_max;</span><br><span>     uhd::gain_range_t range;</span><br><span> </span><br><span>         if (dev_type == UMTRX) {</span><br><span>@@ -320,37 +332,6 @@</span><br><span>      LOGC(DDEV, INFO) << "Rates configured for " << desc.str;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-double uhd_device::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 (chan >= tx_gains.size()) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGC(DDEV, ALERT) << "Requested non-existent channel" << chan;</span><br><span style="color: hsl(0, 100%, 40%);">-            return 0.0f;</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%);">-       if (dev_type == UMTRX) {</span><br><span style="color: hsl(0, 100%, 40%);">-                std::vector<std::string> gain_stages = usrp_dev->get_tx_gain_names(0);</span><br><span style="color: hsl(0, 100%, 40%);">-         if (gain_stages[0] == "VGA" || gain_stages[0] == "PA") {</span><br><span style="color: hsl(0, 100%, 40%);">-                    usrp_dev->set_tx_gain(db, chan);</span><br><span style="color: hsl(0, 100%, 40%);">-             } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        // New UHD versions support split configuration of</span><br><span style="color: hsl(0, 100%, 40%);">-                      // Tx gain stages. We utilize this to set the gain</span><br><span style="color: hsl(0, 100%, 40%);">-                      // configuration, optimal for the Tx signal quality.</span><br><span style="color: hsl(0, 100%, 40%);">-                    // From our measurements, VGA1 must be 18dB plus-minus</span><br><span style="color: hsl(0, 100%, 40%);">-                  // one and VGA2 is the best when 23dB or lower.</span><br><span style="color: hsl(0, 100%, 40%);">-                 usrp_dev->set_tx_gain(UMTRX_VGA1_DEF, "VGA1", chan);</span><br><span style="color: hsl(0, 100%, 40%);">-                       usrp_dev->set_tx_gain(db-UMTRX_VGA1_DEF, "VGA2", chan);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                usrp_dev->set_tx_gain(db, 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%);">-       tx_gains[chan] = usrp_dev->get_tx_gain(chan);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGC(DDEV, INFO) << "Set TX gain to " << tx_gains[chan] << "dB (asked for " << db << "dB)";</span><br><span style="color: hsl(0, 100%, 40%);">-</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 uhd_device::setRxGain(double db, size_t chan)</span><br><span> {</span><br><span>         if (chan >= rx_gains.size()) {</span><br><span>@@ -376,14 +357,50 @@</span><br><span>    return rx_gains[chan];</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-double uhd_device::getTxGain(size_t chan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(120, 100%, 40%);">+double uhd_device::setPowerAttenuation(int atten, size_t chan) {</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%);">+   if (dev_type == UMTRX) {</span><br><span style="color: hsl(120, 100%, 40%);">+              std::vector<std::string> gain_stages = usrp_dev->get_tx_gain_names(0);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (gain_stages[0] == "VGA" || gain_stages[0] == "PA") {</span><br><span style="color: hsl(120, 100%, 40%);">+                  usrp_dev->set_tx_gain(db, chan);</span><br><span style="color: hsl(120, 100%, 40%);">+           } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      // New UHD versions support split configuration of</span><br><span style="color: hsl(120, 100%, 40%);">+                    // Tx gain stages. We utilize this to set the gain</span><br><span style="color: hsl(120, 100%, 40%);">+                    // configuration, optimal for the Tx signal quality.</span><br><span style="color: hsl(120, 100%, 40%);">+                  // From our measurements, VGA1 must be 18dB plus-minus</span><br><span style="color: hsl(120, 100%, 40%);">+                        // one and VGA2 is the best when 23dB or lower.</span><br><span style="color: hsl(120, 100%, 40%);">+                       usrp_dev->set_tx_gain(UMTRX_VGA1_DEF, "VGA1", chan);</span><br><span style="color: hsl(120, 100%, 40%);">+                     usrp_dev->set_tx_gain(db-UMTRX_VGA1_DEF, "VGA2", chan);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              usrp_dev->set_tx_gain(db, 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%);">+   tx_gains[chan] = usrp_dev->get_tx_gain(chan);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGC(DDEV, INFO) << "Set TX gain to " << tx_gains[chan] << "dB (asked for " << db << "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 - TxGain2TxPower(desc, tx_gains[chan]);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+double uhd_device::getPowerAttenuation(size_t chan) {</span><br><span style="color: hsl(120, 100%, 40%);">+        dev_band_desc desc;</span><br><span>  if (chan >= tx_gains.size()) {</span><br><span>            LOGC(DDEV, ALERT) << "Requested non-existent channel " << chan;</span><br><span>                return 0.0f;</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   return tx_gains[chan];</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> }</span><br><span> </span><br><span> int uhd_device::getNominalTxPower(size_t chan)</span><br><span>@@ -1007,7 +1024,6 @@</span><br><span> {</span><br><span>         uint16_t req_arfcn;</span><br><span>  enum gsm_band req_band;</span><br><span style="color: hsl(0, 100%, 40%);">- dev_band_desc desc;</span><br><span> </span><br><span>      if (chan >= tx_freqs.size()) {</span><br><span>            LOGC(DDEV, ALERT) << "Requested non-existent channel " << chan;</span><br><span>@@ -1036,12 +1052,6 @@</span><br><span>               return false;</span><br><span> </span><br><span>    band = req_band;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Update Max Tx Gain */</span><br><span style="color: hsl(0, 100%, 40%);">-        get_dev_band_desc(desc);</span><br><span style="color: hsl(0, 100%, 40%);">-        tx_gain_max = desc.nom_uhd_tx_gain;</span><br><span style="color: hsl(0, 100%, 40%);">-     LOGCHAN(chan, DDEV, INFO) << "Updating max Gain to " << tx_gain_max</span><br><span style="color: hsl(0, 100%, 40%);">-                                  << " dB based on GSM band information";</span><br><span>   return true;</span><br><span> }</span><br><span> </span><br><span>diff --git a/Transceiver52M/device/uhd/UHDDevice.h b/Transceiver52M/device/uhd/UHDDevice.h</span><br><span>index d87caf2..2c428ca 100644</span><br><span>--- a/Transceiver52M/device/uhd/UHDDevice.h</span><br><span>+++ b/Transceiver52M/device/uhd/UHDDevice.h</span><br><span>@@ -101,6 +101,9 @@</span><br><span>         double maxRxGain(void) { return rx_gain_max; }</span><br><span>       double minRxGain(void) { return rx_gain_min; }</span><br><span> </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>  double getTxFreq(size_t chan);</span><br><span>@@ -131,10 +134,9 @@</span><br><span>        };</span><br><span> </span><br><span> private:</span><br><span style="color: hsl(0, 100%, 40%);">-      double setTxGain(double db, size_t chan);</span><br><span style="color: hsl(0, 100%, 40%);">-       double getTxGain(size_t chan = 0);</span><br><span style="color: hsl(0, 100%, 40%);">-      double maxTxGain(void) { return tx_gain_max; }</span><br><span style="color: hsl(0, 100%, 40%);">-  double minTxGain(void) { return tx_gain_min; }</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>     uhd::usrp::multi_usrp::sptr usrp_dev;</span><br><span>        uhd::tx_streamer::sptr tx_stream;</span><br><span>@@ -144,7 +146,6 @@</span><br><span> </span><br><span>  double tx_rate, rx_rate;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    double tx_gain_min, tx_gain_max;</span><br><span>     double rx_gain_min, rx_gain_max;</span><br><span> </span><br><span>         std::vector<double> tx_gains, rx_gains;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-trx/+/18723">change 18723</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/+/18723"/><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: I6f432465dce5c6ec1f1bc4653f6149efb18c3f43 </div>
<div style="display:none"> Gerrit-Change-Number: 18723 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </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>