diff options
Diffstat (limited to 'host/lib/usrp/cores')
| -rw-r--r-- | host/lib/usrp/cores/rx_dsp_core_200.cpp | 10 | ||||
| -rw-r--r-- | host/lib/usrp/cores/time64_core_200.cpp | 34 | ||||
| -rw-r--r-- | host/lib/usrp/cores/time64_core_200.hpp | 4 | 
3 files changed, 25 insertions, 23 deletions
| diff --git a/host/lib/usrp/cores/rx_dsp_core_200.cpp b/host/lib/usrp/cores/rx_dsp_core_200.cpp index d9ca84e0f..ea0384dbe 100644 --- a/host/lib/usrp/cores/rx_dsp_core_200.cpp +++ b/host/lib/usrp/cores/rx_dsp_core_200.cpp @@ -36,8 +36,8 @@  #define FLAG_DSP_RX_MUX_REAL_MODE (1 << 1)  #define REG_RX_CTRL_STREAM_CMD     _ctrl_base + 0 -#define REG_RX_CTRL_TIME_SECS      _ctrl_base + 4 -#define REG_RX_CTRL_TIME_TICKS     _ctrl_base + 8 +#define REG_RX_CTRL_TIME_HI        _ctrl_base + 4 +#define REG_RX_CTRL_TIME_LO        _ctrl_base + 8  #define REG_RX_CTRL_CLEAR          _ctrl_base + 12  #define REG_RX_CTRL_VRT_HDR        _ctrl_base + 16  #define REG_RX_CTRL_VRT_SID        _ctrl_base + 20 @@ -83,7 +83,6 @@ public:          _iface->poke32(REG_RX_CTRL_VRT_HDR, 0              | (0x1 << 28) //if data with stream id              | (0x1 << 26) //has trailer -            | (0x3 << 22) //integer time other              | (0x1 << 20) //fractional time sample count          );          _iface->poke32(REG_RX_CTRL_VRT_SID, _sid); @@ -122,8 +121,9 @@ public:          //issue the stream command          _iface->poke32(REG_RX_CTRL_STREAM_CMD, cmd_word); -        _iface->poke32(REG_RX_CTRL_TIME_SECS, boost::uint32_t(stream_cmd.time_spec.get_full_secs())); -        _iface->poke32(REG_RX_CTRL_TIME_TICKS, stream_cmd.time_spec.get_tick_count(_tick_rate)); //latches the command +        const boost::uint64_t ticks = stream_cmd.time_spec.to_ticks(_tick_rate); +        _iface->poke32(REG_RX_CTRL_TIME_HI, boost::uint32_t(ticks >> 32)); +        _iface->poke32(REG_RX_CTRL_TIME_LO, boost::uint32_t(ticks >> 0)); //latches the command      }      void set_mux(const std::string &mode, const bool fe_swapped){ diff --git a/host/lib/usrp/cores/time64_core_200.cpp b/host/lib/usrp/cores/time64_core_200.cpp index 23d1bdea2..e460d1106 100644 --- a/host/lib/usrp/cores/time64_core_200.cpp +++ b/host/lib/usrp/cores/time64_core_200.cpp @@ -20,11 +20,10 @@  #include <uhd/utils/assert_has.hpp>  #include <boost/math/special_functions/round.hpp> -#define REG_TIME64_SECS        _base + 0 -#define REG_TIME64_TICKS       _base + 4 +#define REG_TIME64_TICKS_HI    _base + 0 +#define REG_TIME64_TICKS_LO    _base + 4  #define REG_TIME64_FLAGS       _base + 8  #define REG_TIME64_IMM         _base + 12 -#define REG_TIME64_TPS         _base + 16  #define REG_TIME64_MIMO_SYNC   _base + 20 //lower byte is delay cycles  //pps flags (see above) @@ -59,39 +58,42 @@ public:      void set_tick_rate(const double rate){          _tick_rate = rate; -        _iface->poke32(REG_TIME64_TPS, boost::math::iround(rate));      }      uhd::time_spec_t get_time_now(void){          for (size_t i = 0; i < 3; i++){ //special algorithm because we cant read 64 bits synchronously -            const boost::uint32_t secs = _iface->peek32(_readback_bases.rb_secs_now); -            const boost::uint32_t ticks = _iface->peek32(_readback_bases.rb_ticks_now); -            if (secs != _iface->peek32(_readback_bases.rb_secs_now)) continue; -            return time_spec_t(secs, ticks, _tick_rate); +            const boost::uint32_t ticks_hi = _iface->peek32(_readback_bases.rb_hi_now); +            const boost::uint32_t ticks_lo = _iface->peek32(_readback_bases.rb_lo_now); +            if (ticks_hi != _iface->peek32(_readback_bases.rb_hi_now)) continue; +            const boost::uint64_t ticks = (boost::uint64_t(ticks_hi) << 32) | ticks_lo; +            return time_spec_t::from_ticks(ticks, _tick_rate);          }          throw uhd::runtime_error("time64_core_200: get time now timeout");      }      uhd::time_spec_t get_time_last_pps(void){          for (size_t i = 0; i < 3; i++){ //special algorithm because we cant read 64 bits synchronously -            const boost::uint32_t secs = _iface->peek32(_readback_bases.rb_secs_pps); -            const boost::uint32_t ticks = _iface->peek32(_readback_bases.rb_ticks_pps); -            if (secs != _iface->peek32(_readback_bases.rb_secs_pps)) continue; -            return time_spec_t(secs, ticks, _tick_rate); +            const boost::uint32_t ticks_hi = _iface->peek32(_readback_bases.rb_hi_pps); +            const boost::uint32_t ticks_lo = _iface->peek32(_readback_bases.rb_lo_pps); +            if (ticks_hi != _iface->peek32(_readback_bases.rb_hi_pps)) continue; +            const boost::uint64_t ticks = (boost::uint64_t(ticks_hi) << 32) | ticks_lo; +            return time_spec_t::from_ticks(ticks, _tick_rate);          }          throw uhd::runtime_error("time64_core_200: get time last pps timeout");      }      void set_time_now(const uhd::time_spec_t &time){ -        _iface->poke32(REG_TIME64_TICKS, time.get_tick_count(_tick_rate)); +        const boost::uint64_t ticks = time.to_ticks(_tick_rate); +        _iface->poke32(REG_TIME64_TICKS_LO, boost::uint32_t(ticks >> 0));          _iface->poke32(REG_TIME64_IMM, FLAG_TIME64_LATCH_NOW); -        _iface->poke32(REG_TIME64_SECS, boost::uint32_t(time.get_full_secs())); //latches all 3 +        _iface->poke32(REG_TIME64_TICKS_HI, boost::uint32_t(ticks >> 32)); //latches all 3      }      void set_time_next_pps(const uhd::time_spec_t &time){ -        _iface->poke32(REG_TIME64_TICKS, time.get_tick_count(_tick_rate)); +        const boost::uint64_t ticks = time.to_ticks(_tick_rate); +        _iface->poke32(REG_TIME64_TICKS_LO, boost::uint32_t(ticks >> 0));          _iface->poke32(REG_TIME64_IMM, FLAG_TIME64_LATCH_NEXT_PPS); -        _iface->poke32(REG_TIME64_SECS, boost::uint32_t(time.get_full_secs())); //latches all 3 +        _iface->poke32(REG_TIME64_TICKS_HI, boost::uint32_t(ticks >> 32)); //latches all 3      }      void set_time_source(const std::string &source){ diff --git a/host/lib/usrp/cores/time64_core_200.hpp b/host/lib/usrp/cores/time64_core_200.hpp index ebd51a02f..7571573a5 100644 --- a/host/lib/usrp/cores/time64_core_200.hpp +++ b/host/lib/usrp/cores/time64_core_200.hpp @@ -31,8 +31,8 @@ public:      typedef boost::shared_ptr<time64_core_200> sptr;      struct readback_bases_type{ -        size_t rb_secs_now, rb_ticks_now; -        size_t rb_secs_pps, rb_ticks_pps; +        size_t rb_hi_now, rb_lo_now; +        size_t rb_hi_pps, rb_lo_pps;      };      //! makes a new time64 core from iface and slave base | 
