usrp methods for computing the mux for dual subdevices
authorjblum <jblum@221aa14e-8319-0410-a670-987f0aec2ac5>
Tue, 17 Feb 2009 23:03:39 +0000 (23:03 +0000)
committerjblum <jblum@221aa14e-8319-0410-a670-987f0aec2ac5>
Tue, 17 Feb 2009 23:03:39 +0000 (23:03 +0000)
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@10457 221aa14e-8319-0410-a670-987f0aec2ac5

12 files changed:
gr-usrp/src/usrp.i
gr-usrp/src/usrp_sink_base.cc
gr-usrp/src/usrp_sink_base.h
gr-usrp/src/usrp_sink_base.i
gr-usrp/src/usrp_source_base.cc
gr-usrp/src/usrp_source_base.h
gr-usrp/src/usrp_source_base.i
grc/scripts/usrp_probe
grc/src/grc_gnuradio/usrp/dual_usrp.py
grc/src/grc_gnuradio/usrp/simple_usrp.py
usrp/host/lib/legacy/usrp_standard.cc
usrp/host/lib/legacy/usrp_standard.h

index 55ad2a763ae524ccd9c917d4b30956be8614073e..f5841985dda59543b78f68621f8de8aa75f61bec 100644 (file)
@@ -48,14 +48,18 @@ def __selected_subdev(self, subdev_spec):
   return self._real_selected_subdev(ss)
 
 # Allow subdev_spec to be tuple
-def __determine_tx_mux_value(self, subdev_spec):
+def __determine_tx_mux_value(self, subdev_spec, subdev_spec_=None):
     ss = usrp_subdev_spec(subdev_spec[0], subdev_spec[1])
-    return self._real_determine_tx_mux_value(ss)
+    if subdev_spec_ is None: return self._real_determine_tx_mux_value(ss)
+    ss_ = usrp_subdev_spec(subdev_spec_[0], subdev_spec_[1])
+    return self._real_determine_tx_mux_value(ss, ss_)
 
 # Allow subdev_spec to be tuple
-def __determine_rx_mux_value(self, subdev_spec):
+def __determine_rx_mux_value(self, subdev_spec, subdev_spec_=None):
     ss = usrp_subdev_spec(subdev_spec[0], subdev_spec[1])
-    return self._real_determine_rx_mux_value(ss)
+    if subdev_spec_ is None: return self._real_determine_rx_mux_value(ss)
+    ss_ = usrp_subdev_spec(subdev_spec_[0], subdev_spec_[1])
+    return self._real_determine_rx_mux_value(ss, ss_)
 
 # Allow subdev_spec to be tuple
 def __pick_subdev(self, candidates=[]):
@@ -86,12 +90,12 @@ def tune(u, chan, subdev, target_freq):
     return u.tune(chan, subdev, target_freq)
 
 # Allow to be called as free function
-def determine_tx_mux_value(u, subdev_spec):
-    return u.determine_tx_mux_value(subdev_spec)
+def determine_tx_mux_value(u, subdev_spec, subdev_spec_=None):
+    return u.determine_tx_mux_value(subdev_spec, subdev_spec_)
 
 # Allow to be called as free function
-def determine_rx_mux_value(u, subdev_spec):
-    return u.determine_rx_mux_value(subdev_spec)
+def determine_rx_mux_value(u, subdev_spec, subdev_spec_=None):
+    return u.determine_rx_mux_value(subdev_spec, subdev_spec_)
 
 # Allow to be called as free function
 def selected_subdev(u, subdev_spec):
index 963f4dd6d53f7afb1113a6315732fe353df8230f..fc238ceb87dfb8aec96720558f5874fb3c827a65 100644 (file)
@@ -151,6 +151,12 @@ usrp_sink_base::determine_tx_mux_value(usrp_subdev_spec ss)
   return d_usrp->determine_tx_mux_value(ss);
 }
 
