summaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/dboard
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/usrp/dboard')
-rw-r--r--host/lib/usrp/dboard/base.cpp89
-rw-r--r--host/lib/usrp/dboard/basic.cpp56
-rw-r--r--host/lib/usrp/dboard/dboards.hpp53
-rw-r--r--host/lib/usrp/dboard/id.cpp39
-rw-r--r--host/lib/usrp/dboard/interface.cpp28
-rw-r--r--host/lib/usrp/dboard/manager.cpp205
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();
+}