<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>