aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib
diff options
context:
space:
mode:
authorMark Meserve <mark.meserve@ni.com>2018-12-19 16:46:49 -0600
committerBrent Stapleton <brent.stapleton@ettus.com>2019-01-09 11:47:07 -0800
commit34f54d3ec7371ba251a2e901638eaae07f3b4cda (patch)
tree3b76c504622292e3d6298aef4d3208d1eca88210 /host/lib
parent5c012cad7858cadcaa85ec295080f3c8b21fdee0 (diff)
downloaduhd-34f54d3ec7371ba251a2e901638eaae07f3b4cda.tar.gz
uhd-34f54d3ec7371ba251a2e901638eaae07f3b4cda.tar.bz2
uhd-34f54d3ec7371ba251a2e901638eaae07f3b4cda.zip
rh: add support for iq and dc correction files
- Update corrections on frequency or LO source change - Add legacy EEPROM properties - Move DSP control initialization earlier - Fix TX antenna list property
Diffstat (limited to 'host/lib')
-rw-r--r--host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_impl.cpp48
-rw-r--r--host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_impl.hpp6
-rw-r--r--host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_init.cpp48
-rw-r--r--host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_lo.cpp4
4 files changed, 88 insertions, 18 deletions
diff --git a/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_impl.cpp b/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_impl.cpp
index 245642917..6599e3d82 100644
--- a/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_impl.cpp
+++ b/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_impl.cpp
@@ -7,6 +7,7 @@
#include "rhodium_radio_ctrl_impl.hpp"
#include "rhodium_constants.hpp"
#include <uhdlib/utils/narrow.hpp>
+#include <uhdlib/usrp/common/apply_corrections.hpp>
#include <uhd/utils/log.hpp>
#include <uhd/rfnoc/node_ctrl_base.hpp>
#include <uhd/transport/chdr.hpp>
@@ -200,6 +201,7 @@ double rhodium_radio_ctrl_impl::set_tx_frequency(
_rpcc->notify_with_token(_rpc_prefix + "enable_tx_lowband_lo", (!is_highband));
}
_update_tx_freq_switches(coerced_freq);
+ _update_corrections(get_tx_lo_source(RHODIUM_LO1, 0), coerced_freq, TX_DIRECTION);
// if TX lowband/highband changed and antenna is TX/RX,
// the ATR and SW1 need to be updated
_update_tx_output_switches(get_tx_antenna(0));
@@ -252,6 +254,7 @@ double rhodium_radio_ctrl_impl::set_rx_frequency(
_rpcc->notify_with_token(_rpc_prefix + "enable_rx_lowband_lo", (!is_highband));
}
_update_rx_freq_switches(coerced_freq);
+ _update_corrections(get_rx_lo_source(RHODIUM_LO1, 0), coerced_freq, RX_DIRECTION);
return coerced_freq;
}
@@ -399,6 +402,40 @@ void rhodium_radio_ctrl_impl::_update_atr(
}
}
+void rhodium_radio_ctrl_impl::_update_corrections(
+ const std::string lo_source,
+ const double freq,
+ const direction_t dir)
+{
+ const std::string fe_path_part = dir == RX_DIRECTION ? "rx_fe_corrections"
+ : "tx_fe_corrections";
+ const fs_path fe_corr_path = _root_path / fe_path_part / 0;
+ const fs_path dboard_path = fs_path("dboards") / _radio_slot;
+
+ if (lo_source == "internal")
+ {
+ UHD_LOG_DEBUG(unique_id(),
+ "Enabling frontend corrections for "
+ << ((dir == RX_DIRECTION) ? "RX" : "TX"));
+ if (dir == RX_DIRECTION) {
+ apply_rx_fe_corrections(_tree, dboard_path, fe_corr_path, freq);
+ } else {
+ apply_tx_fe_corrections(_tree, dboard_path, fe_corr_path, freq);
+ }
+ } else {
+ UHD_LOG_DEBUG(unique_id(),
+ "Disabling frontend corrections for "
+ << ((dir == RX_DIRECTION) ? "RX" : "TX"));
+ if (dir == RX_DIRECTION) {
+ _rx_fe_core->set_iq_balance(rx_frontend_core_3000::DEFAULT_IQ_BALANCE_VALUE);
+ } else {
+ _tx_fe_core->set_dc_offset(tx_frontend_core_200::DEFAULT_DC_OFFSET_VALUE);
+ _tx_fe_core->set_iq_balance(tx_frontend_core_200::DEFAULT_IQ_BALANCE_VALUE);
+ }
+ }
+
+}
+
uhd::gain_range_t rhodium_radio_ctrl_impl::_get_gain_range(direction_t dir)
{
if (dir == RX_DIRECTION) {
@@ -533,12 +570,12 @@ void rhodium_radio_ctrl_impl::set_rpc_client(
radio_ctrl_impl::set_rate(_master_clock_rate);
UHD_LOG_TRACE(unique_id(), "Checking for existence of Rhodium DB in slot " << _radio_slot);
- const auto dboard_info = _rpcc->request<std::vector<std::map<std::string, std::string>>>("get_dboard_info");
+ const auto all_dboard_info = _rpcc->request<std::vector<std::map<std::string, std::string>>>("get_dboard_info");
// There is a bug that if only one DB is plugged into slot B the vector
// will only have 1 element but not be correlated to slot B at all.
// For now, we assume a 1 element array means the DB is in slot A.
- if (dboard_info.size() <= get_block_id().get_block_count())
+ if (all_dboard_info.size() <= get_block_id().get_block_count())
{
UHD_LOG_DEBUG(unique_id(), "No DB detected in slot " << _radio_slot);
// Name and master clock rate are needed for RFNoC init, so set the
@@ -549,11 +586,10 @@ void rhodium_radio_ctrl_impl::set_rpc_client(
->create<std::string>("name").set("Unknown");
}
else {
+ _dboard_info = all_dboard_info.at(get_block_id().get_block_count());
UHD_LOG_DEBUG(unique_id(),
- "Rhodium DB detected in slot " <<
- _radio_slot <<
- ". Serial: " <<
- dboard_info.at(get_block_id().get_block_count()).at("serial"));
+ "Rhodium DB detected in slot " << _radio_slot <<
+ ". Serial: " << _dboard_info.at("serial"));
_init_defaults();
_init_peripherals();
_init_prop_tree();
diff --git a/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_impl.hpp b/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_impl.hpp
index c13dd11ae..0cd29cc99 100644
--- a/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_impl.hpp
+++ b/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_impl.hpp
@@ -215,6 +215,9 @@ private:
// ATR registers control SW10 and the frontend LEDs.
void _update_atr(const std::string& ant, const direction_t dir);
+ //! Configure DSP core corrections based on current frequency and LO source
+ void _update_corrections(const std::string lo_source, const double freq, const direction_t dir);
+
//! Map a frequency in Hz to an rx_band value. Will return
// rx_band::INVALID_BAND if the frequency is out of range.
static rx_band _map_freq_to_rx_band(const double freq);
@@ -294,6 +297,9 @@ private:
//! Prepended for all dboard RPC calls
std::string _rpc_prefix;
+ //! Daughterboard info from MPM
+ std::map<std::string, std::string> _dboard_info;
+
//! Additional block args; gets set during set_rpc_client()
uhd::device_addr_t _block_args;
diff --git a/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_init.cpp b/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_init.cpp
index ae72a4bac..a4b2cd17a 100644
--- a/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_init.cpp
+++ b/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_init.cpp
@@ -16,6 +16,7 @@
#include <string>
using namespace uhd;
+using namespace uhd::usrp;
using namespace uhd::rfnoc;
namespace {
@@ -166,6 +167,19 @@ void rhodium_radio_ctrl_impl::_init_peripherals()
_generate_write_spi(this->_spi, SEN_CPLD, _get_cpld_spi_config()),
_generate_read_spi(this->_spi, SEN_CPLD, _get_cpld_spi_config()));
+ UHD_LOG_TRACE(unique_id(), "Initializing TX frontend DSP core...")
+ _tx_fe_core = tx_frontend_core_200::make(_get_ctrl(0), regs::sr_addr(TX_FE_BASE));
+ _tx_fe_core->set_dc_offset(tx_frontend_core_200::DEFAULT_DC_OFFSET_VALUE);
+ _tx_fe_core->set_iq_balance(tx_frontend_core_200::DEFAULT_IQ_BALANCE_VALUE);
+ _tx_fe_core->populate_subtree(_tree->subtree(_root_path / "tx_fe_corrections" / 0));
+
+ UHD_LOG_TRACE(unique_id(), "Initializing RX frontend DSP core...")
+ _rx_fe_core = rx_frontend_core_3000::make(_get_ctrl(0), regs::sr_addr(RX_FE_BASE));
+ _rx_fe_core->set_adc_rate(_master_clock_rate);
+ _rx_fe_core->set_dc_offset(rx_frontend_core_3000::DEFAULT_DC_OFFSET_VALUE);
+ _rx_fe_core->set_dc_offset_auto(rx_frontend_core_3000::DEFAULT_DC_OFFSET_ENABLE);
+ _rx_fe_core->populate_subtree(_tree->subtree(_root_path / "rx_fe_corrections" / 0));
+
UHD_LOG_TRACE(unique_id(), "Writing initial gain values...");
set_tx_gain(RHODIUM_DEFAULT_GAIN, 0);
set_tx_lo_gain(RHODIUM_DEFAULT_LO_GAIN, RHODIUM_LO1, 0);
@@ -225,17 +239,6 @@ void rhodium_radio_ctrl_impl::_init_peripherals()
_update_tx_output_switches(RHODIUM_DEFAULT_TX_ANTENNA);
_update_rx_input_switches(RHODIUM_DEFAULT_RX_ANTENNA);
- _rx_fe_core = rx_frontend_core_3000::make(_get_ctrl(0), regs::sr_addr(RX_FE_BASE));
- _rx_fe_core->set_adc_rate(_master_clock_rate);
- _rx_fe_core->set_dc_offset(rx_frontend_core_3000::DEFAULT_DC_OFFSET_VALUE);
- _rx_fe_core->set_dc_offset_auto(rx_frontend_core_3000::DEFAULT_DC_OFFSET_ENABLE);
- _rx_fe_core->populate_subtree(_tree->subtree(_root_path / "rx_fe_corrections" / 0));
-
- _tx_fe_core = tx_frontend_core_200::make(_get_ctrl(0), regs::sr_addr(TX_FE_BASE));
- _tx_fe_core->set_dc_offset(tx_frontend_core_200::DEFAULT_DC_OFFSET_VALUE);
- _tx_fe_core->set_iq_balance(tx_frontend_core_200::DEFAULT_IQ_BALANCE_VALUE);
- _tx_fe_core->populate_subtree(_tree->subtree(_root_path / "tx_fe_corrections" / 0));
-
UHD_LOG_TRACE(unique_id(), "Checking for existence of LO Distribution board");
_lo_dist_present = _rpcc->request_with_token<bool>(_rpc_prefix + "is_lo_dist_present");
UHD_LOG_DEBUG(unique_id(), str(boost::format("LO distribution board is%s present") % (_lo_dist_present ? "" : " NOT")));
@@ -290,7 +293,7 @@ void rhodium_radio_ctrl_impl::_init_frontend_subtree(
})
;
subtree->create<std::vector<std::string>>(tx_fe_path / "antenna" / "options")
- .set({RHODIUM_DEFAULT_TX_ANTENNA})
+ .set(RHODIUM_TX_ANTENNAS)
.add_coerced_subscriber([](const std::vector<std::string> &){
throw uhd::runtime_error(
"Attempting to update antenna options!");
@@ -760,6 +763,27 @@ void rhodium_radio_ctrl_impl::_init_prop_tree()
const fs_path fe_base = fs_path("dboards") / _radio_slot;
this->_init_frontend_subtree(_tree->subtree(fe_base), 0);
+ // legacy EEPROM paths
+ auto eeprom_get = [this]() {
+ auto eeprom = dboard_eeprom_t();
+ eeprom.id = boost::lexical_cast<uint16_t>(_dboard_info.at("pid"));
+ eeprom.revision = _dboard_info.at("rev");
+ eeprom.serial = _dboard_info.at("serial");
+ return eeprom;
+ };
+
+ auto eeprom_set = [](dboard_eeprom_t) {
+ throw uhd::not_implemented_error("Setting DB EEPROM from this interface not implemented");
+ };
+
+ _tree->create<dboard_eeprom_t>(fe_base / "rx_eeprom")
+ .set_publisher(eeprom_get)
+ .add_coerced_subscriber(eeprom_set);
+
+ _tree->create<dboard_eeprom_t>(fe_base / "tx_eeprom")
+ .set_publisher(eeprom_get)
+ .add_coerced_subscriber(eeprom_set);
+
// EEPROM paths subject to change FIXME
_tree->create<eeprom_map_t>(_root_path / "eeprom")
.set(eeprom_map_t());
diff --git a/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_lo.cpp b/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_lo.cpp
index d05000cab..8567229d8 100644
--- a/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_lo.cpp
+++ b/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_lo.cpp
@@ -264,6 +264,8 @@ void rhodium_radio_ctrl_impl::set_tx_lo_source(
throw uhd::value_error(str(boost::format("set_tx_lo_source was called with an invalid LO source: %s Valid sources are [internal, external]") % src));
}
+ _update_corrections(src, get_tx_frequency(0), TX_DIRECTION);
+
_tx_lo_source = src;
}
@@ -293,6 +295,8 @@ void rhodium_radio_ctrl_impl::set_rx_lo_source(
throw uhd::value_error(str(boost::format("set_rx_lo_source was called with an invalid LO source: %s Valid sources for LO1 are [internal, external]") % src));
}
+ _update_corrections(src, get_rx_frequency(0), RX_DIRECTION);
+
_rx_lo_source = src;
}