From a5cdd7a311edcb3afdc9673bd7f6ec84bf8e7b6c Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Sat, 5 Jun 2010 00:24:16 +0000
Subject: usrp-e more implementation, rx timed samples runs w/o error (no
 workie though)

---
 host/lib/usrp/usrp_e/dboard_impl.cpp | 116 +++++++++++++++++++++++++++++++----
 host/lib/usrp/usrp_e/io_impl.cpp     |   5 ++
 host/lib/usrp/usrp_e/mboard_impl.cpp |  23 ++++---
 host/lib/usrp/usrp_e/usrp_e_impl.hpp |   3 +
 4 files changed, 128 insertions(+), 19 deletions(-)

(limited to 'host/lib/usrp/usrp_e')

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
-- 
cgit v1.2.3