summaryrefslogtreecommitdiffstats
path: root/host/lib
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2012-05-18 11:50:32 -0700
committerJosh Blum <josh@joshknows.com>2012-05-18 11:50:32 -0700
commita5ffda85bc0c0606caa20a43a0b3d317ea778233 (patch)
tree7ab29781815c5589246ea0c7723b90c9e70c03bf /host/lib
parent3804361215babcebb2a814cf29a315c5f5f3fd2f (diff)
downloaduhd-a5ffda85bc0c0606caa20a43a0b3d317ea778233.tar.gz
uhd-a5ffda85bc0c0606caa20a43a0b3d317ea778233.tar.bz2
uhd-a5ffda85bc0c0606caa20a43a0b3d317ea778233.zip
gpsdo: added "gpsdo" clock and time source options
When an on-board GPSDO is detected, "gpsdo" is added to the options.
Diffstat (limited to 'host/lib')
-rw-r--r--host/lib/usrp/cores/time64_core_200.cpp6
-rw-r--r--host/lib/usrp/cores/time64_core_200.hpp4
-rw-r--r--host/lib/usrp/e100/e100_impl.cpp11
-rw-r--r--host/lib/usrp/usrp2/usrp2_impl.cpp11
4 files changed, 22 insertions, 10 deletions
diff --git a/host/lib/usrp/cores/time64_core_200.cpp b/host/lib/usrp/cores/time64_core_200.cpp
index e460d1106..11b310362 100644
--- a/host/lib/usrp/cores/time64_core_200.cpp
+++ b/host/lib/usrp/cores/time64_core_200.cpp
@@ -56,6 +56,10 @@ public:
if (_mimo_delay_cycles != 0) _sources.push_back("mimo");
}
+ void enable_gpsdo(void){
+ _sources.push_back("gpsdo");
+ }
+
void set_tick_rate(const double rate){
_tick_rate = rate;
}
@@ -100,7 +104,7 @@ public:
assert_has(_sources, source, "time source");
//setup pps flags
- if (source == "external"){
+ if (source == "external" or source == "gpsdo"){
_iface->poke32(REG_TIME64_FLAGS, FLAG_TIME64_PPS_SMA | FLAG_TIME64_PPS_POSEDGE);
}
else if (source == "_external_"){
diff --git a/host/lib/usrp/cores/time64_core_200.hpp b/host/lib/usrp/cores/time64_core_200.hpp
index 7571573a5..315f2ba67 100644
--- a/host/lib/usrp/cores/time64_core_200.hpp
+++ b/host/lib/usrp/cores/time64_core_200.hpp
@@ -1,5 +1,5 @@
//
-// Copyright 2011 Ettus Research LLC
+// Copyright 2011-2012 Ettus Research LLC
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -42,6 +42,8 @@ public:
const size_t mimo_delay_cycles = 0 // 0 means no-mimo
);
+ virtual void enable_gpsdo(void) = 0;
+
virtual void set_tick_rate(const double rate) = 0;
virtual uhd::time_spec_t get_time_now(void) = 0;
diff --git a/host/lib/usrp/e100/e100_impl.cpp b/host/lib/usrp/e100/e100_impl.cpp
index c9a7eb30e..d55ea5ec5 100644
--- a/host/lib/usrp/e100/e100_impl.cpp
+++ b/host/lib/usrp/e100/e100_impl.cpp
@@ -350,7 +350,8 @@ e100_impl::e100_impl(const uhd::device_addr_t &device_addr){
//setup reference source props
_tree->create<std::string>(mb_path / "clock_source/value")
.subscribe(boost::bind(&e100_impl::update_clock_source, this, _1));
- static const std::vector<std::string> clock_sources = boost::assign::list_of("internal")("external")("auto");
+ std::vector<std::string> clock_sources = boost::assign::list_of("internal")("external")("auto");
+ if (_gps and _gps->gps_detected()) clock_sources.push_back("gpsdo");
_tree->create<std::vector<std::string> >(mb_path / "clock_source/options").set(clock_sources);
////////////////////////////////////////////////////////////////////
@@ -426,10 +427,11 @@ e100_impl::e100_impl(const uhd::device_addr_t &device_addr){
_tree->access<std::string>(mb_path / "time_source/value").set("none");
//GPS installed: use external ref, time, and init time spec
- if (_gps.get() != NULL and _gps->gps_detected()){
+ if (_gps and _gps->gps_detected()){
+ _time64->enable_gpsdo();
UHD_MSG(status) << "Setting references to the internal GPSDO" << std::endl;
- _tree->access<std::string>(mb_path / "time_source/value").set("external");
- _tree->access<std::string>(mb_path / "clock_source/value").set("external");
+ _tree->access<std::string>(mb_path / "time_source/value").set("gpsdo");
+ _tree->access<std::string>(mb_path / "clock_source/value").set("gpsdo");
UHD_MSG(status) << "Initializing time to the internal GPSDO" << std::endl;
_time64->set_time_next_pps(time_spec_t(time_t(_gps->get_sensor("gps_time").to_int()+1)));
}
@@ -462,6 +464,7 @@ void e100_impl::update_clock_source(const std::string &source){
if (source == "auto") _clock_ctrl->use_auto_ref();
else if (source == "internal") _clock_ctrl->use_internal_ref();
else if (source == "external") _clock_ctrl->use_external_ref();
+ else if (source == "gpsdo") _clock_ctrl->use_external_ref();
else throw uhd::runtime_error("unhandled clock configuration reference source: " + source);
}
diff --git a/host/lib/usrp/usrp2/usrp2_impl.cpp b/host/lib/usrp/usrp2/usrp2_impl.cpp
index 604f2f832..3214975d1 100644
--- a/host/lib/usrp/usrp2/usrp2_impl.cpp
+++ b/host/lib/usrp/usrp2/usrp2_impl.cpp
@@ -604,7 +604,8 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr){
//setup reference source props
_tree->create<std::string>(mb_path / "clock_source/value")
.subscribe(boost::bind(&usrp2_impl::update_clock_source, this, mb, _1));
- static const std::vector<std::string> clock_sources = boost::assign::list_of("internal")("external")("mimo");
+ std::vector<std::string> clock_sources = boost::assign::list_of("internal")("external")("mimo");
+ if (_mbc[mb].gps and _mbc[mb].gps->gps_detected()) clock_sources.push_back("gpsdo");
_tree->create<std::vector<std::string> >(mb_path / "clock_source/options").set(clock_sources);
//plug timed commands into tree here
switch(_mbc[mb].iface->get_rev()){
@@ -690,10 +691,11 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr){
_tree->access<std::string>(root / "time_source/value").set("none");
//GPS installed: use external ref, time, and init time spec
- if (_mbc[mb].gps.get() and _mbc[mb].gps->gps_detected()){
+ if (_mbc[mb].gps and _mbc[mb].gps->gps_detected()){
+ _mbc[mb].time64->enable_gpsdo();
UHD_MSG(status) << "Setting references to the internal GPSDO" << std::endl;
- _tree->access<std::string>(root / "time_source/value").set("external");
- _tree->access<std::string>(root / "clock_source/value").set("external");
+ _tree->access<std::string>(root / "time_source/value").set("gpsdo");
+ _tree->access<std::string>(root / "clock_source/value").set("gpsdo");
UHD_MSG(status) << "Initializing time to the internal GPSDO" << std::endl;
_mbc[mb].time64->set_time_next_pps(time_spec_t(time_t(_mbc[mb].gps->get_sensor("gps_time").to_int()+1)));
}
@@ -771,6 +773,7 @@ void usrp2_impl::update_clock_source(const std::string &mb, const std::string &s
case usrp2_iface::USRP_N210_R4:
if (source == "internal") _mbc[mb].iface->poke32(U2_REG_MISC_CTRL_CLOCK, 0x12);
else if (source == "external") _mbc[mb].iface->poke32(U2_REG_MISC_CTRL_CLOCK, 0x1C);
+ else if (source == "gpsdo") _mbc[mb].iface->poke32(U2_REG_MISC_CTRL_CLOCK, 0x1C);
else if (source == "mimo") _mbc[mb].iface->poke32(U2_REG_MISC_CTRL_CLOCK, 0x15);
else throw uhd::value_error("unhandled clock configuration reference source: " + source);
_mbc[mb].clock->enable_external_ref(true); //USRP2P has an internal 10MHz TCXO