umtrx: fix, dsp rate is half of the vita rate

This commit is contained in:
Josh Blum
2014-06-23 12:25:54 -04:00
parent 2c59bd936c
commit 149713fe48
4 changed files with 18 additions and 4 deletions

View File

@@ -63,6 +63,7 @@ public:
{
// previously uninitialized - assuming zero for all
_tick_rate = _link_rate = _host_extra_scaling = _fxpt_scalar_correction = 0.0;
_vita_rate = _tick_rate;
//init to something so update method has reasonable defaults
_scaling_adjustment = 1.0;
@@ -132,7 +133,7 @@ public:
//issue the stream command
_iface->poke32(REG_RX_CTRL_STREAM_CMD, cmd_word);
const boost::uint64_t ticks = (stream_cmd.stream_now)? 0 : stream_cmd.time_spec.to_ticks(_tick_rate);
const boost::uint64_t ticks = (stream_cmd.stream_now)? 0 : stream_cmd.time_spec.to_ticks(_vita_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
}
@@ -151,6 +152,10 @@ public:
_tick_rate = rate;
}
void set_vita_rate(const double rate){
_vita_rate = rate;
}
void set_link_rate(const double rate){
//_link_rate = rate/sizeof(boost::uint32_t); //in samps/s
_link_rate = rate/sizeof(boost::uint16_t); //in samps/s (allows for 8sc)
@@ -272,7 +277,7 @@ public:
private:
wb_iface::sptr _iface;
const size_t _dsp_base, _ctrl_base;
double _tick_rate, _link_rate;
double _tick_rate, _vita_rate, _link_rate;
bool _continuous_streaming;
double _scaling_adjustment, _dsp_extra_scaling, _host_extra_scaling, _fxpt_scalar_correction;
const boost::uint32_t _sid;

View File

@@ -47,6 +47,8 @@ public:
virtual void set_tick_rate(const double rate) = 0;
virtual void set_vita_rate(const double rate) = 0;
virtual void set_link_rate(const double rate) = 0;
virtual double set_host_rate(const double rate) = 0;

View File

@@ -186,6 +186,8 @@ umtrx_impl::umtrx_impl(const device_addr_t &device_addr)
_tree->access<double>(mb_path / "tick_rate")
.publish(boost::bind(&umtrx_impl::get_master_clock_rate, this))
.subscribe(boost::bind(&umtrx_impl::update_tick_rate, this, _1));
_tree->access<double>(mb_path / "dsp_rate")
.publish(boost::bind(&umtrx_impl::get_master_dsp_rate, this));
////////////////////////////////////////////////////////////////
// reset LMS chips
@@ -262,8 +264,10 @@ umtrx_impl::umtrx_impl(const device_addr_t &device_addr)
for (size_t dspno = 0; dspno < _rx_dsps.size(); dspno++){
_rx_dsps[dspno]->set_link_rate(UMTRX_LINK_RATE_BPS);
_tree->access<double>(mb_path / "tick_rate")
_tree->access<double>(mb_path / "dsp_rate")
.subscribe(boost::bind(&rx_dsp_core_200::set_tick_rate, _rx_dsps[dspno], _1));
_tree->access<double>(mb_path / "vita_rate")
.subscribe(boost::bind(&rx_dsp_core_200::set_vita_rate, _rx_dsps[dspno], _1));
fs_path rx_dsp_path = mb_path / str(boost::format("rx_dsps/%u") % dspno);
_tree->create<meta_range_t>(rx_dsp_path / "rate/range")
.publish(boost::bind(&rx_dsp_core_200::get_host_rates, _rx_dsps[dspno]));
@@ -288,7 +292,7 @@ umtrx_impl::umtrx_impl(const device_addr_t &device_addr)
for (size_t dspno = 0; dspno < _tx_dsps.size(); dspno++){
_tx_dsps[dspno]->set_link_rate(UMTRX_LINK_RATE_BPS);
_tree->access<double>(mb_path / "tick_rate")
_tree->access<double>(mb_path / "dsp_rate")
.subscribe(boost::bind(&tx_dsp_core_200::set_tick_rate, _tx_dsps[dspno], _1));
fs_path tx_dsp_path = mb_path / str(boost::format("tx_dsps/%u") % dspno);
_tree->create<meta_range_t>(tx_dsp_path / "rate/range")
@@ -480,6 +484,8 @@ umtrx_impl::umtrx_impl(const device_addr_t &device_addr)
////////////////////////////////////////////////////////////////////
_tree->access<double>(mb_path / "tick_rate")
.set(this->get_master_clock_rate());
_tree->access<double>(mb_path / "dsp_rate")
.set(this->get_master_dsp_rate());
this->time64_self_test();
_rx_streamers.resize(_rx_dsps.size());
_tx_streamers.resize(_tx_dsps.size());

View File

@@ -118,6 +118,7 @@ private:
//helper routines
void set_mb_eeprom(const uhd::i2c_iface::sptr &, const uhd::usrp::mboard_eeprom_t &);
double get_master_clock_rate(void) const { return 26e6; }
double get_master_dsp_rate(void) const { return get_master_clock_rate()/2; }
void update_tick_rate(const double rate);
void update_rx_subdev_spec(const uhd::usrp::subdev_spec_t &);
void update_tx_subdev_spec(const uhd::usrp::subdev_spec_t &);