diff options
Diffstat (limited to 'host/lib/usrp/dboard')
-rw-r--r-- | host/lib/usrp/dboard/base.cpp | 89 | ||||
-rw-r--r-- | host/lib/usrp/dboard/basic.cpp | 56 | ||||
-rw-r--r-- | host/lib/usrp/dboard/dboards.hpp | 53 | ||||
-rw-r--r-- | host/lib/usrp/dboard/id.cpp | 39 | ||||
-rw-r--r-- | host/lib/usrp/dboard/interface.cpp | 28 | ||||
-rw-r--r-- | host/lib/usrp/dboard/manager.cpp | 205 |
6 files changed, 470 insertions, 0 deletions
diff --git a/host/lib/usrp/dboard/base.cpp b/host/lib/usrp/dboard/base.cpp new file mode 100644 index 000000000..de8db323a --- /dev/null +++ b/host/lib/usrp/dboard/base.cpp @@ -0,0 +1,89 @@ +// +// 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/base.hpp> +#include <stdexcept> + +using namespace uhd::usrp::dboard; + +/*********************************************************************** + * base dboard base class + **********************************************************************/ +base::base(ctor_args_t const& args){ + boost::tie(_subdev_name, _dboard_interface) = args; +} + +base::~base(void){ + /* NOP */ +} + +std::string base::get_subdev_name(void){ + return _subdev_name; +} + +interface::sptr base::get_interface(void){ + return _dboard_interface; +} + +/*********************************************************************** + * xcvr dboard base class + **********************************************************************/ +xcvr_base::xcvr_base(ctor_args_t const& args) : base(args){ + /* NOP */ +} + +xcvr_base::~xcvr_base(void){ + /* NOP */ +} + +/*********************************************************************** + * rx dboard base class + **********************************************************************/ +rx_base::rx_base(ctor_args_t const& args) : base(args){ + /* NOP */ +} + +rx_base::~rx_base(void){ + /* NOP */ +} + +void rx_base::tx_get(const wax::obj &, wax::obj &){ + throw std::runtime_error("cannot call tx_get on a rx dboard"); +} + +void rx_base::tx_set(const wax::obj &, const wax::obj &){ + throw std::runtime_error("cannot call tx_set on a rx dboard"); +} + +/*********************************************************************** + * tx dboard base class + **********************************************************************/ +tx_base::tx_base(ctor_args_t const& args) : base(args){ + /* NOP */ +} + +tx_base::~tx_base(void){ + /* NOP */ +} + +void tx_base::rx_get(const wax::obj &, wax::obj &){ + throw std::runtime_error("cannot call rx_get on a tx dboard"); +} + +void tx_base::rx_set(const wax::obj &, const wax::obj &){ + throw std::runtime_error("cannot call rx_set on a tx dboard"); +} diff --git a/host/lib/usrp/dboard/basic.cpp b/host/lib/usrp/dboard/basic.cpp new file mode 100644 index 000000000..35512aa5f --- /dev/null +++ b/host/lib/usrp/dboard/basic.cpp @@ -0,0 +1,56 @@ +// +// 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 "dboards.hpp" + +/*********************************************************************** + * Basic RX dboard + **********************************************************************/ +basic_rx::basic_rx(ctor_args_t const& args) : rx_base(args){ + /* NOP */ +} + +basic_rx::~basic_rx(void){ + /* NOP */ +} + +void basic_rx::rx_get(const wax::obj &, wax::obj &){ + /* TODO */ +} + +void basic_rx::rx_set(const wax::obj &, const wax::obj &){ + /* TODO */ +} + +/*********************************************************************** + * Basic TX dboard + **********************************************************************/ +basic_tx::basic_tx(ctor_args_t const& args) : tx_base(args){ + /* NOP */ +} + +basic_tx::~basic_tx(void){ + /* NOP */ +} + +void basic_tx::tx_get(const wax::obj &, wax::obj &){ + /* TODO */ +} + +void basic_tx::tx_set(const wax::obj &, const wax::obj &){ + /* TODO */ +} diff --git a/host/lib/usrp/dboard/dboards.hpp b/host/lib/usrp/dboard/dboards.hpp new file mode 100644 index 000000000..0e740856f --- /dev/null +++ b/host/lib/usrp/dboard/dboards.hpp @@ -0,0 +1,53 @@ +// +// 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_LOCAL_DBOARDS_HPP +#define INCLUDED_LOCAL_DBOARDS_HPP + +#include <uhd/usrp/dboard/base.hpp> + +using namespace uhd::usrp::dboard; + +/*********************************************************************** + * The basic boards: + **********************************************************************/ +class basic_rx : public rx_base{ +public: + static base::sptr make(ctor_args_t const& args){ + return base::sptr(new basic_rx(args)); + } + basic_rx(ctor_args_t const& args); + ~basic_rx(void); + + void rx_get(const wax::obj &key, wax::obj &val); + void rx_set(const wax::obj &key, const wax::obj &val); +}; + +class basic_tx : public tx_base{ +public: + static base::sptr make(ctor_args_t const& args){ + return base::sptr(new basic_tx(args)); + } + basic_tx(ctor_args_t const& args); + ~basic_tx(void); + + void tx_get(const wax::obj &key, wax::obj &val); + void tx_set(const wax::obj &key, const wax::obj &val); + +}; + +#endif /* INCLUDED_LOCAL_DBOARDS_HPP */ diff --git a/host/lib/usrp/dboard/id.cpp b/host/lib/usrp/dboard/id.cpp new file mode 100644 index 000000000..80162240e --- /dev/null +++ b/host/lib/usrp/dboard/id.cpp @@ -0,0 +1,39 @@ +// +// 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/format.hpp> +#include <uhd/dict.hpp> + +using namespace uhd::usrp::dboard; + +std::ostream& operator<<(std::ostream &os, const dboard_id_t &id){ + //map the dboard ids to string representations + uhd::dict<dboard_id_t, std::string> id_to_str; + id_to_str[ID_NONE] = "none"; + id_to_str[ID_BASIC_TX] = "basic tx"; + id_to_str[ID_BASIC_RX] = "basic rx"; + + //get the string representation + if (id_to_str.has_key(id)){ + os << id_to_str[id]; + } + else{ + os << boost::format("dboard id %u") % unsigned(id); + } + return os; +} diff --git a/host/lib/usrp/dboard/interface.cpp b/host/lib/usrp/dboard/interface.cpp new file mode 100644 index 000000000..837c76d0a --- /dev/null +++ b/host/lib/usrp/dboard/interface.cpp @@ -0,0 +1,28 @@ +// +// 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/interface.hpp> + +using namespace uhd::usrp::dboard; + +interface::interface(void){ + /* NOP */ +} + +interface::~interface(void){ + /* NOP */ +} diff --git a/host/lib/usrp/dboard/manager.cpp b/host/lib/usrp/dboard/manager.cpp new file mode 100644 index 000000000..4a675fd0b --- /dev/null +++ b/host/lib/usrp/dboard/manager.cpp @@ -0,0 +1,205 @@ +// +// 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/manager.hpp> +#include <boost/assign/list_of.hpp> +#include <boost/format.hpp> +#include <boost/foreach.hpp> +#include "dboards.hpp" + +using namespace uhd; +using namespace uhd::usrp::dboard; +using namespace boost::assign; + +/*********************************************************************** + * register internal dboards + * + * Register internal/known dboards located in this build tree. + * Each board should have entries below mapping an id to a constructor. + * The xcvr type boards should register both rx and tx sides. + * + * This function will be called before new boards are registered. + * This allows for internal boards to be externally overridden. + * This function will also be called when creating a new manager + * to ensure that the maps are filled with the entries below. + **********************************************************************/ +static void register_internal_dboards(void){ + //ensure that this function can only be called once per instance + static bool called = false; + if (called) return; called = true; + //register the known dboards (dboard id, constructor, subdev names) + manager::register_subdevs(ID_NONE, &basic_tx::make, list_of("")); //for none, make a basic tx + manager::register_subdevs(ID_NONE, &basic_rx::make, list_of("ab")); //for none, make a basic rx (one subdev) + manager::register_subdevs(ID_BASIC_TX, &basic_tx::make, list_of("")); + manager::register_subdevs(ID_BASIC_RX, &basic_rx::make, list_of("a")("b")("ab")); +} + +/*********************************************************************** + * storage and registering for dboards + **********************************************************************/ +//map a dboard id to a dboard constructor +static uhd::dict<dboard_id_t, manager::dboard_ctor_t> id_to_ctor_map; + +//map a dboard constructor to subdevice names +static uhd::dict<manager::dboard_ctor_t, prop_names_t> ctor_to_names_map; + +void manager::register_subdevs( + dboard_id_t dboard_id, + dboard_ctor_t dboard_ctor, + const prop_names_t &subdev_names +){ + register_internal_dboards(); //always call first + id_to_ctor_map[dboard_id] = dboard_ctor; + ctor_to_names_map[dboard_ctor] = subdev_names; +} + +/*********************************************************************** + * internal helper classes + **********************************************************************/ +/*! + * A special wax proxy object that forwards calls to a subdev. + * A sptr to an instance will be used in the properties structure. + */ +class subdev_proxy : boost::noncopyable, public wax::obj{ +public: + typedef boost::shared_ptr<subdev_proxy> sptr; + enum type_t{RX_TYPE, TX_TYPE}; + + //structors + subdev_proxy(base::sptr subdev, type_t type) + : _subdev(subdev), _type(type){ + /* NOP */ + } + + ~subdev_proxy(void){ + /* NOP */ + } + +private: + base::sptr _subdev; + type_t _type; + + //forward the get calls to the rx or tx + void get(const wax::obj &key, wax::obj &val){ + switch(_type){ + case RX_TYPE: return _subdev->rx_get(key, val); + case TX_TYPE: return _subdev->tx_get(key, val); + } + } + + //forward the set calls to the rx or tx + void set(const wax::obj &key, const wax::obj &val){ + switch(_type){ + case RX_TYPE: return _subdev->rx_set(key, val); + case TX_TYPE: return _subdev->tx_set(key, val); + } + } +}; + +/*********************************************************************** + * dboard manager methods + **********************************************************************/ +static manager::dboard_ctor_t const& get_dboard_ctor( + dboard_id_t dboard_id, + std::string const& xx_type +){ + //verify that there is a registered constructor for this id + if (not id_to_ctor_map.has_key(dboard_id)){ + throw std::runtime_error(str( + boost::format("Unknown %s dboard id: 0x%04x") % xx_type % dboard_id + )); + } + //return the dboard constructor for this id + return id_to_ctor_map[dboard_id]; +} + +manager::manager( + dboard_id_t rx_dboard_id, + dboard_id_t tx_dboard_id, + interface::sptr dboard_interface +){ + register_internal_dboards(); //always call first + const dboard_ctor_t rx_dboard_ctor = get_dboard_ctor(rx_dboard_id, "rx"); + const dboard_ctor_t tx_dboard_ctor = get_dboard_ctor(tx_dboard_id, "tx"); + //make xcvr subdevs (make one subdev for both rx and tx dboards) + if (rx_dboard_ctor == tx_dboard_ctor){ + BOOST_FOREACH(std::string name, ctor_to_names_map[rx_dboard_ctor]){ + base::sptr xcvr_dboard = rx_dboard_ctor( + base::ctor_args_t(name, dboard_interface) + ); + //create a rx proxy for this xcvr board + _rx_dboards[name] = subdev_proxy::sptr( + new subdev_proxy(xcvr_dboard, subdev_proxy::RX_TYPE) + ); + //create a tx proxy for this xcvr board + _tx_dboards[name] = subdev_proxy::sptr( + new subdev_proxy(xcvr_dboard, subdev_proxy::TX_TYPE) + ); + } + } + //make tx and rx subdevs (separate subdevs for rx and tx dboards) + else{ + //make the rx subdevs + BOOST_FOREACH(std::string name, ctor_to_names_map[rx_dboard_ctor]){ + base::sptr rx_dboard = rx_dboard_ctor( + base::ctor_args_t(name, dboard_interface) + ); + //create a rx proxy for this rx board + _rx_dboards[name] = subdev_proxy::sptr( + new subdev_proxy(rx_dboard, subdev_proxy::RX_TYPE) + ); + } + //make the tx subdevs + BOOST_FOREACH(std::string name, ctor_to_names_map[tx_dboard_ctor]){ + base::sptr tx_dboard = tx_dboard_ctor( + base::ctor_args_t(name, dboard_interface) + ); + //create a tx proxy for this tx board + _tx_dboards[name] = subdev_proxy::sptr( + new subdev_proxy(tx_dboard, subdev_proxy::TX_TYPE) + ); + } + } +} + +manager::~manager(void){ + /* NOP */ +} + +prop_names_t manager::get_rx_subdev_names(void){ + return _rx_dboards.get_keys(); +} + +prop_names_t manager::get_tx_subdev_names(void){ + return _tx_dboards.get_keys(); +} + +wax::obj manager::get_rx_subdev(const std::string &subdev_name){ + if (not _rx_dboards.has_key(subdev_name)) throw std::invalid_argument( + str(boost::format("Unknown rx subdev name %s") % subdev_name) + ); + //get a link to the rx subdev proxy + return wax::cast<subdev_proxy::sptr>(_rx_dboards[subdev_name])->get_link(); +} + +wax::obj manager::get_tx_subdev(const std::string &subdev_name){ + if (not _tx_dboards.has_key(subdev_name)) throw std::invalid_argument( + str(boost::format("Unknown tx subdev name %s") % subdev_name) + ); + //get a link to the tx subdev proxy + return wax::cast<subdev_proxy::sptr>(_tx_dboards[subdev_name])->get_link(); +} |