diff options
| -rw-r--r-- | host/lib/usrp/common/ad9361_driver/ad9361_device.cpp | 29 | ||||
| -rw-r--r-- | host/lib/usrp/common/ad9361_driver/ad9361_device.h | 2 | ||||
| -rw-r--r-- | host/lib/usrp/cores/rx_dsp_core_3000.cpp | 2 | 
3 files changed, 24 insertions, 9 deletions
diff --git a/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp b/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp index 7e574920a..97b214d7d 100644 --- a/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp +++ b/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp @@ -135,30 +135,39 @@ void ad9361_device_t::_program_fir_filter(direction_t direction, int num_taps, b      _io_iface->poke8(base + 5, reg_numtaps | 0x1A);      if (direction == RX) {          _io_iface->poke8(base + 5, reg_numtaps | 0x18); +        /* Rx Gain, set to prevent digital overflow/saturation in filters +           0:+6dB, 1:0dB, 2:-6dB, 3:-12dB +           page 35 of UG-671 */          _io_iface->poke8(base + 6, 0x02); /* Also turn on -6dB Rx gain here, to stop filter overfow.*/      } else { -        _io_iface->poke8(base + 5, reg_numtaps | 0x19); /* Also turn on -6dB Tx gain here, to stop filter overfow.*/ +        /* Tx Gain. bit[0]. set to prevent digital overflow/saturation in filters +           0: 0dB, 1:-6dB +           page 25 of UG-671 */ +        _io_iface->poke8(base + 5, reg_numtaps | 0x18);      }  }  /* Program the RX FIR Filter. */ -void ad9361_device_t::_setup_rx_fir(size_t num_taps, boost::int32_t interpolation) +void ad9361_device_t::_setup_rx_fir(size_t num_taps, boost::int32_t decimation)  { +    if (not (decimation == 1 or decimation == 2 or decimation == 4)) { +        throw uhd::runtime_error("[ad9361_device_t] Invalid Rx FIR decimation."); +    }      boost::scoped_array<boost::uint16_t> coeffs(new boost::uint16_t[num_taps]);      for (size_t i = 0; i < num_taps; i++) {          switch (num_taps) {          case 128: -            coeffs[i] = boost::uint16_t((interpolation==4) ? fir_128_x4_coeffs[i] : hb127_coeffs[i]); +            coeffs[i] = boost::uint16_t((decimation==4) ? fir_128_x4_coeffs[i] : hb127_coeffs[i]);              break;          case 96: -            coeffs[i] = boost::uint16_t((interpolation==4) ? fir_96_x4_coeffs[i] : hb95_coeffs[i]); +            coeffs[i] = boost::uint16_t((decimation==4) ? fir_96_x4_coeffs[i] : hb95_coeffs[i]);              break;          case 64: -            coeffs[i] = boost::uint16_t((interpolation==4) ? fir_64_x4_coeffs[i] : hb63_coeffs[i]); +            coeffs[i] = boost::uint16_t((decimation==4) ? fir_64_x4_coeffs[i] : hb63_coeffs[i]);              break;          case 48: -            coeffs[i] = boost::uint16_t((interpolation==4) ? fir_48_x4_coeffs[i] : hb47_coeffs[i]); +            coeffs[i] = boost::uint16_t((decimation==4) ? fir_48_x4_coeffs[i] : hb47_coeffs[i]);              break;          default:              throw uhd::runtime_error("[ad9361_device_t] Unsupported number of Rx FIR taps."); @@ -171,11 +180,17 @@ void ad9361_device_t::_setup_rx_fir(size_t num_taps, boost::int32_t interpolatio  /* Program the TX FIR Filter. */  void ad9361_device_t::_setup_tx_fir(size_t num_taps, boost::int32_t interpolation)  { +    if (not (interpolation == 1 or interpolation == 2 or interpolation == 4)) { +        throw uhd::runtime_error("[ad9361_device_t] Invalid Tx FIR interpolation."); +    } +    if (interpolation == 1 and num_taps > 64) { +        throw uhd::runtime_error("[ad9361_device_t] Too many Tx FIR taps for interpolation value."); +    }      boost::scoped_array<boost::uint16_t> coeffs(new boost::uint16_t[num_taps]);      for (size_t i = 0; i < num_taps; i++) {          switch (num_taps) {          case 128: -	    coeffs[i] = boost::uint16_t((interpolation==4) ? fir_128_x4_coeffs[i] : hb127_coeffs[i]); +            coeffs[i] = boost::uint16_t((interpolation==4) ? fir_128_x4_coeffs[i] : hb127_coeffs[i]);              break;          case 96:              coeffs[i] = boost::uint16_t((interpolation==4) ? fir_96_x4_coeffs[i] : hb95_coeffs[i]); diff --git a/host/lib/usrp/common/ad9361_driver/ad9361_device.h b/host/lib/usrp/common/ad9361_driver/ad9361_device.h index fead90424..ca83f3037 100644 --- a/host/lib/usrp/common/ad9361_driver/ad9361_device.h +++ b/host/lib/usrp/common/ad9361_driver/ad9361_device.h @@ -74,7 +74,7 @@ public:  private:    //Methods      void _program_fir_filter(direction_t direction, int num_taps, boost::uint16_t *coeffs);      void _setup_tx_fir(size_t num_taps, boost::int32_t interpolation); -    void _setup_rx_fir(size_t num_taps, boost::int32_t interpolation); +    void _setup_rx_fir(size_t num_taps, boost::int32_t decimation);      void _calibrate_lock_bbpll();      void _calibrate_synth_charge_pumps();      double _calibrate_baseband_rx_analog_filter(); diff --git a/host/lib/usrp/cores/rx_dsp_core_3000.cpp b/host/lib/usrp/cores/rx_dsp_core_3000.cpp index 32866880f..13d69920a 100644 --- a/host/lib/usrp/cores/rx_dsp_core_3000.cpp +++ b/host/lib/usrp/cores/rx_dsp_core_3000.cpp @@ -138,7 +138,7 @@ public:          }          if (_is_b200) { -            _iface->poke32(REG_DSP_RX_DECIM, (hb1 << 9) | (hb0 << 8) | (decim & 0xff)); +            _iface->poke32(REG_DSP_RX_DECIM, (hb0 << 9) /*small HB */ | (hb1 << 8) /*large HB*/ | (decim & 0xff));              if (decim > 1 and hb0 == 0 and hb1 == 0) {                  UHD_MSG(warning) << boost::format(  | 
