aboutsummaryrefslogtreecommitdiffstats
path: root/host
diff options
context:
space:
mode:
Diffstat (limited to 'host')
-rw-r--r--host/lib/usrp/common/ad9361_driver/ad9361_device.cpp26
1 files changed, 23 insertions, 3 deletions
diff --git a/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp b/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp
index 5574022b6..6d687f80e 100644
--- a/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp
+++ b/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp
@@ -1242,7 +1242,11 @@ double ad9361_device_t::_tune_bbvco(const double rate)
* (double)modulus);
UHD_LOG_TRACE("AD936X",
boost::format("[ad9361_device_t::_tune_bbvco] nint=%d nfrac=%d") % nint % nfrac);
- double actual_vcorate = fref * ((double)nint + ((double)nfrac / (double)modulus));
+ const double actual_vcorate =
+ fref * ((double)nint + ((double)nfrac / (double)modulus));
+ UHD_LOG_TRACE("AD936X",
+ boost::format("[ad9361_device_t::_tune_bbvco] actual vcorate=%.10f")
+ % actual_vcorate);
/* Scale CP current according to VCO rate */
const double icp_baseline = 150e-6;
@@ -1507,8 +1511,14 @@ double ad9361_device_t::_setup_rates(const double rate)
const double adcclk = _tune_bbvco(rate * divfactor);
double dacclk = adcclk;
- /* The DAC clock must be <= 336e6, and is either the ADC clock or 1/2 the
- * ADC clock.*/
+ // We keep the DAC clock <= 336 MHz, either the ADC clock or 1/2 the ADC
+ // clock.
+ // Note that current recommendations from ADI are 640 MHz for the ADC and
+ // 320 MHz for the DAC. We are thus overclocking the AD9361, since we are
+ // using these no longer valid recommendations, but they seem to work and we
+ // consider the risk of changing these higher than the benefit. We will add
+ // a log statement, though, so we can track back suboptimal RF performance
+ // to overclocked settings.
if (adcclk > 336e6) {
/* Make the DAC clock = ADC/2 */
_regs.bbpll = _regs.bbpll | 0x08;
@@ -1516,6 +1526,16 @@ double ad9361_device_t::_setup_rates(const double rate)
} else {
_regs.bbpll = _regs.bbpll & 0xF7;
}
+ if (dacclk > 320e6) {
+ UHD_LOG_DEBUG("AD936X",
+ "[ad9361_device_t::_setup_rates] DAC rate is overclocked! dacclk="
+ << (dacclk / 1e6) << " MHz.");
+ }
+ if (dacclk > 640e6) {
+ UHD_LOG_DEBUG("AD936X",
+ "[ad9361_device_t::_setup_rates] ADC rate is overclocked! adcclk="
+ << (adcclk / 1e6) << " MHz.");
+ }
/* Set the dividers / interpolators in AD9361. */
_io_iface->poke8(0x002, _regs.txfilt);