aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/usrp')
-rw-r--r--host/lib/usrp/usrp2/clock_ctrl.cpp27
-rw-r--r--host/lib/usrp/usrp2/clock_ctrl.hpp4
-rw-r--r--host/lib/usrp/usrp2/mboard_impl.cpp19
3 files changed, 37 insertions, 13 deletions
diff --git a/host/lib/usrp/usrp2/clock_ctrl.cpp b/host/lib/usrp/usrp2/clock_ctrl.cpp
index 73331e594..27ccefb2b 100644
--- a/host/lib/usrp/usrp2/clock_ctrl.cpp
+++ b/host/lib/usrp/usrp2/clock_ctrl.cpp
@@ -22,10 +22,13 @@
#include <uhd/utils/assert.hpp>
#include <boost/cstdint.hpp>
#include <boost/lexical_cast.hpp>
+#include <boost/math/special_functions/round.hpp>
#include <iostream>
using namespace uhd;
+static const bool enb_test_clk = false;
+
/*!
* A usrp2 clock control specific to the ad9510 ic.
*/
@@ -71,6 +74,7 @@ public:
/* private clock enables, must be set here */
this->enable_dac_clock(true);
this->enable_adc_clock(true);
+ this->enable_test_clock(enb_test_clk);
}
~usrp2_clock_ctrl_impl(void){
@@ -81,6 +85,7 @@ public:
this->enable_dac_clock(false);
this->enable_adc_clock(false);
this->enable_mimo_clock_out(false);
+ this->enable_test_clock(false);
}
void enable_mimo_clock_out(bool enb){
@@ -245,22 +250,24 @@ public:
return 100e6;
}
- void set_mimo_clock_delay(boost::uint8_t delay) {
- //delay is a 5-bit value (0-31) for fine control
+ void set_mimo_clock_delay(double delay) {
+ //delay_val is a 5-bit value (0-31) for fine control
//the equations below determine delay for a given ramp current, # of caps and fine delay register
//delay range:
//range_ns = 200*((caps+3)/i_ramp_ua)*1.3286
//offset (zero delay):
//offset_ns = 0.34 + (1600 - i_ramp_ua)*1e-4 + ((caps-1)/ramp)*6
//delay_ns = offset_ns + range_ns * delay / 31
-
- if(delay == 0) {
+
+ int delay_val = boost::math::iround(delay/9.744e-9*31);
+
+ if(delay_val == 0) {
switch(clk_regs.exp) {
case 5:
- _ad9510_regs.delay_control_out5 = 0;
+ _ad9510_regs.delay_control_out5 = 1;
break;
case 6:
- _ad9510_regs.delay_control_out6 = 0;
+ _ad9510_regs.delay_control_out6 = 1;
break;
default:
break; //delay not supported on U2 rev 3
@@ -268,19 +275,19 @@ public:
} else {
switch(clk_regs.exp) {
case 5:
- _ad9510_regs.delay_control_out5 = 1;
+ _ad9510_regs.delay_control_out5 = 0;
_ad9510_regs.ramp_current_out5 = ad9510_regs_t::RAMP_CURRENT_OUT5_200UA;
_ad9510_regs.ramp_capacitor_out5 = ad9510_regs_t::RAMP_CAPACITOR_OUT5_4CAPS;
- _ad9510_regs.delay_fine_adjust_out5 = delay;
+ _ad9510_regs.delay_fine_adjust_out5 = delay_val;
this->write_reg(0x34);
this->write_reg(0x35);
this->write_reg(0x36);
break;
case 6:
- _ad9510_regs.delay_control_out6 = 1;
+ _ad9510_regs.delay_control_out6 = 0;
_ad9510_regs.ramp_current_out6 = ad9510_regs_t::RAMP_CURRENT_OUT6_200UA;
_ad9510_regs.ramp_capacitor_out6 = ad9510_regs_t::RAMP_CAPACITOR_OUT6_4CAPS;
- _ad9510_regs.delay_fine_adjust_out6 = delay;
+ _ad9510_regs.delay_fine_adjust_out6 = delay_val;
this->write_reg(0x38);
this->write_reg(0x39);
this->write_reg(0x3A);
diff --git a/host/lib/usrp/usrp2/clock_ctrl.hpp b/host/lib/usrp/usrp2/clock_ctrl.hpp
index 2ec347cac..9ccbc959e 100644
--- a/host/lib/usrp/usrp2/clock_ctrl.hpp
+++ b/host/lib/usrp/usrp2/clock_ctrl.hpp
@@ -100,9 +100,9 @@ public:
* Set the output delay of the mimo clock
* Used to synchronise daisy-chained USRPs over the MIMO cable
* Can also be used to adjust delay for uneven reference cable lengths
- * \param delay in an arbitrary scaling
+ * \param delay the clock delay in seconds
*/
- virtual void set_mimo_clock_delay(boost::uint8_t delay) = 0;
+ virtual void set_mimo_clock_delay(double delay) = 0;
};
diff --git a/host/lib/usrp/usrp2/mboard_impl.cpp b/host/lib/usrp/usrp2/mboard_impl.cpp
index 20404635a..29867cf9d 100644
--- a/host/lib/usrp/usrp2/mboard_impl.cpp
+++ b/host/lib/usrp/usrp2/mboard_impl.cpp
@@ -198,7 +198,24 @@ void usrp2_mboard_impl::update_clock_config(void){
// - Slaves lock their time over the serdes.
const bool master_mode = bool(_iface->peek32(_iface->regs.status) & (1 << 8));
_clock_ctrl->enable_mimo_clock_out(master_mode);
- if (not master_mode) _iface->poke32(_iface->regs.misc_ctrl_clock, 0x15);
+ if (master_mode){
+ switch(_iface->get_rev()){
+ case usrp2_iface::USRP_N200:
+ case usrp2_iface::USRP_N210:
+ _clock_ctrl->set_mimo_clock_delay(0/*TODO*/);
+ break;
+
+ case usrp2_iface::USRP2_REV4:
+ _clock_ctrl->set_mimo_clock_delay(3.08e-9);
+ break;
+
+ default: break; //not handled
+ }
+ }
+ else{
+ _iface->poke32(_iface->regs.misc_ctrl_clock, 0x15);
+ _clock_ctrl->enable_external_ref(true);
+ }
//TODO slaves lock time over the serdes...
}