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 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;
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue