summaryrefslogtreecommitdiffstats
path: root/host
diff options
context:
space:
mode:
Diffstat (limited to 'host')
-rw-r--r--host/lib/usrp/usrp_e/dboard_impl.cpp116
-rw-r--r--host/lib/usrp/usrp_e/io_impl.cpp5
-rw-r--r--host/lib/usrp/usrp_e/mboard_impl.cpp23
-rw-r--r--host/lib/usrp/usrp_e/usrp_e_impl.hpp3
4 files changed, 128 insertions, 19 deletions
diff --git a/host/lib/usrp/usrp_e/dboard_impl.cpp b/host/lib/usrp/usrp_e/dboard_impl.cpp
index 31f792306..22c4ac8b7 100644
--- a/host/lib/usrp/usrp_e/dboard_impl.cpp
+++ b/host/lib/usrp/usrp_e/dboard_impl.cpp
@@ -17,8 +17,11 @@
#include <boost/bind.hpp>
#include "usrp_e_impl.hpp"
+#include <uhd/utils/assert.hpp>
+#include <uhd/usrp/dboard_props.hpp>
#include <iostream>
+using namespace uhd;
using namespace uhd::usrp;
/***********************************************************************
@@ -32,11 +35,11 @@ void usrp_e_impl::dboard_init(void){
std::cout << _tx_db_eeprom.id.to_pp_string() << std::endl;
//create a new dboard interface and manager
- dboard_iface::sptr dboard_iface(
- make_usrp_e_dboard_iface(_iface, _clock_ctrl, _codec_ctrl)
+ _dboard_iface = make_usrp_e_dboard_iface(
+ _iface, _clock_ctrl, _codec_ctrl
);
_dboard_manager = dboard_manager::make(
- _rx_db_eeprom.id, _tx_db_eeprom.id, dboard_iface
+ _rx_db_eeprom.id, _tx_db_eeprom.id, _dboard_iface
);
//setup the dboard proxies
@@ -48,32 +51,123 @@ void usrp_e_impl::dboard_init(void){
boost::bind(&usrp_e_impl::tx_dboard_get, this, _1, _2),
boost::bind(&usrp_e_impl::tx_dboard_set, this, _1, _2)
);
+
+ //init the subdevs in use (use the first subdevice)
+ _rx_subdevs_in_use = prop_names_t(1, _dboard_manager->get_rx_subdev_names().at(0));
+ //TODO update_rx_mux_config();
+
+ _tx_subdevs_in_use = prop_names_t(1, _dboard_manager->get_tx_subdev_names().at(0));
+ //TODO update_tx_mux_config();
}
/***********************************************************************
* RX Dboard Get
**********************************************************************/
-void usrp_e_impl::rx_dboard_get(const wax::obj &, wax::obj &){
- UHD_THROW_PROP_GET_ERROR();
+void usrp_e_impl::rx_dboard_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<dboard_prop_t>()){
+ case DBOARD_PROP_NAME:
+ val = std::string("usrp-e dboard (rx unit)");
+ return;
+
+ case DBOARD_PROP_SUBDEV:
+ val = _dboard_manager->get_rx_subdev(name);
+ return;
+
+ case DBOARD_PROP_SUBDEV_NAMES:
+ val = _dboard_manager->get_rx_subdev_names();
+ return;
+
+ case DBOARD_PROP_USED_SUBDEVS:
+ val = _rx_subdevs_in_use;
+ return;
+
+ case DBOARD_PROP_DBOARD_ID:
+ val = _rx_db_eeprom.id;
+ return;
+
+ case DBOARD_PROP_DBOARD_IFACE:
+ val = _dboard_iface;
+ return;
+
+ default: UHD_THROW_PROP_GET_ERROR();
+ }
}
/***********************************************************************
* RX Dboard Set
**********************************************************************/
-void usrp_e_impl::rx_dboard_set(const wax::obj &, const wax::obj &){
- UHD_THROW_PROP_SET_ERROR();
+void usrp_e_impl::rx_dboard_set(const wax::obj &key, const wax::obj &val){
+ switch(key.as<dboard_prop_t>()){
+ case DBOARD_PROP_USED_SUBDEVS:
+ _rx_subdevs_in_use = val.as<prop_names_t>();
+ //TODO update_rx_mux_config(); //if the val is bad, this will throw
+ return;
+
+ case DBOARD_PROP_DBOARD_ID:
+ _rx_db_eeprom.id = val.as<dboard_id_t>();
+ _iface->write_eeprom(I2C_ADDR_RX_DB, 0, _rx_db_eeprom.get_eeprom_bytes());
+ return;
+
+ default: UHD_THROW_PROP_SET_ERROR();
+ }
}
/***********************************************************************
* TX Dboard Get
**********************************************************************/
-void usrp_e_impl::tx_dboard_get(const wax::obj &, wax::obj &){
- UHD_THROW_PROP_GET_ERROR();
+void usrp_e_impl::tx_dboard_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<dboard_prop_t>()){
+ case DBOARD_PROP_NAME:
+ val = std::string("usrp-e dboard (tx unit)");
+ return;
+
+ case DBOARD_PROP_SUBDEV:
+ val = _dboard_manager->get_tx_subdev(name);
+ return;
+
+ case DBOARD_PROP_SUBDEV_NAMES:
+ val = _dboard_manager->get_tx_subdev_names();
+ return;
+
+ case DBOARD_PROP_USED_SUBDEVS:
+ val = _tx_subdevs_in_use;
+ return;
+
+ case DBOARD_PROP_DBOARD_ID:
+ val = _tx_db_eeprom.id;
+ return;
+
+ case DBOARD_PROP_DBOARD_IFACE:
+ val = _dboard_iface;
+ return;
+
+ default: UHD_THROW_PROP_GET_ERROR();
+ }
}
/***********************************************************************
* TX Dboard Set
**********************************************************************/
-void usrp_e_impl::tx_dboard_set(const wax::obj &, const wax::obj &){
- UHD_THROW_PROP_SET_ERROR();
+void usrp_e_impl::tx_dboard_set(const wax::obj &key, const wax::obj &val){
+ switch(key.as<dboard_prop_t>()){
+ case DBOARD_PROP_USED_SUBDEVS:
+ _tx_subdevs_in_use = val.as<prop_names_t>();
+ //TODO update_tx_mux_config(); //if the val is bad, this will throw
+ return;
+
+ case DBOARD_PROP_DBOARD_ID:
+ _tx_db_eeprom.id = val.as<dboard_id_t>();
+ _iface->write_eeprom(I2C_ADDR_TX_DB, 0, _tx_db_eeprom.get_eeprom_bytes());
+ return;
+
+ default: UHD_THROW_PROP_SET_ERROR();
+ }
}
diff --git a/host/lib/usrp/usrp_e/io_impl.cpp b/host/lib/usrp/usrp_e/io_impl.cpp
index 5914bc613..9ebc5b560 100644
--- a/host/lib/usrp/usrp_e/io_impl.cpp
+++ b/host/lib/usrp/usrp_e/io_impl.cpp
@@ -22,6 +22,8 @@
#include <fcntl.h> //read, write
#include <linux/usrp_e.h> //transfer frame struct
#include <stddef.h> //offsetof
+#include <boost/format.hpp>
+#include <iostream>
using namespace uhd;
@@ -68,6 +70,9 @@ private:
);
}
size_t recv(const boost::asio::mutable_buffer &buff){
+ std::cout << boost::format(
+ "calling read on fd %d, buff size is %d"
+ ) % _fd % boost::asio::buffer_size(buff) << std::endl;
return read(
_fd,
boost::asio::buffer_cast<void *>(buff),
diff --git a/host/lib/usrp/usrp_e/mboard_impl.cpp b/host/lib/usrp/usrp_e/mboard_impl.cpp
index efbde38ce..e4a0e81af 100644
--- a/host/lib/usrp/usrp_e/mboard_impl.cpp
+++ b/host/lib/usrp/usrp_e/mboard_impl.cpp
@@ -16,6 +16,7 @@
//
#include "usrp_e_impl.hpp"
+#include "usrp_e_regs.hpp"
#include <uhd/utils/assert.hpp>
#include <uhd/usrp/mboard_props.hpp>
#include <boost/bind.hpp>
@@ -75,26 +76,22 @@ void usrp_e_impl::mboard_get(const wax::obj &key_, wax::obj &val){
val = prop_names_t(1, ""); //vector of size 1 with empty string
return;
- case MBOARD_PROP_STREAM_CMD:
- //val = TODO
- return;
-
case MBOARD_PROP_RX_DSP:
- UHD_ASSERT_THROW(name == "ddc0");
+ UHD_ASSERT_THROW(name == "");
val = _rx_ddc_proxy->get_link();
return;
case MBOARD_PROP_RX_DSP_NAMES:
- val = prop_names_t(1, "ddc0");
+ val = prop_names_t(1, "");
return;
case MBOARD_PROP_TX_DSP:
- UHD_ASSERT_THROW(name == "duc0");
+ UHD_ASSERT_THROW(name == "");
val = _tx_duc_proxy->get_link();
return;
case MBOARD_PROP_TX_DSP_NAMES:
- val = prop_names_t(1, "duc0");
+ val = prop_names_t(1, "");
return;
case MBOARD_PROP_CLOCK_CONFIG:
@@ -116,6 +113,16 @@ void usrp_e_impl::mboard_set(const wax::obj &key, const wax::obj &val){
issue_stream_cmd(val.as<stream_cmd_t>());
return;
+ case MBOARD_PROP_TIME_NOW:
+ case MBOARD_PROP_TIME_NEXT_PPS:{
+ time_spec_t time_spec = val.as<time_spec_t>();
+ _iface->poke32(UE_REG_TIME64_TICKS, time_spec.get_ticks(MASTER_CLOCK_RATE));
+ boost::uint32_t imm_flags = (key.as<mboard_prop_t>() == MBOARD_PROP_TIME_NOW)? 1 : 0;
+ _iface->poke32(UE_REG_TIME64_IMM, imm_flags);
+ _iface->poke32(UE_REG_TIME64_SECS, time_spec.secs);
+ }
+ return;
+
default: UHD_THROW_PROP_SET_ERROR();
}
}
diff --git a/host/lib/usrp/usrp_e/usrp_e_impl.hpp b/host/lib/usrp/usrp_e/usrp_e_impl.hpp
index a9fd856fe..657d2d225 100644
--- a/host/lib/usrp/usrp_e/usrp_e_impl.hpp
+++ b/host/lib/usrp/usrp_e/usrp_e_impl.hpp
@@ -118,17 +118,20 @@ private:
//xx dboard functions and settings
void dboard_init(void);
uhd::usrp::dboard_manager::sptr _dboard_manager;
+ uhd::usrp::dboard_iface::sptr _dboard_iface;
//rx dboard functions and settings
uhd::usrp::dboard_eeprom_t _rx_db_eeprom;
void rx_dboard_get(const wax::obj &, wax::obj &);
void rx_dboard_set(const wax::obj &, const wax::obj &);
+ uhd::prop_names_t _rx_subdevs_in_use;
wax_obj_proxy::sptr _rx_dboard_proxy;
//tx dboard functions and settings
uhd::usrp::dboard_eeprom_t _tx_db_eeprom;
void tx_dboard_get(const wax::obj &, wax::obj &);
void tx_dboard_set(const wax::obj &, const wax::obj &);
+ uhd::prop_names_t _tx_subdevs_in_use;
wax_obj_proxy::sptr _tx_dboard_proxy;
//rx ddc functions and settings