From b5232b8e3fe5655218f776231d3e92964aa799ed Mon Sep 17 00:00:00 2001 From: Martin Braun Date: Tue, 12 May 2020 13:48:14 -0700 Subject: utils: Fix usrp_burn_db_eeprom w.r.t. new property tree paths usrp_burn_db_eeprom operates directly on property tree paths, and so the utility required an update to work with RFNoC devices. --- host/utils/usrp_burn_db_eeprom.cpp | 53 +++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 15 deletions(-) (limited to 'host/utils') diff --git a/host/utils/usrp_burn_db_eeprom.cpp b/host/utils/usrp_burn_db_eeprom.cpp index cfb80fd42..c55128d74 100644 --- a/host/utils/usrp_burn_db_eeprom.cpp +++ b/host/utils/usrp_burn_db_eeprom.cpp @@ -6,10 +6,10 @@ // -#include #include #include #include +#include #include #include #include @@ -22,6 +22,31 @@ using namespace uhd; using namespace uhd::usrp; namespace po = boost::program_options; + +uhd::fs_path get_radio_path(uhd::property_tree::sptr tree, std::string& slot) +{ + // RFNoC devices: + if (tree->exists("/blocks")) { + if (slot.empty()) { + slot = "0"; + } + const uhd::fs_path radio_path = + uhd::fs_path("/blocks/0/Radio#" + slot) / "dboard"; + if (!tree->exists(radio_path)) { + throw uhd::assertion_error("Invalid slot index: " + slot); + } + return radio_path; + } + // Other devices: + const uhd::fs_path db_root = "/mboards/0/dboards"; + std::vector dboard_names = tree->list(db_root); + if (dboard_names.size() == 1 and slot.empty()) { + slot = dboard_names.front(); + } + uhd::assert_has(dboard_names, slot, "dboard slot name"); + return db_root / slot; +} + int UHD_SAFE_MAIN(int argc, char* argv[]) { // command line variables @@ -32,7 +57,7 @@ int UHD_SAFE_MAIN(int argc, char* argv[]) desc.add_options() ("help", "help message") ("args", po::value(&args)->default_value(""), "device address args [default = \"\"]") - ("slot", po::value(&slot)->default_value(""), "dboard slot name [default is blank for automatic]") + ("slot", po::value(&slot)->default_value(""), "dboard slot name/index [default is blank for automatic]") ("unit", po::value(&unit)->default_value(""), "which unit [RX, TX, or GDB]") ("id", po::value(), "dboard id to burn, omit for readback") ("ser", po::value(), "serial to burn, omit for readback") @@ -48,25 +73,23 @@ int UHD_SAFE_MAIN(int argc, char* argv[]) if (vm.count("help")) { std::cout << boost::format("USRP Burn Daughterboard EEPROM %s") % desc << std::endl; - std::cout << boost::format("Omit the ID argument to perform readback,\n" - "Or specify a new ID to burn into the EEPROM.\n") + std::cout << "Omit the ID argument to perform readback,\n" + "Or specify a new ID to burn into the EEPROM.\n" << std::endl; + return EXIT_SUCCESS; + } + if (unit.empty()) { + std::cout << "Error: --unit must be specified!" << std::endl; return EXIT_FAILURE; } // make the device and extract the dboard w/ property - device::sptr dev = device::make(args, device::USRP); - uhd::property_tree::sptr tree = dev->get_tree(); - const uhd::fs_path db_root = "/mboards/0/dboards"; - std::vector dboard_names = tree->list(db_root); - if (dboard_names.size() == 1 and slot.empty()) - slot = dboard_names.front(); - uhd::assert_has(dboard_names, slot, "dboard slot name"); - - std::cout << boost::format("Reading %s EEPROM on %s dboard...") % unit % slot - << std::endl; + auto dev = multi_usrp::make(args); + auto tree = dev->get_tree(); + const auto radio_path = get_radio_path(tree, slot); + std::cout << "Reading " << unit << " EEPROM on dboard " << slot << "..." << std::endl; boost::to_lower(unit); - const uhd::fs_path db_path = db_root / slot / (unit + "_eeprom"); + const uhd::fs_path db_path = radio_path / (unit + "_eeprom"); dboard_eeprom_t db_eeprom = tree->access(db_path).get(); //------------- handle the dboard ID -----------------------------// -- cgit v1.2.3