diff options
Diffstat (limited to 'host/lib/usrp')
| -rw-r--r-- | host/lib/usrp/dboard/db_basic_and_lf.cpp | 20 | ||||
| -rw-r--r-- | host/lib/usrp/dboard/db_rfx.cpp | 18 | ||||
| -rw-r--r-- | host/lib/usrp/dboard/db_xcvr2450.cpp | 10 | ||||
| -rw-r--r-- | host/lib/usrp/dboard_base.cpp | 42 | ||||
| -rw-r--r-- | host/lib/usrp/dboard_ctor_args.hpp | 32 | ||||
| -rw-r--r-- | host/lib/usrp/dboard_eeprom.cpp | 13 | ||||
| -rw-r--r-- | host/lib/usrp/dboard_id.cpp | 68 | ||||
| -rw-r--r-- | host/lib/usrp/dboard_manager.cpp | 75 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/dboard_iface.cpp | 57 | 
9 files changed, 220 insertions, 115 deletions
diff --git a/host/lib/usrp/dboard/db_basic_and_lf.cpp b/host/lib/usrp/dboard/db_basic_and_lf.cpp index b0fbbd2ec..23ac98872 100644 --- a/host/lib/usrp/dboard/db_basic_and_lf.cpp +++ b/host/lib/usrp/dboard/db_basic_and_lf.cpp @@ -34,7 +34,7 @@ using namespace boost::assign;   **********************************************************************/  class basic_rx : public rx_dboard_base{  public: -    basic_rx(ctor_args_t const& args, double max_freq); +    basic_rx(ctor_args_t args, double max_freq);      ~basic_rx(void);      void rx_get(const wax::obj &key, wax::obj &val); @@ -46,7 +46,7 @@ private:  class basic_tx : public tx_dboard_base{  public: -    basic_tx(ctor_args_t const& args, double max_freq); +    basic_tx(ctor_args_t args, double max_freq);      ~basic_tx(void);      void tx_get(const wax::obj &key, wax::obj &val); @@ -59,19 +59,19 @@ private:  /***********************************************************************   * Register the basic and LF dboards   **********************************************************************/ -static dboard_base::sptr make_basic_rx(dboard_base::ctor_args_t const& args){ +static dboard_base::sptr make_basic_rx(dboard_base::ctor_args_t args){      return dboard_base::sptr(new basic_rx(args, 90e9));  } -static dboard_base::sptr make_basic_tx(dboard_base::ctor_args_t const& args){ +static dboard_base::sptr make_basic_tx(dboard_base::ctor_args_t args){      return dboard_base::sptr(new basic_tx(args, 90e9));  } -static dboard_base::sptr make_lf_rx(dboard_base::ctor_args_t const& args){ +static dboard_base::sptr make_lf_rx(dboard_base::ctor_args_t args){      return dboard_base::sptr(new basic_rx(args, 32e6));  } -static dboard_base::sptr make_lf_tx(dboard_base::ctor_args_t const& args){ +static dboard_base::sptr make_lf_tx(dboard_base::ctor_args_t args){      return dboard_base::sptr(new basic_tx(args, 32e6));  } @@ -85,7 +85,7 @@ UHD_STATIC_BLOCK(reg_basic_and_lf_dboards){  /***********************************************************************   * Basic and LF RX dboard   **********************************************************************/ -basic_rx::basic_rx(ctor_args_t const& args, double max_freq) : rx_dboard_base(args){ +basic_rx::basic_rx(ctor_args_t args, double max_freq) : rx_dboard_base(args){      _max_freq = max_freq;  } @@ -101,7 +101,7 @@ void basic_rx::rx_get(const wax::obj &key_, wax::obj &val){      switch(key.as<subdev_prop_t>()){      case SUBDEV_PROP_NAME:          val = std::string(str(boost::format("%s - %s") -            % dboard_id::to_string(get_rx_id()) +            % get_rx_id().to_pp_string()              % get_subdev_name()          ));          return; @@ -187,7 +187,7 @@ void basic_rx::rx_set(const wax::obj &key_, const wax::obj &val){  /***********************************************************************   * Basic and LF TX dboard   **********************************************************************/ -basic_tx::basic_tx(ctor_args_t const& args, double max_freq) : tx_dboard_base(args){ +basic_tx::basic_tx(ctor_args_t args, double max_freq) : tx_dboard_base(args){      _max_freq = max_freq;  } @@ -202,7 +202,7 @@ void basic_tx::tx_get(const wax::obj &key_, wax::obj &val){      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){      case SUBDEV_PROP_NAME: -        val = dboard_id::to_string(get_tx_id()); +        val = get_tx_id().to_pp_string();          return;      case SUBDEV_PROP_OTHERS: diff --git a/host/lib/usrp/dboard/db_rfx.cpp b/host/lib/usrp/dboard/db_rfx.cpp index 175f55eab..bbc9716b1 100644 --- a/host/lib/usrp/dboard/db_rfx.cpp +++ b/host/lib/usrp/dboard/db_rfx.cpp @@ -63,7 +63,7 @@ static const float _max_rx_pga0_gain = 45;  class rfx_xcvr : public xcvr_dboard_base{  public:      rfx_xcvr( -        ctor_args_t const& args, +        ctor_args_t args,          const freq_range_t &freq_range,          bool rx_div2, bool tx_div2      ); @@ -108,23 +108,23 @@ private:  /***********************************************************************   * Register the RFX dboards (min freq, max freq, rx div2, tx div2)   **********************************************************************/ -static dboard_base::sptr make_rfx_flex400(dboard_base::ctor_args_t const& args){ +static dboard_base::sptr make_rfx_flex400(dboard_base::ctor_args_t args){      return dboard_base::sptr(new rfx_xcvr(args, freq_range_t(400e6, 500e6), false, true));  } -static dboard_base::sptr make_rfx_flex900(dboard_base::ctor_args_t const& args){ +static dboard_base::sptr make_rfx_flex900(dboard_base::ctor_args_t args){      return dboard_base::sptr(new rfx_xcvr(args, freq_range_t(750e6, 1050e6), true, true));  } -static dboard_base::sptr make_rfx_flex1800(dboard_base::ctor_args_t const& args){ +static dboard_base::sptr make_rfx_flex1800(dboard_base::ctor_args_t args){      return dboard_base::sptr(new rfx_xcvr(args, freq_range_t(1500e6, 2100e6), false, false));  } -static dboard_base::sptr make_rfx_flex1200(dboard_base::ctor_args_t const& args){ +static dboard_base::sptr make_rfx_flex1200(dboard_base::ctor_args_t args){      return dboard_base::sptr(new rfx_xcvr(args, freq_range_t(1150e6, 1450e6), true, true));  } -static dboard_base::sptr make_rfx_flex2400(dboard_base::ctor_args_t const& args){ +static dboard_base::sptr make_rfx_flex2400(dboard_base::ctor_args_t args){      return dboard_base::sptr(new rfx_xcvr(args, freq_range_t(2300e6, 2900e6), false, false));  } @@ -149,7 +149,7 @@ UHD_STATIC_BLOCK(reg_rfx_dboards){   * Structors   **********************************************************************/  rfx_xcvr::rfx_xcvr( -    ctor_args_t const& args, +    ctor_args_t args,      const freq_range_t &freq_range,      bool rx_div2, bool tx_div2  ) : xcvr_dboard_base(args){ @@ -351,7 +351,7 @@ void rfx_xcvr::rx_get(const wax::obj &key_, wax::obj &val){      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){      case SUBDEV_PROP_NAME: -        val = dboard_id::to_string(get_rx_id()); +        val = get_rx_id().to_pp_string();          return;      case SUBDEV_PROP_OTHERS: @@ -448,7 +448,7 @@ void rfx_xcvr::tx_get(const wax::obj &key_, wax::obj &val){      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){      case SUBDEV_PROP_NAME: -        val = dboard_id::to_string(get_tx_id()); +        val = get_tx_id().to_pp_string();          return;      case SUBDEV_PROP_OTHERS: diff --git a/host/lib/usrp/dboard/db_xcvr2450.cpp b/host/lib/usrp/dboard/db_xcvr2450.cpp index 0dfef2a0a..3bf866fc8 100644 --- a/host/lib/usrp/dboard/db_xcvr2450.cpp +++ b/host/lib/usrp/dboard/db_xcvr2450.cpp @@ -89,7 +89,7 @@ static const uhd::dict<std::string, gain_range_t> xcvr_rx_gain_ranges = map_list   **********************************************************************/  class xcvr2450 : public xcvr_dboard_base{  public: -    xcvr2450(ctor_args_t const& args); +    xcvr2450(ctor_args_t args);      ~xcvr2450(void);      void rx_get(const wax::obj &key, wax::obj &val); @@ -152,7 +152,7 @@ private:  /***********************************************************************   * Register the XCVR 2450 dboard   **********************************************************************/ -static dboard_base::sptr make_xcvr2450(dboard_base::ctor_args_t const& args){ +static dboard_base::sptr make_xcvr2450(dboard_base::ctor_args_t args){      return dboard_base::sptr(new xcvr2450(args));  } @@ -165,7 +165,7 @@ UHD_STATIC_BLOCK(reg_xcvr2450_dboard){  /***********************************************************************   * Structors   **********************************************************************/ -xcvr2450::xcvr2450(ctor_args_t const& args) : xcvr_dboard_base(args){ +xcvr2450::xcvr2450(ctor_args_t args) : xcvr_dboard_base(args){      //enable only the clocks we need      this->get_iface()->set_clock_enabled(dboard_iface::UNIT_TX, true); @@ -444,7 +444,7 @@ void xcvr2450::rx_get(const wax::obj &key_, wax::obj &val){      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){      case SUBDEV_PROP_NAME: -        val = dboard_id::to_string(get_rx_id()); +        val = get_rx_id().to_pp_string();          return;      case SUBDEV_PROP_OTHERS: @@ -542,7 +542,7 @@ void xcvr2450::tx_get(const wax::obj &key_, wax::obj &val){      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){      case SUBDEV_PROP_NAME: -        val = dboard_id::to_string(get_tx_id()); +        val = get_tx_id().to_pp_string();          return;      case SUBDEV_PROP_OTHERS: diff --git a/host/lib/usrp/dboard_base.cpp b/host/lib/usrp/dboard_base.cpp index 68e4743d1..bd4b37ef3 100644 --- a/host/lib/usrp/dboard_base.cpp +++ b/host/lib/usrp/dboard_base.cpp @@ -15,6 +15,7 @@  // along with this program.  If not, see <http://www.gnu.org/licenses/>.  // +#include "dboard_ctor_args.hpp"  #include <uhd/usrp/dboard_base.hpp>  #include <boost/format.hpp>  #include <stdexcept> @@ -24,43 +25,48 @@ using namespace uhd::usrp;  /***********************************************************************   * dboard_base dboard dboard_base class   **********************************************************************/ -dboard_base::dboard_base(ctor_args_t const& args){ -    boost::tie(_subdev_name, _dboard_iface, _rx_id, _tx_id) = args; +struct dboard_base::dboard_base_impl{ +    ctor_args_impl args; +    dboard_base_impl(ctor_args_t args) : args(*args){} +}; + +dboard_base::dboard_base(ctor_args_t args){ +    _impl = new dboard_base_impl(args);  }  dboard_base::~dboard_base(void){ -    /* NOP */ +   delete _impl;  }  std::string dboard_base::get_subdev_name(void){ -    return _subdev_name; +    return _impl->args.sd_name;  }  dboard_iface::sptr dboard_base::get_iface(void){ -    return _dboard_iface; +    return _impl->args.db_iface;  }  dboard_id_t dboard_base::get_rx_id(void){ -    return _rx_id; +    return _impl->args.rx_id;  }  dboard_id_t dboard_base::get_tx_id(void){ -    return _tx_id; +    return _impl->args.tx_id;  }  /***********************************************************************   * xcvr dboard dboard_base class   **********************************************************************/ -xcvr_dboard_base::xcvr_dboard_base(ctor_args_t const& args) : dboard_base(args){ -    if (get_rx_id() == dboard_id::NONE){ +xcvr_dboard_base::xcvr_dboard_base(ctor_args_t args) : dboard_base(args){ +    if (get_rx_id() == dboard_id_t::none()){          throw std::runtime_error(str(boost::format(              "cannot create xcvr board when the rx id is \"%s\"" -        ) % dboard_id::to_string(dboard_id::NONE))); +        ) % dboard_id_t::none().to_pp_string()));      } -    if (get_tx_id() == dboard_id::NONE){ +    if (get_tx_id() == dboard_id_t::none()){          throw std::runtime_error(str(boost::format(              "cannot create xcvr board when the tx id is \"%s\"" -        ) % dboard_id::to_string(dboard_id::NONE))); +        ) % dboard_id_t::none().to_pp_string()));      }  } @@ -71,12 +77,12 @@ xcvr_dboard_base::~xcvr_dboard_base(void){  /***********************************************************************   * rx dboard dboard_base class   **********************************************************************/ -rx_dboard_base::rx_dboard_base(ctor_args_t const& args) : dboard_base(args){ -    if (get_tx_id() != dboard_id::NONE){ +rx_dboard_base::rx_dboard_base(ctor_args_t args) : dboard_base(args){ +    if (get_tx_id() != dboard_id_t::none()){          throw std::runtime_error(str(boost::format(              "cannot create rx board when the tx id is \"%s\""              " -> expected a tx id of \"%s\"" -        ) % dboard_id::to_string(get_tx_id()) % dboard_id::to_string(dboard_id::NONE))); +        ) % get_tx_id().to_pp_string() % dboard_id_t::none().to_pp_string()));      }  } @@ -95,12 +101,12 @@ void rx_dboard_base::tx_set(const wax::obj &, const wax::obj &){  /***********************************************************************   * tx dboard dboard_base class   **********************************************************************/ -tx_dboard_base::tx_dboard_base(ctor_args_t const& args) : dboard_base(args){ -    if (get_rx_id() != dboard_id::NONE){ +tx_dboard_base::tx_dboard_base(ctor_args_t args) : dboard_base(args){ +    if (get_rx_id() != dboard_id_t::none()){          throw std::runtime_error(str(boost::format(              "cannot create tx board when the rx id is \"%s\""              " -> expected a rx id of \"%s\"" -        ) % dboard_id::to_string(get_rx_id()) % dboard_id::to_string(dboard_id::NONE))); +        ) % get_rx_id().to_pp_string() % dboard_id_t::none().to_pp_string()));      }  } diff --git a/host/lib/usrp/dboard_ctor_args.hpp b/host/lib/usrp/dboard_ctor_args.hpp new file mode 100644 index 000000000..13abe79e8 --- /dev/null +++ b/host/lib/usrp/dboard_ctor_args.hpp @@ -0,0 +1,32 @@ +// +// 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_DBOARD_CTOR_ARGS_HPP +#define INCLUDED_DBOARD_CTOR_ARGS_HPP + +#include <uhd/usrp/dboard_id.hpp> +#include <uhd/usrp/dboard_base.hpp> +#include <uhd/usrp/dboard_iface.hpp> +#include <string> + +struct uhd::usrp::dboard_base::ctor_args_impl{ +    std::string               sd_name; +    dboard_iface::sptr        db_iface; +    dboard_id_t               rx_id, tx_id; +}; + +#endif /* INCLUDED_DBOARD_CTOR_ARGS_HPP */ diff --git a/host/lib/usrp/dboard_eeprom.cpp b/host/lib/usrp/dboard_eeprom.cpp index 54e7a4fd9..fa3631948 100644 --- a/host/lib/usrp/dboard_eeprom.cpp +++ b/host/lib/usrp/dboard_eeprom.cpp @@ -80,19 +80,20 @@ dboard_eeprom_t::dboard_eeprom_t(const byte_vector_t &bytes){          UHD_ASSERT_THROW(bytes.size() >= DB_EEPROM_CLEN);          UHD_ASSERT_THROW(bytes[DB_EEPROM_MAGIC] == DB_EEPROM_MAGIC_VALUE);          UHD_ASSERT_THROW(bytes[DB_EEPROM_CHKSUM] == checksum(bytes)); -        id = \ -            (boost::uint16_t(bytes[DB_EEPROM_ID_LSB]) << 0) | -            (boost::uint16_t(bytes[DB_EEPROM_ID_MSB]) << 8) ; +        id = dboard_id_t::from_uint16(0 +            | (boost::uint16_t(bytes[DB_EEPROM_ID_LSB]) << 0) +            | (boost::uint16_t(bytes[DB_EEPROM_ID_MSB]) << 8) +        );      }catch(const uhd::assert_error &){ -        id = dboard_id::NONE; +        id = dboard_id_t::none();      }  }  byte_vector_t dboard_eeprom_t::get_eeprom_bytes(void){      byte_vector_t bytes(DB_EEPROM_CLEN, 0); //defaults to all zeros      bytes[DB_EEPROM_MAGIC] = DB_EEPROM_MAGIC_VALUE; -    bytes[DB_EEPROM_ID_LSB] = boost::uint8_t(id >> 0); -    bytes[DB_EEPROM_ID_MSB] = boost::uint8_t(id >> 8); +    bytes[DB_EEPROM_ID_LSB] = boost::uint8_t(id.to_uint16() >> 0); +    bytes[DB_EEPROM_ID_MSB] = boost::uint8_t(id.to_uint16() >> 8);      bytes[DB_EEPROM_CHKSUM] = checksum(bytes);      return bytes;  } diff --git a/host/lib/usrp/dboard_id.cpp b/host/lib/usrp/dboard_id.cpp new file mode 100644 index 000000000..3028d2a3b --- /dev/null +++ b/host/lib/usrp/dboard_id.cpp @@ -0,0 +1,68 @@ +// +// 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 <uhd/usrp/dboard_id.hpp> +#include <boost/lexical_cast.hpp> +#include <boost/format.hpp> +#include <sstream> +#include <iostream> + +using namespace uhd::usrp; + +dboard_id_t::dboard_id_t(boost::uint16_t id){ +    _id = id; +} + +dboard_id_t dboard_id_t::none(void){ +    return dboard_id_t(); +} + +dboard_id_t dboard_id_t::from_uint16(boost::uint16_t uint16){ +    return dboard_id_t(uint16); +} + +boost::uint16_t dboard_id_t::to_uint16(void) const{ +    return _id; +} + +//used with lexical cast to parse a hex string +template <class T> struct to_hex{ +    T value; +    operator T() const {return value;} +    friend std::istream& operator>>(std::istream& in, to_hex& out){ +        in >> std::hex >> out.value; +        return in; +    } +}; + +dboard_id_t dboard_id_t::from_string(const std::string &string){ +    if (string.substr(0, 2) == "0x"){ +        return dboard_id_t::from_uint16(boost::lexical_cast<to_hex<boost::uint16_t> >(string)); +    } +    return dboard_id_t::from_uint16(boost::lexical_cast<boost::uint16_t>(string)); +} + +std::string dboard_id_t::to_string(void) const{ +    return str(boost::format("0x%04x") % this->to_uint16()); +} + +//Note: to_pp_string is implemented in the dboard manager +//because it needs access to the dboard registration table + +bool uhd::usrp::operator==(const dboard_id_t &lhs, const dboard_id_t &rhs){ +    return lhs.to_uint16() == rhs.to_uint16(); +} diff --git a/host/lib/usrp/dboard_manager.cpp b/host/lib/usrp/dboard_manager.cpp index 390c1d3c9..8161727e5 100644 --- a/host/lib/usrp/dboard_manager.cpp +++ b/host/lib/usrp/dboard_manager.cpp @@ -15,6 +15,7 @@  // along with this program.  If not, see <http://www.gnu.org/licenses/>.  // +#include "dboard_ctor_args.hpp"  #include <uhd/usrp/dboard_manager.hpp>  #include <uhd/usrp/subdev_props.hpp>  #include <uhd/utils/gain_handler.hpp> @@ -26,6 +27,7 @@  #include <boost/bind.hpp>  #include <boost/foreach.hpp>  #include <boost/assign/list_of.hpp> +#include <iostream>  using namespace uhd;  using namespace uhd::usrp; @@ -49,15 +51,18 @@ void dboard_manager::register_dboard(      //std::cout << "registering: " << name << std::endl;      if (get_id_to_args_map().has_key(dboard_id)){          throw std::runtime_error(str(boost::format( -            "The dboard id 0x%04x is already registered to %s." -        ) % dboard_id % dboard_id::to_string(dboard_id))); +            "The dboard id %s is already registered to %s." +        ) % dboard_id.to_string() % dboard_id.to_pp_string()));      }      get_id_to_args_map()[dboard_id] = args_t(dboard_ctor, name, subdev_names);  } -std::string dboard_id::to_string(const dboard_id_t &id){ -    std::string name = (get_id_to_args_map().has_key(id))? get_id_to_args_map()[id].get<1>() : "unknown"; -    return str(boost::format("%s (0x%04x)") % name % id); +std::string dboard_id_t::to_pp_string(void) const{ +    std::string name = "unknown"; +    if (get_id_to_args_map().has_key(*this)){ +        name = get_id_to_args_map()[*this].get<1>(); +    } +    return str(boost::format("%s (%s)") % name % this->to_string());  }  /*********************************************************************** @@ -162,26 +167,27 @@ dboard_manager::sptr dboard_manager::make(   * implementation class methods   **********************************************************************/  static args_t get_dboard_args( -    dboard_id_t dboard_id, -    std::string const& xx_type +    dboard_iface::unit_t unit, +    dboard_id_t dboard_id  ){ -    //special case, its rx and the none id (0xffff) -    if (xx_type == "rx" and dboard_id == dboard_id::NONE){ -        return get_dboard_args(0x0001, xx_type); -    } - -    //special case, its tx and the none id (0xffff) -    if (xx_type == "tx" and dboard_id == dboard_id::NONE){ -        return get_dboard_args(0x0000, xx_type); +    //special case, the none id was provided, use the following ids +    if (dboard_id == dboard_id_t::none()){ +        std::cerr << boost::format( +            "Warning: unregistered dboard id: %s" +            " -> defaulting to a basic board" +        ) % dboard_id.to_pp_string() << std::endl; +        UHD_ASSERT_THROW(get_id_to_args_map().has_key(0x0001)); +        UHD_ASSERT_THROW(get_id_to_args_map().has_key(0x0000)); +        switch(unit){ +        case dboard_iface::UNIT_RX: return get_dboard_args(unit, 0x0001); +        case dboard_iface::UNIT_TX: return get_dboard_args(unit, 0x0000); +        default: UHD_ASSERT_THROW(false); +        }      }      //verify that there is a registered constructor for this id      if (not get_id_to_args_map().has_key(dboard_id)){ -        /*throw std::runtime_error(str( -            boost::format("Unregistered %s dboard id: %s") -            % xx_type % dboard_id::to_string(dboard_id) -        ));*/ -        return get_dboard_args(dboard_id::NONE, xx_type); +        return get_dboard_args(unit, dboard_id_t::none());      }      //return the dboard args for this id @@ -196,21 +202,26 @@ dboard_manager_impl::dboard_manager_impl(      _iface = iface;      dboard_ctor_t rx_dboard_ctor; std::string rx_name; prop_names_t rx_subdevs; -    boost::tie(rx_dboard_ctor, rx_name, rx_subdevs) = get_dboard_args(rx_dboard_id, "rx"); +    boost::tie(rx_dboard_ctor, rx_name, rx_subdevs) = get_dboard_args(dboard_iface::UNIT_RX, rx_dboard_id);      dboard_ctor_t tx_dboard_ctor; std::string tx_name; prop_names_t tx_subdevs; -    boost::tie(tx_dboard_ctor, tx_name, tx_subdevs) = get_dboard_args(tx_dboard_id, "tx"); +    boost::tie(tx_dboard_ctor, tx_name, tx_subdevs) = get_dboard_args(dboard_iface::UNIT_TX, tx_dboard_id);      //initialize the gpio pins before creating subdevs      set_nice_dboard_if(); +    //dboard constructor args +    dboard_base::ctor_args_impl db_ctor_args; +    db_ctor_args.db_iface = iface; +      //make xcvr subdevs (make one subdev for both rx and tx dboards)      if (rx_dboard_ctor == tx_dboard_ctor){          UHD_ASSERT_THROW(rx_subdevs == tx_subdevs);          BOOST_FOREACH(const std::string &subdev, rx_subdevs){ -            dboard_base::sptr xcvr_dboard = rx_dboard_ctor( -                dboard_base::ctor_args_t(subdev, iface, rx_dboard_id, tx_dboard_id) -            ); +            db_ctor_args.sd_name = subdev; +            db_ctor_args.rx_id = rx_dboard_id; +            db_ctor_args.tx_id = tx_dboard_id; +            dboard_base::sptr xcvr_dboard = rx_dboard_ctor(&db_ctor_args);              //create a rx proxy for this xcvr board              _rx_dboards[subdev] = subdev_proxy::sptr(                  new subdev_proxy(xcvr_dboard, subdev_proxy::RX_TYPE) @@ -226,9 +237,10 @@ dboard_manager_impl::dboard_manager_impl(      else{          //make the rx subdevs          BOOST_FOREACH(const std::string &subdev, rx_subdevs){ -            dboard_base::sptr rx_dboard = rx_dboard_ctor( -                dboard_base::ctor_args_t(subdev, iface, rx_dboard_id, dboard_id::NONE) -            ); +            db_ctor_args.sd_name = subdev; +            db_ctor_args.rx_id = rx_dboard_id; +            db_ctor_args.tx_id = dboard_id_t::none(); +            dboard_base::sptr rx_dboard = rx_dboard_ctor(&db_ctor_args);              //create a rx proxy for this rx board              _rx_dboards[subdev] = subdev_proxy::sptr(                  new subdev_proxy(rx_dboard, subdev_proxy::RX_TYPE) @@ -236,9 +248,10 @@ dboard_manager_impl::dboard_manager_impl(          }          //make the tx subdevs          BOOST_FOREACH(const std::string &subdev, tx_subdevs){ -            dboard_base::sptr tx_dboard = tx_dboard_ctor( -                dboard_base::ctor_args_t(subdev, iface, dboard_id::NONE, tx_dboard_id) -            ); +            db_ctor_args.sd_name = subdev; +            db_ctor_args.rx_id = dboard_id_t::none(); +            db_ctor_args.tx_id = tx_dboard_id; +            dboard_base::sptr tx_dboard = tx_dboard_ctor(&db_ctor_args);              //create a tx proxy for this tx board              _tx_dboards[subdev] = subdev_proxy::sptr(                  new subdev_proxy(tx_dboard, subdev_proxy::TX_TYPE) diff --git a/host/lib/usrp/usrp2/dboard_iface.cpp b/host/lib/usrp/usrp2/dboard_iface.cpp index 74d80163c..372a5af07 100644 --- a/host/lib/usrp/usrp2/dboard_iface.cpp +++ b/host/lib/usrp/usrp2/dboard_iface.cpp @@ -29,6 +29,7 @@  using namespace uhd;  using namespace uhd::usrp; +using namespace boost::assign;  class usrp2_dboard_iface : public dboard_iface{  public: @@ -122,49 +123,42 @@ double usrp2_dboard_iface::get_clock_rate(unit_t){  void usrp2_dboard_iface::set_clock_enabled(unit_t unit, bool enb){      switch(unit){ -    case UNIT_RX: -        _clk_ctrl->enable_rx_dboard_clock(enb); -        return; -    case UNIT_TX: -        _clk_ctrl->enable_tx_dboard_clock(enb); -        return; +    case UNIT_RX: _clk_ctrl->enable_rx_dboard_clock(enb); return; +    case UNIT_TX: _clk_ctrl->enable_tx_dboard_clock(enb); return;      }  }  /***********************************************************************   * GPIO   **********************************************************************/ -static int unit_to_shift(dboard_iface::unit_t unit){ -    switch(unit){ -    case dboard_iface::UNIT_RX: return 0; -    case dboard_iface::UNIT_TX: return 16; -    } -    throw std::runtime_error("unknown unit type"); -} +static const uhd::dict<dboard_iface::unit_t, int> unit_to_shift = map_list_of +    (dboard_iface::UNIT_RX, 0) +    (dboard_iface::UNIT_TX, 16) +;  void usrp2_dboard_iface::set_gpio_ddr(unit_t unit, boost::uint16_t value){      _ddr_shadow = \ -        (_ddr_shadow & ~(0xffff << unit_to_shift(unit))) | -        (boost::uint32_t(value) << unit_to_shift(unit)); +        (_ddr_shadow & ~(0xffff << unit_to_shift[unit])) | +        (boost::uint32_t(value) << unit_to_shift[unit]);      _iface->poke32(FR_GPIO_DDR, _ddr_shadow);  }  boost::uint16_t usrp2_dboard_iface::read_gpio(unit_t unit){ -    return boost::uint16_t(_iface->peek32(FR_GPIO_IO) >> unit_to_shift(unit)); +    return boost::uint16_t(_iface->peek32(FR_GPIO_IO) >> unit_to_shift[unit]);  }  void usrp2_dboard_iface::set_atr_reg(unit_t unit, atr_reg_t atr, boost::uint16_t value){      //define mapping of unit to atr regs to register address      static const uhd::dict<          unit_t, uhd::dict<atr_reg_t, boost::uint32_t> -    > unit_to_atr_to_addr = boost::assign::map_list_of -        (UNIT_RX, boost::assign::map_list_of +    > unit_to_atr_to_addr = map_list_of +        (UNIT_RX, map_list_of              (ATR_REG_IDLE,        FR_ATR_IDLE_RXSIDE)              (ATR_REG_TX_ONLY,     FR_ATR_INTX_RXSIDE)              (ATR_REG_RX_ONLY,     FR_ATR_INRX_RXSIDE)              (ATR_REG_FULL_DUPLEX, FR_ATR_FULL_RXSIDE)          ) -        (UNIT_TX, boost::assign::map_list_of +        (UNIT_TX, map_list_of              (ATR_REG_IDLE,        FR_ATR_IDLE_TXSIDE)              (ATR_REG_TX_ONLY,     FR_ATR_INTX_TXSIDE)              (ATR_REG_RX_ONLY,     FR_ATR_INRX_TXSIDE) @@ -177,19 +171,10 @@ void usrp2_dboard_iface::set_atr_reg(unit_t unit, atr_reg_t atr, boost::uint16_t  /***********************************************************************   * SPI   **********************************************************************/ -/*! - * Static function to convert a unit type enum - * to an over-the-wire value for the spi device. - * \param unit the dboard interface unit type enum - * \return an over the wire representation - */ -static boost::uint8_t unit_to_otw_spi_dev(dboard_iface::unit_t unit){ -    switch(unit){ -    case dboard_iface::UNIT_TX: return SPI_SS_TX_DB; -    case dboard_iface::UNIT_RX: return SPI_SS_RX_DB; -    } -    throw std::invalid_argument("unknown unit type"); -} +static const uhd::dict<dboard_iface::unit_t, int> unit_to_spi_dev = map_list_of +    (dboard_iface::UNIT_TX, SPI_SS_TX_DB) +    (dboard_iface::UNIT_RX, SPI_SS_RX_DB) +;  void usrp2_dboard_iface::write_spi(      unit_t unit, @@ -197,7 +182,7 @@ void usrp2_dboard_iface::write_spi(      boost::uint32_t data,      size_t num_bits  ){ -    _iface->transact_spi(unit_to_otw_spi_dev(unit), config, data, num_bits, false /*no rb*/); +    _iface->transact_spi(unit_to_spi_dev[unit], config, data, num_bits, false /*no rb*/);  }  boost::uint32_t usrp2_dboard_iface::read_write_spi( @@ -206,7 +191,7 @@ boost::uint32_t usrp2_dboard_iface::read_write_spi(      boost::uint32_t data,      size_t num_bits  ){ -    return _iface->transact_spi(unit_to_otw_spi_dev(unit), config, data, num_bits, true /*rb*/); +    return _iface->transact_spi(unit_to_spi_dev[unit], config, data, num_bits, true /*rb*/);  }  /*********************************************************************** @@ -224,7 +209,7 @@ byte_vector_t usrp2_dboard_iface::read_i2c(boost::uint8_t addr, size_t num_bytes   * Aux DAX/ADC   **********************************************************************/  void usrp2_dboard_iface::_write_aux_dac(unit_t unit){ -    static const uhd::dict<unit_t, int> unit_to_spi_dac = boost::assign::map_list_of +    static const uhd::dict<unit_t, int> unit_to_spi_dac = map_list_of          (UNIT_RX, SPI_SS_RX_DAC)          (UNIT_TX, SPI_SS_TX_DAC)      ; @@ -248,7 +233,7 @@ void usrp2_dboard_iface::write_aux_dac(unit_t unit, int which, float value){  }  float usrp2_dboard_iface::read_aux_adc(unit_t unit, int which){ -    static const uhd::dict<unit_t, int> unit_to_spi_adc = boost::assign::map_list_of +    static const uhd::dict<unit_t, int> unit_to_spi_adc = map_list_of          (UNIT_RX, SPI_SS_RX_ADC)          (UNIT_TX, SPI_SS_TX_ADC)      ;  | 
