From cbd800a252400bd0372e00974a02ed9d85e9d821 Mon Sep 17 00:00:00 2001 From: Martin Braun Date: Thu, 13 Mar 2014 17:38:16 +0100 Subject: uhd: Addressed Balints and Bens comments for subdev addressing --- host/lib/usrp/multi_usrp.cpp | 4 ++-- host/lib/usrp/x300/x300_impl.cpp | 3 ++- host/lib/usrp/x300/x300_io_impl.cpp | 33 +++++++++++++++++++-------------- 3 files changed, 23 insertions(+), 17 deletions(-) (limited to 'host/lib') diff --git a/host/lib/usrp/multi_usrp.cpp b/host/lib/usrp/multi_usrp.cpp index 2e82e890e..f08709669 100644 --- a/host/lib/usrp/multi_usrp.cpp +++ b/host/lib/usrp/multi_usrp.cpp @@ -1063,7 +1063,7 @@ private: mboard_chan_pair mcp = rx_chan_to_mcp(chan); if (_tree->exists(mb_root(mcp.mboard) / "rx_chan_dsp_mapping")) { std::vector map = _tree->access >(mb_root(mcp.mboard) / "rx_chan_dsp_mapping").get(); - UHD_ASSERT_THROW(map.size() >= mcp.chan); + UHD_ASSERT_THROW(map.size() > mcp.chan); mcp.chan = map[mcp.chan]; } @@ -1083,7 +1083,7 @@ private: mboard_chan_pair mcp = tx_chan_to_mcp(chan); if (_tree->exists(mb_root(mcp.mboard) / "tx_chan_dsp_mapping")) { std::vector map = _tree->access >(mb_root(mcp.mboard) / "tx_chan_dsp_mapping").get(); - UHD_ASSERT_THROW(map.size() >= mcp.chan); + UHD_ASSERT_THROW(map.size() > mcp.chan); mcp.chan = map[mcp.chan]; } try diff --git a/host/lib/usrp/x300/x300_impl.cpp b/host/lib/usrp/x300/x300_impl.cpp index 22f607baa..e6dfa3bc1 100644 --- a/host/lib/usrp/x300/x300_impl.cpp +++ b/host/lib/usrp/x300/x300_impl.cpp @@ -829,8 +829,9 @@ static void check_adc(wb_iface::sptr iface, const boost::uint32_t val) void x300_impl::setup_radio(const size_t mb_i, const std::string &slot_name) { const fs_path mb_path = "/mboards/"+boost::lexical_cast(mb_i); - const size_t radio_index = _mb[mb_i].get_radio_index(slot_name); + UHD_ASSERT_THROW(mb_i < _mb.size()); mboard_members_t &mb = _mb[mb_i]; + const size_t radio_index = mb.get_radio_index(slot_name); radio_perifs_t &perif = mb.radio_perifs[radio_index]; //////////////////////////////////////////////////////////////////// diff --git a/host/lib/usrp/x300/x300_io_impl.cpp b/host/lib/usrp/x300/x300_io_impl.cpp index 84f96d9f5..85de34a54 100644 --- a/host/lib/usrp/x300/x300_io_impl.cpp +++ b/host/lib/usrp/x300/x300_io_impl.cpp @@ -80,6 +80,7 @@ void x300_impl::update_tx_samp_rate(mboard_members_t &mb, const size_t dspno, co void x300_impl::update_subdev_spec(const std::string &tx_rx, const size_t mb_i, const subdev_spec_t &spec) { UHD_ASSERT_THROW(tx_rx == "tx" or tx_rx == "rx"); + UHD_ASSERT_THROW(mb_i < _mb.size()); const std::string mb_name = boost::lexical_cast(mb_i); fs_path mb_root = "/mboards/" + mb_name; @@ -87,14 +88,14 @@ void x300_impl::update_subdev_spec(const std::string &tx_rx, const size_t mb_i, validate_subdev_spec(_tree, spec, tx_rx, mb_name); UHD_ASSERT_THROW(spec.size() <= 2); if (spec.size() == 1) { - UHD_ASSERT_THROW(spec[0].db_name == "A" || spec[0].db_name == "B"); - } - if (spec.size() == 2) { - UHD_ASSERT_THROW( - (spec[0].db_name == "A" && spec[1].db_name == "B") || - (spec[0].db_name == "B" && spec[1].db_name == "A") - ); - } + UHD_ASSERT_THROW(spec[0].db_name == "A" || spec[0].db_name == "B"); + } + else if (spec.size() == 2) { + UHD_ASSERT_THROW( + (spec[0].db_name == "A" && spec[1].db_name == "B") || + (spec[0].db_name == "B" && spec[1].db_name == "A") + ); + } std::vector chan_to_dsp_map(spec.size(), 0); // setup mux for this spec @@ -104,18 +105,18 @@ void x300_impl::update_subdev_spec(const std::string &tx_rx, const size_t mb_i, chan_to_dsp_map[i] = radio_idx; //extract connection - const std::string conn = _tree->access(mb_root / "dboards" / spec[i].db_name / (tx_rx + "_frontends") / spec[i].sd_name / "connection").get(); + const std::string conn = _tree->access(mb_root / "dboards" / spec[i].db_name / (tx_rx + "_frontends") / spec[i].sd_name / "connection").get(); - if (tx_rx == "tx") { + if (tx_rx == "tx") { //swap condition _mb[mb_i].radio_perifs[radio_idx].tx_fe->set_mux(conn); - } else { + } else { //swap condition const bool fe_swapped = (conn == "QI" or conn == "Q"); _mb[mb_i].radio_perifs[radio_idx].ddc->set_mux(conn, fe_swapped); //see usrp/io_impl.cpp if multiple DSPs share the frontend: _mb[mb_i].radio_perifs[radio_idx].rx_fe->set_mux(fe_swapped); - } + } } _tree->access >(mb_root / (tx_rx + "_chan_dsp_mapping")).set(chan_to_dsp_map); @@ -364,9 +365,13 @@ rx_streamer::sptr x300_impl::get_rx_stream(const uhd::stream_args_t &args_) } // Find the DSP that corresponds to this mainboard and subdev + UHD_ASSERT_THROW(mb_index < _mb.size()); mboard_members_t &mb = _mb[mb_index]; - const size_t radio_index = _tree->access >("/mboards/" + boost::lexical_cast(mb_index) / "rx_chan_dsp_mapping") - .get().at(mb_chan); + const std::vector dsp_map = _tree->access >("/mboards/" + boost::lexical_cast(mb_index) / "rx_chan_dsp_mapping") + .get(); //.at(mb_chan); + UHD_ASSERT_THROW(mb_chan < dsp_map.size()); + const size_t radio_index = dsp_map[mb_chan]; + UHD_ASSERT_THROW(radio_index < 2); radio_perifs_t &perif = mb.radio_perifs[radio_index]; //setup the dsp transport hints (default to a large recv buff) -- cgit v1.2.3