diff options
| author | Josh Blum <josh@joshknows.com> | 2010-06-18 17:20:46 -0700 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2010-06-18 17:20:46 -0700 | 
| commit | e3058c022e4d71401a073fdaa16a97808977e23b (patch) | |
| tree | 8f02c98e26ca999399692be6e631fb8640e3ff98 /host | |
| parent | 16335c108272321408cae01f2d2bf234eb83fe32 (diff) | |
| download | uhd-e3058c022e4d71401a073fdaa16a97808977e23b.tar.gz uhd-e3058c022e4d71401a073fdaa16a97808977e23b.tar.bz2 uhd-e3058c022e4d71401a073fdaa16a97808977e23b.zip  | |
uhd: added checking for xcvr dbids, added unknown dboard rx and tx constructors (for bad dbids or combinations)
Diffstat (limited to 'host')
| -rw-r--r-- | host/lib/usrp/dboard/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | host/lib/usrp/dboard/db_unknown.cpp | 265 | ||||
| -rw-r--r-- | host/lib/usrp/dboard_manager.cpp | 49 | 
3 files changed, 301 insertions, 14 deletions
diff --git a/host/lib/usrp/dboard/CMakeLists.txt b/host/lib/usrp/dboard/CMakeLists.txt index 3a6c2d84a..6093583d3 100644 --- a/host/lib/usrp/dboard/CMakeLists.txt +++ b/host/lib/usrp/dboard/CMakeLists.txt @@ -22,5 +22,6 @@ LIBUHD_APPEND_SOURCES(      ${CMAKE_SOURCE_DIR}/lib/usrp/dboard/db_rfx.cpp      ${CMAKE_SOURCE_DIR}/lib/usrp/dboard/db_xcvr2450.cpp      ${CMAKE_SOURCE_DIR}/lib/usrp/dboard/db_wbx.cpp +    ${CMAKE_SOURCE_DIR}/lib/usrp/dboard/db_unknown.cpp  ) diff --git a/host/lib/usrp/dboard/db_unknown.cpp b/host/lib/usrp/dboard/db_unknown.cpp new file mode 100644 index 000000000..ced27e34d --- /dev/null +++ b/host/lib/usrp/dboard/db_unknown.cpp @@ -0,0 +1,265 @@ +// +// 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/subdev_props.hpp> +#include <uhd/types/ranges.hpp> +#include <uhd/utils/assert.hpp> +#include <uhd/utils/static.hpp> +#include <uhd/usrp/dboard_base.hpp> +#include <uhd/usrp/dboard_manager.hpp> +#include <boost/assign/list_of.hpp> +#include <boost/format.hpp> + +using namespace uhd; +using namespace uhd::usrp; +using namespace boost::assign; + +/*********************************************************************** + * The unknown boards: + *   Like a basic board, but with only one subdev. + **********************************************************************/ +class unknown_rx : public rx_dboard_base{ +public: +    unknown_rx(ctor_args_t args); +    ~unknown_rx(void); + +    void rx_get(const wax::obj &key, wax::obj &val); +    void rx_set(const wax::obj &key, const wax::obj &val); +}; + +class unknown_tx : public tx_dboard_base{ +public: +    unknown_tx(ctor_args_t args); +    ~unknown_tx(void); + +    void tx_get(const wax::obj &key, wax::obj &val); +    void tx_set(const wax::obj &key, const wax::obj &val); +}; + +/*********************************************************************** + * Register the unknown dboards + **********************************************************************/ +static dboard_base::sptr make_unknown_rx(dboard_base::ctor_args_t args){ +    return dboard_base::sptr(new unknown_rx(args)); +} + +static dboard_base::sptr make_unknown_tx(dboard_base::ctor_args_t args){ +    return dboard_base::sptr(new unknown_tx(args)); +} + +UHD_STATIC_BLOCK(reg_unknown_dboards){ +    dboard_manager::register_dboard(0xfff0, &make_unknown_tx, "Unknown TX"); +    dboard_manager::register_dboard(0xfff1, &make_unknown_rx, "Unknown RX"); +} + +/*********************************************************************** + * Unknown RX dboard + **********************************************************************/ +unknown_rx::unknown_rx(ctor_args_t args) : rx_dboard_base(args){ +    /* NOP */ +} + +unknown_rx::~unknown_rx(void){ +    /* NOP */ +} + +void unknown_rx::rx_get(const wax::obj &key_, wax::obj &val){ +    wax::obj key; std::string name; +    boost::tie(key, name) = extract_named_prop(key_); + +    //handle the get request conditioned on the key +    switch(key.as<subdev_prop_t>()){ +    case SUBDEV_PROP_NAME: +        val = "Unknown - " + get_rx_id().to_pp_string(); +        return; + +    case SUBDEV_PROP_OTHERS: +        val = prop_names_t(); //empty +        return; + +    case SUBDEV_PROP_GAIN: +        val = float(0); +        return; + +    case SUBDEV_PROP_GAIN_RANGE: +        val = gain_range_t(0, 0, 0); +        return; + +    case SUBDEV_PROP_GAIN_NAMES: +        val = prop_names_t(); //empty +        return; + +    case SUBDEV_PROP_FREQ: +        val = double(0); +        return; + +    case SUBDEV_PROP_FREQ_RANGE: +        val = freq_range_t(0, 0); +        return; + +    case SUBDEV_PROP_ANTENNA: +        val = std::string(""); +        return; + +    case SUBDEV_PROP_ANTENNA_NAMES: +        val = prop_names_t(1, ""); //vector of 1 empty string +        return; + +    case SUBDEV_PROP_QUADRATURE: +        val = false; +        return; + +    case SUBDEV_PROP_IQ_SWAPPED: +        val = false; +        return; + +    case SUBDEV_PROP_SPECTRUM_INVERTED: +        val = false; +        return; + +    case SUBDEV_PROP_USE_LO_OFFSET: +        val = false; +        return; + +    case SUBDEV_PROP_LO_LOCKED: +        val = true; //there is no LO, so it must be true! +        return; + +    default: UHD_THROW_PROP_GET_ERROR(); +    } +} + +void unknown_rx::rx_set(const wax::obj &key_, const wax::obj &val){ +    wax::obj key; std::string name; +    boost::tie(key, name) = extract_named_prop(key_); + +    //handle the get request conditioned on the key +    switch(key.as<subdev_prop_t>()){ + +    case SUBDEV_PROP_GAIN: +        UHD_ASSERT_THROW(val.as<float>() == float(0)); +        return; + +    case SUBDEV_PROP_ANTENNA: +        UHD_ASSERT_THROW(val.as<std::string>() == std::string("")); +        return; + +    case SUBDEV_PROP_FREQ: +        return; // it wont do you much good, but you can set it + +    default: UHD_THROW_PROP_SET_ERROR(); +    } +} + +/*********************************************************************** + * Basic and LF TX dboard + **********************************************************************/ +unknown_tx::unknown_tx(ctor_args_t args) : tx_dboard_base(args){ +    /* NOP */ +} + +unknown_tx::~unknown_tx(void){ +    /* NOP */ +} + +void unknown_tx::tx_get(const wax::obj &key_, wax::obj &val){ +    wax::obj key; std::string name; +    boost::tie(key, name) = extract_named_prop(key_); + +    //handle the get request conditioned on the key +    switch(key.as<subdev_prop_t>()){ +    case SUBDEV_PROP_NAME: +        val = "Unknown - " + get_tx_id().to_pp_string(); +        return; + +    case SUBDEV_PROP_OTHERS: +        val = prop_names_t(); //empty +        return; + +    case SUBDEV_PROP_GAIN: +        val = float(0); +        return; + +    case SUBDEV_PROP_GAIN_RANGE: +        val = gain_range_t(0, 0, 0); +        return; + +    case SUBDEV_PROP_GAIN_NAMES: +        val = prop_names_t(); //empty +        return; + +    case SUBDEV_PROP_FREQ: +        val = double(0); +        return; + +    case SUBDEV_PROP_FREQ_RANGE: +        val = freq_range_t(0, 0); +        return; + +    case SUBDEV_PROP_ANTENNA: +        val = std::string(""); +        return; + +    case SUBDEV_PROP_ANTENNA_NAMES: +        val = prop_names_t(1, ""); //vector of 1 empty string +        return; + +    case SUBDEV_PROP_QUADRATURE: +        val = true; +        return; + +    case SUBDEV_PROP_IQ_SWAPPED: +        val = false; +        return; + +    case SUBDEV_PROP_SPECTRUM_INVERTED: +        val = false; +        return; + +    case SUBDEV_PROP_USE_LO_OFFSET: +        val = false; +        return; + +    case SUBDEV_PROP_LO_LOCKED: +        val = true; //there is no LO, so it must be true! +        return; + +    default: UHD_THROW_PROP_GET_ERROR(); +    } +} + +void unknown_tx::tx_set(const wax::obj &key_, const wax::obj &val){ +    wax::obj key; std::string name; +    boost::tie(key, name) = extract_named_prop(key_); + +    //handle the get request conditioned on the key +    switch(key.as<subdev_prop_t>()){ + +    case SUBDEV_PROP_GAIN: +        UHD_ASSERT_THROW(val.as<float>() == float(0)); +        return; + +    case SUBDEV_PROP_ANTENNA: +        UHD_ASSERT_THROW(val.as<std::string>() == std::string("")); +        return; + +    case SUBDEV_PROP_FREQ: +        return; // it wont do you much good, but you can set it + +    default: UHD_THROW_PROP_SET_ERROR(); +    } +} diff --git a/host/lib/usrp/dboard_manager.cpp b/host/lib/usrp/dboard_manager.cpp index 31af11ed0..6321e018f 100644 --- a/host/lib/usrp/dboard_manager.cpp +++ b/host/lib/usrp/dboard_manager.cpp @@ -57,6 +57,10 @@ void dboard_manager::register_dboard(      get_id_to_args_map()[dboard_id] = args_t(dboard_ctor, name, subdev_names);  } +//map an xcvr dboard id to its partner dboard id +typedef uhd::dict<dboard_id_t, dboard_id_t> xcvr_id_to_id_map_t; +UHD_SINGLETON_FCN(xcvr_id_to_id_map_t, get_xcvr_id_to_id_map) +  void dboard_manager::register_dboard(      const dboard_id_t &rx_dboard_id,      const dboard_id_t &tx_dboard_id, @@ -64,8 +68,13 @@ void dboard_manager::register_dboard(      const std::string &name,      const prop_names_t &subdev_names  ){ -    register_dboard(rx_dboard_id, dboard_ctor, name, subdev_names); -    register_dboard(tx_dboard_id, dboard_ctor, name, subdev_names); +    //regular registration for ids +    register_dboard(rx_dboard_id, dboard_ctor, name + " RX", subdev_names); +    register_dboard(tx_dboard_id, dboard_ctor, name + " TX", subdev_names); + +    //register xcvr mapping for ids +    get_xcvr_id_to_id_map()[rx_dboard_id] = tx_dboard_id; +    get_xcvr_id_to_id_map()[tx_dboard_id] = rx_dboard_id;  }  std::string dboard_id_t::to_pp_string(void) const{ @@ -179,26 +188,27 @@ dboard_manager::sptr dboard_manager::make(   **********************************************************************/  static args_t get_dboard_args(      dboard_iface::unit_t unit, -    dboard_id_t dboard_id +    dboard_id_t dboard_id, +    bool force_to_unknown = false  ){      //special case, the none id was provided, use the following ids -    if (dboard_id == dboard_id_t::none()){ +    if (dboard_id == dboard_id_t::none() or force_to_unknown){          std::cerr << boost::format( -            "Warning: unregistered dboard id: %s" -            " -> defaulting to a basic board" +            "Warning: unknown dboard-id or dboard-id combination: %s\n" +            "    -> defaulting to the unknown board type"          ) % 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)); +        UHD_ASSERT_THROW(get_id_to_args_map().has_key(0xfff1)); +        UHD_ASSERT_THROW(get_id_to_args_map().has_key(0xfff0));          switch(unit){ -        case dboard_iface::UNIT_RX: return get_dboard_args(unit, 0x0001); -        case dboard_iface::UNIT_TX: return get_dboard_args(unit, 0x0000); +        case dboard_iface::UNIT_RX: return get_dboard_args(unit, 0xfff1); +        case dboard_iface::UNIT_TX: return get_dboard_args(unit, 0xfff0);          default: UHD_THROW_INVALID_CODE_PATH();          }      }      //verify that there is a registered constructor for this id      if (not get_id_to_args_map().has_key(dboard_id)){ -        return get_dboard_args(unit, dboard_id_t::none()); +        return get_dboard_args(unit, dboard_id, true);      }      //return the dboard args for this id @@ -212,11 +222,21 @@ dboard_manager_impl::dboard_manager_impl(  ){      _iface = iface; +    //determine xcvr status +    bool rx_dboard_is_xcvr = get_xcvr_id_to_id_map().has_key(rx_dboard_id); +    bool tx_dboard_is_xcvr = get_xcvr_id_to_id_map().has_key(tx_dboard_id); +    bool this_dboard_is_xcvr = ( +        rx_dboard_is_xcvr and tx_dboard_is_xcvr and +        (get_xcvr_id_to_id_map()[rx_dboard_id] == tx_dboard_id) and +        (get_xcvr_id_to_id_map()[tx_dboard_id] == rx_dboard_id) +    ); + +    //extract dboard constructor and settings (force to unknown for messed up xcvr status)      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(dboard_iface::UNIT_RX, rx_dboard_id); +    boost::tie(rx_dboard_ctor, rx_name, rx_subdevs) = get_dboard_args(dboard_iface::UNIT_RX, rx_dboard_id, rx_dboard_is_xcvr != this_dboard_is_xcvr);      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(dboard_iface::UNIT_TX, tx_dboard_id); +    boost::tie(tx_dboard_ctor, tx_name, tx_subdevs) = get_dboard_args(dboard_iface::UNIT_TX, tx_dboard_id, tx_dboard_is_xcvr != this_dboard_is_xcvr);      //initialize the gpio pins before creating subdevs      set_nice_dboard_if(); @@ -226,7 +246,8 @@ dboard_manager_impl::dboard_manager_impl(      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){ +    if (this_dboard_is_xcvr){ +        UHD_ASSERT_THROW(rx_dboard_ctor == tx_dboard_ctor);          UHD_ASSERT_THROW(rx_subdevs == tx_subdevs);          BOOST_FOREACH(const std::string &subdev, rx_subdevs){              db_ctor_args.sd_name = subdev;  | 