+int
+usrp_sink_base::determine_tx_mux_value(usrp_subdev_spec ss_a, usrp_subdev_spec ss_b)
+{
+  return d_usrp->determine_tx_mux_value(ss_a, ss_b);
+}
+
 bool
 usrp_sink_base::set_tx_freq (int channel, double freq)
 {
index 12dd51c65912dbb112801d0300555be205d5403e..312bab2463af2ef37058075d4629715e48ce3b7b 100644 (file)
@@ -88,6 +88,7 @@ class usrp_sink_base : public usrp_base {
   bool set_nchannels (int nchan);
   bool set_mux (int mux);
   int determine_tx_mux_value(usrp_subdev_spec ss);
+  int determine_tx_mux_value(usrp_subdev_spec ss_a, usrp_subdev_spec ss_b);
 
   /*!
    * \brief set the frequency of the digital up converter.
index ffc70a9842cc8823722bba61618088518c46711f..17fca441de62f41c099876284ef2a847a62401a2 100644 (file)
@@ -35,6 +35,7 @@ public:
   bool set_mux (int mux);
   %rename(_real_determine_tx_mux_value) determine_tx_mux_value;
   int determine_tx_mux_value(usrp_subdev_spec ss);
+  int determine_tx_mux_value(usrp_subdev_spec ss_a, usrp_subdev_spec ss_b);
   bool set_tx_freq (int channel, double freq);
   long dac_rate() const { return converter_rate(); }
   long dac_freq() const { return converter_rate(); }
index 778fa1017e50b31d40c8eeb191e11e5ac9bfc598..b875737ce08b70cece30e111cb61f6fec3c4a54f 100644 (file)
@@ -148,6 +148,12 @@ usrp_source_base::determine_rx_mux_value(usrp_subdev_spec ss)
   return d_usrp->determine_rx_mux_value(ss);
 }
 
+int
+usrp_source_base::determine_rx_mux_value(usrp_subdev_spec ss_a, usrp_subdev_spec ss_b)
+{
+  return d_usrp->determine_rx_mux_value(ss_a, ss_b);
+}
+
 bool
 usrp_source_base::set_rx_freq (int channel, double freq)
 {
index 9d8f32ac73d20643f55af52e606d6f26f9b436de..b9c4b9499b329ad66d4b83afdbd8497ab4093aa9 100644 (file)
@@ -101,6 +101,7 @@ class usrp_source_base : public usrp_base {
   bool set_nchannels (int nchan);
   bool set_mux (int mux);
   int determine_rx_mux_value(usrp_subdev_spec ss);
+  int determine_rx_mux_value(usrp_subdev_spec ss_a, usrp_subdev_spec ss_b);
 
   /*!
    * \brief set the center frequency of the digital down converter.
index 6a70c74129592d8f4464db40c373bdc24499414c..aed751de980d80a4ed542efdbc98b81d94e27846 100644 (file)
@@ -35,6 +35,7 @@ public:
   bool set_mux (int mux);
   %rename(_real_determine_rx_mux_value) determine_rx_mux_value;
   int determine_rx_mux_value(usrp_subdev_spec ss);
+  int determine_rx_mux_value(usrp_subdev_spec ss_a, usrp_subdev_spec ss_b);
   bool set_rx_freq (int channel, double freq);
   bool set_fpga_mode (int mode);
   bool set_ddc_phase(int channel, int phase);
index ac786075ca7f33b47b425c0babc41ac18d50f9fd..3d7b6f0cbb521bef5893f6448d2f2a1c0b22685b 100755 (executable)
@@ -81,19 +81,14 @@ class USRPProbeWindow(gtk.Window):
                """Probe the USRP device and copy the results into the query text box."""
                dboard = usrp_dboard_param.evaluate()
                side = {'a': 0, 'b': 1}[dboard[-1]]
-               if dboard.startswith('rx'): #for the rx query, use the source and rx methods
-                       make = usrp.source_c
-                       get_mux = usrp.determine_rx_mux_value
-               elif dboard.startswith('tx'): #for the tx query, use the sink and tx methods
-                       make = usrp.sink_c
-                       get_mux = usrp.determine_tx_mux_value
+               if dboard.startswith('rx'): make = usrp.source_c
+               elif dboard.startswith('tx'): make = usrp.sink_c
                try:
                        u = make(which=usrp_which_param.evaluate())
                        subdev_spec = (side, 0)
                        subdev = usrp.selected_subdev(u, subdev_spec) #get the subdev
                        msg = ">>> USRP Probe\n"
                        msg = "%s\nName:\n\t%s\n"%(msg, str(subdev.name()))
-                       msg = "%s\nAutomated Mux:\n\t0x%08x\n"%(msg, 0xFFFFFFFFL & long(get_mux(u, subdev_spec))) #ensure that the value is displayed as: 8 nibbles, unsigned, hex
                        msg = "%s\nConverter Rate:\n\t%s\n"%(msg, u.converter_rate())
                        msg = "%s\nUses Quadrature:\n\t%s\n"%(msg, str(subdev.is_quadrature()))
                        gain_min, gain_max, gain_step = subdev.gain_range()
index 47449ae788778ef2bb7dcd319a5a875cdd693ccd..f12b5348d923abfc733ec5cd413e1db20fab74a3 100644 (file)
@@ -42,16 +42,11 @@ class _dual_source(gr.hier_block2):
                )
                #create usrp object
                self._make_usrp(which=which, nchan=2)
-               #get the mux for side A
                subdev_spec_a = common.to_spec('A', rx_ant_a)
-               self._subdev_a = usrp.selected_subdev(self._get_u(), subdev_spec_a)
-               mux_a = usrp.determine_rx_mux_value(self._get_u(), subdev_spec_a)
-               #get the mux for side B
                subdev_spec_b = common.to_spec('B', rx_ant_b)
-               self._subdev_b = usrp.selected_subdev(self._get_u(), subdev_spec_b)
-               mux_b = usrp.determine_rx_mux_value(self._get_u(), subdev_spec_b)
-               #move the lower byte of the mux b into the second byte of the mux a
-               self._get_u().set_mux(((mux_b & 0xff) << 8) | (mux_a - (mux_a & 0xff00)))
+               self._get_u().set_mux(self._get_u().determine_rx_mux_value(subdev_spec_a, subdev_spec_b))
+               self._subdev_a = self._get_u().selected_subdev(subdev_spec_a)
+               self._subdev_b = self._get_u().selected_subdev(subdev_spec_b)
                #connect
                deinter = gr.deinterleave(self._get_io_size())
                self.connect(self._get_u(), deinter)
@@ -97,16 +92,11 @@ class _dual_sink(gr.hier_block2):
                )
                #create usrp object
                self._make_usrp(which=which, nchan=2)
-               #get the mux for side A
                subdev_spec_a = common.to_spec('A')
-               self._subdev_a = usrp.selected_subdev(self._get_u(), subdev_spec_a)
-               mux_a = usrp.determine_tx_mux_value(self._get_u(), subdev_spec_a)
-               #get the mux for side B
                subdev_spec_b = common.to_spec('B')
-               self._subdev_b = usrp.selected_subdev(self._get_u(), subdev_spec_b)
-               mux_b = usrp.determine_tx_mux_value(self._get_u(), subdev_spec_b)
-               #set the mux
-               self._get_u().set_mux(mux_a | mux_b)
+               self._get_u().set_mux(self._get_u().determine_tx_mux_value(subdev_spec_a, subdev_spec_b))
+               self._subdev_a = self._get_u().selected_subdev(subdev_spec_a)
+               self._subdev_b = self._get_u().selected_subdev(subdev_spec_b)
                #connect
                inter = gr.interleave(self._get_io_size())
                self.connect(inter, self._get_u())
index 819a01c2cf9702fb7cb97e5eb3f60c9cb1afe92b..58683433eeabb28334c32337cc323fb8ae77ea77 100644 (file)
@@ -46,8 +46,8 @@ class _simple_source(gr.hier_block2):
                if self._no_hb: self._make_usrp(which=which, nchan=1, fpga_filename="std_4rx_0tx.rbf")
                else: self._make_usrp(which=which, nchan=1)
                subdev_spec = common.to_spec(side, rx_ant)
-               self._get_u().set_mux(usrp.determine_rx_mux_value(self._get_u(), subdev_spec))
-               self._subdev = usrp.selected_subdev(self._get_u(), subdev_spec)
+               self._get_u().set_mux(self._get_u().determine_rx_mux_value(subdev_spec))
+               self._subdev = self._get_u().selected_subdev(subdev_spec)
                if common.is_flex(rx_ant): self._subdev.select_rx_antenna(rx_ant)
                #connect
                self.connect(self._get_u(), self)
@@ -89,8 +89,8 @@ class _simple_sink(gr.hier_block2):
                #create usrp object
                self._make_usrp(which=which, nchan=1)
                subdev_spec = common.to_spec(side)
-               self._get_u().set_mux(usrp.determine_tx_mux_value(self._get_u(), subdev_spec))
-               self._subdev = usrp.selected_subdev(self._get_u(), subdev_spec)
+               self._get_u().set_mux(self._get_u().determine_tx_mux_value(subdev_spec))
+               self._subdev = self._get_u().selected_subdev(subdev_spec)
                #connect
                self.connect(self, self._get_u())
 
index d2360cc6f729f1aa8a06e4363a51cf3f81fa15b7..afbbaa8d9b7880429fa3363d1fa3a231e72d338d 100644 (file)
@@ -627,7 +627,22 @@ usrp_standard_rx::determine_rx_mux_value(const usrp_subdev_spec &ss)
   throw std::runtime_error("internal error");
 }
 
-
+int
+usrp_standard_rx::determine_rx_mux_value(const usrp_subdev_spec &ss_a, const usrp_subdev_spec &ss_b)
+{
+  if (ss_a.side == ss_b.side && ss_a.subdev == ss_b.subdev){
+    throw std::runtime_error("Cannot compute dual mux, repeated subdevice");
+  }
+  std::vector<db_base_sptr> db_a = this->db(ss_a.side);
+  std::vector<db_base_sptr> db_b = this->db(ss_b.side);
+  if (db_a[ss_a.subdev]->is_quadrature() != db_b[ss_b.subdev]->is_quadrature()){
+    throw std::runtime_error("Cannot compute dual mux when mixing quadrature and non-quadrature subdevices");
+  }
+  int mux_a = determine_rx_mux_value(ss_a);
+  int mux_b = determine_rx_mux_value(ss_b);
+  //move the lower byte of the mux b into the second byte of the mux a
+  return ((mux_b & 0xff) << 8) | (mux_a & 0xffff00ff);
+}
 
 bool
 usrp_standard_rx::set_rx_freq (int channel, double freq)
@@ -961,7 +976,20 @@ usrp_standard_tx::determine_tx_mux_value(const usrp_subdev_spec &ss)
   }
 }
 
-
+int
+usrp_standard_tx::determine_tx_mux_value(const usrp_subdev_spec &ss_a, const usrp_subdev_spec &ss_b)
+{
+  if (ss_a.side == ss_b.side && ss_a.subdev == ss_b.subdev){
+    throw std::runtime_error("Cannot compute dual mux, repeated subdevice");
+  }
+  int mux_a = determine_tx_mux_value(ss_a);
+  //Get the mux b:
+  //   DAC0 becomes DAC2
+  //   DAC1 becomes DAC3
+  unsigned int mask[2] = {0x0022, 0x2200};
+  int mux_b = determine_tx_mux_value(ss_b) + mask[ss_b.side];
+  return mux_b | mux_a;
+}
 
 #ifdef USE_FPGA_TX_CORDIC
 
index b7145b843fbc48e45767e463569b03d2040e6832..1e018c74d8c6851809ab8da315966be7bf44eb40 100644 (file)
@@ -179,6 +179,7 @@ class usrp_standard_rx : public usrp_basic_rx, public usrp_standard_common
    * and the characteristics of the respective daughterboard.
    */
   int determine_rx_mux_value(const usrp_subdev_spec &ss);
+  int determine_rx_mux_value(const usrp_subdev_spec &ss_a, const usrp_subdev_spec &ss_b);
 
   /*!
    * \brief set the frequency of the digital down converter.
@@ -389,6 +390,7 @@ class usrp_standard_tx : public usrp_basic_tx, public usrp_standard_common
    * and the characteristics of the respective daughterboard.
    */
   int determine_tx_mux_value(const usrp_subdev_spec &ss);
+  int determine_tx_mux_value(const usrp_subdev_spec &ss_a, const usrp_subdev_spec &ss_b);
 
   /*!
    * \brief set the frequency of the digital up converter.