Change in osmo-trx[master]: UHDDevice: Implement getNominalTxPower() based on TxFrequency

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

pespin gerrit-no-reply at lists.osmocom.org
Mon Jun 15 09:08:33 UTC 2020


pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-trx/+/18721 )

Change subject: UHDDevice: Implement getNominalTxPower() based on TxFrequency
......................................................................

UHDDevice: Implement getNominalTxPower() based on TxFrequency

The table with nominal UHD Tx Gains and real transmit power is filled
with values measured experimentally. More information can be found in
OS#4583.

Related: OS#4583

Change-Id: If7ef5bf95ffe4afe5864c0f051853aa38b9639eb
---
M Transceiver52M/device/uhd/UHDDevice.cpp
M Transceiver52M/device/uhd/UHDDevice.h
2 files changed, 90 insertions(+), 6 deletions(-)

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



diff --git a/Transceiver52M/device/uhd/UHDDevice.cpp b/Transceiver52M/device/uhd/UHDDevice.cpp
index 2970173..93dde4b 100644
--- a/Transceiver52M/device/uhd/UHDDevice.cpp
+++ b/Transceiver52M/device/uhd/UHDDevice.cpp
@@ -33,6 +33,10 @@
 #include "config.h"
 #endif
 
+extern "C" {
+#include <osmocom/gsm/gsm_utils.h>
+}
+
 #ifdef USE_UHD_3_11
 #include <uhd/utils/log_add.hpp>
 #include <uhd/utils/thread.hpp>
@@ -123,6 +127,26 @@
 	{ std::make_tuple(B2XX_MCBTS, 4, 4), { 1, 51.2e6, MCBTS_SPACING*4, B2XX_TIMING_MCBTS, "B200/B210 4 SPS Multi-ARFCN" } },
 };
 
