aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/usrp')
-rw-r--r--host/lib/usrp/dboard_manager.cpp28
-rw-r--r--host/lib/usrp/usrp2/dboard_interface.cpp30
2 files changed, 43 insertions, 15 deletions
diff --git a/host/lib/usrp/dboard_manager.cpp b/host/lib/usrp/dboard_manager.cpp
index f8ff38c39..5e62b5564 100644
--- a/host/lib/usrp/dboard_manager.cpp
+++ b/host/lib/usrp/dboard_manager.cpp
@@ -25,6 +25,7 @@
#include <boost/format.hpp>
#include <boost/bind.hpp>
#include <boost/foreach.hpp>
+#include <boost/assign/list_of.hpp>
using namespace uhd;
using namespace uhd::usrp;
@@ -141,7 +142,7 @@ private:
uhd::dict<std::string, subdev_proxy::sptr> _rx_dboards;
uhd::dict<std::string, subdev_proxy::sptr> _tx_dboards;
dboard_interface::sptr _interface;
- void set_nice_gpio_pins(void);
+ void set_nice_dboard_if(void);
};
/***********************************************************************
@@ -200,7 +201,7 @@ dboard_manager_impl::dboard_manager_impl(
boost::tie(tx_dboard_ctor, tx_name, tx_subdevs) = get_dboard_args(tx_dboard_id, "tx");
//initialize the gpio pins before creating subdevs
- set_nice_gpio_pins();
+ set_nice_dboard_if();
//make xcvr subdevs (make one subdev for both rx and tx dboards)
if (rx_dboard_ctor == tx_dboard_ctor){
@@ -246,7 +247,7 @@ dboard_manager_impl::dboard_manager_impl(
}
dboard_manager_impl::~dboard_manager_impl(void){
- set_nice_gpio_pins();
+ set_nice_dboard_if();
}
prop_names_t dboard_manager_impl::get_rx_subdev_names(void){
@@ -273,12 +274,17 @@ wax::obj dboard_manager_impl::get_tx_subdev(const std::string &subdev_name){
return _tx_dboards[subdev_name]->get_link();
}
-void dboard_manager_impl::set_nice_gpio_pins(void){
- //std::cout << "Set nice GPIO pins" << std::endl;
-
- _interface->set_gpio_ddr(dboard_interface::UNIT_RX, 0x0000); //all inputs
- _interface->set_atr_reg(dboard_interface::UNIT_RX, dboard_interface::ATR_REG_IDLE, 0x0000); //all low
-
- _interface->set_gpio_ddr(dboard_interface::UNIT_TX, 0x0000); //all inputs
- _interface->set_atr_reg(dboard_interface::UNIT_TX, dboard_interface::ATR_REG_IDLE, 0x0000); //all low
+void dboard_manager_impl::set_nice_dboard_if(void){
+ //make a list of possible unit types
+ std::vector<dboard_interface::unit_t> units = boost::assign::list_of
+ (dboard_interface::UNIT_RX)
+ (dboard_interface::UNIT_TX)
+ ;
+
+ //set nice settings on each unit
+ BOOST_FOREACH(dboard_interface::unit_t unit, units){
+ _interface->set_gpio_ddr(unit, 0x0000); //all inputs
+ _interface->set_atr_reg(unit, dboard_interface::ATR_REG_IDLE, 0x0000); //all low
+ _interface->set_clock_enabled(unit, false); //clock off
+ }
}
diff --git a/host/lib/usrp/usrp2/dboard_interface.cpp b/host/lib/usrp/usrp2/dboard_interface.cpp
index db8679b9b..8a3df08cb 100644
--- a/host/lib/usrp/usrp2/dboard_interface.cpp
+++ b/host/lib/usrp/usrp2/dboard_interface.cpp
@@ -17,6 +17,7 @@
#include "usrp2_impl.hpp"
#include "usrp2_regs.hpp"
+#include "ad9510_regs.hpp"
#include <uhd/types/dict.hpp>
#include <uhd/utils/assert.hpp>
#include <boost/assign/list_of.hpp>
@@ -60,6 +61,8 @@ public:
private:
usrp2_impl *_impl;
boost::uint32_t _ddr_shadow;
+ ad9510_regs_t _ad9510_regs;
+ uhd::dict<unit_t, bool> _clock_enb_shadow;
};
/***********************************************************************
@@ -96,12 +99,31 @@ double usrp2_dboard_interface::get_clock_rate(unit_t){
return _impl->get_master_clock_freq();
}
-void usrp2_dboard_interface::set_clock_enabled(unit_t, bool){
- //TODO
+void usrp2_dboard_interface::set_clock_enabled(unit_t unit, bool enb){
+ uint16_t data = 0;
+ switch(unit){
+ case UNIT_RX:
+ _ad9510_regs.power_down_lvds_cmos_out7 = enb? 0 : 1;
+ _ad9510_regs.lvds_cmos_select_out7 = ad9510_regs_t::LVDS_CMOS_SELECT_OUT7_CMOS;
+ _ad9510_regs.output_level_lvds_out7 = ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT7_1_75MA;
+ data = _ad9510_regs.get_write_reg(0x43);
+ break;
+ case UNIT_TX:
+ _ad9510_regs.power_down_lvds_cmos_out6 = enb? 0 : 1;
+ _ad9510_regs.lvds_cmos_select_out6 = ad9510_regs_t::LVDS_CMOS_SELECT_OUT6_CMOS;
+ _ad9510_regs.output_level_lvds_out6 = ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT6_1_75MA;
+ data = _ad9510_regs.get_write_reg(0x42);
+ break;
+ }
+ _impl->transact_spi(SPI_SS_AD9510, spi_config_t::EDGE_RISE, data, 24, false /*no rb*/);
+
+ _ad9510_regs.update_registers = 1;
+ _impl->transact_spi(SPI_SS_AD9510, spi_config_t::EDGE_RISE, _ad9510_regs.get_write_reg(0x5a), 24, false /*no rb*/);
+ _clock_enb_shadow[unit] = unit;
}
-bool usrp2_dboard_interface::get_clock_enabled(unit_t){
- return false; //TODO
+bool usrp2_dboard_interface::get_clock_enabled(unit_t unit){
+ return _clock_enb_shadow[unit];
}
/***********************************************************************