diff options
| author | Martin Braun <martin.braun@ettus.com> | 2017-07-17 18:44:48 -0700 | 
|---|---|---|
| committer | Martin Braun <martin.braun@ettus.com> | 2017-07-17 18:44:48 -0700 | 
| commit | 3d5176874f90f9155c1591656df8a7d663b3c712 (patch) | |
| tree | 3693c123057a9420b273f595e6609fb32343130c /host/lib | |
| parent | 47c853f9dd518ef25d23b94bc0e77dbda3c2ddab (diff) | |
| parent | 684fd3a3ffaf31b9fa726ccf2fdea2627f6ea10d (diff) | |
| download | uhd-3d5176874f90f9155c1591656df8a7d663b3c712.tar.gz uhd-3d5176874f90f9155c1591656df8a7d663b3c712.tar.bz2 uhd-3d5176874f90f9155c1591656df8a7d663b3c712.zip  | |
Merge branch 'maint'
Diffstat (limited to 'host/lib')
| -rw-r--r-- | host/lib/usrp/dboard/db_sbx_common.cpp | 27 | ||||
| -rw-r--r-- | host/lib/usrp/dboard/db_sbx_common.hpp | 29 | ||||
| -rw-r--r-- | host/lib/usrp/dboard/db_ubx.cpp | 16 | ||||
| -rw-r--r-- | host/lib/usrp/x300/x300_impl.cpp | 16 | 
4 files changed, 66 insertions, 22 deletions
diff --git a/host/lib/usrp/dboard/db_sbx_common.cpp b/host/lib/usrp/dboard/db_sbx_common.cpp index 8df4028e7..42c080155 100644 --- a/host/lib/usrp/dboard/db_sbx_common.cpp +++ b/host/lib/usrp/dboard/db_sbx_common.cpp @@ -118,27 +118,24 @@ sbx_xcvr::sbx_xcvr(ctor_args_t args) : xcvr_dboard_base(args){      switch(get_rx_id().to_uint16()) {          case 0x0054:              db_actual = sbx_versionx_sptr(new sbx_version3(this)); -            freq_range = sbx_freq_range; +            freq_range =          sbx_freq_range; +            enable_rx_lo_filter = sbx_enable_rx_lo_filter; +            enable_tx_lo_filter = sbx_enable_tx_lo_filter;              break;          case 0x0065: -            db_actual = sbx_versionx_sptr(new sbx_version4(this)); -            freq_range = sbx_freq_range; -            break; -        case 0x0067: -            db_actual = sbx_versionx_sptr(new cbx(this)); -            freq_range = cbx_freq_range; -            break;          case 0x0069: -            db_actual = sbx_versionx_sptr(new sbx_version4(this)); -            freq_range = sbx_freq_range; -            break;          case 0x0083:              db_actual = sbx_versionx_sptr(new sbx_version4(this)); -            freq_range = sbx_freq_range; +            freq_range =          sbx_freq_range; +            enable_rx_lo_filter = sbx_enable_rx_lo_filter; +            enable_tx_lo_filter = sbx_enable_tx_lo_filter;              break; +        case 0x0067:          case 0x0085:              db_actual = sbx_versionx_sptr(new cbx(this)); -            freq_range = cbx_freq_range; +            freq_range =          cbx_freq_range; +            enable_rx_lo_filter = cbx_enable_rx_lo_filter; +            enable_tx_lo_filter = cbx_enable_tx_lo_filter;              break;          default:              /* We didn't recognize the version of the board... */ @@ -256,8 +253,8 @@ void sbx_xcvr::update_atr(void){      //calculate atr pins      int rx_pga0_iobits = rx_pga0_gain_to_iobits(_rx_gains["PGA0"]);      int tx_pga0_iobits = tx_pga0_gain_to_iobits(_tx_gains["PGA0"]); -    int rx_lo_lpf_en = (_rx_lo_freq == sbx_enable_rx_lo_filter.clip(_rx_lo_freq)) ? LO_LPF_EN : 0; -    int tx_lo_lpf_en = (_tx_lo_freq == sbx_enable_tx_lo_filter.clip(_tx_lo_freq)) ? LO_LPF_EN : 0; +    int rx_lo_lpf_en = (_rx_lo_freq == enable_rx_lo_filter.clip(_rx_lo_freq)) ? LO_LPF_EN : 0; +    int tx_lo_lpf_en = (_tx_lo_freq == enable_tx_lo_filter.clip(_tx_lo_freq)) ? LO_LPF_EN : 0;      int rx_ld_led = _rx_lo_lock_cache ? 0 : RX_LED_LD;      int tx_ld_led = _tx_lo_lock_cache ? 0 : TX_LED_LD;      int rx_ant_led = _rx_ant == "TX/RX" ? RX_LED_RX1RX2 : 0; diff --git a/host/lib/usrp/dboard/db_sbx_common.hpp b/host/lib/usrp/dboard/db_sbx_common.hpp index 0e4dc5ace..8f305a7c4 100644 --- a/host/lib/usrp/dboard/db_sbx_common.hpp +++ b/host/lib/usrp/dboard/db_sbx_common.hpp @@ -116,6 +116,14 @@ static const freq_range_t sbx_enable_rx_lo_filter = list_of      (range_t(0.4e9, 1.5e9))  ; +static const freq_range_t cbx_enable_tx_lo_filter = list_of +    (range_t(1.2e9, 2e9)) +; + +static const freq_range_t cbx_enable_rx_lo_filter = list_of +    (range_t(1.2e9, 2e9)) +; +  static const std::vector<std::string> sbx_tx_antennas = list_of("TX/RX")("CAL");  static const std::vector<std::string> sbx_rx_antennas = list_of("TX/RX")("RX2")("CAL"); @@ -226,9 +234,12 @@ protected:      /*!       * CBX daughterboard       * -     * The only driver difference between SBX and CBX is the MAX2870 vs. ADF435x. -     * There is also no LO filter switching required, but the GPIO is left blank -     * so we don't worry about it. +     * There are a few differences between SBX and CBX +     * - The CBX and SBX use the MAX2870 and ADF435x respectively for LOs +     * - There are different frequency ranges +     * - There are different LO LPF cutoff frequencies +     * There is also no LO filter switching required on CBX, but the GPIO is left +     * blank so we don't worry about it.       */      class cbx : public sbx_versionx {      public: @@ -252,6 +263,18 @@ protected:      freq_range_t freq_range;      /*! +    * Frequency range to use the LO LPF in RX; this is set in the constructor +    * to correspond either to SBX or CBX. +    */ +    freq_range_t enable_rx_lo_filter; + +    /*! +    * Frequency range to use the LO LPF in TX; this is set in the constructor +    * to correspond either to SBX or CBX. +    */ +    freq_range_t enable_tx_lo_filter; + +    /*!       * Handle to the version-specific implementation of the SBX.       *       * Since many of this class's functions are dependent on the version of the diff --git a/host/lib/usrp/dboard/db_ubx.cpp b/host/lib/usrp/dboard/db_ubx.cpp index d25aabe98..21308b08c 100644 --- a/host/lib/usrp/dboard/db_ubx.cpp +++ b/host/lib/usrp/dboard/db_ubx.cpp @@ -295,6 +295,7 @@ public:          _tx_target_pfd_freq = pfd_freq_max;          if (_rev >= 1)          { +            bool can_set_clock_rate = true;              // set dboard clock rates to as close to the max PFD freq as possible              if (_iface->get_clock_rate(dboard_iface::UNIT_RX) > pfd_freq_max)              { @@ -305,10 +306,15 @@ public:                      if (rate <= pfd_freq_max and rate > highest_rate)                          highest_rate = rate;                  } -                _iface->set_clock_rate(dboard_iface::UNIT_RX, highest_rate); +                try { +                    _iface->set_clock_rate(dboard_iface::UNIT_RX, highest_rate); +                } catch (const uhd::not_implemented_error &) { +                    UHD_MSG(warning) << "Unable to set dboard clock rate - phase will vary" << std::endl; +                    can_set_clock_rate = false; +                }                  _rx_target_pfd_freq = highest_rate;              } -            if (_iface->get_clock_rate(dboard_iface::UNIT_TX) > pfd_freq_max) +            if (can_set_clock_rate and _iface->get_clock_rate(dboard_iface::UNIT_TX) > pfd_freq_max)              {                  std::vector<double> rates = _iface->get_clock_rates(dboard_iface::UNIT_TX);                  double highest_rate = 0.0; @@ -317,7 +323,11 @@ public:                      if (rate <= pfd_freq_max and rate > highest_rate)                          highest_rate = rate;                  } -                _iface->set_clock_rate(dboard_iface::UNIT_TX, highest_rate); +                try { +                    _iface->set_clock_rate(dboard_iface::UNIT_TX, highest_rate); +                } catch (const uhd::not_implemented_error &) { +                    UHD_MSG(warning) << "Unable to set dboard clock rate - phase will vary" << std::endl; +                }                  _tx_target_pfd_freq = highest_rate;              }          } diff --git a/host/lib/usrp/x300/x300_impl.cpp b/host/lib/usrp/x300/x300_impl.cpp index 1c8eeab51..1e22f7fb7 100644 --- a/host/lib/usrp/x300/x300_impl.cpp +++ b/host/lib/usrp/x300/x300_impl.cpp @@ -332,7 +332,21 @@ device_addrs_t x300_find(const device_addr_t &hint_)              //call discover with the new hint and append results              device_addrs_t new_addrs = x300_find(new_hint); -            addrs.insert(addrs.begin(), new_addrs.begin(), new_addrs.end()); +            //if we are looking for a serial, only add the one device with a matching serial +            if (hint.has_key("serial")) { +                bool found_serial = false; //signal to break out of the interface loop +                for (device_addrs_t::iterator new_addr_it=new_addrs.begin(); new_addr_it != new_addrs.end(); new_addr_it++) { +                    if ((*new_addr_it)["serial"] == hint["serial"]) { +                        addrs.insert(addrs.begin(), *new_addr_it); +                        found_serial = true; +                        break; +                    } +                } +                if (found_serial) break; +            } else { +                // Otherwise, add all devices we find +                addrs.insert(addrs.begin(), new_addrs.begin(), new_addrs.end()); +            }          }      }  | 
