aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/multi_usrp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/usrp/multi_usrp.cpp')
-rw-r--r--host/lib/usrp/multi_usrp.cpp34
1 files changed, 30 insertions, 4 deletions
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;