devices: add freq/gain override for uhd
This allows using arbitrary gain and frequencies. Change-Id: I3c1b9a067cafc6d696b9aa2da8ee0480ec1e094f
This commit is contained in:
parent
c0f78a37ed
commit
f8c7a52521
|
@ -57,4 +57,14 @@ struct trx_cfg {
|
||||||
unsigned int stack_size;
|
unsigned int stack_size;
|
||||||
unsigned int num_chans;
|
unsigned int num_chans;
|
||||||
struct trx_chan chans[TRX_CHAN_MAX];
|
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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -285,6 +285,60 @@ DEFUN_ATTR(cfg_ul_fn_offset, cfg_ul_fn_offset_cmd,
|
||||||
return CMD_SUCCESS;
|
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,
|
DEFUN(cfg_swap_channels, cfg_swap_channels_cmd,
|
||||||
"swap-channels (disable|enable)",
|
"swap-channels (disable|enable)",
|
||||||
"Swap primary and secondary channels of the PHY (if any)\n"
|
"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);
|
vty_out(vty, " stack-size %u%s", trx->cfg.stack_size, VTY_NEWLINE);
|
||||||
if (trx->cfg.ul_fn_offset != 0)
|
if (trx->cfg.ul_fn_offset != 0)
|
||||||
vty_out(vty, " ul-fn-offset %d%s", trx->cfg.ul_fn_offset, VTY_NEWLINE);
|
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, " ");
|
trx_rate_ctr_threshold_write_config(vty, " ");
|
||||||
|
|
||||||
for (i = 0; i < trx->cfg.num_chans; i++) {
|
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_chan_cmd);
|
||||||
install_element(TRX_NODE, &cfg_ul_fn_offset_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_node(&chan_node, dummy_config_write);
|
||||||
install_element(CHAN_NODE, &cfg_chan_rx_path_cmd);
|
install_element(CHAN_NODE, &cfg_chan_rx_path_cmd);
|
||||||
install_element(CHAN_NODE, &cfg_chan_tx_path_cmd);
|
install_element(CHAN_NODE, &cfg_chan_tx_path_cmd);
|
||||||
|
|
|
@ -295,6 +295,9 @@ double uhd_device::setRxGain(double db, size_t chan)
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cfg->overrides.ul_gain_override)
|
||||||
|
return rx_gains[chan];
|
||||||
|
|
||||||
usrp_dev->set_rx_gain(db, chan);
|
usrp_dev->set_rx_gain(db, chan);
|
||||||
rx_gains[chan] = usrp_dev->get_rx_gain(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;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cfg->overrides.dl_gain_override)
|
||||||
|
return atten; // ensures caller does not apply digital attenuation
|
||||||
|
|
||||||
get_dev_band_desc(desc);
|
get_dev_band_desc(desc);
|
||||||
tx_power = desc.nom_out_tx_power - atten;
|
tx_power = desc.nom_out_tx_power - atten;
|
||||||
db = TxPower2TxGain(desc, tx_power);
|
db = TxPower2TxGain(desc, tx_power);
|
||||||
|
@ -626,6 +632,32 @@ int uhd_device::open()
|
||||||
// Print configuration
|
// Print configuration
|
||||||
LOGC(DDEV, INFO) << "Device configuration: " << usrp_dev->get_pp_string();
|
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)
|
if (iface == MULTI_ARFCN)
|
||||||
return 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;
|
uhd::tune_result_t tres;
|
||||||
std::string str_dir = tx ? "Tx" : "Rx";
|
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))
|
if (!update_band_from_freq(freq, chan, tx))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue