aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--host/include/uhd/usrp/multi_usrp.hpp27
-rw-r--r--host/lib/usrp/multi_usrp.cpp34
2 files changed, 50 insertions, 11 deletions
diff --git a/host/include/uhd/usrp/multi_usrp.hpp b/host/include/uhd/usrp/multi_usrp.hpp
index 0c1e73895..80501e489 100644
--- a/host/include/uhd/usrp/multi_usrp.hpp
+++ b/host/include/uhd/usrp/multi_usrp.hpp
@@ -977,6 +977,26 @@ public:
/*******************************************************************
* Register IO methods
******************************************************************/
+ struct register_info_t {
+ size_t bitwidth;
+ bool readable;
+ bool writable;
+ };
+
+ /*!
+ * Enumerate the full paths of all low-level USRP register accessible to read/write
+ * \param mboard the motherboard index 0 to M-1
+ * \return a vector of register paths
+ */
+ virtual std::vector<std::string> enumerate_registers(const size_t mboard = 0) = 0;
+
+ /*!
+ * Get more information about a low-level device register
+ * \param path the full path to the register
+ * \param mboard the motherboard index 0 to M-1
+ * \return the info struct which contains the bitwidth and read-write access information
+ */
+ virtual register_info_t get_register_info(const std::string &path, const size_t mboard = 0) = 0;
/*!
* Write a low-level register field for a register in the USRP hardware
@@ -996,13 +1016,6 @@ public:
*/
virtual boost::uint64_t read_register(const std::string &path, const boost::uint32_t field, const size_t mboard = 0) = 0;
- /*!
- * Enumerate the full paths of all low-level USRP register accessible to read/write
- * \param mboard the motherboard index 0 to M-1
- * \return a vector of register paths
- */
- virtual std::vector<std::string> enumerate_registers(const size_t mboard = 0) = 0;
-
/*******************************************************************
* Filter API methods
******************************************************************/
diff --git a/host/lib/usrp/multi_usrp.cpp b/host/lib/usrp/multi_usrp.cpp
index 285799674..f27d0ca03 100644
--- a/host/lib/usrp/multi_usrp.cpp
+++ b/host/lib/usrp/multi_usrp.cpp
@@ -1380,6 +1380,10 @@ public:
_tree->access<uhd::soft_regmap_accessor_t::sptr>(mb_root(mboard) / "registers").get();
uhd::soft_register_base& reg = accessor->lookup(path);
+ if (not reg.is_writable()) {
+ throw uhd::runtime_error("multi_usrp::write_register - register not writable: " + path);
+ }
+
switch (reg.get_bitwidth()) {
case 16:
if (reg.is_readable())
@@ -1403,11 +1407,11 @@ public:
break;
default:
- throw uhd::assertion_error("register has invalid bitwidth");
+ throw uhd::assertion_error("multi_usrp::write_register - register has invalid bitwidth");
}
} else {
- throw uhd::not_implemented_error("register IO not supported for this device");
+ throw uhd::not_implemented_error("multi_usrp::write_register - register IO not supported for this device");
}
}
@@ -1419,6 +1423,10 @@ public:
_tree->access<uhd::soft_regmap_accessor_t::sptr>(mb_root(mboard) / "registers").get();
uhd::soft_register_base& reg = accessor->lookup(path);
+ if (not reg.is_readable()) {
+ throw uhd::runtime_error("multi_usrp::read_register - register not readable: " + path);
+ }
+
switch (reg.get_bitwidth()) {
case 16:
if (reg.is_writable())
@@ -1442,10 +1450,10 @@ public:
break;
default:
- throw uhd::assertion_error("register has invalid bitwidth: " + path);
+ throw uhd::assertion_error("multi_usrp::read_register - register has invalid bitwidth: " + path);
}
} else {
- throw uhd::not_implemented_error("register IO not supported for this device");
+ throw uhd::not_implemented_error("multi_usrp::read_register - register IO not supported for this device");
}
}
@@ -1461,6 +1469,24 @@ public:
}
}
+ register_info_t get_register_info(const std::string &path, const size_t mboard = 0)
+ {
+ if (_tree->exists(mb_root(mboard) / "registers"))
+ {
+ uhd::soft_regmap_accessor_t::sptr accessor =
+ _tree->access<uhd::soft_regmap_accessor_t::sptr>(mb_root(mboard) / "registers").get();
+ uhd::soft_register_base& reg = accessor->lookup(path);
+
+ register_info_t info;
+ info.bitwidth = reg.get_bitwidth();
+ info.readable = reg.is_readable();
+ info.writable = reg.is_writable();
+ return info;
+ } else {
+ throw uhd::not_implemented_error("multi_usrp::read_register - register IO not supported for this device");
+ }
+ }
+
private:
device::sptr _dev;
property_tree::sptr _tree;