// // Copyright 2014-2015 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 // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // #include #include #include #include #include #include #include #include #include #include "b200_iface.hpp" #include "b200_impl.hpp" using namespace uhd; using namespace uhd::usrp; using namespace uhd::transport; namespace uhd{ static b200_iface::sptr get_b200_iface(const image_loader::image_loader_args_t &image_loader_args, mboard_eeprom_t &mb_eeprom, bool user_specified){ std::vector dev_handles = get_b200_device_handles(image_loader_args.args); b200_iface::sptr iface; if(dev_handles.size() > 0){ BOOST_FOREACH(usb_device_handle::sptr dev_handle, dev_handles){ if(dev_handle->firmware_loaded()){ iface = b200_iface::make(usb_control::make(dev_handle,0)); mb_eeprom = mboard_eeprom_t(*iface, "B200"); if(user_specified){ if(image_loader_args.args.has_key("serial") and mb_eeprom.get("serial") != image_loader_args.args.get("serial")){ continue; } if(image_loader_args.args.has_key("name") and mb_eeprom.get("name") != image_loader_args.args.get("name")){ continue; } return iface; } else return iface; // Just return first found } } } // No applicable devices found, return empty sptr so we can exit iface.reset(); mb_eeprom = mboard_eeprom_t(); return iface; } static bool b200_image_loader(const image_loader::image_loader_args_t &image_loader_args){ if(!image_loader_args.load_fpga) return false; bool user_specified = (image_loader_args.args.has_key("serial") or image_loader_args.args.has_key("name")); // See if a B2x0 with the given args is found mboard_eeprom_t mb_eeprom; b200_iface::sptr iface = get_b200_iface(image_loader_args, mb_eeprom, user_specified); if(!iface) return false; // No initialized B2x0 found std::string fpga_path; if(image_loader_args.fpga_path == ""){ /* * Normally, we can auto-generate the FPGA filename from what's in the EEPROM, * but if the applicable value is not in the EEPROM, the user must give a specific * filename for us to use. */ std::string product = mb_eeprom.get("product"); if(not B2X0_PRODUCT_ID.has_key(boost::lexical_cast(product))){ if(user_specified){ // The user specified a bad device but expects us to know what it is throw uhd::runtime_error("Could not determine model. You must manually specify an FPGA image filename."); } else{ return false; } } else{ fpga_path = find_image_path(B2X0_FPGA_FILE_NAME.get(get_b200_type(mb_eeprom))); } } else fpga_path = image_loader_args.fpga_path; std::cout << boost::format("Unit: USRP %s (%s)") % B2X0_STR_NAMES.get(get_b200_type(mb_eeprom), "B2XX") % mb_eeprom.get("serial") << std::endl; iface->load_fpga(fpga_path, true); return true; } UHD_STATIC_BLOCK(register_b200_image_loader){ std::string recovery_instructions = "This device is likely in an unusable state. Power-cycle the\n" "device, and the firmware/FPGA will be reloaded the next time\n" "UHD uses the device."; image_loader::register_image_loader("b200", b200_image_loader, recovery_instructions); } } /* namespace uhd */