aboutsummaryrefslogtreecommitdiffstats
path: root/host
diff options
context:
space:
mode:
Diffstat (limited to 'host')
-rw-r--r--host/lib/usrp/multi_usrp.cpp93
1 files changed, 78 insertions, 15 deletions
diff --git a/host/lib/usrp/multi_usrp.cpp b/host/lib/usrp/multi_usrp.cpp
index 6c758e07e..2a3e2e80f 100644
--- a/host/lib/usrp/multi_usrp.cpp
+++ b/host/lib/usrp/multi_usrp.cpp
@@ -6,6 +6,7 @@
//
#include <uhd/property_tree.hpp>
+#include <uhd/types/eeprom.hpp>
#include <uhd/usrp/multi_usrp.hpp>
#include <uhd/usrp/gpio_defs.hpp>
#include <uhd/exception.hpp>
@@ -409,38 +410,82 @@ public:
dict<std::string, std::string> get_usrp_rx_info(size_t chan){
mboard_chan_pair mcp = rx_chan_to_mcp(chan);
dict<std::string, std::string> usrp_info;
-
- mboard_eeprom_t mb_eeprom = _tree->access<mboard_eeprom_t>(mb_root(mcp.mboard) / "eeprom").get();
- dboard_eeprom_t db_eeprom = _tree->access<dboard_eeprom_t>(rx_rf_fe_root(chan).branch_path().branch_path() / "rx_eeprom").get();
-
+ const auto mb_eeprom =
+ _tree->access<mboard_eeprom_t>(mb_root(mcp.mboard) / "eeprom").get();
usrp_info["mboard_id"] = _tree->access<std::string>(mb_root(mcp.mboard) / "name").get();
- usrp_info["mboard_name"] = mb_eeprom["name"];
+ usrp_info["mboard_name"] = mb_eeprom.get("name", "n/a");
usrp_info["mboard_serial"] = mb_eeprom["serial"];
- usrp_info["rx_id"] = db_eeprom.id.to_pp_string();
usrp_info["rx_subdev_name"] = _tree->access<std::string>(rx_rf_fe_root(chan) / "name").get();
usrp_info["rx_subdev_spec"] = _tree->access<subdev_spec_t>(mb_root(mcp.mboard) / "rx_subdev_spec").get().to_string();
- usrp_info["rx_serial"] = db_eeprom.serial;
usrp_info["rx_antenna"] = _tree->access<std::string>(rx_rf_fe_root(chan) / "antenna" / "value").get();
-
+ if (_tree->exists(rx_rf_fe_root(chan).branch_path().branch_path() / "rx_eeprom")) {
+ const auto db_eeprom =
+ _tree->access<dboard_eeprom_t>(
+ rx_rf_fe_root(chan).branch_path().branch_path()
+ / "rx_eeprom"
+ ).get();
+ usrp_info["rx_serial"] = db_eeprom.serial;
+ usrp_info["rx_id"] = db_eeprom.id.to_pp_string();
+ }
+ const auto rfnoc_path = mb_root(mcp.mboard) / "xbar";
+ if (_tree->exists(rfnoc_path)) {
+ const auto spec = get_rx_subdev_spec(mcp.mboard).at(mcp.chan);
+ const auto radio_index = get_radio_index(spec.db_name);
+ const auto radio_path = rfnoc_path / str(boost::format("Radio_%d") % radio_index);
+ const auto eeprom_path = radio_path / "eeprom";
+ if (_tree->exists(radio_path)) {
+ const auto db_eeprom = _tree->access<eeprom_map_t>(eeprom_path).get();
+ usrp_info["rx_serial"] = db_eeprom.count("serial") ?
+ std::string(db_eeprom.at("serial").begin(), db_eeprom.at("serial").end())
+ : "n/a"
+ ;
+ usrp_info["rx_id"] = db_eeprom.count("pid") ?
+ std::string(db_eeprom.at("pid").begin(), db_eeprom.at("pid").end())
+ : "n/a"
+ ;
+ }
+ }
return usrp_info;
}
dict<std::string, std::string> get_usrp_tx_info(size_t chan){
mboard_chan_pair mcp = tx_chan_to_mcp(chan);
dict<std::string, std::string> usrp_info;
-
- mboard_eeprom_t mb_eeprom = _tree->access<mboard_eeprom_t>(mb_root(mcp.mboard) / "eeprom").get();
- dboard_eeprom_t db_eeprom = _tree->access<dboard_eeprom_t>(tx_rf_fe_root(chan).branch_path().branch_path() / "tx_eeprom").get();
-
+ const auto mb_eeprom =
+ _tree->access<mboard_eeprom_t>(mb_root(mcp.mboard) / "eeprom").get();
usrp_info["mboard_id"] = _tree->access<std::string>(mb_root(mcp.mboard) / "name").get();
usrp_info["mboard_name"] = mb_eeprom["name"];
usrp_info["mboard_serial"] = mb_eeprom["serial"];
- usrp_info["tx_id"] = db_eeprom.id.to_pp_string();
usrp_info["tx_subdev_name"] = _tree->access<std::string>(tx_rf_fe_root(chan) / "name").get();
usrp_info["tx_subdev_spec"] = _tree->access<subdev_spec_t>(mb_root(mcp.mboard) / "tx_subdev_spec").get().to_string();
- usrp_info["tx_serial"] = db_eeprom.serial;
usrp_info["tx_antenna"] = _tree->access<std::string>(tx_rf_fe_root(chan) / "antenna" / "value").get();
-
+ if (_tree->exists(tx_rf_fe_root(chan).branch_path().branch_path() / "tx_eeprom")) {
+ const auto db_eeprom =
+ _tree->access<dboard_eeprom_t>(
+ tx_rf_fe_root(chan).branch_path().branch_path()
+ / "tx_eeprom"
+ ).get();
+ usrp_info["tx_serial"] = db_eeprom.serial;
+ usrp_info["tx_id"] = db_eeprom.id.to_pp_string();
+ }
+ const auto rfnoc_path = mb_root(mcp.mboard) / "xbar";
+ if (_tree->exists(rfnoc_path)) {
+ const auto spec = get_tx_subdev_spec(mcp.mboard).at(mcp.chan);
+ const auto radio_index = get_radio_index(spec.db_name);
+ const auto radio_path = rfnoc_path / str(boost::format("Radio_%d")%radio_index);
+ const auto path = radio_path / "eeprom";
+ if(_tree->exists(radio_path)) {
+ const auto db_eeprom = _tree->access<eeprom_map_t>(path).get();
+ usrp_info["tx_serial"] = db_eeprom.count("serial") ?
+ std::string(db_eeprom.at("serial").begin(), db_eeprom.at("serial").end())
+ : "n/a"
+ ;
+ usrp_info["tx_id"] = db_eeprom.count("pid") ?
+ std::string(db_eeprom.at("pid").begin(), db_eeprom.at("pid").end())
+ : "n/a"
+ ;
+ }
+ }
return usrp_info;
}
@@ -2382,6 +2427,24 @@ private:
}
}
+ size_t get_radio_index(const std::string slot_name)
+ {
+ if (slot_name == "A") {
+ return 0;
+ } else if (slot_name == "B") {
+ return 1;
+ } else if (slot_name == "C") {
+ return 2;
+ } else if (slot_name == "D") {
+ return 3;
+ } else {
+ throw uhd::key_error(str(
+ boost::format("[multi_usrp]: radio slot name %s out of supported range.")
+ % slot_name
+ ));
+ }
+ }
+
fs_path rx_rf_fe_root(const size_t chan)
{
mboard_chan_pair mcp = rx_chan_to_mcp(chan);