aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Wild <ewild@sysmocom.de>2023-05-17 17:44:08 +0200
committerEric <ewild@sysmocom.de>2023-07-25 18:25:49 +0200
commitf8c7a5252159814b96d171805213cc5bfa4921bc (patch)
treef7655e75080d3e37910961fe3736301533c42ec6
parentc0f78a37ed6fcb900c232eeba41f22f2dffa48d1 (diff)
devices: add freq/gain override for uhd
This allows using arbitrary gain and frequencies. Change-Id: I3c1b9a067cafc6d696b9aa2da8ee0480ec1e094f
-rw-r--r--CommonLibs/config_defs.h10
-rw-r--r--CommonLibs/trx_vty.c66
-rw-r--r--Transceiver52M/device/uhd/UHDDevice.cpp35
3 files changed, 111 insertions, 0 deletions
diff --git a/CommonLibs/config_defs.h b/CommonLibs/config_defs.h
index 33be73f..bf49bcf 100644
--- a/CommonLibs/config_defs.h
+++ b/CommonLibs/config_defs.h
@@ -57,4 +57,14 @@ struct trx_cfg {
unsigned int stack_size;
unsigned int num_chans;
struct trx_chan chans[TRX_CHAN_MAX];
+ struct {
+ bool ul_freq_override;
+ bool dl_freq_override;
+ bool ul_gain_override;
+ bool dl_gain_override;
+ double ul_freq;
+ double dl_freq;
+ double ul_gain;
+ double dl_gain;
+ } overrides;
};
diff --git a/CommonLibs/trx_vty.c b/CommonLibs/trx_vty.c
index 6724189..1878d83 100644
--- a/CommonLibs/trx_vty.c
+++ b/CommonLibs/trx_vty.c
@@ -285,6 +285,60 @@ DEFUN_ATTR(cfg_ul_fn_offset, cfg_ul_fn_offset_cmd,
return CMD_SUCCESS;
}
+DEFUN_ATTR(cfg_ul_freq_override, cfg_ul_freq_override_cmd,
+ "ul-freq-override FLOAT",
+ "Overrides Rx carrier frequency\n"
+ "Frequency in Hz (e.g. 145300000)\n",
+ CMD_ATTR_HIDDEN)
+{
+ struct trx_ctx *trx = trx_from_vty(vty);
+
+ trx->cfg.overrides.ul_freq_override = true;
+ trx->cfg.overrides.ul_freq = atof(argv[0]);
+
+ return CMD_SUCCESS;
+}
+DEFUN_ATTR(cfg_dl_freq_override, cfg_dl_freq_override_cmd,
+ "dl-freq-override FLOAT",
+ "Overrides Tx carrier frequency\n"
+ "Frequency in Hz (e.g. 145300000)\n",
+ CMD_ATTR_HIDDEN)
+{
+ struct trx_ctx *trx = trx_from_vty(vty);
+
+ trx->cfg.overrides.dl_freq_override = true;
+ trx->cfg.overrides.dl_freq = atof(argv[0]);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN_ATTR(cfg_ul_gain_override, cfg_ul_gain_override_cmd,
+ "ul-gain-override FLOAT",
+ "Overrides Rx gain\n"
+ "gain in dB\n",
+ CMD_ATTR_HIDDEN)
+{
+ struct trx_ctx *trx = trx_from_vty(vty);
+
+ trx->cfg.overrides.ul_gain_override = true;
+ trx->cfg.overrides.ul_gain = atof(argv[0]);
+
+ return CMD_SUCCESS;
+}
+DEFUN_ATTR(cfg_dl_gain_override, cfg_dl_gain_override_cmd,
+ "dl-gain-override FLOAT",
+ "Overrides Tx gain\n"
+ "gain in dB\n",
+ CMD_ATTR_HIDDEN)
+{
+ struct trx_ctx *trx = trx_from_vty(vty);
+
+ trx->cfg.overrides.dl_gain_override = true;
+ trx->cfg.overrides.dl_gain = atof(argv[0]);
+
+ return CMD_SUCCESS;
+}
+
DEFUN(cfg_swap_channels, cfg_swap_channels_cmd,
"swap-channels (disable|enable)",
"Swap primary and secondary channels of the PHY (if any)\n"
@@ -638,6 +692,14 @@ static int config_write_trx(struct vty *vty)
vty_out(vty, " stack-size %u%s", trx->cfg.stack_size, VTY_NEWLINE);
if (trx->cfg.ul_fn_offset != 0)
vty_out(vty, " ul-fn-offset %d%s", trx->cfg.ul_fn_offset, VTY_NEWLINE);
+ if (trx->cfg.overrides.dl_freq_override)
+ vty_out(vty, " dl-freq-override %f%s", trx->cfg.overrides.dl_freq, VTY_NEWLINE);
+ if (trx->cfg.overrides.ul_freq_override)
+ vty_out(vty, " ul-freq-override %f%s", trx->cfg.overrides.ul_freq, VTY_NEWLINE);
+ if (trx->cfg.overrides.dl_gain_override)
+ vty_out(vty, " dl-gain-override %f%s", trx->cfg.overrides.dl_gain, VTY_NEWLINE);
+ if (trx->cfg.overrides.ul_gain_override)
+ vty_out(vty, " ul-gain-override %f%s", trx->cfg.overrides.ul_gain, VTY_NEWLINE);
trx_rate_ctr_threshold_write_config(vty, " ");
for (i = 0; i < trx->cfg.num_chans; i++) {
@@ -803,6 +865,10 @@ int trx_vty_init(struct trx_ctx* trx)
install_element(TRX_NODE, &cfg_chan_cmd);
install_element(TRX_NODE, &cfg_ul_fn_offset_cmd);
+ install_element(TRX_NODE, &cfg_ul_freq_override_cmd);
+ install_element(TRX_NODE, &cfg_dl_freq_override_cmd);
+ install_element(TRX_NODE, &cfg_ul_gain_override_cmd);
+ install_element(TRX_NODE, &cfg_dl_gain_override_cmd);
install_node(&chan_node, dummy_config_write);
install_element(CHAN_NODE, &cfg_chan_rx_path_cmd);
install_element(CHAN_NODE, &cfg_chan_tx_path_cmd);
diff --git a/Transceiver52M/device/uhd/UHDDevice.cpp b/Transceiver52M/device/uhd/UHDDevice.cpp
index 95ea8e7..ec772aa 100644
--- a/Transceiver52M/device/uhd/UHDDevice.cpp
+++ b/Transceiver52M/device/uhd/UHDDevice.cpp
@@ -295,6 +295,9 @@ double uhd_device::setRxGain(double db, size_t chan)
return 0.0f;
}
+ if (cfg->overrides.ul_gain_override)
+ return rx_gains[chan];
+
usrp_dev->set_rx_gain(db, chan);
rx_gains[chan] = usrp_dev->get_rx_gain(chan);
@@ -337,6 +340,9 @@ double uhd_device::setPowerAttenuation(int atten, size_t chan) {
return 0.0f;
}
+ if (cfg->overrides.dl_gain_override)
+ return atten; // ensures caller does not apply digital attenuation
+
get_dev_band_desc(desc);
tx_power = desc.nom_out_tx_power - atten;
db = TxPower2TxGain(desc, tx_power);
@@ -626,6 +632,32 @@ int uhd_device::open()
// Print configuration
LOGC(DDEV, INFO) << "Device configuration: " << usrp_dev->get_pp_string();
+ if (cfg->overrides.dl_freq_override) {
+ uhd::tune_request_t treq_tx = uhd::tune_request_t(cfg->overrides.dl_freq, 0);
+ auto tres = usrp_dev->set_tx_freq(treq_tx, 0);
+ tx_freqs[0] = usrp_dev->get_tx_freq(0);
+ LOGCHAN(0, DDEV, INFO) << "OVERRIDE set_freq(" << tx_freqs[0] << ", TX): " << tres.to_pp_string() << std::endl;
+ }
+
+ if (cfg->overrides.ul_freq_override) {
+ uhd::tune_request_t treq_rx = uhd::tune_request_t(cfg->overrides.ul_freq, 0);
+ auto tres = usrp_dev->set_rx_freq(treq_rx, 0);
+ rx_freqs[0] = usrp_dev->get_rx_freq(0);
+ LOGCHAN(0, DDEV, INFO) << "OVERRIDE set_freq(" << rx_freqs[0] << ", RX): " << tres.to_pp_string() << std::endl;
+ }
+
+ if (cfg->overrides.ul_gain_override) {
+ usrp_dev->set_rx_gain(cfg->overrides.ul_gain, 0);
+ rx_gains[0] = usrp_dev->get_rx_gain(0);
+ LOGCHAN(0, DDEV, INFO) << " OVERRIDE RX gain:" << rx_gains[0] << std::endl;
+ }
+
+ if (cfg->overrides.dl_gain_override) {
+ usrp_dev->set_tx_gain(cfg->overrides.dl_gain, 0);
+ tx_gains[0] = usrp_dev->get_tx_gain(0);
+ LOGCHAN(0, DDEV, INFO) << " OVERRIDE TX gain:" << tx_gains[0] << std::endl;
+ }
+
if (iface == MULTI_ARFCN)
return MULTI_ARFCN;
@@ -978,6 +1010,9 @@ bool uhd_device::set_freq(double freq, size_t chan, bool tx)
uhd::tune_result_t tres;
std::string str_dir = tx ? "Tx" : "Rx";
+ if (cfg->overrides.dl_freq_override || cfg->overrides.ul_freq_override)
+ return true;
+
if (!update_band_from_freq(freq, chan, tx))
return false;