+typedef std::tuple<uhd_dev_type, enum gsm_band> dev_band_key;
+/* Maximum UHD Tx Gain which can be set/used without distorting the
+   output signal, and the resulting real output power measured when that
+   gain is used. Correct measured values only provided for B210 so far. */
+struct dev_band_desc {
+	double nom_uhd_tx_gain;  /* dB */
+	double nom_out_tx_power; /* dBm */
+};
+typedef std::map<dev_band_key, dev_band_desc>::const_iterator dev_band_map_it;
+static const std::map<dev_band_key, dev_band_desc> dev_band_nom_power_param_map {
+	{ std::make_tuple(B200, GSM_BAND_850),	{ 89.75, 13.3 } },
+	{ std::make_tuple(B200, GSM_BAND_900),	{ 89.75, 13.3 } },
+	{ std::make_tuple(B200, GSM_BAND_1800),	{ 89.75, 7.5 } },
+	{ std::make_tuple(B200, GSM_BAND_1900),	{ 89.75, 7.7 } },
+	{ std::make_tuple(B210, GSM_BAND_850),	{ 89.75, 13.3 } },
+	{ std::make_tuple(B210, GSM_BAND_900),	{ 89.75, 13.3 } },
+	{ std::make_tuple(B210, GSM_BAND_1800),	{ 89.75, 7.5 } },
+	{ std::make_tuple(B210, GSM_BAND_1900),	{ 89.75, 7.7 } },
+};
+
 void *async_event_loop(uhd_device *dev)
 {
 	set_selfthread_name("UHDAsyncEvent");
@@ -195,7 +219,7 @@
 	: RadioDevice(tx_sps, rx_sps, iface, chan_num, lo_offset, tx_paths, rx_paths),
 	  tx_gain_min(0.0), tx_gain_max(0.0),
 	  rx_gain_min(0.0), rx_gain_max(0.0),
-	  tx_spp(0), rx_spp(0),
+	  band((enum gsm_band)0), tx_spp(0), rx_spp(0),
 	  started(false), aligned(false), drop_cnt(0),
 	  prev_ts(0,0), ts_initial(0), ts_offset(0), async_event_thrd(NULL)
 {
@@ -209,6 +233,27 @@
 		delete rx_buffers[i];
 }
 
+void uhd_device::get_dev_band_desc(dev_band_desc& desc)
+{
+	dev_band_map_it it;
+	enum gsm_band req_band = band;
+
+	if (req_band == 0) {
+		LOGC(DDEV, ERROR) << "Nominal Tx Power requested before Tx Frequency was set! Providing band 900 by default... ";
+		req_band = GSM_BAND_900;
+	}
+	it = dev_band_nom_power_param_map.find(dev_band_key(dev_type, req_band));
+	if (it == dev_band_nom_power_param_map.end()) {
+		dev_desc desc = dev_param_map.at(dev_key(dev_type, tx_sps, rx_sps));
+		LOGC(DDEV, ERROR) << "No Tx Power measurements exist for device "
+				    << desc.str << " on band " << gsm_band_name(req_band)
+				    << ", using B210 ones as fallback";
+		it = dev_band_nom_power_param_map.find(dev_band_key(B210, req_band));
+	}
+	OSMO_ASSERT(it != dev_band_nom_power_param_map.end())
+	desc = it->second;
+}
+
 void uhd_device::init_gains()
 {
 	uhd::gain_range_t range;
@@ -343,10 +388,10 @@
 
 int uhd_device::getNominalTxPower(size_t chan)
 {
-	/* TODO: return value based on some experimentally generated table depending on
-	 * band/arfcn, which is known here thanks to TXTUNE
-	 */
-	return 23;
+	dev_band_desc desc;
+	get_dev_band_desc(desc);
+
+	return desc.nom_out_tx_power;
 }
 
 /*
@@ -960,13 +1005,44 @@
 
 bool uhd_device::setTxFreq(double wFreq, size_t chan)
 {
+	uint16_t req_arfcn;
+	enum gsm_band req_band;
+	dev_band_desc desc;
+
 	if (chan >= tx_freqs.size()) {
 		LOGC(DDEV, ALERT) << "Requested non-existent channel " << chan;
 		return false;
 	}
 	ScopedLock lock(tune_lock);
 
-	return set_freq(wFreq, chan, true);
+	req_arfcn = gsm_freq102arfcn(wFreq / 1000 / 100 , 0);
+	if (req_arfcn == 0xffff) {
+		LOGCHAN(chan, DDEV, ALERT) << "Unknown ARFCN for Tx Frequency " << wFreq / 1000 << " kHz";
+		return false;
+	}
+	if (gsm_arfcn2band_rc(req_arfcn, &req_band) < 0) {
+		LOGCHAN(chan, DDEV, ALERT) << "Unknown GSM band for Tx Frequency " << wFreq
+					   << " Hz (ARFCN " << req_arfcn << " )";
+		return false;
+	}
+
+	if (band != 0 && req_band != band) {
+		LOGCHAN(chan, DDEV, ALERT) << "Requesting Tx Frequency " << wFreq
+					   << " Hz different from previous band " << gsm_band_name(band);
+		return false;
+	}
+
+	if (!set_freq(wFreq, chan, true))
+		return false;
+
+	band = req_band;
+
+	/* Update Max Tx Gain */
+	get_dev_band_desc(desc);
+	tx_gain_max = desc.nom_uhd_tx_gain;
+	LOGCHAN(chan, DDEV, INFO) << "Updating max Gain to " << tx_gain_max
+				   << " dB based on GSM band information";
+	return true;
 }
 
 bool uhd_device::setRxFreq(double wFreq, size_t chan)
diff --git a/Transceiver52M/device/uhd/UHDDevice.h b/Transceiver52M/device/uhd/UHDDevice.h
index 01d71a0..8a2d592 100644
--- a/Transceiver52M/device/uhd/UHDDevice.h
+++ b/Transceiver52M/device/uhd/UHDDevice.h
@@ -37,6 +37,10 @@
 #include <uhd/property_tree.hpp>
 #include <uhd/usrp/multi_usrp.hpp>
 
+extern "C" {
+#include <osmocom/gsm/gsm_utils.h>
+}
+
 
 enum uhd_dev_type {
 	USRP1,
@@ -52,6 +56,8 @@
 	LIMESDR,
 };
 
+struct dev_band_desc;
+
 /*
     uhd_device - UHD implementation of the Device interface. Timestamped samples
                 are sent to and received from the device. An intermediate buffer
@@ -143,6 +149,7 @@
 
 	std::vector<double> tx_gains, rx_gains;
 	std::vector<double> tx_freqs, rx_freqs;
+	enum gsm_band band;
 	size_t tx_spp, rx_spp;
 
 	bool started;
@@ -171,6 +178,7 @@
 
 	uhd::tune_request_t select_freq(double wFreq, size_t chan, bool tx);
 	bool set_freq(double freq, size_t chan, bool tx);
+	void get_dev_band_desc(dev_band_desc& desc);
 
 	Thread *async_event_thrd;
 	Mutex tune_lock;

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-trx/+/18721
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-trx
Gerrit-Branch: master
Gerrit-Change-Id: If7ef5bf95ffe4afe5864c0f051853aa38b9639eb
Gerrit-Change-Number: 18721
Gerrit-PatchSet: 2
Gerrit-Owner: pespin <pespin at sysmocom.de>
Gerrit-Reviewer: Hoernchen <ewild at sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: daniel <dwillmann at sysmocom.de>
Gerrit-Reviewer: fixeria <vyanitskiy at sysmocom.de>
Gerrit-Reviewer: laforge <laforge at osmocom.org>
Gerrit-Reviewer: neels <nhofmeyr at sysmocom.de>
Gerrit-Reviewer: pespin <pespin at sysmocom.de>
Gerrit-Reviewer: roh <jsteiger at sysmocom.de>
Gerrit-Reviewer: tnt <tnt at 246tNt.com>
Gerrit-MessageType: merged
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200615/a3b610f7/attachment.htm>


More information about the gerrit-log mailing list