merging 10218 to 10241 for full daughterboard support with in-band project
authorgnychis <gnychis@221aa14e-8319-0410-a670-987f0aec2ac5>
Fri, 16 Jan 2009 18:51:42 +0000 (18:51 +0000)
committergnychis <gnychis@221aa14e-8319-0410-a670-987f0aec2ac5>
Fri, 16 Jan 2009 18:51:42 +0000 (18:51 +0000)
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@10244 221aa14e-8319-0410-a670-987f0aec2ac5

usrp/host/apps-inband/test_usrp_inband_2tx.cc
usrp/host/apps-inband/test_usrp_inband_rx.cc
usrp/host/apps-inband/test_usrp_inband_tx.cc
usrp/host/lib/inband/usrp_usb_interface.cc
usrp/host/lib/inband/usrp_usb_interface.h

index caa7803390988713017142423bf75f0c4702b79d..11a1a491c8bdbedd0bbe0095451a5c5a13db4884 100644 (file)
@@ -127,9 +127,9 @@ test_usrp_tx::test_usrp_tx(mb_runtime *runtime, const std::string &instance_name
                pmt_intern("interp-tx"),
                pmt_from_long(128));
 
-  pmt_dict_set(usrp_dict,
-               pmt_intern("rf-freq"),
-               pmt_from_long(10e6));
+//  pmt_dict_set(usrp_dict,
+//               pmt_intern("rf-freq"),
+//               pmt_from_long(10e6));
 
   define_component("server", "usrp_server", usrp_dict);
 
index dcb87a7c9ef774957d9856e383bfd1a76e274d1c..4f21e4afc75bfe3f97de9ab22eea3dcfa5fdbe51 100644 (file)
@@ -112,6 +112,11 @@ test_usrp_rx::test_usrp_rx(mb_runtime *runtime, const std::string &instance_name
                pmt_intern("decim-rx"),
                pmt_from_long(64));
 
+//  If unspecified, chooses center frequency from range
+//  pmt_dict_set(usrp_dict,
+//               pmt_intern("rf-freq"),
+//               pmt_from_long(10e6));
+
   define_component("server", "usrp_server", usrp_dict);
 
   connect("self", "rx0", "server", "rx0");
index 7ce38c2e401d0527de472e6a6e083f8915026025..9f294e770f0b96d751b5ee002f58d2e68dd8c829 100644 (file)
@@ -124,9 +124,10 @@ test_usrp_tx::test_usrp_tx(mb_runtime *runtime, const std::string &instance_name
                pmt_intern("interp-tx"),
                pmt_from_long(64));
 
-  pmt_dict_set(usrp_dict,
-               pmt_intern("rf-freq"),
-               pmt_from_long(10e6));
+//  If unspecified, chooses center frequency from range
+//  pmt_dict_set(usrp_dict,
+//               pmt_intern("rf-freq"),
+//               pmt_from_long(10e6));
 
   define_component("server", "usrp_server", usrp_dict);
 
index d82b589b480012315af37192e987855785541943..cd77974c7458a9a7b7cc665412b71a6846d04410 100644 (file)
@@ -36,6 +36,7 @@
 #include "usrp_tx.h"
 #include "usrp_standard.h"
 #include <stdio.h>
+#include <usrp_dbid.h>
 
 typedef usrp_inband_usb_packet transport_pkt;
 
