diff options
| author | Cristina Fuentes <cristina.fuentes-curiel@ni.com> | 2020-09-21 15:17:39 -0700 | 
|---|---|---|
| committer | Aaron Rossetto <aaron.rossetto@ni.com> | 2020-09-24 15:16:45 -0500 | 
| commit | 2e64cb1b2891cbecab832aec00b8269e0798ff0d (patch) | |
| tree | 2ba16206f87a760efe7835121b52dc727b1ddd84 /host | |
| parent | bc20747808138462968b1b743abecbb83389e1c4 (diff) | |
| download | uhd-2e64cb1b2891cbecab832aec00b8269e0798ff0d.tar.gz uhd-2e64cb1b2891cbecab832aec00b8269e0798ff0d.tar.bz2 uhd-2e64cb1b2891cbecab832aec00b8269e0798ff0d.zip | |
multi_usrp: Add get_mb_controller() API call
Diffstat (limited to 'host')
| -rw-r--r-- | host/include/uhd/usrp/multi_usrp.hpp | 20 | ||||
| -rw-r--r-- | host/lib/usrp/multi_usrp.cpp | 6 | ||||
| -rw-r--r-- | host/lib/usrp/multi_usrp_python.hpp | 1 | ||||
| -rw-r--r-- | host/lib/usrp/multi_usrp_rfnoc.cpp | 59 | ||||
| -rwxr-xr-x | host/tests/devtest/multi_usrp_test.py | 1 | 
5 files changed, 60 insertions, 27 deletions
| diff --git a/host/include/uhd/usrp/multi_usrp.hpp b/host/include/uhd/usrp/multi_usrp.hpp index 2f441bd5a..e00fe7553 100644 --- a/host/include/uhd/usrp/multi_usrp.hpp +++ b/host/include/uhd/usrp/multi_usrp.hpp @@ -36,6 +36,7 @@  #include <uhd/usrp/dboard_iface.hpp>  #include <uhd/usrp/subdev_spec.hpp>  #include <uhd/utils/noncopyable.hpp> +#include <uhd/rfnoc/mb_controller.hpp>  #include <uhd/rfnoc/radio_control.hpp>  #include <complex>  #include <memory> @@ -1783,6 +1784,25 @@ public:      virtual void set_tx_filter(const std::string& name,          uhd::filter_info_base::sptr filter,          const size_t chan) = 0; + +     /*! Get direct access to the underlying mb_controller object. +     * +     * Note: This is an advanced API, created for corner cases where the +     * application is using multi_usrp, but some special features from +     * mb_controller need to be used that are not exposed by multi_usrp. +     * Note that it is possible to put the mb_controller and multi_usrp into a +     * broken state by directly accessing the mb_controller. For typical +     * mb_controller operations it is therefore highly recommended +     * to not use this API call, but use the native multi_usrp API calls. +     * +     * The lifetime of the mb_controller is linked to the lifetime of the +     * device object, so storing a reference from this function is not allowed. +     * +     * \param mboard The motherboard index +     * \returns A reference to the mb_controller for the corresponding mboard +     * \throws uhd::not_implemented_error if not on an RFNoC device. +     */ +    virtual uhd::rfnoc::mb_controller& get_mb_controller(const size_t mboard = 0) = 0;  };  } // namespace usrp diff --git a/host/lib/usrp/multi_usrp.cpp b/host/lib/usrp/multi_usrp.cpp index e3424d748..78205fbdd 100644 --- a/host/lib/usrp/multi_usrp.cpp +++ b/host/lib/usrp/multi_usrp.cpp @@ -2557,6 +2557,12 @@ public:              "set_gpio_src() not implemented for this motherboard!");      } +    uhd::rfnoc::mb_controller& get_mb_controller(const size_t /*mboard*/) +    { +        throw uhd::not_implemented_error( +            "get_mb_controller() not supported on this device!"); +    } +  private:      device::sptr _dev;      property_tree::sptr _tree; diff --git a/host/lib/usrp/multi_usrp_python.hpp b/host/lib/usrp/multi_usrp_python.hpp index cec901315..2b760365c 100644 --- a/host/lib/usrp/multi_usrp_python.hpp +++ b/host/lib/usrp/multi_usrp_python.hpp @@ -86,6 +86,7 @@ void export_multi_usrp(py::module& m)          .def("get_mboard_sensor_names" , &multi_usrp::get_mboard_sensor_names, py::arg("mboard") = 0)          .def("set_user_register"       , &multi_usrp::set_user_register, py::arg("addr"), py::arg("data"), py::arg("mboard") = ALL_MBOARDS)          .def("get_radio_control"       , &multi_usrp::get_radio_control, py::arg("chan") = 0) +        .def("get_mb_controller"       , &multi_usrp::get_mb_controller, py::arg("mboard") = 0)          // RX methods          .def("set_rx_subdev_spec"      , &multi_usrp::set_rx_subdev_spec, py::arg("spec"), py::arg("mboard") = ALL_MBOARDS) diff --git a/host/lib/usrp/multi_usrp_rfnoc.cpp b/host/lib/usrp/multi_usrp_rfnoc.cpp index 659d879e8..5fff37ae4 100644 --- a/host/lib/usrp/multi_usrp_rfnoc.cpp +++ b/host/lib/usrp/multi_usrp_rfnoc.cpp @@ -452,7 +452,7 @@ public:      {          auto& rx_chain      = _get_rx_chan(chan);          const size_t mb_idx = rx_chain.radio->get_block_id().get_device_no(); -        auto mbc            = get_mbc(mb_idx); +        auto mbc            = _get_mbc(mb_idx);          auto mb_eeprom      = mbc->get_eeprom();          dict<std::string, std::string> usrp_info; @@ -486,7 +486,7 @@ public:      {          auto& tx_chain      = _get_tx_chan(chan);          const size_t mb_idx = tx_chain.radio->get_block_id().get_device_no(); -        auto mbc            = get_mbc(mb_idx); +        auto mbc            = _get_mbc(mb_idx);          auto mb_eeprom      = mbc->get_eeprom();          dict<std::string, std::string> usrp_info; @@ -685,7 +685,7 @@ public:                                 % (_tree->access<std::string>("/name").get()));          for (size_t m = 0; m < get_num_mboards(); m++) {              buff += str( -                boost::format("  Mboard %d: %s\n") % m % get_mbc(m)->get_mboard_name()); +                boost::format("  Mboard %d: %s\n") % m % _get_mbc(m)->get_mboard_name());          } @@ -718,29 +718,29 @@ public:      std::string get_mboard_name(size_t mboard = 0)      { -        return get_mbc(mboard)->get_mboard_name(); +        return _get_mbc(mboard)->get_mboard_name();      }      time_spec_t get_time_now(size_t mboard = 0)      { -        return get_mbc(mboard)->get_timekeeper(0)->get_time_now(); +        return _get_mbc(mboard)->get_timekeeper(0)->get_time_now();      }      time_spec_t get_time_last_pps(size_t mboard = 0)      { -        return get_mbc(mboard)->get_timekeeper(0)->get_time_last_pps(); +        return _get_mbc(mboard)->get_timekeeper(0)->get_time_last_pps();      }      void set_time_now(const time_spec_t& time_spec, size_t mboard = ALL_MBOARDS)      {          MUX_MB_API_CALL(set_time_now, time_spec); -        get_mbc(mboard)->get_timekeeper(0)->set_time_now(time_spec); +        _get_mbc(mboard)->get_timekeeper(0)->set_time_now(time_spec);      }      void set_time_next_pps(const time_spec_t& time_spec, size_t mboard = ALL_MBOARDS)      {          MUX_MB_API_CALL(set_time_next_pps, time_spec); -        get_mbc(mboard)->get_timekeeper(0)->set_time_next_pps(time_spec); +        _get_mbc(mboard)->get_timekeeper(0)->set_time_next_pps(time_spec);      }      void set_time_unknown_pps(const time_spec_t& time_spec) @@ -858,33 +858,33 @@ public:      void set_time_source(const std::string& source, const size_t mboard = ALL_MBOARDS)      {          MUX_MB_API_CALL(set_time_source, source); -        get_mbc(mboard)->set_time_source(source); +        _get_mbc(mboard)->set_time_source(source);      }      std::string get_time_source(const size_t mboard)      { -        return get_mbc(mboard)->get_time_source(); +        return _get_mbc(mboard)->get_time_source();      }      std::vector<std::string> get_time_sources(const size_t mboard)      { -        return get_mbc(mboard)->get_time_sources(); +        return _get_mbc(mboard)->get_time_sources();      }      void set_clock_source(const std::string& source, const size_t mboard = ALL_MBOARDS)      {          MUX_MB_API_CALL(set_clock_source, source); -        get_mbc(mboard)->set_clock_source(source); +        _get_mbc(mboard)->set_clock_source(source);      }      std::string get_clock_source(const size_t mboard)      { -        return get_mbc(mboard)->get_clock_source(); +        return _get_mbc(mboard)->get_clock_source();      }      std::vector<std::string> get_clock_sources(const size_t mboard)      { -        return get_mbc(mboard)->get_clock_sources(); +        return _get_mbc(mboard)->get_clock_sources();      }      void set_sync_source(const std::string& clock_source, @@ -892,36 +892,36 @@ public:          const size_t mboard = ALL_MBOARDS)      {          MUX_MB_API_CALL(set_sync_source, clock_source, time_source); -        get_mbc(mboard)->set_sync_source(clock_source, time_source); +        _get_mbc(mboard)->set_sync_source(clock_source, time_source);      }      void set_sync_source(          const device_addr_t& sync_source, const size_t mboard = ALL_MBOARDS)      {          MUX_MB_API_CALL(set_sync_source, sync_source); -        get_mbc(mboard)->set_sync_source(sync_source); +        _get_mbc(mboard)->set_sync_source(sync_source);      }      device_addr_t get_sync_source(const size_t mboard)      { -        return get_mbc(mboard)->get_sync_source(); +        return _get_mbc(mboard)->get_sync_source();      }      std::vector<device_addr_t> get_sync_sources(const size_t mboard)      { -        return get_mbc(mboard)->get_sync_sources(); +        return _get_mbc(mboard)->get_sync_sources();      }      void set_clock_source_out(const bool enb, const size_t mboard = ALL_MBOARDS)      {          MUX_MB_API_CALL(set_clock_source_out, enb); -        get_mbc(mboard)->set_clock_source_out(enb); +        _get_mbc(mboard)->set_clock_source_out(enb);      }      void set_time_source_out(const bool enb, const size_t mboard = ALL_MBOARDS)      {          MUX_MB_API_CALL(set_time_source_out, enb); -        get_mbc(mboard)->set_time_source_out(enb); +        _get_mbc(mboard)->set_time_source_out(enb);      }      size_t get_num_mboards(void) @@ -931,12 +931,12 @@ public:      sensor_value_t get_mboard_sensor(const std::string& name, size_t mboard = 0)      { -        return get_mbc(mboard)->get_sensor(name); +        return _get_mbc(mboard)->get_sensor(name);      }      std::vector<std::string> get_mboard_sensor_names(size_t mboard = 0)      { -        return get_mbc(mboard)->get_sensor_names(); +        return _get_mbc(mboard)->get_sensor_names();      }      // This only works on the USRP2 and B100, both of which are not rfnoc_device @@ -2138,26 +2138,26 @@ public:      std::vector<std::string> get_gpio_src_banks(const size_t mboard = 0)      { -        return get_mbc(mboard)->get_gpio_banks(); +        return _get_mbc(mboard)->get_gpio_banks();      }      std::vector<std::string> get_gpio_srcs(          const std::string& bank, const size_t mboard = 0)      { -        return get_mbc(mboard)->get_gpio_srcs(bank); +        return _get_mbc(mboard)->get_gpio_srcs(bank);      }      std::vector<std::string> get_gpio_src(          const std::string& bank, const size_t mboard = 0)      { -        return get_mbc(mboard)->get_gpio_src(bank); +        return _get_mbc(mboard)->get_gpio_src(bank);      }      void set_gpio_src(const std::string& bank,          const std::vector<std::string>& src,          const size_t mboard = 0)      { -        get_mbc(mboard)->set_gpio_src(bank, src); +        _get_mbc(mboard)->set_gpio_src(bank, src);      }      /******************************************************************* @@ -2405,11 +2405,16 @@ public:          }      } +    mb_controller& get_mb_controller(const size_t mboard) +    { +        return *_get_mbc(mboard); +    } +  private:      /**************************************************************************       * Private Helpers       *************************************************************************/ -    mb_controller::sptr get_mbc(const size_t mb_idx) +    mb_controller::sptr _get_mbc(const size_t mb_idx)      {          if (mb_idx >= get_num_mboards()) {              throw uhd::key_error( diff --git a/host/tests/devtest/multi_usrp_test.py b/host/tests/devtest/multi_usrp_test.py index 7d78349de..ba17337a6 100755 --- a/host/tests/devtest/multi_usrp_test.py +++ b/host/tests/devtest/multi_usrp_test.py @@ -589,6 +589,7 @@ def run_api_test(usrp):                      'get_rx_dboard_iface',                      'set_time_unknown_pps',                      'get_radio_control', +                    'get_mb_controller',                     ]      success = True | 
