diff options
| author | Josh Blum <josh@joshknows.com> | 2011-02-21 15:56:48 -0800 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2011-02-21 15:56:48 -0800 | 
| commit | 3261b89eeb96a6b87bc35c86be3faf78aee569b0 (patch) | |
| tree | dbabe821c0dd67e04e78de1dff1a0cee7a059e11 | |
| parent | 436387677320e371bb9a2efa6b0c2ec97027bc05 (diff) | |
| download | uhd-3261b89eeb96a6b87bc35c86be3faf78aee569b0.tar.gz uhd-3261b89eeb96a6b87bc35c86be3faf78aee569b0.tar.bz2 uhd-3261b89eeb96a6b87bc35c86be3faf78aee569b0.zip | |
usrp2: 2nd dsp working, tweaks regs map and other bugs
| -rw-r--r-- | host/lib/usrp/usrp2/io_impl.cpp | 34 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/mboard_impl.cpp | 2 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/usrp2_impl.hpp | 1 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/usrp2_regs.cpp | 4 | 
4 files changed, 23 insertions, 18 deletions
| diff --git a/host/lib/usrp/usrp2/io_impl.cpp b/host/lib/usrp/usrp2/io_impl.cpp index e931778fa..e59ee2d24 100644 --- a/host/lib/usrp/usrp2/io_impl.cpp +++ b/host/lib/usrp/usrp2/io_impl.cpp @@ -130,16 +130,17 @@ struct usrp2_impl::io_impl{          for (size_t i = 0; i < num_monitors; i++){              fc_mons.push_back(flow_control_monitor::sptr(new flow_control_monitor(                  usrp2_impl::sram_bytes/dsp_xports.front()->get_send_frame_size() -            ))); -            //init empty packet infos -            vrt::if_packet_info_t packet_info; -            packet_info.packet_count = 0xf; -            packet_info.has_tsi = true; -            packet_info.tsi = 0; -            packet_info.has_tsf = true; -            packet_info.tsf = 0; -            prev_infos.push_back(packet_info); +            )));;          } + +        //init empty packet infos +        vrt::if_packet_info_t packet_info = vrt::if_packet_info_t(); +        packet_info.packet_count = 0xf; +        packet_info.has_tsi = true; +        packet_info.tsi = 0; +        packet_info.has_tsf = true; +        packet_info.tsf = 0; +        prev_infos.resize(dsp_xports.size(), packet_info);      }      ~io_impl(void){ @@ -413,10 +414,11 @@ UHD_INLINE bool usrp2_impl::io_impl::get_recv_buffs(          if (buffs[0].get() == NULL) return false;          bool clear, msg; time_spec_t time; //unused variables          //call extract_packet_info to handle printing the overflows -        extract_packet_info(buffs[0], this->prev_infos[0], time, clear, msg); +        extract_packet_info(buffs[0], this->prev_infos[recv_map[0]], time, clear, msg);          return true;      }      //-------------------- begin alignment logic ---------------------// +    UHD_ASSERT_THROW(recv_map.size() == buffs.size());      boost::system_time exit_time = boost::get_system_time() + to_time_dur(recv_timeout);      managed_recv_buffer::sptr buff_tmp;      alignment_indexes indexes_to_do; @@ -432,7 +434,7 @@ UHD_INLINE bool usrp2_impl::io_impl::get_recv_buffs(      size_t index = indexes_to_do.front();      buff_tmp = dsp_xports[recv_map[index]]->get_recv_buff(from_time_dur(exit_time - boost::get_system_time()));      if (buff_tmp.get() == NULL) return false; -    extract_packet_info(buff_tmp, this->prev_infos[index], expected_time, clear, msg); +    extract_packet_info(buff_tmp, this->prev_infos[recv_map[index]], expected_time, clear, msg);      if (clear) goto got_clear;      buffs[index] = buff_tmp;      if (msg) return handle_msg_packet(buffs, index); @@ -446,7 +448,7 @@ UHD_INLINE bool usrp2_impl::io_impl::get_recv_buffs(          buff_tmp = dsp_xports[recv_map[index]]->get_recv_buff(from_time_dur(exit_time - boost::get_system_time()));          if (buff_tmp.get() == NULL) return false;          time_spec_t this_time; -        extract_packet_info(buff_tmp, this->prev_infos[index], this_time, clear, msg); +        extract_packet_info(buff_tmp, this->prev_infos[recv_map[index]], this_time, clear, msg);          if (clear) goto got_clear;          buffs[index] = buff_tmp;          if (msg) return handle_msg_packet(buffs, index); @@ -488,10 +490,10 @@ size_t usrp2_impl::get_max_recv_samps_per_packet(void) const{      return bpp/_rx_otw_type.get_sample_size();  } -static void handle_overflow(std::vector<usrp2_mboard_impl::sptr> &mboards, size_t chan){ +void usrp2_impl::handle_overflow(size_t chan){      std::cerr << "O" << std::flush; -    //TODO this is wrong way to determine the index... -    mboards.at(chan/mboards.size())->handle_overflow(chan%mboards.size()); +    div_t indexes = div(chan, usrp2_mboard_impl::NUM_RX_DSPS); +    _mboards.at(indexes.quot)->handle_overflow(indexes.rem);  }  size_t usrp2_impl::recv( @@ -508,6 +510,6 @@ size_t usrp2_impl::recv(          _mboards.front()->get_master_clock_freq(), //master clock tick rate          uhd::transport::vrt::if_hdr_unpack_be,          _io_impl->get_recv_buffs_fcn, -        boost::bind(&handle_overflow, boost::ref(_mboards), _1) +        boost::bind(&usrp2_impl::handle_overflow, this, _1)      );  } diff --git a/host/lib/usrp/usrp2/mboard_impl.cpp b/host/lib/usrp/usrp2/mboard_impl.cpp index c7a91c69b..b8849f65b 100644 --- a/host/lib/usrp/usrp2/mboard_impl.cpp +++ b/host/lib/usrp/usrp2/mboard_impl.cpp @@ -153,6 +153,7 @@ usrp2_mboard_impl::usrp2_mboard_impl(      (*this)[MBOARD_PROP_RX_SUBDEV_SPEC] = subdev_spec_t();      (*this)[MBOARD_PROP_TX_SUBDEV_SPEC] = subdev_spec_t(); +    //------------------------------------------------------------------      //This is a hack/fix for the lingering packet problem.      stream_cmd_t stream_cmd(stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE);      for (size_t i = 0; i < NUM_RX_DSPS; i++){ @@ -163,6 +164,7 @@ usrp2_mboard_impl::usrp2_mboard_impl(          device.dsp_xports.at(index)->get_recv_buff(0.01).get(); //recv with timeout for expected          _iface->poke32(_iface->regs.rx_ctrl[i].clear_overrun, 1); //resets sequence      } +    //------------------------------------------------------------------  }  usrp2_mboard_impl::~usrp2_mboard_impl(void){ diff --git a/host/lib/usrp/usrp2/usrp2_impl.hpp b/host/lib/usrp/usrp2/usrp2_impl.hpp index dbddd2ec0..0676cecf2 100644 --- a/host/lib/usrp/usrp2/usrp2_impl.hpp +++ b/host/lib/usrp/usrp2/usrp2_impl.hpp @@ -217,6 +217,7 @@ private:      uhd::otw_type_t _rx_otw_type, _tx_otw_type;      UHD_PIMPL_DECL(io_impl) _io_impl;      void io_init(void); +    void handle_overflow(size_t);  };  #endif /* INCLUDED_USRP2_IMPL_HPP */ diff --git a/host/lib/usrp/usrp2/usrp2_regs.cpp b/host/lib/usrp/usrp2/usrp2_regs.cpp index 31c904960..66c3ac137 100644 --- a/host/lib/usrp/usrp2/usrp2_regs.cpp +++ b/host/lib/usrp/usrp2/usrp2_regs.cpp @@ -76,7 +76,7 @@ usrp2_regs_t usrp2_get_regs(bool use_n2xx_map) {    x.dsp_rx[0].dcoffset_i = sr_addr(misc_output_base, x.sr_rx_dsp0 + 3);    x.dsp_rx[0].dcoffset_q = sr_addr(misc_output_base, x.sr_rx_dsp0 + 4);    x.dsp_rx[0].mux = sr_addr(misc_output_base, x.sr_rx_dsp0 + 5); -  x.dsp_rx[1].freq = sr_addr(misc_output_base, x.sr_rx_dsp1 + 1); +  x.dsp_rx[1].freq = sr_addr(misc_output_base, x.sr_rx_dsp1 + 0);    x.dsp_rx[1].scale_iq = sr_addr(misc_output_base, x.sr_rx_dsp1 + 1);    x.dsp_rx[1].decim_rate = sr_addr(misc_output_base, x.sr_rx_dsp1 + 2);    x.dsp_rx[1].dcoffset_i = sr_addr(misc_output_base, x.sr_rx_dsp1 + 3); @@ -103,7 +103,7 @@ usrp2_regs_t usrp2_get_regs(bool use_n2xx_map) {    x.rx_ctrl[0].vrt_trailer = sr_addr(misc_output_base, x.sr_rx_ctrl0 + 6);    x.rx_ctrl[0].nsamps_per_pkt = sr_addr(misc_output_base, x.sr_rx_ctrl0 + 7);    x.rx_ctrl[0].nchannels = sr_addr(misc_output_base, x.sr_rx_ctrl0 + 8); -  x.rx_ctrl[1].stream_cmd = sr_addr(misc_output_base, x.sr_rx_ctrl1 + 1); +  x.rx_ctrl[1].stream_cmd = sr_addr(misc_output_base, x.sr_rx_ctrl1 + 0);    x.rx_ctrl[1].time_secs = sr_addr(misc_output_base, x.sr_rx_ctrl1 + 1);    x.rx_ctrl[1].time_ticks = sr_addr(misc_output_base, x.sr_rx_ctrl1 + 2);    x.rx_ctrl[1].clear_overrun = sr_addr(misc_output_base, x.sr_rx_ctrl1 + 3); | 
