aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDerek Kozel <derek.kozel@ettus.com>2016-07-28 18:14:20 -0700
committerMartin Braun <martin.braun@ettus.com>2016-08-09 10:21:53 -0700
commitf360059b99d4ae11e5279b8999364ec1fe2997a3 (patch)
tree04b46481c368569ff1aeb3c1d7ff2a411a7f27bc
parent8607cf96932120bab3d4775ff297801add6403a0 (diff)
downloaduhd-f360059b99d4ae11e5279b8999364ec1fe2997a3.tar.gz
uhd-f360059b99d4ae11e5279b8999364ec1fe2997a3.tar.bz2
uhd-f360059b99d4ae11e5279b8999364ec1fe2997a3.zip
dboard manager: Allow deferring dboard initialization
-rw-r--r--host/include/uhd/usrp/dboard_manager.hpp9
-rw-r--r--host/lib/usrp/dboard_manager.cpp51
2 files changed, 48 insertions, 12 deletions
diff --git a/host/include/uhd/usrp/dboard_manager.hpp b/host/include/uhd/usrp/dboard_manager.hpp
index 4ce943972..85fa65e81 100644
--- a/host/include/uhd/usrp/dboard_manager.hpp
+++ b/host/include/uhd/usrp/dboard_manager.hpp
@@ -124,6 +124,7 @@ public:
* \param gdboard_id the id of the grand-dboard
* \param iface the custom dboard interface
* \param subtree the subtree to load with props
+ * \param bool defer initialising the daughterboards
* \return an sptr to the new dboard manager
*/
static sptr make(
@@ -131,12 +132,18 @@ public:
dboard_id_t tx_dboard_id,
dboard_id_t gdboard_id,
dboard_iface::sptr iface,
- property_tree::sptr subtree
+ property_tree::sptr subtree,
+ bool defer_db_init = false
);
virtual ~dboard_manager() {}
/*!
+ * Run dboard post constructor initializations if defered during make
+ */
+ virtual void initialize_dboards() = 0;
+
+ /*!
* Returns a vector of RX frontend (subdev) names
* \return a vector of names
*/
diff --git a/host/lib/usrp/dboard_manager.cpp b/host/lib/usrp/dboard_manager.cpp
index 6099adcbb..56cd08fd7 100644
--- a/host/lib/usrp/dboard_manager.cpp
+++ b/host/lib/usrp/dboard_manager.cpp
@@ -182,7 +182,8 @@ public:
dboard_id_t rx_dboard_id,
dboard_id_t tx_dboard_id,
dboard_iface::sptr iface,
- property_tree::sptr subtree
+ property_tree::sptr subtree,
+ bool defer_db_init
);
virtual ~dboard_manager_impl(void);
@@ -194,13 +195,17 @@ public:
return _tx_frontends;
}
+ void initialize_dboards();
+
private:
- void init(dboard_id_t, dboard_id_t, property_tree::sptr);
+ void init(dboard_id_t, dboard_id_t, property_tree::sptr, bool);
//list of rx and tx dboards in this dboard_manager
//each dboard here is actually a subdevice proxy
//the subdevice proxy is internal to the cpp file
uhd::dict<std::string, dboard_base::sptr> _rx_dboards;
uhd::dict<std::string, dboard_base::sptr> _tx_dboards;
+ std::vector<dboard_base::sptr> _rx_containers;
+ std::vector<dboard_base::sptr> _tx_containers;
std::vector<std::string> _rx_frontends;
std::vector<std::string> _tx_frontends;
dboard_iface::sptr _iface;
@@ -215,13 +220,14 @@ dboard_manager::sptr dboard_manager::make(
dboard_id_t tx_dboard_id,
dboard_id_t gdboard_id,
dboard_iface::sptr iface,
- property_tree::sptr subtree
+ property_tree::sptr subtree,
+ bool defer_db_init
){
return dboard_manager::sptr(
new dboard_manager_impl(
rx_dboard_id,
(gdboard_id == dboard_id_t::none())? tx_dboard_id : gdboard_id,
- iface, subtree
+ iface, subtree, defer_db_init
)
);
}
@@ -233,12 +239,13 @@ dboard_manager_impl::dboard_manager_impl(
dboard_id_t rx_dboard_id,
dboard_id_t tx_dboard_id,
dboard_iface::sptr iface,
- property_tree::sptr subtree
+ property_tree::sptr subtree,
+ bool defer_db_init
):
_iface(iface)
{
try{
- this->init(rx_dboard_id, tx_dboard_id, subtree);
+ this->init(rx_dboard_id, tx_dboard_id, subtree, defer_db_init);
}
catch(const std::exception &e){
UHD_MSG(error) << boost::format(
@@ -250,12 +257,12 @@ dboard_manager_impl::dboard_manager_impl(
if (subtree->exists("rx_frontends")) subtree->remove("rx_frontends");
if (subtree->exists("tx_frontends")) subtree->remove("tx_frontends");
if (subtree->exists("iface")) subtree->remove("iface");
- this->init(dboard_id_t::none(), dboard_id_t::none(), subtree);
+ this->init(dboard_id_t::none(), dboard_id_t::none(), subtree, false);
}
}
void dboard_manager_impl::init(
- dboard_id_t rx_dboard_id, dboard_id_t tx_dboard_id, property_tree::sptr subtree
+ dboard_id_t rx_dboard_id, dboard_id_t tx_dboard_id, property_tree::sptr subtree, bool defer_db_init
){
//find the dboard key matches for the dboard ids
dboard_key_t rx_dboard_key, tx_dboard_key, xcvr_dboard_key;
@@ -327,7 +334,11 @@ void dboard_manager_impl::init(
//initialize the container after all subdevs have been created
if (container_ctor) {
- db_ctor_args.rx_container->initialize();
+ if (defer_db_init) {
+ _rx_containers.push_back(db_ctor_args.rx_container);
+ } else {
+ db_ctor_args.rx_container->initialize();
+ }
}
//Populate frontend names in-order.
@@ -371,7 +382,11 @@ void dboard_manager_impl::init(
//initialize the container after all subdevs have been created
if (rx_cont_ctor) {
- db_ctor_args.rx_container->initialize();
+ if (defer_db_init) {
+ _rx_containers.push_back(db_ctor_args.rx_container);
+ } else {
+ db_ctor_args.rx_container->initialize();
+ }
}
//force the tx key to the unknown board for bad combinations
@@ -406,7 +421,11 @@ void dboard_manager_impl::init(
//initialize the container after all subdevs have been created
if (tx_cont_ctor) {
- db_ctor_args.tx_container->initialize();
+ if (defer_db_init) {
+ _tx_containers.push_back(db_ctor_args.tx_container);
+ } else {
+ db_ctor_args.tx_container->initialize();
+ }
}
//Populate frontend names in-order.
@@ -416,6 +435,16 @@ void dboard_manager_impl::init(
}
}
+void dboard_manager_impl::initialize_dboards(void) {
+ BOOST_FOREACH(dboard_base::sptr& _rx_container, _rx_containers) {
+ _rx_container->initialize();
+ }
+
+ BOOST_FOREACH(dboard_base::sptr& _tx_container, _tx_containers) {
+ _tx_container->initialize();
+ }
+}
+
dboard_manager_impl::~dboard_manager_impl(void){UHD_SAFE_CALL(
set_nice_dboard_if();
)}