diff options
| -rw-r--r-- | host/lib/usrp/dboard/db_dbsrx.cpp | 9 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/usrp2_impl.cpp | 20 | 
2 files changed, 25 insertions, 4 deletions
| diff --git a/host/lib/usrp/dboard/db_dbsrx.cpp b/host/lib/usrp/dboard/db_dbsrx.cpp index 846597f06..95c5c5d4d 100644 --- a/host/lib/usrp/dboard/db_dbsrx.cpp +++ b/host/lib/usrp/dboard/db_dbsrx.cpp @@ -1,5 +1,5 @@  // -// Copyright 2010-2011 Ettus Research LLC +// Copyright 2010-2012 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 @@ -58,6 +58,8 @@ static const uhd::dict<std::string, gain_range_t> dbsrx_gain_ranges = map_list_o      ("GC2", gain_range_t(0, 24, 1))  ; +static const double usrp1_gpio_clock_rate_limit = 4e6; +  /***********************************************************************   * The DBSRX dboard class   **********************************************************************/ @@ -265,6 +267,11 @@ double dbsrx::set_lo_freq(double target_freq){      std::vector<double> clock_rates = this->get_iface()->get_clock_rates(dboard_iface::UNIT_RX);      const double max_clock_rate = uhd::sorted(clock_rates).back();      BOOST_FOREACH(ref_clock, uhd::reversed(uhd::sorted(clock_rates))){ +        //USRP1 feeds the DBSRX clock from a FPGA GPIO line. +        //make sure that this clock does not exceed rate limit. +        if (this->get_iface()->get_special_props().soft_clock_divider){ +            if (ref_clock > usrp1_gpio_clock_rate_limit) continue; +        }          if (ref_clock > 27.0e6) continue;          if (size_t(max_clock_rate/ref_clock)%2 == 1) continue; //reject asymmetric clocks (odd divisors) diff --git a/host/lib/usrp/usrp2/usrp2_impl.cpp b/host/lib/usrp/usrp2/usrp2_impl.cpp index 20a74db2c..e6e8ca675 100644 --- a/host/lib/usrp/usrp2/usrp2_impl.cpp +++ b/host/lib/usrp/usrp2/usrp2_impl.cpp @@ -121,12 +121,26 @@ static device_addrs_t usrp2_find(const device_addr_t &hint_){              //new_addr["addr"] = ip_addr.to_string();              new_addr["addr"] = udp_transport->get_recv_addr(); +            //Attempt a simple 2-way communication with a connected socket. +            //Reason: Although the USRP will respond the broadcast above, +            //we may not be able to communicate directly (non-broadcast). +            udp_simple::sptr ctrl_xport = udp_simple::make_connected( +                new_addr["addr"], BOOST_STRINGIZE(USRP2_UDP_CTRL_PORT) +            ); +            ctrl_xport->send(boost::asio::buffer(&ctrl_data_out, sizeof(ctrl_data_out))); +            size_t len = ctrl_xport->recv(asio::buffer(usrp2_ctrl_data_in_mem)); +            if (len > offsetof(usrp2_ctrl_data_t, data) and ntohl(ctrl_data_in->id) == USRP2_CTRL_ID_WAZZUP_DUDE){ +                //found the device, open up for communication! +            } +            else{ +                //otherwise we don't find it... +                continue; +            } +              //Attempt to read the name from the EEPROM and perform filtering.              //This operation can throw due to compatibility mismatch.              try{ -                usrp2_iface::sptr iface = usrp2_iface::make(udp_simple::make_connected( -                    new_addr["addr"], BOOST_STRINGIZE(USRP2_UDP_CTRL_PORT) -                )); +                usrp2_iface::sptr iface = usrp2_iface::make(ctrl_xport);                  if (iface->is_device_locked()) continue; //ignore locked devices                  mboard_eeprom_t mb_eeprom = iface->mb_eeprom;                  new_addr["name"] = mb_eeprom["name"]; | 
