aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib
diff options
context:
space:
mode:
authorAshish Chaudhari <ashish@ettus.com>2015-08-06 10:23:10 -0500
committerAshish Chaudhari <ashish@ettus.com>2015-08-06 10:23:10 -0500
commitcc6853bd475238012a97743891854194efc26862 (patch)
tree9ab9fc47e2e0f60248e5c7cae0ada0407f0298c0 /host/lib
parentc7f24e49db47aec2008b072bb6fb9b6dddc36797 (diff)
downloaduhd-cc6853bd475238012a97743891854194efc26862.tar.gz
uhd-cc6853bd475238012a97743891854194efc26862.tar.bz2
uhd-cc6853bd475238012a97743891854194efc26862.zip
uhd: Register API enhancements
- Added get_register_info function to get bitwidth and R/W access for a registers - Better error reporting
Diffstat (limited to 'host/lib')
-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;