diff options
| -rw-r--r-- | host/utils/usrp_burn_mb_eeprom.cpp | 36 | 
1 files changed, 26 insertions, 10 deletions
| diff --git a/host/utils/usrp_burn_mb_eeprom.cpp b/host/utils/usrp_burn_mb_eeprom.cpp index 1b13fb615..3f434e274 100644 --- a/host/utils/usrp_burn_mb_eeprom.cpp +++ b/host/utils/usrp_burn_mb_eeprom.cpp @@ -1,5 +1,5 @@  // -// Copyright 2010 Ettus Research LLC +// Copyright 2010,2013 Ettus Research LLC  //  // This program is free software: you can redistribute it and/or modify  // it under the terms of the GNU General Public License as published by @@ -19,9 +19,11 @@  #include <uhd/device.hpp>  #include <uhd/property_tree.hpp>  #include <uhd/usrp/mboard_eeprom.hpp> +#include <boost/algorithm/string.hpp>  #include <boost/program_options.hpp>  #include <boost/format.hpp>  #include <iostream> +#include <vector>  namespace po = boost::program_options; @@ -32,8 +34,8 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){      desc.add_options()          ("help", "help message")          ("args", po::value<std::string>(&args)->default_value(""), "device address args [default = \"\"]") -        ("key", po::value<std::string>(&key), "the indentifier for a value in EEPROM") -        ("val", po::value<std::string>(&val), "the new value to set, omit for readback") +        ("key", po::value<std::string>(&key), "identifiers for new values in EEPROM, separate multiple by \",\"") +        ("val", po::value<std::string>(&val), "the new values to set, omit for readback, separate multiple by \",\"")      ;      po::variables_map vm; @@ -55,20 +57,34 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){      uhd::property_tree::sptr tree = dev->get_tree();      std::cout << std::endl; +    //split arguments and values  +    std::vector<std::string> keys_vec, vals_vec; +    boost::split(keys_vec, key, boost::is_any_of("\"',")); +    boost::split(vals_vec, val, boost::is_any_of("\"',")); + +    if(keys_vec.size() != vals_vec.size() and val != "") { +        //If zero values are given, then user just wants values read to them +        throw std::runtime_error("Number of keys must match number of values!"); +    } +      if (true /*always readback*/){          std::cout << "Fetching current settings from EEPROM..." << std::endl;          uhd::usrp::mboard_eeprom_t mb_eeprom = tree->access<uhd::usrp::mboard_eeprom_t>("/mboards/0/eeprom").get(); -        if (not mb_eeprom.has_key(key)){ -            std::cerr << boost::format("Cannot find value for EEPROM[%s]") % key << std::endl; -            return EXIT_FAILURE; +        for(size_t i = 0; i < keys_vec.size(); i++){ +            if (not mb_eeprom.has_key(keys_vec[i])){ +                std::cerr << boost::format("Cannot find value for EEPROM[%s]") % keys_vec[i] << std::endl; +                return EXIT_FAILURE; +            } +            std::cout << boost::format("    EEPROM [\"%s\"] is \"%s\"") % keys_vec[i] % mb_eeprom[keys_vec[i]] << std::endl;          } -        std::cout << boost::format("    EEPROM [\"%s\"] is \"%s\"") % key % mb_eeprom[key] << std::endl;          std::cout << std::endl;      }      if (vm.count("val")){ -        uhd::usrp::mboard_eeprom_t mb_eeprom; mb_eeprom[key] = val; -        std::cout << boost::format("Setting EEPROM [\"%s\"] to \"%s\"...") % key % val << std::endl; -        tree->access<uhd::usrp::mboard_eeprom_t>("/mboards/0/eeprom").set(mb_eeprom); +        for(size_t i = 0; i < vals_vec.size(); i++){ +            uhd::usrp::mboard_eeprom_t mb_eeprom; mb_eeprom[keys_vec[i]] = vals_vec[i]; +            std::cout << boost::format("Setting EEPROM [\"%s\"] to \"%s\"...") % keys_vec[i] % vals_vec[i] << std::endl; +            tree->access<uhd::usrp::mboard_eeprom_t>("/mboards/0/eeprom").set(mb_eeprom); +        }          std::cout << "Power-cycle the USRP device for the changes to take effect." << std::endl;          std::cout << std::endl;      } | 
