aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/usrp1/dboard_impl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/usrp/usrp1/dboard_impl.cpp')
-rw-r--r--host/lib/usrp/usrp1/dboard_impl.cpp148
1 files changed, 82 insertions, 66 deletions
diff --git a/host/lib/usrp/usrp1/dboard_impl.cpp b/host/lib/usrp/usrp1/dboard_impl.cpp
index 9df87432d..ba826d2f5 100644
--- a/host/lib/usrp/usrp1/dboard_impl.cpp
+++ b/host/lib/usrp/usrp1/dboard_impl.cpp
@@ -23,96 +23,107 @@
#include <uhd/usrp/dboard_props.hpp>
#include <uhd/usrp/subdev_props.hpp>
#include <boost/bind.hpp>
+#include <boost/foreach.hpp>
+#include <boost/format.hpp>
#include <iostream>
using namespace uhd;
using namespace uhd::usrp;
/***********************************************************************
- * Dboard Initialization
+ * Helper Functions
**********************************************************************/
-void usrp1_impl::dboard_init(void)
-{
- _rx_db_eeprom = dboard_eeprom_t(
- _iface->read_eeprom(I2C_ADDR_RX_A, 0, dboard_eeprom_t::num_bytes()));
-
- _tx_db_eeprom = dboard_eeprom_t(
- _iface->read_eeprom(I2C_ADDR_TX_A, 0, dboard_eeprom_t::num_bytes()));
-
-
- //create a new dboard interface and manager
- _dboard_iface = make_usrp1_dboard_iface(_iface, _clock_ctrl, _codec_ctrl);
-
- _dboard_manager = dboard_manager::make(_rx_db_eeprom.id,
- _tx_db_eeprom.id,
- _dboard_iface);
-
- //setup the dboard proxies
- _rx_dboard_proxy = wax_obj_proxy::make(
- boost::bind(&usrp1_impl::rx_dboard_get, this, _1, _2),
- boost::bind(&usrp1_impl::rx_dboard_set, this, _1, _2));
-
- _tx_dboard_proxy = wax_obj_proxy::make(
- boost::bind(&usrp1_impl::tx_dboard_get, this, _1, _2),
- boost::bind(&usrp1_impl::tx_dboard_set, this, _1, _2));
+static boost::uint8_t get_rx_ee_addr(usrp1_impl::dboard_slot_t dboard_slot){
+ switch(dboard_slot){
+ case usrp1_impl::DBOARD_SLOT_A: return I2C_ADDR_RX_A;
+ case usrp1_impl::DBOARD_SLOT_B: return I2C_ADDR_RX_B;
+ default: UHD_THROW_INVALID_CODE_PATH();
+ }
+}
+static boost::uint8_t get_tx_ee_addr(usrp1_impl::dboard_slot_t dboard_slot){
+ switch(dboard_slot){
+ case usrp1_impl::DBOARD_SLOT_A: return I2C_ADDR_TX_A;
+ case usrp1_impl::DBOARD_SLOT_B: return I2C_ADDR_TX_B;
+ default: UHD_THROW_INVALID_CODE_PATH();
+ }
}
+
/***********************************************************************
- * Helper functions
+ * Dboard Initialization
**********************************************************************/
-//static int slot_to_i2c_addr (int slot)
-//{
-// switch (slot) {
-// case SLOT_TX_A:
-// return I2C_ADDR_TX_A;
-// case SLOT_RX_A:
-// return I2C_ADDR_RX_A;
-// case SLOT_TX_B:
-// return I2C_ADDR_TX_B;
-// case SLOT_RX_B:
-// return I2C_ADDR_RX_B;
-// default:
-// return -1;
-// }
-//}
+void usrp1_impl::dboard_init(void)
+{
+ BOOST_FOREACH(dboard_slot_t dboard_slot, _dboard_slots){
+
+ //read the tx and rx dboard eeproms
+ _rx_db_eeproms[dboard_slot] = dboard_eeprom_t(_iface->read_eeprom(
+ get_rx_ee_addr(dboard_slot), 0, dboard_eeprom_t::num_bytes()
+ ));
+
+ _tx_db_eeproms[dboard_slot] = dboard_eeprom_t(_iface->read_eeprom(
+ get_tx_ee_addr(dboard_slot), 0, dboard_eeprom_t::num_bytes()
+ ));
+
+ //create a new dboard interface and manager
+ _dboard_ifaces[dboard_slot] = make_dboard_iface(
+ _iface, _clock_ctrl, _codec_ctrls[dboard_slot], dboard_slot
+ );
+
+ _dboard_managers[dboard_slot] = dboard_manager::make(
+ _rx_db_eeproms[dboard_slot].id,
+ _tx_db_eeproms[dboard_slot].id,
+ _dboard_ifaces[dboard_slot]
+ );
+
+ //setup the dboard proxies
+ _rx_dboard_proxies[dboard_slot] = wax_obj_proxy::make(
+ boost::bind(&usrp1_impl::rx_dboard_get, this, _1, _2, dboard_slot),
+ boost::bind(&usrp1_impl::rx_dboard_set, this, _1, _2, dboard_slot));
+
+ _tx_dboard_proxies[dboard_slot] = wax_obj_proxy::make(
+ boost::bind(&usrp1_impl::tx_dboard_get, this, _1, _2, dboard_slot),
+ boost::bind(&usrp1_impl::tx_dboard_set, this, _1, _2, dboard_slot));
+ }
+}
/***********************************************************************
* RX Dboard Get
**********************************************************************/
-void usrp1_impl::rx_dboard_get(const wax::obj &key_, wax::obj &val)
+void usrp1_impl::rx_dboard_get(const wax::obj &key_, wax::obj &val, dboard_slot_t dboard_slot)
{
named_prop_t key = named_prop_t::extract(key_);
//handle the get request conditioned on the key
switch(key.as<dboard_prop_t>()){
case DBOARD_PROP_NAME:
- val = std::string("usrp1 dboard (rx unit)");
+ val = str(boost::format("usrp1 dboard (rx unit) - %c") % dboard_slot);
return;
case DBOARD_PROP_SUBDEV:
- val = _dboard_manager->get_rx_subdev(key.name);
+ val = _dboard_managers[dboard_slot]->get_rx_subdev(key.name);
return;
case DBOARD_PROP_SUBDEV_NAMES:
- val = _dboard_manager->get_rx_subdev_names();
+ val = _dboard_managers[dboard_slot]->get_rx_subdev_names();
return;
case DBOARD_PROP_DBOARD_ID:
- val = _rx_db_eeprom.id;
+ val = _rx_db_eeproms[dboard_slot].id;
return;
case DBOARD_PROP_DBOARD_IFACE:
- val = _dboard_iface;
+ val = _dboard_ifaces[dboard_slot];
return;
case DBOARD_PROP_CODEC:
- val = _rx_codec_proxy->get_link();
+ val = _rx_codec_proxies[dboard_slot]->get_link();
return;
case DBOARD_PROP_GAIN_GROUP:
- val = make_gain_group(_dboard_manager->get_rx_subdev(key.name),
- _rx_codec_proxy->get_link());
+ val = make_gain_group(_dboard_managers[dboard_slot]->get_rx_subdev(key.name),
+ _rx_codec_proxies[dboard_slot]->get_link());
return;
default: UHD_THROW_PROP_GET_ERROR();
@@ -122,13 +133,15 @@ void usrp1_impl::rx_dboard_get(const wax::obj &key_, wax::obj &val)
/***********************************************************************
* RX Dboard Set
**********************************************************************/
-void usrp1_impl::rx_dboard_set(const wax::obj &key, const wax::obj &val)
+void usrp1_impl::rx_dboard_set(const wax::obj &key, const wax::obj &val, dboard_slot_t dboard_slot)
{
switch(key.as<dboard_prop_t>()) {
case DBOARD_PROP_DBOARD_ID:
- _rx_db_eeprom.id = val.as<dboard_id_t>();
- _iface->write_eeprom(I2C_ADDR_RX_A, 0,
- _rx_db_eeprom.get_eeprom_bytes());
+ _rx_db_eeproms[dboard_slot].id = val.as<dboard_id_t>();
+ _iface->write_eeprom(
+ get_rx_ee_addr(dboard_slot), 0,
+ _rx_db_eeproms[dboard_slot].get_eeprom_bytes()
+ );
return;
default:
@@ -139,39 +152,39 @@ void usrp1_impl::rx_dboard_set(const wax::obj &key, const wax::obj &val)
/***********************************************************************
* TX Dboard Get
**********************************************************************/
-void usrp1_impl::tx_dboard_get(const wax::obj &key_, wax::obj &val)
+void usrp1_impl::tx_dboard_get(const wax::obj &key_, wax::obj &val, dboard_slot_t dboard_slot)
{
named_prop_t key = named_prop_t::extract(key_);
//handle the get request conditioned on the key
switch(key.as<dboard_prop_t>()){
case DBOARD_PROP_NAME:
- val = std::string("usrp1 dboard (tx unit)");
+ val = str(boost::format("usrp1 dboard (tx unit) - %c") % dboard_slot);
return;
case DBOARD_PROP_SUBDEV:
- val = _dboard_manager->get_tx_subdev(key.name);
+ val = _dboard_managers[dboard_slot]->get_tx_subdev(key.name);
return;
case DBOARD_PROP_SUBDEV_NAMES:
- val = _dboard_manager->get_tx_subdev_names();
+ val = _dboard_managers[dboard_slot]->get_tx_subdev_names();
return;
case DBOARD_PROP_DBOARD_ID:
- val = _tx_db_eeprom.id;
+ val = _tx_db_eeproms[dboard_slot].id;
return;
case DBOARD_PROP_DBOARD_IFACE:
- val = _dboard_iface;
+ val = _dboard_ifaces[dboard_slot];
return;
case DBOARD_PROP_CODEC:
- val = _tx_codec_proxy->get_link();
+ val = _tx_codec_proxies[dboard_slot]->get_link();
return;
case DBOARD_PROP_GAIN_GROUP:
- val = make_gain_group(_dboard_manager->get_tx_subdev(key.name),
- _tx_codec_proxy->get_link());
+ val = make_gain_group(_dboard_managers[dboard_slot]->get_tx_subdev(key.name),
+ _tx_codec_proxies[dboard_slot]->get_link());
return;
default: UHD_THROW_PROP_GET_ERROR();
@@ -181,12 +194,15 @@ void usrp1_impl::tx_dboard_get(const wax::obj &key_, wax::obj &val)
/***********************************************************************
* TX Dboard Set
**********************************************************************/
-void usrp1_impl::tx_dboard_set(const wax::obj &key, const wax::obj &val)
+void usrp1_impl::tx_dboard_set(const wax::obj &key, const wax::obj &val, dboard_slot_t dboard_slot)
{
switch(key.as<dboard_prop_t>()) {
case DBOARD_PROP_DBOARD_ID:
- _tx_db_eeprom.id = val.as<dboard_id_t>();
- _iface->write_eeprom(I2C_ADDR_TX_A, 0, _tx_db_eeprom.get_eeprom_bytes());
+ _tx_db_eeproms[dboard_slot].id = val.as<dboard_id_t>();
+ _iface->write_eeprom(
+ get_tx_ee_addr(dboard_slot), 0,
+ _tx_db_eeproms[dboard_slot].get_eeprom_bytes()
+ );
return;
default: UHD_THROW_PROP_SET_ERROR();