diff options
author | Josh Blum <josh@joshknows.com> | 2010-06-10 10:10:05 -0700 |
---|---|---|
committer | Josh Blum <josh@joshknows.com> | 2010-06-10 10:10:05 -0700 |
commit | 126444c564d30d65116be5f772bdf47594d62884 (patch) | |
tree | 13c60f59f937edd34aacd58f69b03f5253f76f1f | |
parent | ad95e45ab20134657075cd30b989748597c17765 (diff) | |
download | uhd-126444c564d30d65116be5f772bdf47594d62884.tar.gz uhd-126444c564d30d65116be5f772bdf47594d62884.tar.bz2 uhd-126444c564d30d65116be5f772bdf47594d62884.zip |
Moved mux calculations into dsp type1 utils.
Fixed error in db basic freq range switcheroo.
-rw-r--r-- | host/lib/usrp/dboard/db_basic_and_lf.cpp | 4 | ||||
-rw-r--r-- | host/lib/usrp/dsp_utils.hpp | 35 | ||||
-rw-r--r-- | host/lib/usrp/usrp2/dboard_impl.cpp | 64 | ||||
-rw-r--r-- | host/lib/usrp/usrp2/usrp2_impl.hpp | 2 |
4 files changed, 59 insertions, 46 deletions
diff --git a/host/lib/usrp/dboard/db_basic_and_lf.cpp b/host/lib/usrp/dboard/db_basic_and_lf.cpp index 23ac98872..766deac78 100644 --- a/host/lib/usrp/dboard/db_basic_and_lf.cpp +++ b/host/lib/usrp/dboard/db_basic_and_lf.cpp @@ -127,7 +127,7 @@ void basic_rx::rx_get(const wax::obj &key_, wax::obj &val){ return; case SUBDEV_PROP_FREQ_RANGE: - val = freq_range_t(+_max_freq, -_max_freq); + val = freq_range_t(-_max_freq, +_max_freq); return; case SUBDEV_PROP_ANTENNA: @@ -226,7 +226,7 @@ void basic_tx::tx_get(const wax::obj &key_, wax::obj &val){ return; case SUBDEV_PROP_FREQ_RANGE: - val = freq_range_t(+_max_freq, -_max_freq); + val = freq_range_t(-_max_freq, +_max_freq); return; case SUBDEV_PROP_ANTENNA: diff --git a/host/lib/usrp/dsp_utils.hpp b/host/lib/usrp/dsp_utils.hpp index cfe5375f8..e0ec46184 100644 --- a/host/lib/usrp/dsp_utils.hpp +++ b/host/lib/usrp/dsp_utils.hpp @@ -32,6 +32,41 @@ namespace dsp_type1{ } /*! + * Calculate the rx mux word from properties. + * \param is_quadrature true if the subdev is complex + * \param is_iq_swapped true if the i and q are reversed + * \param the 32-bit rx mux control word + */ + static inline boost::uint32_t calc_rx_mux_word( + bool is_quadrature, + bool is_iq_swapped + ){ + boost::uint32_t rx_mux = 0; + if (is_quadrature){ + rx_mux = (0x01 << 2) | (0x00 << 0); //Q=ADC1, I=ADC0 + }else{ + rx_mux = (0x11 << 2) | (0x00 << 0); //Q=ZERO, I=ADC0 + } + if (is_iq_swapped){ + rx_mux = (rx_mux << 2) | (rx_mux >> 2); + } + return rx_mux; + } + + /*! + * Calculate the tx mux word from properties. + * \param is_iq_swapped true if the i and q are reversed + * \param the 32-bit tx mux control word + */ + static inline boost::uint32_t calc_tx_mux_word(bool is_iq_swapped){ + boost::uint32_t tx_mux = 0x10; + if (is_iq_swapped){ + tx_mux = (tx_mux << 4) | (tx_mux >> 4); + } + return tx_mux; + } + + /*! * Calculate the cordic word from the frequency and clock rate. * The frequency will be set to the actual (possible) frequency. * diff --git a/host/lib/usrp/usrp2/dboard_impl.cpp b/host/lib/usrp/usrp2/dboard_impl.cpp index 4a3a70467..fef486771 100644 --- a/host/lib/usrp/usrp2/dboard_impl.cpp +++ b/host/lib/usrp/usrp2/dboard_impl.cpp @@ -18,6 +18,7 @@ #include "usrp2_impl.hpp" #include "usrp2_regs.hpp" +#include "../dsp_utils.hpp" #include <uhd/usrp/subdev_props.hpp> #include <uhd/usrp/dboard_props.hpp> #include <uhd/utils/assert.hpp> @@ -54,42 +55,8 @@ void usrp2_impl::dboard_init(void){ ); //init the subdevs in use (use the first subdevice) - _rx_subdevs_in_use = prop_names_t(1, _dboard_manager->get_rx_subdev_names().at(0)); - update_rx_mux_config(); - - _tx_subdevs_in_use = prop_names_t(1, _dboard_manager->get_tx_subdev_names().at(0)); - update_tx_mux_config(); -} - -void usrp2_impl::update_rx_mux_config(void){ - //calculate the rx mux - boost::uint32_t rx_mux = 0; - UHD_ASSERT_THROW(_rx_subdevs_in_use.size() == 1); - wax::obj rx_subdev = _dboard_manager->get_rx_subdev(_rx_subdevs_in_use.at(0)); - std::cout << "Using: " << rx_subdev[SUBDEV_PROP_NAME].as<std::string>() << std::endl; - if (rx_subdev[SUBDEV_PROP_QUADRATURE].as<bool>()){ - rx_mux = (0x01 << 2) | (0x00 << 0); //Q=ADC1, I=ADC0 - }else{ - rx_mux = 0x00; //ADC0 - } - if (rx_subdev[SUBDEV_PROP_IQ_SWAPPED].as<bool>()){ - rx_mux = (((rx_mux >> 0) & 0x3) << 2) | (((rx_mux >> 2) & 0x3) << 0); - } - - _iface->poke32(U2_REG_DSP_RX_MUX, rx_mux); -} - -void usrp2_impl::update_tx_mux_config(void){ - //calculate the tx mux - boost::uint32_t tx_mux = 0x10; - UHD_ASSERT_THROW(_tx_subdevs_in_use.size() == 1); - wax::obj tx_subdev = _dboard_manager->get_tx_subdev(_tx_subdevs_in_use.at(0)); - std::cout << "Using: " << tx_subdev[SUBDEV_PROP_NAME].as<std::string>() << std::endl; - if (tx_subdev[SUBDEV_PROP_IQ_SWAPPED].as<bool>()){ - tx_mux = (((tx_mux >> 0) & 0xf) << 4) | (((tx_mux >> 4) & 0xf) << 0); - } - - _iface->poke32(U2_REG_DSP_TX_MUX, tx_mux); + rx_dboard_set(DBOARD_PROP_USED_SUBDEVS, prop_names_t(1, _dboard_manager->get_rx_subdev_names().at(0))); + tx_dboard_set(DBOARD_PROP_USED_SUBDEVS, prop_names_t(1, _dboard_manager->get_tx_subdev_names().at(0))); } /*********************************************************************** @@ -131,9 +98,16 @@ void usrp2_impl::rx_dboard_get(const wax::obj &key_, wax::obj &val){ void usrp2_impl::rx_dboard_set(const wax::obj &key, const wax::obj &val){ switch(key.as<dboard_prop_t>()){ - case DBOARD_PROP_USED_SUBDEVS: - _rx_subdevs_in_use = val.as<prop_names_t>(); - update_rx_mux_config(); //if the val is bad, this will throw + case DBOARD_PROP_USED_SUBDEVS:{ + _rx_subdevs_in_use = val.as<prop_names_t>(); + UHD_ASSERT_THROW(_rx_subdevs_in_use.size() == 1); + wax::obj rx_subdev = _dboard_manager->get_rx_subdev(_rx_subdevs_in_use.at(0)); + std::cout << "Using: " << rx_subdev[SUBDEV_PROP_NAME].as<std::string>() << std::endl; + _iface->poke32(U2_REG_DSP_RX_MUX, dsp_type1::calc_rx_mux_word( + rx_subdev[SUBDEV_PROP_QUADRATURE].as<bool>(), + rx_subdev[SUBDEV_PROP_IQ_SWAPPED].as<bool>() + )); + } return; case DBOARD_PROP_DBOARD_ID: @@ -184,9 +158,15 @@ void usrp2_impl::tx_dboard_get(const wax::obj &key_, wax::obj &val){ void usrp2_impl::tx_dboard_set(const wax::obj &key, const wax::obj &val){ switch(key.as<dboard_prop_t>()){ - case DBOARD_PROP_USED_SUBDEVS: - _tx_subdevs_in_use = val.as<prop_names_t>(); - update_tx_mux_config(); //if the val is bad, this will throw + case DBOARD_PROP_USED_SUBDEVS:{ + _tx_subdevs_in_use = val.as<prop_names_t>(); + UHD_ASSERT_THROW(_tx_subdevs_in_use.size() == 1); + wax::obj tx_subdev = _dboard_manager->get_tx_subdev(_tx_subdevs_in_use.at(0)); + std::cout << "Using: " << tx_subdev[SUBDEV_PROP_NAME].as<std::string>() << std::endl; + _iface->poke32(U2_REG_DSP_TX_MUX, dsp_type1::calc_tx_mux_word( + tx_subdev[SUBDEV_PROP_IQ_SWAPPED].as<bool>() + )); + } return; case DBOARD_PROP_DBOARD_ID: diff --git a/host/lib/usrp/usrp2/usrp2_impl.hpp b/host/lib/usrp/usrp2/usrp2_impl.hpp index 77148ee62..ccc09003e 100644 --- a/host/lib/usrp/usrp2/usrp2_impl.hpp +++ b/host/lib/usrp/usrp2/usrp2_impl.hpp @@ -190,8 +190,6 @@ private: wax_obj_proxy::sptr _tx_dboard_proxy; uhd::prop_names_t _tx_subdevs_in_use; uhd::usrp::dboard_eeprom_t _tx_db_eeprom; - void update_rx_mux_config(void); - void update_tx_mux_config(void); //methods and shadows for the ddc dsp std::vector<size_t> _allowed_decim_and_interp_rates; |