@@ -59,7 +60,7 @@ usrp_usb_interface::usrp_usb_interface(mb_runtime *rt, const std::string &instan
   d_rx_reading(false),
   d_interp_tx(128),
   d_decim_rx(128),
-  d_rf_freq(10e6),
+  d_rf_freq(-1),
   d_rbf("inband_tx_rx.rbf")
 {
   // Dictionary for arguments to all of the components
@@ -299,17 +300,51 @@ usrp_usb_interface::handle_cmd_open(pmt_t data)
     return;
   }
 
-  if(!d_utx->set_tx_freq (0,d_rf_freq) || !d_utx->set_tx_freq(1,d_rf_freq)) {  // try setting center freq to 0
-    if (verbose)
-      std::cout << "[USRP_USB_INTERFACE] Failed to set center frequency on TX\n";
-    reply_data = pmt_list2(invocation_handle, PMT_F);
-    d_cs->send(s_response_usrp_open, reply_data);
-    return;
+  // Perform TX daughterboard tuning
+  double target_freq;
+  unsigned int mux;
+  int tgain, rgain;
+  float input_rate;
+  bool ok;
+  usrp_tune_result r;
+
+  // Cast to usrp_basic and then detect daughterboards
+  d_ub_tx = d_utx;
+  usrp_subdev_spec tspec = pick_tx_subdevice();
+  db_base_sptr tsubdev = d_ub_tx->selected_subdev(tspec);
+
+  // Set the TX mux value
+  mux = d_utx->determine_tx_mux_value(tspec);
+  d_utx->set_mux(mux);
+  
+  // Set the TX gain and determine rate
+  tgain = tsubdev->gain_max();
+  tsubdev->set_gain(tgain);
+  input_rate = d_ub_tx->converter_rate() / d_utx->interp_rate();
+
+  // Perform the actual tuning, if no frequency specified then pick
+  if(d_rf_freq==-1)
+    target_freq = tsubdev->freq_min()+((tsubdev->freq_max()-tsubdev->freq_min())/2.0);
+  else 
+    target_freq = d_rf_freq;
+  ok = d_utx->tune(tsubdev->which(), tsubdev, target_freq, &r);
+  tsubdev->set_enable(true);
+  
+  if(verbose) {
+    printf("TX Subdevice name is %s\n", tsubdev->name().c_str());
+    printf("TX Subdevice freq range: (%g, %g)\n",
+       tsubdev->freq_min(), tsubdev->freq_max());
+    printf("mux: %#08x\n",  mux);
+    printf("target_freq:     %f\n", target_freq);
+    printf("ok:              %s\n", ok ? "true" : "false");
+    printf("r.baseband_freq: %f\n", r.baseband_freq);
+    printf("r.dxc_freq:      %f\n", r.dxc_freq);
+    printf("r.residual_freq: %f\n", r.residual_freq);
+    printf("r.inverted:      %d\n", r.inverted);
   }
 
-  if(!d_utx->set_mux(0xBA98)) {
-    if (verbose)
-      std::cout << "[USRP_USB_INTERFACE] Failed to set TX mux\n";
+  if(!ok) {
+    std::cerr << "[USRP_USB_INTERFACE] Failed to set center frequency on TX\n";
     reply_data = pmt_list2(invocation_handle, PMT_F);
     d_cs->send(s_response_usrp_open, reply_data);
     return;
@@ -337,20 +372,39 @@ usrp_usb_interface::handle_cmd_open(pmt_t data)
     d_cs->send(s_response_usrp_open, reply_data);
     return;
   }
+  
+  // Cast to usrp_basic and then detect daughterboards
+  d_ub_rx = d_urx;
+  usrp_subdev_spec rspec = pick_rx_subdevice();
+  db_base_sptr rsubdev = d_ub_rx->selected_subdev(rspec);
+
+  // Set the RX mux value
+  mux = d_urx->determine_rx_mux_value(rspec);
+  d_urx->set_mux(mux);
+  
+  // Set the TX gain and determine rate
+  rgain = rsubdev->gain_max();
+  rsubdev->set_gain(rgain);
+  input_rate = d_ub_rx->converter_rate() / d_urx->decim_rate();
 
-  if(!d_urx->set_rx_freq (0, -d_rf_freq) || !d_urx->set_rx_freq(1, -d_rf_freq)) {
-    if (verbose)
-      std::cout << "[usrp_server] Failed to set center frequency on RX\n";
-    reply_data = pmt_list2(invocation_handle, PMT_F);
-    d_cs->send(s_response_usrp_open, reply_data);
-    return;
+  ok = d_urx->tune(rsubdev->which(), rsubdev, target_freq, &r);
+  rsubdev->set_enable(true);
+  
+  if(verbose) {
+    printf("RX Subdevice name is %s\n", rsubdev->name().c_str());
+    printf("RX Subdevice freq range: (%g, %g)\n",
+       rsubdev->freq_min(), rsubdev->freq_max());
+    printf("mux: %#08x\n",  mux);
+    printf("target_freq:     %f\n", target_freq);
+    printf("ok:              %s\n", ok ? "true" : "false");
+    printf("r.baseband_freq: %f\n", r.baseband_freq);
+    printf("r.dxc_freq:      %f\n", r.dxc_freq);
+    printf("r.residual_freq: %f\n", r.residual_freq);
+    printf("r.inverted:      %d\n", r.inverted);
   }
   
-  // Two channels ... this really needs to end up being set correctly by
-  // querying for what dboards are connected
-  if(!d_urx->set_mux(0x32103210)) {
-    if (verbose)
-      std::cout << "[USRP_USB_INTERFACE] Failed to set RX mux\n";
+  if(!ok) {
+    std::cerr << "[USRP_USB_INTERFACE] Failed to set center frequency on RX\n";
     reply_data = pmt_list2(invocation_handle, PMT_F);
     d_cs->send(s_response_usrp_open, reply_data);
     return;
@@ -486,5 +540,61 @@ usrp_usb_interface::handle_cmd_close(pmt_t data)
   shutdown_all(PMT_T);
 }
 
+usrp_subdev_spec
+usrp_usb_interface::pick_rx_subdevice()
+{
+  int dbids[] = {
+    USRP_DBID_FLEX_400_RX,
+    USRP_DBID_FLEX_900_RX,
+    USRP_DBID_FLEX_1200_RX,
+    USRP_DBID_FLEX_2400_RX,
+    USRP_DBID_TV_RX,
+    USRP_DBID_TV_RX_REV_2,
+    USRP_DBID_DBS_RX,
+    USRP_DBID_DBS_RX_REV_2_1,
+    USRP_DBID_BASIC_RX
+  };
+
+  std::vector<int> candidates(dbids, dbids+(sizeof(dbids)/sizeof(int)));
+  return pick_subdev(d_ub_rx, candidates);
+}
+
+usrp_subdev_spec
+usrp_usb_interface::pick_tx_subdevice()
+{
+  int dbids[] = {
+    USRP_DBID_FLEX_400_TX,
+    USRP_DBID_FLEX_900_TX,
+    USRP_DBID_FLEX_1200_TX,
+    USRP_DBID_FLEX_2400_TX,
+    USRP_DBID_BASIC_TX
+  };
+
+  std::vector<int> candidates(dbids, dbids+(sizeof(dbids)/sizeof(int)));
+  return pick_subdev(d_ub_tx, candidates);
+}
+
+usrp_subdev_spec
+usrp_usb_interface::pick_subdev(boost::shared_ptr<usrp_basic> d_usrp_basic, std::vector<int> candidates)
+{
+  int dbid0 = d_usrp_basic->selected_subdev(usrp_subdev_spec(0, 0))->dbid();
+  int dbid1 = d_usrp_basic->selected_subdev(usrp_subdev_spec(1, 0))->dbid();
+
+  for (int i = 0; i < candidates.size(); i++) {
+    int dbid = candidates[i];
+    if (dbid0 == dbid)
+      return usrp_subdev_spec(0, 0);
+    if (dbid1 == dbid)
+      return usrp_subdev_spec(1, 0);
+  }
+
+  if (dbid0 >= 0)
+    return usrp_subdev_spec(0, 0);
+  if (dbid1 >= 0)
+    return usrp_subdev_spec(1, 0);
+
+  throw std::runtime_error("No suitable daughterboard found!");
+}
+
 
 REGISTER_MBLOCK_CLASS(usrp_usb_interface);
index c10741516d44e67d555a27fbbc29a610e2a153e2..4d7750a7d69e096ecc6fdd85e4d3526dbd5f216e 100644 (file)
@@ -34,6 +34,9 @@ class usrp_usb_interface : public mb_mblock
 
   usrp_standard_tx_sptr d_utx;
   usrp_standard_rx_sptr d_urx;
+
+  boost::shared_ptr<usrp_basic> d_ub_tx;
+  boost::shared_ptr<usrp_basic> d_ub_rx;
   
   mb_port_sptr d_cs;
   mb_port_sptr  d_rx_cs;
@@ -49,7 +52,7 @@ class usrp_usb_interface : public mb_mblock
   long d_interp_tx;
   long d_decim_rx;
 
-  long d_rf_freq;
+  double d_rf_freq;
 
   std::string d_rbf;
 
@@ -58,6 +61,9 @@ class usrp_usb_interface : public mb_mblock
   ~usrp_usb_interface();
   void initial_transition();
   void handle_message(mb_message_sptr msg);
+  usrp_subdev_spec pick_rx_subdevice();
+  usrp_subdev_spec pick_tx_subdevice();
+  usrp_subdev_spec pick_subdev(boost::shared_ptr<usrp_basic> d_usrp_basic, std::vector<int> candidates);
 
  private:
   void handle_cmd_open(pmt_t data);