diff options
| author | Josh Blum <josh@joshknows.com> | 2010-04-13 12:42:23 -0700 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2010-04-13 12:42:23 -0700 | 
| commit | ad0d641b38dd79cc29b4ca7a3a02c02e35eb8f71 (patch) | |
| tree | a4cc75cb4aced1114d4add0dc1ab4679523fc33d /host/lib | |
| parent | ea7568588a3837bd14b3ce2737afa2b8dcacafd2 (diff) | |
| download | uhd-ad0d641b38dd79cc29b4ca7a3a02c02e35eb8f71.tar.gz uhd-ad0d641b38dd79cc29b4ca7a3a02c02e35eb8f71.tar.bz2 uhd-ad0d641b38dd79cc29b4ca7a3a02c02e35eb8f71.zip | |
Moved clock control into abstraction clock control class.
Diffstat (limited to 'host/lib')
| -rw-r--r-- | host/lib/CMakeLists.txt | 19 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/clock_control.cpp | 84 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/clock_control.hpp | 55 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/dboard_interface.cpp | 27 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/mboard_impl.cpp | 6 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/usrp2_impl.hpp | 5 | 
6 files changed, 167 insertions, 29 deletions
| diff --git a/host/lib/CMakeLists.txt b/host/lib/CMakeLists.txt index 0483cd11c..b25ba38e2 100644 --- a/host/lib/CMakeLists.txt +++ b/host/lib/CMakeLists.txt @@ -60,12 +60,6 @@ SET(libuhd_sources      usrp/simple_usrp.cpp      usrp/dboard_manager.cpp      usrp/tune_helper.cpp -    usrp/usrp2/dboard_impl.cpp -    usrp/usrp2/dboard_interface.cpp -    usrp/usrp2/dsp_impl.cpp -    usrp/usrp2/io_impl.cpp -    usrp/usrp2/mboard_impl.cpp -    usrp/usrp2/usrp2_impl.cpp  )  ######################################################################## @@ -98,6 +92,19 @@ UHD_PYTHON_GEN_SOURCE_FILE(  )  ######################################################################## +# Add usrp2 sources +######################################################################## +LIST(APPEND libuhd_sources +    usrp/usrp2/clock_control.cpp +    usrp/usrp2/dboard_impl.cpp +    usrp/usrp2/dboard_interface.cpp +    usrp/usrp2/dsp_impl.cpp +    usrp/usrp2/io_impl.cpp +    usrp/usrp2/mboard_impl.cpp +    usrp/usrp2/usrp2_impl.cpp +) + +########################################################################  # Conditionally add the udp sources  ########################################################################  LIST(APPEND libuhd_sources diff --git a/host/lib/usrp/usrp2/clock_control.cpp b/host/lib/usrp/usrp2/clock_control.cpp new file mode 100644 index 000000000..74db5958a --- /dev/null +++ b/host/lib/usrp/usrp2/clock_control.cpp @@ -0,0 +1,84 @@ +// +// Copyright 2010 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 +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program.  If not, see <http://www.gnu.org/licenses/>. +// + +#include "usrp2_impl.hpp" +#include "clock_control.hpp" +#include "ad9510_regs.hpp" +#include "usrp2_regs.hpp" //spi slave constants +#include <boost/cstdint.hpp> + +using namespace uhd::usrp; + +/*! + * A usrp2 clock control specific to the ad9510 ic. + */ +class clock_control_ad9510 : public clock_control{ +public: +    clock_control_ad9510(usrp2_impl *impl){ +        _impl = impl; +        this->enable_rx_dboard_clock(false); +        this->enable_tx_dboard_clock(false); +    } + +    ~clock_control_ad9510(void){ +        /* NOP */ +    } + +    void enable_rx_dboard_clock(bool enb){ +        _ad9510_regs.power_down_lvds_cmos_out7 = enb? 0 : 1; +        _ad9510_regs.lvds_cmos_select_out7 = ad9510_regs_t::LVDS_CMOS_SELECT_OUT7_CMOS; +        _ad9510_regs.output_level_lvds_out7 = ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT7_1_75MA; +        this->write_reg(0x43); +        this->update_regs(); +    } + +    void enable_tx_dboard_clock(bool enb){ +        _ad9510_regs.power_down_lvds_cmos_out6 = enb? 0 : 1; +        _ad9510_regs.lvds_cmos_select_out6 = ad9510_regs_t::LVDS_CMOS_SELECT_OUT6_CMOS; +        _ad9510_regs.output_level_lvds_out6 = ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT6_1_75MA; +        this->write_reg(0x42); +        this->update_regs(); +    } + +private: +    /*! +     * Write a single register to the spi regs. +     * \param addr the address to write +     */ +    void write_reg(boost::uint8_t addr){ +        boost::uint32_t data = _ad9510_regs.get_write_reg(addr); +        _impl->transact_spi(SPI_SS_AD9510, spi_config_t::EDGE_RISE, data, 24, false /*no rb*/); +    } + +    /*! +     * Tells the ad9510 to latch the settings into the operational registers. +     */ +    void update_regs(void){ +        _ad9510_regs.update_registers = 1; +        this->write_reg(0x5a); +    } + +    usrp2_impl *_impl; +    ad9510_regs_t _ad9510_regs; +}; + +/*********************************************************************** + * Public make function for the ad9510 clock control + **********************************************************************/ +clock_control::sptr clock_control::make_ad9510(usrp2_impl *impl){ +    return clock_control::sptr(new clock_control_ad9510(impl)); +} diff --git a/host/lib/usrp/usrp2/clock_control.hpp b/host/lib/usrp/usrp2/clock_control.hpp new file mode 100644 index 000000000..366e09c28 --- /dev/null +++ b/host/lib/usrp/usrp2/clock_control.hpp @@ -0,0 +1,55 @@ +// +// Copyright 2010 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 +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program.  If not, see <http://www.gnu.org/licenses/>. +// + +#ifndef INCLUDED_CLOCK_CONTROL_HPP +#define INCLUDED_CLOCK_CONTROL_HPP + +class usrp2_impl; //dummy class + +#include <boost/shared_ptr.hpp> +#include <boost/utility.hpp> + +class clock_control : boost::noncopyable{ +public: +    typedef boost::shared_ptr<clock_control> sptr; + +    /*! +     * Make a clock config for the ad9510 ic. +     * \param impl a pointer to the usrp2 implementation object +     * \return a new clock control object +     */ +    static sptr make_ad9510(usrp2_impl *impl); + +    /*! +     * Enable/disable the rx dboard clock. +     * \param enb true to enable +     */ +    virtual void enable_rx_dboard_clock(bool enb) = 0; + +    /*! +     * Enable/disable the tx dboard clock. +     * \param enb true to enable +     */ +    virtual void enable_tx_dboard_clock(bool enb) = 0; + +    /*! +     * TODO other clock control api here.... +     */ + +}; + +#endif /* INCLUDED_CLOCK_CONTROL_HPP */ diff --git a/host/lib/usrp/usrp2/dboard_interface.cpp b/host/lib/usrp/usrp2/dboard_interface.cpp index 8a3df08cb..c74bdaf44 100644 --- a/host/lib/usrp/usrp2/dboard_interface.cpp +++ b/host/lib/usrp/usrp2/dboard_interface.cpp @@ -17,7 +17,6 @@  #include "usrp2_impl.hpp"  #include "usrp2_regs.hpp" -#include "ad9510_regs.hpp"  #include <uhd/types/dict.hpp>  #include <uhd/utils/assert.hpp>  #include <boost/assign/list_of.hpp> @@ -61,8 +60,6 @@ public:  private:      usrp2_impl *_impl;      boost::uint32_t _ddr_shadow; -    ad9510_regs_t _ad9510_regs; -    uhd::dict<unit_t, bool> _clock_enb_shadow;  };  /*********************************************************************** @@ -100,30 +97,14 @@ double usrp2_dboard_interface::get_clock_rate(unit_t){  }  void usrp2_dboard_interface::set_clock_enabled(unit_t unit, bool enb){ -    uint16_t data = 0;      switch(unit){      case UNIT_RX: -        _ad9510_regs.power_down_lvds_cmos_out7 = enb? 0 : 1; -        _ad9510_regs.lvds_cmos_select_out7 = ad9510_regs_t::LVDS_CMOS_SELECT_OUT7_CMOS; -        _ad9510_regs.output_level_lvds_out7 = ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT7_1_75MA; -        data = _ad9510_regs.get_write_reg(0x43); -        break; +        _impl->get_clock_control()->enable_rx_dboard_clock(enb); +        return;      case UNIT_TX: -        _ad9510_regs.power_down_lvds_cmos_out6 = enb? 0 : 1; -        _ad9510_regs.lvds_cmos_select_out6 = ad9510_regs_t::LVDS_CMOS_SELECT_OUT6_CMOS; -        _ad9510_regs.output_level_lvds_out6 = ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT6_1_75MA; -        data = _ad9510_regs.get_write_reg(0x42); -        break; +        _impl->get_clock_control()->enable_tx_dboard_clock(enb); +        return;      } -    _impl->transact_spi(SPI_SS_AD9510, spi_config_t::EDGE_RISE, data, 24, false /*no rb*/); - -    _ad9510_regs.update_registers = 1; -    _impl->transact_spi(SPI_SS_AD9510, spi_config_t::EDGE_RISE, _ad9510_regs.get_write_reg(0x5a), 24, false /*no rb*/); -    _clock_enb_shadow[unit] = unit; -} - -bool usrp2_dboard_interface::get_clock_enabled(unit_t unit){ -    return _clock_enb_shadow[unit];  }  /*********************************************************************** diff --git a/host/lib/usrp/usrp2/mboard_impl.cpp b/host/lib/usrp/usrp2/mboard_impl.cpp index 2fa2e5211..faa34d0b3 100644 --- a/host/lib/usrp/usrp2/mboard_impl.cpp +++ b/host/lib/usrp/usrp2/mboard_impl.cpp @@ -33,6 +33,12 @@ void usrp2_impl::mboard_init(void){          boost::bind(&usrp2_impl::mboard_get, this, _1, _2),          boost::bind(&usrp2_impl::mboard_set, this, _1, _2)      ); + +    _clock_control = clock_control::make_ad9510(this); +} + +clock_control::sptr usrp2_impl::get_clock_control(void){ +    return _clock_control;  }  void usrp2_impl::init_clock_config(void){ diff --git a/host/lib/usrp/usrp2/usrp2_impl.hpp b/host/lib/usrp/usrp2/usrp2_impl.hpp index 5a02b33dc..f2e823391 100644 --- a/host/lib/usrp/usrp2/usrp2_impl.hpp +++ b/host/lib/usrp/usrp2/usrp2_impl.hpp @@ -18,6 +18,7 @@  #ifndef INCLUDED_USRP2_IMPL_HPP  #define INCLUDED_USRP2_IMPL_HPP +#include "clock_control.hpp"  #include <uhd/usrp/usrp2.hpp>  #include <uhd/types/dict.hpp>  #include <uhd/types/otw_type.hpp> @@ -110,6 +111,9 @@ public:      void poke16(boost::uint32_t addr, boost::uint16_t data);      boost::uint16_t peek16(boost::uint32_t addr); +    //clock control +    clock_control::sptr get_clock_control(void); +      //spi read and write      boost::uint32_t transact_spi(          int which_slave, @@ -130,6 +134,7 @@ private:      //device properties interface      void get(const wax::obj &, wax::obj &);      void set(const wax::obj &, const wax::obj &); +    clock_control::sptr _clock_control;      //the raw io interface (samples are in the usrp2 native format)      void recv_raw(uhd::rx_metadata_t &); | 
