diff options
| author | Josh Blum <josh@joshknows.com> | 2011-01-19 22:23:46 -0800 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2011-01-19 22:23:46 -0800 | 
| commit | 9239878b0b81c3a368bf11cfc2fe48bfb05ff902 (patch) | |
| tree | f41a5e58eac89b35cb99537a0a0b64662384a9f2 /host/lib/usrp/usrp_e100 | |
| parent | fc138381ee4bd8d191795230b7447071a85e1f28 (diff) | |
| parent | 7d918c5f6acc9a5d2c8ae03e2e67b403f7efd5ff (diff) | |
| download | uhd-9239878b0b81c3a368bf11cfc2fe48bfb05ff902.tar.gz uhd-9239878b0b81c3a368bf11cfc2fe48bfb05ff902.tar.bz2 uhd-9239878b0b81c3a368bf11cfc2fe48bfb05ff902.zip  | |
Merge branch 'next'
Conflicts:
	host/lib/usrp/usrp2/codec_impl.cpp
Diffstat (limited to 'host/lib/usrp/usrp_e100')
| -rw-r--r-- | host/lib/usrp/usrp_e100/codec_ctrl.cpp | 32 | ||||
| -rw-r--r-- | host/lib/usrp/usrp_e100/codec_ctrl.hpp | 14 | ||||
| -rw-r--r-- | host/lib/usrp/usrp_e100/codec_impl.cpp | 8 | ||||
| -rw-r--r-- | host/lib/usrp/usrp_e100/dboard_iface.cpp | 10 | ||||
| -rw-r--r-- | host/lib/usrp/usrp_e100/dsp_impl.cpp | 4 | ||||
| -rw-r--r-- | host/lib/usrp/usrp_e100/mboard_impl.cpp | 30 | ||||
| -rw-r--r-- | host/lib/usrp/usrp_e100/usrp_e100_impl.hpp | 2 | ||||
| -rw-r--r-- | host/lib/usrp/usrp_e100/usrp_e100_regs.hpp | 10 | 
8 files changed, 69 insertions, 41 deletions
diff --git a/host/lib/usrp/usrp_e100/codec_ctrl.cpp b/host/lib/usrp/usrp_e100/codec_ctrl.cpp index 18d9daca0..b33c8ae65 100644 --- a/host/lib/usrp/usrp_e100/codec_ctrl.cpp +++ b/host/lib/usrp/usrp_e100/codec_ctrl.cpp @@ -1,5 +1,5 @@  // -// Copyright 2010 Ettus Research LLC +// Copyright 2010-2011 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 @@ -31,7 +31,7 @@ using namespace uhd;  static const bool codec_debug = false; -const gain_range_t usrp_e100_codec_ctrl::tx_pga_gain_range(-20, 0, float(0.1)); +const gain_range_t usrp_e100_codec_ctrl::tx_pga_gain_range(-20, 0, double(0.1));  const gain_range_t usrp_e100_codec_ctrl::rx_pga_gain_range(0, 20, 1);  /*********************************************************************** @@ -44,14 +44,14 @@ public:      ~usrp_e100_codec_ctrl_impl(void);      //aux adc and dac control -    float read_aux_adc(aux_adc_t which); -    void write_aux_dac(aux_dac_t which, float volts); +    double read_aux_adc(aux_adc_t which); +    void write_aux_dac(aux_dac_t which, double volts);      //pga gain control -    void set_tx_pga_gain(float); -    float get_tx_pga_gain(void); -    void set_rx_pga_gain(float, char); -    float get_rx_pga_gain(char); +    void set_tx_pga_gain(double); +    double get_tx_pga_gain(void); +    void set_rx_pga_gain(double, char); +    double get_rx_pga_gain(char);  private:      usrp_e100_iface::sptr _iface; @@ -135,19 +135,19 @@ usrp_e100_codec_ctrl_impl::~usrp_e100_codec_ctrl_impl(void){   **********************************************************************/  static const int mtpgw = 255; //maximum tx pga gain word -void usrp_e100_codec_ctrl_impl::set_tx_pga_gain(float gain){ +void usrp_e100_codec_ctrl_impl::set_tx_pga_gain(double gain){      int gain_word = int(mtpgw*(gain - tx_pga_gain_range.start())/(tx_pga_gain_range.stop() - tx_pga_gain_range.start()));      _ad9862_regs.tx_pga_gain = std::clip(gain_word, 0, mtpgw);      this->send_reg(16);  } -float usrp_e100_codec_ctrl_impl::get_tx_pga_gain(void){ +double usrp_e100_codec_ctrl_impl::get_tx_pga_gain(void){      return (_ad9862_regs.tx_pga_gain*(tx_pga_gain_range.stop() - tx_pga_gain_range.start())/mtpgw) + tx_pga_gain_range.start();  }  static const int mrpgw = 0x14; //maximum rx pga gain word -void usrp_e100_codec_ctrl_impl::set_rx_pga_gain(float gain, char which){ +void usrp_e100_codec_ctrl_impl::set_rx_pga_gain(double gain, char which){      int gain_word = int(mrpgw*(gain - rx_pga_gain_range.start())/(rx_pga_gain_range.stop() - rx_pga_gain_range.start()));      gain_word = std::clip(gain_word, 0, mrpgw);      switch(which){ @@ -163,7 +163,7 @@ void usrp_e100_codec_ctrl_impl::set_rx_pga_gain(float gain, char which){      }  } -float usrp_e100_codec_ctrl_impl::get_rx_pga_gain(char which){ +double usrp_e100_codec_ctrl_impl::get_rx_pga_gain(char which){      int gain_word;      switch(which){      case 'A': gain_word = _ad9862_regs.rx_pga_a; break; @@ -176,11 +176,11 @@ float usrp_e100_codec_ctrl_impl::get_rx_pga_gain(char which){  /***********************************************************************   * Codec Control AUX ADC Methods   **********************************************************************/ -static float aux_adc_to_volts(boost::uint8_t high, boost::uint8_t low){ -    return float((boost::uint16_t(high) << 2) | low)*3.3/0x3ff; +static double aux_adc_to_volts(boost::uint8_t high, boost::uint8_t low){ +    return double((boost::uint16_t(high) << 2) | low)*3.3/0x3ff;  } -float usrp_e100_codec_ctrl_impl::read_aux_adc(aux_adc_t which){ +double usrp_e100_codec_ctrl_impl::read_aux_adc(aux_adc_t which){      //check to see if the switch needs to be set      bool write_switch = false;      switch(which){ @@ -233,7 +233,7 @@ float usrp_e100_codec_ctrl_impl::read_aux_adc(aux_adc_t which){  /***********************************************************************   * Codec Control AUX DAC Methods   **********************************************************************/ -void usrp_e100_codec_ctrl_impl::write_aux_dac(aux_dac_t which, float volts){ +void usrp_e100_codec_ctrl_impl::write_aux_dac(aux_dac_t which, double volts){      //special case for aux dac d (aka sigma delta word)      if (which == AUX_DAC_D){          boost::uint16_t dac_word = std::clip(boost::math::iround(volts*0xfff/3.3), 0, 0xfff); diff --git a/host/lib/usrp/usrp_e100/codec_ctrl.hpp b/host/lib/usrp/usrp_e100/codec_ctrl.hpp index 74ce9bd9a..05d7aab38 100644 --- a/host/lib/usrp/usrp_e100/codec_ctrl.hpp +++ b/host/lib/usrp/usrp_e100/codec_ctrl.hpp @@ -1,5 +1,5 @@  // -// Copyright 2010 Ettus Research LLC +// Copyright 2010-2011 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 @@ -57,7 +57,7 @@ public:       * \param which which of the 4 adcs       * \return a value in volts       */ -    virtual float read_aux_adc(aux_adc_t which) = 0; +    virtual double read_aux_adc(aux_adc_t which) = 0;      //! aux dac identifier constants      enum aux_dac_t{ @@ -72,19 +72,19 @@ public:       * \param which which of the 4 dacs       * \param volts the level in in volts       */ -    virtual void write_aux_dac(aux_dac_t which, float volts) = 0; +    virtual void write_aux_dac(aux_dac_t which, double volts) = 0;      //! Set the TX PGA gain -    virtual void set_tx_pga_gain(float gain) = 0; +    virtual void set_tx_pga_gain(double gain) = 0;      //! Get the TX PGA gain -    virtual float get_tx_pga_gain(void) = 0; +    virtual double get_tx_pga_gain(void) = 0;      //! Set the RX PGA gain ('A' or 'B') -    virtual void set_rx_pga_gain(float gain, char which) = 0; +    virtual void set_rx_pga_gain(double gain, char which) = 0;      //! Get the RX PGA gain ('A' or 'B') -    virtual float get_rx_pga_gain(char which) = 0; +    virtual double get_rx_pga_gain(char which) = 0;  };  #endif /* INCLUDED_USRP_E100_CODEC_CTRL_HPP */ diff --git a/host/lib/usrp/usrp_e100/codec_impl.cpp b/host/lib/usrp/usrp_e100/codec_impl.cpp index 6fd44bad3..0d91fb42c 100644 --- a/host/lib/usrp/usrp_e100/codec_impl.cpp +++ b/host/lib/usrp/usrp_e100/codec_impl.cpp @@ -1,5 +1,5 @@  // -// Copyright 2010 Ettus Research LLC +// Copyright 2010-2011 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 @@ -86,12 +86,12 @@ void usrp_e100_impl::rx_codec_set(const wax::obj &key_, const wax::obj &val){      switch(key.as<codec_prop_t>()){      case CODEC_PROP_GAIN_I:          UHD_ASSERT_THROW(key.name == ad9862_pga_gain_name); -        _codec_ctrl->set_rx_pga_gain(val.as<float>(), 'A'); +        _codec_ctrl->set_rx_pga_gain(val.as<double>(), 'A');          return;      case CODEC_PROP_GAIN_Q:          UHD_ASSERT_THROW(key.name == ad9862_pga_gain_name); -        _codec_ctrl->set_rx_pga_gain(val.as<float>(), 'B'); +        _codec_ctrl->set_rx_pga_gain(val.as<double>(), 'B');          return;      default: UHD_THROW_PROP_SET_ERROR(); @@ -141,7 +141,7 @@ void usrp_e100_impl::tx_codec_set(const wax::obj &key_, const wax::obj &val){      case CODEC_PROP_GAIN_I: //only one gain for I and Q      case CODEC_PROP_GAIN_Q:          UHD_ASSERT_THROW(key.name == ad9862_pga_gain_name); -        _codec_ctrl->set_tx_pga_gain(val.as<float>()); +        _codec_ctrl->set_tx_pga_gain(val.as<double>());          return;      default: UHD_THROW_PROP_SET_ERROR(); diff --git a/host/lib/usrp/usrp_e100/dboard_iface.cpp b/host/lib/usrp/usrp_e100/dboard_iface.cpp index a5032f86f..e4c3856c9 100644 --- a/host/lib/usrp/usrp_e100/dboard_iface.cpp +++ b/host/lib/usrp/usrp_e100/dboard_iface.cpp @@ -1,5 +1,5 @@  // -// Copyright 2010 Ettus Research LLC +// Copyright 2010-2011 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 @@ -60,8 +60,8 @@ public:          return props;      } -    void write_aux_dac(unit_t, aux_dac_t, float); -    float read_aux_adc(unit_t, aux_adc_t); +    void write_aux_dac(unit_t, aux_dac_t, double); +    double read_aux_adc(unit_t, aux_adc_t);      void _set_pin_ctrl(unit_t, boost::uint16_t);      void _set_atr_reg(unit_t, atr_reg_t, boost::uint16_t); @@ -270,7 +270,7 @@ byte_vector_t usrp_e100_dboard_iface::read_i2c(boost::uint8_t addr, size_t num_b  /***********************************************************************   * Aux DAX/ADC   **********************************************************************/ -void usrp_e100_dboard_iface::write_aux_dac(dboard_iface::unit_t, aux_dac_t which, float value){ +void usrp_e100_dboard_iface::write_aux_dac(dboard_iface::unit_t, aux_dac_t which, double value){      //same aux dacs for each unit      static const uhd::dict<aux_dac_t, usrp_e100_codec_ctrl::aux_dac_t> which_to_aux_dac = map_list_of          (AUX_DAC_A, usrp_e100_codec_ctrl::AUX_DAC_A) @@ -281,7 +281,7 @@ void usrp_e100_dboard_iface::write_aux_dac(dboard_iface::unit_t, aux_dac_t which      _codec->write_aux_dac(which_to_aux_dac[which], value);  } -float usrp_e100_dboard_iface::read_aux_adc(dboard_iface::unit_t unit, aux_adc_t which){ +double usrp_e100_dboard_iface::read_aux_adc(dboard_iface::unit_t unit, aux_adc_t which){      static const uhd::dict<          unit_t, uhd::dict<aux_adc_t, usrp_e100_codec_ctrl::aux_adc_t>      > unit_to_which_to_aux_adc = map_list_of diff --git a/host/lib/usrp/usrp_e100/dsp_impl.cpp b/host/lib/usrp/usrp_e100/dsp_impl.cpp index 43a3bd3be..7d358a607 100644 --- a/host/lib/usrp/usrp_e100/dsp_impl.cpp +++ b/host/lib/usrp/usrp_e100/dsp_impl.cpp @@ -38,7 +38,7 @@ void usrp_e100_impl::rx_ddc_init(void){      //initial config and update      rx_ddc_set(DSP_PROP_FREQ_SHIFT, double(0)); -    rx_ddc_set(DSP_PROP_HOST_RATE, double(64e6/10)); +    rx_ddc_set(DSP_PROP_HOST_RATE, double(16e6));  }  /*********************************************************************** @@ -121,7 +121,7 @@ void usrp_e100_impl::tx_duc_init(void){      //initial config and update      tx_duc_set(DSP_PROP_FREQ_SHIFT, double(0)); -    tx_duc_set(DSP_PROP_HOST_RATE, double(64e6/10)); +    tx_duc_set(DSP_PROP_HOST_RATE, double(16e6));  }  /*********************************************************************** diff --git a/host/lib/usrp/usrp_e100/mboard_impl.cpp b/host/lib/usrp/usrp_e100/mboard_impl.cpp index fe26cd63d..f52d2e6fb 100644 --- a/host/lib/usrp/usrp_e100/mboard_impl.cpp +++ b/host/lib/usrp/usrp_e100/mboard_impl.cpp @@ -1,5 +1,5 @@  // -// Copyright 2010 Ettus Research LLC +// Copyright 2010-2011 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 @@ -36,11 +36,13 @@ void usrp_e100_impl::mboard_init(void){          boost::bind(&usrp_e100_impl::mboard_set, this, _1, _2)      ); -    //init the clock config -    _clock_config.ref_source = clock_config_t::REF_AUTO; -    _clock_config.pps_source = clock_config_t::PPS_SMA; -    _clock_config.pps_polarity = clock_config_t::PPS_NEG; +    //set the ticks per seconds into the vita time control +    _iface->poke32(UE_REG_TIME64_TPS, +        boost::uint32_t(_clock_ctrl->get_fpga_clock_rate()) +    ); +    //init the clock config +    _clock_config = clock_config_t::internal();      update_clock_config();  } @@ -134,6 +136,22 @@ void usrp_e100_impl::mboard_get(const wax::obj &key_, wax::obj &val){          val = _iface->mb_eeprom;          return; +    case MBOARD_PROP_TIME_NOW: while(true){ +        uint32_t secs = _iface->peek32(UE_REG_RB_TIME_NOW_SECS); +        uint32_t ticks = _iface->peek32(UE_REG_RB_TIME_NOW_TICKS); +        if (secs != _iface->peek32(UE_REG_RB_TIME_NOW_SECS)) continue; +        val = time_spec_t(secs, ticks, _clock_ctrl->get_fpga_clock_rate()); +        return; +    } + +    case MBOARD_PROP_TIME_PPS: while(true){ +        uint32_t secs = _iface->peek32(UE_REG_RB_TIME_PPS_SECS); +        uint32_t ticks = _iface->peek32(UE_REG_RB_TIME_PPS_TICKS); +        if (secs != _iface->peek32(UE_REG_RB_TIME_PPS_SECS)) continue; +        val = time_spec_t(secs, ticks, _clock_ctrl->get_fpga_clock_rate()); +        return; +    } +      default: UHD_THROW_PROP_GET_ERROR();      }  } @@ -150,7 +168,7 @@ void usrp_e100_impl::mboard_set(const wax::obj &key, const wax::obj &val){          return;      case MBOARD_PROP_TIME_NOW: -    case MBOARD_PROP_TIME_NEXT_PPS:{ +    case MBOARD_PROP_TIME_PPS:{              time_spec_t time_spec = val.as<time_spec_t>();              _iface->poke32(UE_REG_TIME64_TICKS, time_spec.get_tick_count(_clock_ctrl->get_fpga_clock_rate()));              boost::uint32_t imm_flags = (key.as<mboard_prop_t>() == MBOARD_PROP_TIME_NOW)? 1 : 0; diff --git a/host/lib/usrp/usrp_e100/usrp_e100_impl.hpp b/host/lib/usrp/usrp_e100/usrp_e100_impl.hpp index de158ea5e..864e82099 100644 --- a/host/lib/usrp/usrp_e100/usrp_e100_impl.hpp +++ b/host/lib/usrp/usrp_e100/usrp_e100_impl.hpp @@ -30,7 +30,7 @@  #ifndef INCLUDED_USRP_E100_IMPL_HPP  #define INCLUDED_USRP_E100_IMPL_HPP -static const boost::uint16_t USRP_E_COMPAT_NUM = 0x02; +static const boost::uint16_t USRP_E_COMPAT_NUM = 0x03;  //! load an fpga image from a bin file into the usrp-e fpga  extern void usrp_e100_load_fpga(const std::string &bin_file); diff --git a/host/lib/usrp/usrp_e100/usrp_e100_regs.hpp b/host/lib/usrp/usrp_e100/usrp_e100_regs.hpp index 625fb2c35..a57fe5171 100644 --- a/host/lib/usrp/usrp_e100/usrp_e100_regs.hpp +++ b/host/lib/usrp/usrp_e100/usrp_e100_regs.hpp @@ -114,6 +114,16 @@  #define	UE_REG_ATR_FULL_RXSIDE  UE_REG_ATR_BASE + 12  #define	UE_REG_ATR_FULL_TXSIDE  UE_REG_ATR_BASE + 14 +/////////////////////////////////////////////////// +// Slave 7 -- Readback Mux 32 + +#define UE_REG_RB_MUX_32_BASE  UE_REG_SLAVE(7) + +#define UE_REG_RB_TIME_NOW_SECS   UE_REG_RB_MUX_32_BASE + 0 +#define UE_REG_RB_TIME_NOW_TICKS  UE_REG_RB_MUX_32_BASE + 4 +#define UE_REG_RB_TIME_PPS_SECS   UE_REG_RB_MUX_32_BASE + 8 +#define UE_REG_RB_TIME_PPS_TICKS  UE_REG_RB_MUX_32_BASE + 12 +  /////////////////////////////////////////////////  // DSP RX Regs  ////////////////////////////////////////////////  | 
