diff options
Diffstat (limited to 'host/lib')
| -rw-r--r-- | host/lib/usrp/b200/b200_impl.cpp | 14 | ||||
| -rw-r--r-- | host/lib/usrp/common/ad9361_ctrl.cpp | 28 | ||||
| -rw-r--r-- | host/lib/usrp/common/ad9361_ctrl.hpp | 15 | ||||
| -rw-r--r-- | host/lib/usrp/common/ad9361_driver/ad9361_device.cpp | 125 | ||||
| -rw-r--r-- | host/lib/usrp/common/ad9361_driver/ad9361_device.h | 9 | ||||
| -rw-r--r-- | host/lib/usrp/common/ad9361_driver/ad9361_gain_tables.h | 162 | 
6 files changed, 245 insertions, 108 deletions
| diff --git a/host/lib/usrp/b200/b200_impl.cpp b/host/lib/usrp/b200/b200_impl.cpp index c1729ead3..ada25ad59 100644 --- a/host/lib/usrp/b200/b200_impl.cpp +++ b/host/lib/usrp/b200/b200_impl.cpp @@ -591,7 +591,7 @@ b200_impl::b200_impl(const device_addr_t &device_addr)  b200_impl::~b200_impl(void)  { -	UHD_SAFE_CALL +    UHD_SAFE_CALL      (          _async_task.reset();      ) @@ -702,7 +702,7 @@ void b200_impl::setup_radio(const size_t dspno)          _tree->create<bool>(rf_fe_path / "use_lo_offset").set(false);          _tree->create<double>(rf_fe_path / "bandwidth" / "value")              .coerce(boost::bind(&ad9361_ctrl::set_bw_filter, _codec_ctrl, key, _1)) -            .set(40e6); +            .set(56e6);          _tree->create<meta_range_t>(rf_fe_path / "bandwidth" / "range")              .publish(boost::bind(&ad9361_ctrl::get_bw_filter_range, key));          _tree->create<double>(rf_fe_path / "freq" / "value") @@ -715,6 +715,16 @@ void b200_impl::setup_radio(const size_t dspno)                  .publish(boost::bind(&ad9361_ctrl::get_temperature, _codec_ctrl));          //setup RX related stuff +        if(direction) +        { +            _tree->create<bool>(rf_fe_path / "dc_offset" / "enable" ) +                .subscribe(boost::bind(&ad9361_ctrl::set_dc_offset_auto, _codec_ctrl, key, _1)).set(true); + +            _tree->create<bool>(rf_fe_path / "iq_balance" / "enable" ) +                .subscribe(boost::bind(&ad9361_ctrl::set_iq_balance_auto, _codec_ctrl, key, _1)).set(true); +        } + +        //setup antenna stuff          if (key[0] == 'R')          {              static const std::vector<std::string> ants = boost::assign::list_of("TX/RX")("RX2"); diff --git a/host/lib/usrp/common/ad9361_ctrl.cpp b/host/lib/usrp/common/ad9361_ctrl.cpp index 3db6739e7..4a3c17cf1 100644 --- a/host/lib/usrp/common/ad9361_ctrl.cpp +++ b/host/lib/usrp/common/ad9361_ctrl.cpp @@ -178,6 +178,34 @@ public:          return sensor_value_t("temp", _device.get_average_temperature(), "C");      } +    void set_dc_offset_auto(const std::string &which, const bool on) +    { +        boost::lock_guard<boost::mutex> lock(_mutex); + +        ad9361_device_t::direction_t direction = _get_direction_from_antenna(which); +        _device.set_dc_offset_auto(direction,on); +    } + +    void set_dc_offset(const std::string &which, const std::complex<double> value) +    { +        //This feature should not be used according to Analog Devices +        throw uhd::runtime_error("ad9361_ctrl::set_dc_offset this feature is not supported on this device."); +    } + +    void set_iq_balance_auto(const std::string &which, const bool on) +    { +        boost::lock_guard<boost::mutex> lock(_mutex); + +        ad9361_device_t::direction_t direction = _get_direction_from_antenna(which); +        _device.set_iq_balance_auto(direction,on); +    } + +    void set_iq_balance(const std::string &which, const std::complex<double> value) +    { +        //This feature should not be used according to Analog Devices +        throw uhd::runtime_error("ad9361_ctrl::set_iq_balance this feature is not supported on this device."); +    } +  private:      static ad9361_device_t::direction_t _get_direction_from_antenna(const std::string& antenna)      { diff --git a/host/lib/usrp/common/ad9361_ctrl.hpp b/host/lib/usrp/common/ad9361_ctrl.hpp index f831f870d..94eee608e 100644 --- a/host/lib/usrp/common/ad9361_ctrl.hpp +++ b/host/lib/usrp/common/ad9361_ctrl.hpp @@ -25,6 +25,7 @@  #include <boost/shared_ptr.hpp>  #include <ad9361_device.h>  #include <string> +#include <complex>  namespace uhd { namespace usrp { @@ -95,7 +96,19 @@ public:      //! tune the given frontend, return the exact value      virtual double tune(const std::string &which, const double value) = 0; -    //! turn on/off data port loopback +    //! set the DC offset for I and Q manually +    virtual void set_dc_offset(const std::string &which, const std::complex<double> value) = 0; + +    //! enable or disable the BB/RF DC tracking feature +    virtual void set_dc_offset_auto(const std::string &which, const bool on) = 0; + +    //! set the IQ correction value manually +    virtual void set_iq_balance(const std::string &which, const std::complex<double> value) = 0; + +    //! enable or disable the quadrature calibration +    virtual void set_iq_balance_auto(const std::string &which, const bool on) = 0; + +    //! turn on/off Catalina's data port loopback      virtual void data_port_loopback(const bool on) = 0;      //! read internal RSSI sensor diff --git a/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp b/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp index f1a82d71c..e5938184c 100644 --- a/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp +++ b/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp @@ -11,6 +11,7 @@  #include <cmath>  #include <uhd/exception.hpp>  #include <uhd/utils/log.hpp> +#include <uhd/utils/msg.hpp>  #include <boost/cstdint.hpp>  #include <boost/date_time/posix_time/posix_time.hpp>  #include <boost/thread/thread.hpp> @@ -650,11 +651,12 @@ void ad9361_device_t::_setup_adc()  }  /* Calibrate the baseband DC offset. - * - * Note that this function is called from within the TX quadrature - * calibration function! */ + * Disables tracking + */  void ad9361_device_t::_calibrate_baseband_dc_offset()  { +    _io_iface->poke8(0x18b, 0x83); //Reset RF DC tracking flag +      _io_iface->poke8(0x193, 0x3f); // Calibration settings      _io_iface->poke8(0x190, 0x0f); // Set tracking coefficient      //write_ad9361_reg(device, 0x190, /*0x0f*//*0xDF*/0x80*1 | 0x40*1 | (16+8/*+4*/)); // Set tracking coefficient: don't *4 counter, do decim /4, increased gain shift @@ -674,9 +676,8 @@ void ad9361_device_t::_calibrate_baseband_dc_offset()  }  /* Calibrate the RF DC offset. - * - * Note that this function is called from within the TX quadrature - * calibration function. */ + * Disables tracking + */  void ad9361_device_t::_calibrate_rf_dc_offset()  {      /* Some settings are frequency-dependent. */ @@ -691,7 +692,7 @@ void ad9361_device_t::_calibrate_rf_dc_offset()      }      _io_iface->poke8(0x185, 0x20); // RF DC Offset wait count -    _io_iface->poke8(0x18b, 0x83); +    _io_iface->poke8(0x18b, 0x83); // Disable tracking      _io_iface->poke8(0x189, 0x30);      /* Run the calibration! */ @@ -707,6 +708,16 @@ void ad9361_device_t::_calibrate_rf_dc_offset()      }  } +void ad9361_device_t::_configure_bb_rf_dc_tracking(const bool on) +{ +    if(on) +    { +        _io_iface->poke8(0x18b, 0xad); // Enable BB and RF DC tracking +    } else { +        _io_iface->poke8(0x18b, 0x83); // Disable BB and RF DC tracking +    } +} +  /* Start the RX quadrature calibration.   *   * Note that we are using AD9361's 'tracking' feature for RX quadrature @@ -719,16 +730,20 @@ void ad9361_device_t::_calibrate_rx_quadrature()      _io_iface->poke8(0x16e, 0x25); // RX Gain index to use for cal      _io_iface->poke8(0x16a, 0x75); // Set Kexp phase      _io_iface->poke8(0x16b, 0x15); // Set Kexp amplitude -    _io_iface->poke8(0x169, 0xcf); // Continuous tracking mode -    _io_iface->poke8(0x18b, 0xad); + +    if(_use_iq_balance_correction) +    { +        _io_iface->poke8(0x169, 0xcf); // Continuous tracking mode. Gets disabled in _tx_quadrature_cal_routine! +    }  } -/* TX quadtrature calibration routine. +/* TX quadrature calibration routine.   *   * The TX quadrature needs to be done twice, once for each TX chain, with   * only one register change in between. Thus, this function enacts the   * calibrations, and it is called from calibrate_tx_quadrature. */  void ad9361_device_t::_tx_quadrature_cal_routine() { +      /* This is a weird process, but here is how it works:       * 1) Read the calibrated NCO frequency bits out of 0A3.       * 2) Write the two bits to the RX NCO freq part of 0A0. @@ -773,12 +788,6 @@ void ad9361_device_t::_tx_quadrature_cal_routine() {      _io_iface->poke8(0x0a4, 0xf0); // Cal setting conut      _io_iface->poke8(0x0ae, 0x00); // Cal LPF gain index (split mode) -    /* First, calibrate the baseband DC offset. */ -    _calibrate_baseband_dc_offset(); - -    /* Second, calibrate the RF DC offset. */ -    _calibrate_rf_dc_offset(); -      /* Now, calibrate the TX quadrature! */      size_t count = 0;      _io_iface->poke8(0x016, 0x10); @@ -793,9 +802,7 @@ void ad9361_device_t::_tx_quadrature_cal_routine() {  }  /* Run the TX quadrature calibration. - * - * Note that from within this function we are also triggering the baseband - * and RF DC calibrations. */ + */  void ad9361_device_t::_calibrate_tx_quadrature()  {      /* Make sure we are, in fact, in the ALERT state. If not, something is @@ -879,7 +886,7 @@ void ad9361_device_t::_program_mixer_gm_subtable()  void ad9361_device_t::_program_gain_table() {      /* Figure out which gain table we should be using for our current       * frequency band. */ -    boost::uint8_t (*gain_table)[5] = NULL; +    boost::uint8_t (*gain_table)[3] = NULL;      boost::uint8_t new_gain_table;      if (_rx_freq < 1300e6) {          gain_table = gain_table_sub_1300mhz; @@ -910,9 +917,9 @@ void ad9361_device_t::_program_gain_table() {      boost::uint8_t index = 0;      for (; index < 77; index++) {          _io_iface->poke8(0x130, index); -        _io_iface->poke8(0x131, gain_table[index][1]); -        _io_iface->poke8(0x132, gain_table[index][2]); -        _io_iface->poke8(0x133, gain_table[index][3]); +        _io_iface->poke8(0x131, gain_table[index][0]); +        _io_iface->poke8(0x132, gain_table[index][1]); +        _io_iface->poke8(0x133, gain_table[index][2]);          _io_iface->poke8(0x137, 0x1E);          _io_iface->poke8(0x134, 0x00);          _io_iface->poke8(0x134, 0x00); @@ -1256,6 +1263,7 @@ double ad9361_device_t::_setup_rates(const double rate)      int divfactor = 0;      _tfir_factor = 0;      _rfir_factor = 0; +      if (rate < 0.33e6) {          // RX1 + RX2 enabled, 3, 2, 2, 4          _regs.rxfilt = B8(11101111); @@ -1411,6 +1419,8 @@ void ad9361_device_t::initialize()      _rx2_gain = 0;      _tx1_gain = 0;      _tx2_gain = 0; +    _use_dc_offset_correction = true; +    _use_iq_balance_correction = true;      /* Reset the device. */      _io_iface->poke8(0x000, 0x01); @@ -1563,8 +1573,11 @@ void ad9361_device_t::initialize()      _setup_adc(); +    _calibrate_baseband_dc_offset(); +    _calibrate_rf_dc_offset();      _calibrate_tx_quadrature();      _calibrate_rx_quadrature(); +    _configure_bb_rf_dc_tracking(_use_dc_offset_correction);      // cals done, set PPORT config      switch (_client_params->get_digital_interface_mode()) { @@ -1687,8 +1700,11 @@ double ad9361_device_t::set_clock_rate(const double req_rate)      _setup_adc(); +    _calibrate_baseband_dc_offset(); +    _calibrate_rf_dc_offset();      _calibrate_tx_quadrature();      _calibrate_rx_quadrature(); +    _configure_bb_rf_dc_tracking(_use_dc_offset_correction);      // cals done, set PPORT config      switch (_client_params->get_digital_interface_mode()) { @@ -1841,9 +1857,11 @@ double ad9361_device_t::tune(direction_t direction, const double value)      _reprogram_gains();      /* Run the calibration algorithms. */ +    _calibrate_baseband_dc_offset(); +    _calibrate_rf_dc_offset();      _calibrate_tx_quadrature();      _calibrate_rx_quadrature(); - +    _configure_bb_rf_dc_tracking(_use_dc_offset_correction); //if this is not done here, bb dc offset is not good      /* If we were in the FDD state, return it now. */      if (not_in_alert) {          _io_iface->poke8(0x014, 0x21); @@ -1990,4 +2008,63 @@ double ad9361_device_t::get_average_temperature(const double cal_offset, const s      return d_temp;  } +void ad9361_device_t::set_dc_offset_auto(direction_t direction, const bool on) +{ +    if(direction == RX) +    { +         _use_dc_offset_correction = on; +         _configure_bb_rf_dc_tracking(_use_dc_offset_correction); +        if(on) +        { +            _io_iface->poke8(0x182, (_io_iface->peek8(0x182) & (~((1 << 7) | (1 << 6) | (1 << 3) | (1 << 2))))); //Clear force bits +            //Do a single shot DC offset cal before enabling tracking (Not possible if not in ALERT state. Is it necessary?) +        } else { +            //clear current config values +            _io_iface->poke8(0x182, (_io_iface->peek8(0x182) | ((1 << 7) | (1 << 6) | (1 << 3) | (1 << 2)))); //Set input A and input B&C force enable bits +            _io_iface->poke8(0x174, 0x00); +            _io_iface->poke8(0x175, 0x00); +            _io_iface->poke8(0x176, 0x00); +            _io_iface->poke8(0x177, 0x00); +            _io_iface->poke8(0x178, 0x00); +            _io_iface->poke8(0x17D, 0x00); +            _io_iface->poke8(0x17E, 0x00); +            _io_iface->poke8(0x17F, 0x00); +            _io_iface->poke8(0x180, 0x00); +            _io_iface->poke8(0x181, 0x00); +        } +    } else { +        // DC offset is removed during TX quad cal +        throw uhd::runtime_error("[ad9361_device_t] [set_iq_balance_auto] INVALID_CODE_PATH"); +    } +} + +void ad9361_device_t::set_iq_balance_auto(direction_t direction, const bool on) +{ +    if(direction == RX) +    { +        _use_iq_balance_correction = on; +        if(on) +        { +            //disable force registers and enable tracking +            _io_iface->poke8(0x182, (_io_iface->peek8(0x182) & (~ ( (1<<1) | (1<<0) | (1<<5) | (1<<4) )))); +            _calibrate_rx_quadrature(); +        } else { +            //disable IQ tracking +            _io_iface->poke8(0x169, 0xc0); +            //clear current config values +            _io_iface->poke8(0x182, (_io_iface->peek8(0x182) | ((1 << 1) | (1 << 0) | (1 << 5) | (1 << 4)))); //Set Rx2 input B&C force enable bit +            _io_iface->poke8(0x17B, 0x00); +            _io_iface->poke8(0x17C, 0x00); +            _io_iface->poke8(0x179, 0x00); +            _io_iface->poke8(0x17A, 0x00); +            _io_iface->poke8(0x170, 0x00); +            _io_iface->poke8(0x171, 0x00); +            _io_iface->poke8(0x172, 0x00); +            _io_iface->poke8(0x173, 0x00); +        } +    } else { +        throw uhd::runtime_error("[ad9361_device_t] [set_iq_balance_auto] INVALID_CODE_PATH"); +    } +} +  }} diff --git a/host/lib/usrp/common/ad9361_driver/ad9361_device.h b/host/lib/usrp/common/ad9361_driver/ad9361_device.h index 8f64922f8..93dc413d5 100644 --- a/host/lib/usrp/common/ad9361_driver/ad9361_device.h +++ b/host/lib/usrp/common/ad9361_driver/ad9361_device.h @@ -72,6 +72,12 @@ public:       */      double get_average_temperature(const double cal_offset = -30.0, const size_t num_samples = 3); +    /* Turn on/off AD9361's RX DC offset correction */ +    void set_dc_offset_auto(direction_t direction, const bool on); + +    /* Turn on/off AD9361's RX IQ imbalance correction */ +    void set_iq_balance_auto(direction_t direction, const bool on); +      //Constants      static const double AD9361_MAX_GAIN;      static const double AD9361_MAX_CLOCK_RATE; @@ -102,6 +108,7 @@ private:    //Methods      double _tune_helper(direction_t direction, const double value);      double _setup_rates(const double rate);      double _get_temperature(const double cal_offset, const double timeout = 0.1); +    void _configure_bb_rf_dc_tracking(const bool on);  private:    //Members      typedef struct { @@ -130,6 +137,8 @@ private:    //Members      chip_regs_t         _regs;      //Synchronization      boost::recursive_mutex  _mutex; +    bool _use_dc_offset_correction; +    bool _use_iq_balance_correction;  };  }}  //namespace diff --git a/host/lib/usrp/common/ad9361_driver/ad9361_gain_tables.h b/host/lib/usrp/common/ad9361_driver/ad9361_gain_tables.h index 786029d6e..553655fa5 100644 --- a/host/lib/usrp/common/ad9361_driver/ad9361_gain_tables.h +++ b/host/lib/usrp/common/ad9361_driver/ad9361_gain_tables.h @@ -7,91 +7,91 @@  #include <boost/cstdint.hpp> -boost::uint8_t gain_table_sub_1300mhz[77][5] = { {0,0x00,0x00,0x20,1}, -    {1,0x00,0x00,0x00,0}, {2,0x00,0x00,0x00,0}, {3,0x00,0x01,0x00,0}, -    {4,0x00,0x02,0x00,0}, {5,0x00,0x03,0x00,0}, {6,0x00,0x04,0x00,0}, -    {7,0x00,0x05,0x00,0}, {8,0x01,0x03,0x20,1}, {9,0x01,0x04,0x00,0}, -    {10,0x01,0x05,0x00,0}, {11,0x01,0x06,0x00,0}, {12,0x01,0x07,0x00,0}, -    {13,0x01,0x08,0x00,0}, {14,0x01,0x09,0x00,0}, {15,0x01,0x0A,0x00,0}, -    {16,0x01,0x0B,0x00,0}, {17,0x01,0x0C,0x00,0}, {18,0x01,0x0D,0x00,0}, -    {19,0x01,0x0E,0x00,0}, {20,0x02,0x09,0x20,1}, {21,0x02,0x0A,0x00,0}, -    {22,0x02,0x0B,0x00,0}, {23,0x02,0x0C,0x00,0}, {24,0x02,0x0D,0x00,0}, -    {25,0x02,0x0E,0x00,0}, {26,0x02,0x0F,0x00,0}, {27,0x02,0x10,0x00,0}, -    {28,0x02,0x2B,0x20,1}, {29,0x02,0x2C,0x00,0}, {30,0x04,0x27,0x20,1}, -    {31,0x04,0x28,0x00,0}, {32,0x04,0x29,0x00,0}, {33,0x04,0x2A,0x00,0}, -    {34,0x04,0x2B,0x00,1}, {35,0x24,0x21,0x20,0}, {36,0x24,0x22,0x00,1}, -    {37,0x44,0x20,0x20,0}, {38,0x44,0x21,0x00,0}, {39,0x44,0x22,0x00,0}, -    {40,0x44,0x23,0x00,0}, {41,0x44,0x24,0x00,0}, {42,0x44,0x25,0x00,0}, -    {43,0x44,0x26,0x00,0}, {44,0x44,0x27,0x00,0}, {45,0x44,0x28,0x00,0}, -    {46,0x44,0x29,0x00,0}, {47,0x44,0x2A,0x00,0}, {48,0x44,0x2B,0x00,0}, -    {49,0x44,0x2C,0x00,0}, {50,0x44,0x2D,0x00,0}, {51,0x44,0x2E,0x00,0}, -    {52,0x44,0x2F,0x00,0}, {53,0x44,0x30,0x00,0}, {54,0x44,0x31,0x00,0}, -    {55,0x64,0x2E,0x20,1}, {56,0x64,0x2F,0x00,0}, {57,0x64,0x30,0x00,0}, -    {58,0x64,0x31,0x00,0}, {59,0x64,0x32,0x00,0}, {60,0x64,0x33,0x00,0}, -    {61,0x64,0x34,0x00,0}, {62,0x64,0x35,0x00,0}, {63,0x64,0x36,0x00,0}, -    {64,0x64,0x37,0x00,0}, {65,0x64,0x38,0x00,0}, {66,0x65,0x38,0x20,1}, -    {67,0x66,0x38,0x20,1}, {68,0x67,0x38,0x20,1}, {69,0x68,0x38,0x20,1}, -    {70,0x69,0x38,0x20,1}, {71,0x6A,0x38,0x20,1}, {72,0x6B,0x38,0x20,1}, -    {73,0x6C,0x38,0x20,1}, {74,0x6D,0x38,0x20,1}, {75,0x6E,0x38,0x20,1}, -    {76,0x6F,0x38,0x20,1}}; +boost::uint8_t gain_table_sub_1300mhz[77][3] = { +{ 0x00, 0x00, 0x20 }, { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00 }, +{ 0x00, 0x01, 0x00 }, { 0x00, 0x02, 0x00 }, { 0x00, 0x03, 0x00 }, +{ 0x00, 0x04, 0x00 }, { 0x00, 0x05, 0x00 }, { 0x01, 0x03, 0x20 }, +{ 0x01, 0x04, 0x00 }, { 0x01, 0x05, 0x00 }, { 0x01, 0x06, 0x00 }, +{ 0x01, 0x07, 0x00 }, { 0x01, 0x08, 0x00 }, { 0x01, 0x09, 0x00 }, +{ 0x01, 0x0A, 0x00 }, { 0x01, 0x0B, 0x00 }, { 0x01, 0x0C, 0x00 }, +{ 0x01, 0x0D, 0x00 }, { 0x01, 0x0E, 0x00 }, { 0x02, 0x09, 0x20 }, +{ 0x02, 0x0A, 0x00 }, { 0x02, 0x0B, 0x00 }, { 0x02, 0x0C, 0x00 }, +{ 0x02, 0x0D, 0x00 }, { 0x02, 0x0E, 0x00 }, { 0x02, 0x0F, 0x00 }, +{ 0x02, 0x10, 0x00 }, { 0x02, 0x2B, 0x20 }, { 0x02, 0x2C, 0x00 }, +{ 0x04, 0x28, 0x20 }, { 0x04, 0x29, 0x00 }, { 0x04, 0x2A, 0x00 }, +{ 0x04, 0x2B, 0x00 }, { 0x24, 0x20, 0x20 }, { 0x24, 0x21, 0x00 }, +{ 0x44, 0x20, 0x20 }, { 0x44, 0x21, 0x00 }, { 0x44, 0x22, 0x00 }, +{ 0x44, 0x23, 0x00 }, { 0x44, 0x24, 0x00 }, { 0x44, 0x25, 0x00 }, +{ 0x44, 0x26, 0x00 }, { 0x44, 0x27, 0x00 }, { 0x44, 0x28, 0x00 }, +{ 0x44, 0x29, 0x00 }, { 0x44, 0x2A, 0x00 }, { 0x44, 0x2B, 0x00 }, +{ 0x44, 0x2C, 0x00 }, { 0x44, 0x2D, 0x00 }, { 0x44, 0x2E, 0x00 }, +{ 0x44, 0x2F, 0x00 }, { 0x44, 0x30, 0x00 }, { 0x44, 0x31, 0x00 }, +{ 0x44, 0x32, 0x00 }, { 0x64, 0x2E, 0x20 }, { 0x64, 0x2F, 0x00 }, +{ 0x64, 0x30, 0x00 }, { 0x64, 0x31, 0x00 }, { 0x64, 0x32, 0x00 }, +{ 0x64, 0x33, 0x00 }, { 0x64, 0x34, 0x00 }, { 0x64, 0x35, 0x00 }, +{ 0x64, 0x36, 0x00 }, { 0x64, 0x37, 0x00 }, { 0x64, 0x38, 0x00 }, +{ 0x65, 0x38, 0x20 }, { 0x66, 0x38, 0x20 }, { 0x67, 0x38, 0x20 }, +{ 0x68, 0x38, 0x20 }, { 0x69, 0x38, 0x20 }, { 0x6A, 0x38, 0x20 }, +{ 0x6B, 0x38, 0x20 }, { 0x6C, 0x38, 0x20 }, { 0x6D, 0x38, 0x20 }, +{ 0x6E, 0x38, 0x20 }, { 0x6F, 0x38, 0x20 } }; -boost::uint8_t gain_table_1300mhz_to_4000mhz[77][5] = {   {0,0x00,0x00,0x20,1}, -    {1,0x00,0x00,0x00,0}, {2,0x00,0x00,0x00,0}, {3,0x00,0x01,0x00,0}, -    {4,0x00,0x02,0x00,0}, {5,0x00,0x03,0x00,0}, {6,0x00,0x04,0x00,0}, -    {7,0x00,0x05,0x00,0}, {8,0x01,0x03,0x20,1}, {9,0x01,0x04,0x00,0}, -    {10,0x01,0x05,0x00,0}, {11,0x01,0x06,0x00,0}, {12,0x01,0x07,0x00,0}, -    {13,0x01,0x08,0x00,0}, {14,0x01,0x09,0x00,0}, {15,0x01,0x0A,0x00,0}, -    {16,0x01,0x0B,0x00,0}, {17,0x01,0x0C,0x00,0}, {18,0x01,0x0D,0x00,0}, -    {19,0x01,0x0E,0x00,0}, {20,0x02,0x09,0x20,1}, {21,0x02,0x0A,0x00,0}, -    {22,0x02,0x0B,0x00,0}, {23,0x02,0x0C,0x00,0}, {24,0x02,0x0D,0x00,0}, -    {25,0x02,0x0E,0x00,0}, {26,0x02,0x0F,0x00,0}, {27,0x02,0x10,0x00,0}, -    {28,0x02,0x2B,0x20,1}, {29,0x02,0x2C,0x00,0}, {30,0x04,0x28,0x20,1}, -    {31,0x04,0x29,0x00,0}, {32,0x04,0x2A,0x00,0}, {33,0x04,0x2B,0x00,0}, -    {34,0x24,0x20,0x20,0}, {35,0x24,0x21,0x00,1}, {36,0x44,0x20,0x20,0}, -    {37,0x44,0x21,0x00,1}, {38,0x44,0x22,0x00,0}, {39,0x44,0x23,0x00,0}, -    {40,0x44,0x24,0x00,0}, {41,0x44,0x25,0x00,0}, {42,0x44,0x26,0x00,0}, -    {43,0x44,0x27,0x00,0}, {44,0x44,0x28,0x00,0}, {45,0x44,0x29,0x00,0}, -    {46,0x44,0x2A,0x00,0}, {47,0x44,0x2B,0x00,0}, {48,0x44,0x2C,0x00,0}, -    {49,0x44,0x2D,0x00,0}, {50,0x44,0x2E,0x00,0}, {51,0x44,0x2F,0x00,0}, -    {52,0x44,0x30,0x00,0}, {53,0x44,0x31,0x00,0}, {54,0x44,0x32,0x00,0}, -    {55,0x64,0x2E,0x20,1}, {56,0x64,0x2F,0x00,0}, {57,0x64,0x30,0x00,0}, -    {58,0x64,0x31,0x00,0}, {59,0x64,0x32,0x00,0}, {60,0x64,0x33,0x00,0}, -    {61,0x64,0x34,0x00,0}, {62,0x64,0x35,0x00,0}, {63,0x64,0x36,0x00,0}, -    {64,0x64,0x37,0x00,0}, {65,0x64,0x38,0x00,0}, {66,0x65,0x38,0x20,1}, -    {67,0x66,0x38,0x20,1}, {68,0x67,0x38,0x20,1}, {69,0x68,0x38,0x20,1}, -    {70,0x69,0x38,0x20,1}, {71,0x6A,0x38,0x20,1}, {72,0x6B,0x38,0x20,1}, -    {73,0x6C,0x38,0x20,1}, {74,0x6D,0x38,0x20,1}, {75,0x6E,0x38,0x20,1}, -    {76,0x6F,0x38,0x20,1}}; +boost::uint8_t gain_table_1300mhz_to_4000mhz[77][3] = { +{ 0x00, 0x00, 0x20 }, { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00 }, +{ 0x00, 0x01, 0x00 }, { 0x00, 0x02, 0x00 }, { 0x00, 0x03, 0x00 }, +{ 0x00, 0x04, 0x00 }, { 0x00, 0x05, 0x00 }, { 0x01, 0x03, 0x20 }, +{ 0x01, 0x04, 0x00 }, { 0x01, 0x05, 0x00 }, { 0x01, 0x06, 0x00 }, +{ 0x01, 0x07, 0x00 }, { 0x01, 0x08, 0x00 }, { 0x01, 0x09, 0x00 }, +{ 0x01, 0x0A, 0x00 }, { 0x01, 0x0B, 0x00 }, { 0x01, 0x0C, 0x00 }, +{ 0x01, 0x0D, 0x00 }, { 0x01, 0x0E, 0x00 }, { 0x02, 0x09, 0x20 }, +{ 0x02, 0x0A, 0x00 }, { 0x02, 0x0B, 0x00 }, { 0x02, 0x0C, 0x00 }, +{ 0x02, 0x0D, 0x00 }, { 0x02, 0x0E, 0x00 }, { 0x02, 0x0F, 0x00 }, +{ 0x02, 0x10, 0x00 }, { 0x02, 0x2B, 0x20 }, { 0x02, 0x2C, 0x00 }, +{ 0x04, 0x27, 0x20 }, { 0x04, 0x28, 0x00 }, { 0x04, 0x29, 0x00 }, +{ 0x04, 0x2A, 0x00 }, { 0x04, 0x2B, 0x00 }, { 0x24, 0x21, 0x20 }, +{ 0x24, 0x22, 0x00 }, { 0x44, 0x20, 0x20 }, { 0x44, 0x21, 0x00 }, +{ 0x44, 0x22, 0x00 }, { 0x44, 0x23, 0x00 }, { 0x44, 0x24, 0x00 }, +{ 0x44, 0x25, 0x00 }, { 0x44, 0x26, 0x00 }, { 0x44, 0x27, 0x00 }, +{ 0x44, 0x28, 0x00 }, { 0x44, 0x29, 0x00 }, { 0x44, 0x2A, 0x00 }, +{ 0x44, 0x2B, 0x00 }, { 0x44, 0x2C, 0x00 }, { 0x44, 0x2D, 0x00 }, +{ 0x44, 0x2E, 0x00 }, { 0x44, 0x2F, 0x00 }, { 0x44, 0x30, 0x00 }, +{ 0x44, 0x31, 0x00 }, { 0x64, 0x2E, 0x20 }, { 0x64, 0x2F, 0x00 }, +{ 0x64, 0x30, 0x00 }, { 0x64, 0x31, 0x00 }, { 0x64, 0x32, 0x00 }, +{ 0x64, 0x33, 0x00 }, { 0x64, 0x34, 0x00 }, { 0x64, 0x35, 0x00 }, +{ 0x64, 0x36, 0x00 }, { 0x64, 0x37, 0x00 }, { 0x64, 0x38, 0x00 }, +{ 0x65, 0x38, 0x20 }, { 0x66, 0x38, 0x20 }, { 0x67, 0x38, 0x20 }, +{ 0x68, 0x38, 0x20 }, { 0x69, 0x38, 0x20 }, { 0x6A, 0x38, 0x20 }, +{ 0x6B, 0x38, 0x20 }, { 0x6C, 0x38, 0x20 }, { 0x6D, 0x38, 0x20 }, +{ 0x6E, 0x38, 0x20 }, { 0x6F, 0x38, 0x20 } }; -boost::uint8_t gain_table_4000mhz_to_6000mhz[77][5] = { {0,0x00,0x00,0x20,1}, -    {1,0x00,0x00,0x00,0}, {2,0x00,0x00,0x00,0}, {3,0x00,0x00,0x00,0}, -    {4,0x00,0x00,0x00,0}, {5,0x00,0x01,0x00,0}, {6,0x00,0x02,0x00,0}, -    {7,0x00,0x03,0x00,0}, {8,0x01,0x01,0x20,1}, {9,0x01,0x02,0x00,0}, -    {10,0x01,0x03,0x00,0}, {11,0x01,0x04,0x20,1}, {12,0x01,0x05,0x00,0}, -    {13,0x01,0x06,0x00,0}, {14,0x01,0x07,0x00,0}, {15,0x01,0x08,0x00,0}, -    {16,0x01,0x09,0x00,0}, {17,0x01,0x0A,0x00,0}, {18,0x01,0x0B,0x00,0}, -    {19,0x01,0x0C,0x00,0}, {20,0x02,0x08,0x20,1}, {21,0x02,0x09,0x00,0}, -    {22,0x02,0x0A,0x00,0}, {23,0x02,0x0B,0x20,1}, {24,0x02,0x0C,0x00,0}, -    {25,0x02,0x0D,0x00,0}, {26,0x02,0x0E,0x00,0}, {27,0x02,0x0F,0x00,0}, -    {28,0x02,0x2A,0x20,1}, {29,0x02,0x2B,0x00,0}, {30,0x04,0x27,0x20,1}, -    {31,0x04,0x28,0x00,0}, {32,0x04,0x29,0x00,0}, {33,0x04,0x2A,0x00,0}, -    {34,0x04,0x2B,0x00,0}, {35,0x04,0x2C,0x00,0}, {36,0x04,0x2D,0x00,0}, -    {37,0x24,0x20,0x20,1}, {38,0x24,0x21,0x00,0}, {39,0x24,0x22,0x00,0}, -    {40,0x44,0x20,0x20,1}, {41,0x44,0x21,0x00,0}, {42,0x44,0x22,0x00,0}, -    {43,0x44,0x23,0x00,0}, {44,0x44,0x24,0x00,0}, {45,0x44,0x25,0x00,0}, -    {46,0x44,0x26,0x00,0}, {47,0x44,0x27,0x00,0}, {48,0x44,0x28,0x00,0}, -    {49,0x44,0x29,0x00,0}, {50,0x44,0x2A,0x00,0}, {51,0x44,0x2B,0x00,0}, -    {52,0x44,0x2C,0x00,0}, {53,0x44,0x2D,0x00,0}, {54,0x44,0x2E,0x00,0}, -    {55,0x64,0x2E,0x20,1}, {56,0x64,0x2F,0x00,0}, {57,0x64,0x30,0x00,0}, -    {58,0x64,0x31,0x00,0}, {59,0x64,0x32,0x00,0}, {60,0x64,0x33,0x00,0}, -    {61,0x64,0x34,0x00,0}, {62,0x64,0x35,0x00,0}, {63,0x64,0x36,0x00,0}, -    {64,0x64,0x37,0x00,0}, {65,0x64,0x38,0x00,0}, {66,0x65,0x38,0x20,1}, -    {67,0x66,0x38,0x20,1}, {68,0x67,0x38,0x20,1}, {69,0x68,0x38,0x20,1}, -    {70,0x69,0x38,0x20,1}, {71,0x6A,0x38,0x20,1}, {72,0x6B,0x38,0x20,1}, -    {73,0x6C,0x38,0x20,1}, {74,0x6D,0x38,0x20,1}, {75,0x6E,0x38,0x20,1}, -    {76,0x6F,0x38,0x20,1}}; +boost::uint8_t gain_table_4000mhz_to_6000mhz[77][3] = { +{ 0x00, 0x00, 0x20 }, { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00 }, +{ 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00 }, { 0x00, 0x01, 0x00 }, +{ 0x00, 0x02, 0x00 }, { 0x00, 0x03, 0x00 }, { 0x01, 0x01, 0x20 }, +{ 0x01, 0x02, 0x00 }, { 0x01, 0x03, 0x00 }, { 0x01, 0x04, 0x20 }, +{ 0x01, 0x05, 0x00 }, { 0x01, 0x06, 0x00 }, { 0x01, 0x07, 0x00 }, +{ 0x01, 0x08, 0x00 }, { 0x01, 0x09, 0x00 }, { 0x01, 0x0A, 0x00 }, +{ 0x01, 0x0B, 0x00 }, { 0x01, 0x0C, 0x00 }, { 0x02, 0x08, 0x20 }, +{ 0x02, 0x09, 0x00 }, { 0x02, 0x0A, 0x00 }, { 0x02, 0x0B, 0x20 }, +{ 0x02, 0x0C, 0x00 }, { 0x02, 0x0D, 0x00 }, { 0x02, 0x0E, 0x00 }, +{ 0x02, 0x0F, 0x00 }, { 0x02, 0x2A, 0x20 }, { 0x02, 0x2B, 0x00 }, +{ 0x04, 0x27, 0x20 }, { 0x04, 0x28, 0x00 }, { 0x04, 0x29, 0x00 }, +{ 0x04, 0x2A, 0x00 }, { 0x04, 0x2B, 0x00 }, { 0x04, 0x2C, 0x00 }, +{ 0x04, 0x2D, 0x00 }, { 0x24, 0x20, 0x20 }, { 0x24, 0x21, 0x00 }, +{ 0x24, 0x22, 0x00 }, { 0x44, 0x20, 0x20 }, { 0x44, 0x21, 0x00 }, +{ 0x44, 0x22, 0x00 }, { 0x44, 0x23, 0x00 }, { 0x44, 0x24, 0x00 }, +{ 0x44, 0x25, 0x00 }, { 0x44, 0x26, 0x00 }, { 0x44, 0x27, 0x00 }, +{ 0x44, 0x28, 0x00 }, { 0x44, 0x29, 0x00 }, { 0x44, 0x2A, 0x00 }, +{ 0x44, 0x2B, 0x00 }, { 0x44, 0x2C, 0x00 }, { 0x44, 0x2D, 0x00 }, +{ 0x44, 0x2E, 0x00 }, { 0x64, 0x2E, 0x20 }, { 0x64, 0x2F, 0x00 }, +{ 0x64, 0x30, 0x00 }, { 0x64, 0x31, 0x00 }, { 0x64, 0x32, 0x00 }, +{ 0x64, 0x33, 0x00 }, { 0x64, 0x34, 0x00 }, { 0x64, 0x35, 0x00 }, +{ 0x64, 0x36, 0x00 }, { 0x64, 0x37, 0x00 }, { 0x64, 0x38, 0x00 }, +{ 0x65, 0x38, 0x20 }, { 0x66, 0x38, 0x20 }, { 0x67, 0x38, 0x20 }, +{ 0x68, 0x38, 0x20 }, { 0x69, 0x38, 0x20 }, { 0x6A, 0x38, 0x20 }, +{ 0x6B, 0x38, 0x20 }, { 0x6C, 0x38, 0x20 }, { 0x6D, 0x38, 0x20 }, +{ 0x6E, 0x38, 0x20 }, { 0x6F, 0x38, 0x20 } };  #endif /* INCLUDED_AD9361_GAIN_TABLES_HPP */ | 
