diff options
-rw-r--r-- | gr-usrp/src/usrp.i | 20 | ||||
-rw-r--r-- | gr-usrp/src/usrp_sink_base.cc | 6 | ||||
-rw-r--r-- | gr-usrp/src/usrp_sink_base.h | 1 | ||||
-rw-r--r-- | gr-usrp/src/usrp_sink_base.i | 1 | ||||
-rw-r--r-- | gr-usrp/src/usrp_source_base.cc | 6 | ||||
-rw-r--r-- | gr-usrp/src/usrp_source_base.h | 1 | ||||
-rw-r--r-- | gr-usrp/src/usrp_source_base.i | 1 | ||||
-rwxr-xr-x | grc/scripts/usrp_probe | 9 | ||||
-rw-r--r-- | grc/src/grc_gnuradio/usrp/dual_usrp.py | 22 | ||||
-rw-r--r-- | grc/src/grc_gnuradio/usrp/simple_usrp.py | 8 | ||||
-rw-r--r-- | usrp/host/lib/legacy/usrp_standard.cc | 32 | ||||
-rw-r--r-- | usrp/host/lib/legacy/usrp_standard.h | 2 |
12 files changed, 72 insertions, 37 deletions
diff --git a/gr-usrp/src/usrp.i b/gr-usrp/src/usrp.i index 55ad2a763..f5841985d 100644 --- a/gr-usrp/src/usrp.i +++ b/gr-usrp/src/usrp.i @@ -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): diff --git a/gr-usrp/src/usrp_sink_base.cc b/gr-usrp/src/usrp_sink_base.cc index 963f4dd6d..fc238ceb8 100644 --- a/gr-usrp/src/usrp_sink_base.cc +++ b/gr-usrp/src/usrp_sink_base.cc @@ -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) { diff --git a/gr-usrp/src/usrp_sink_base.h b/gr-usrp/src/usrp_sink_base.h index 12dd51c65..312bab246 100644 --- a/gr-usrp/src/usrp_sink_base.h +++ b/gr-usrp/src/usrp_sink_base.h @@ -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. diff --git a/gr-usrp/src/usrp_sink_base.i b/gr-usrp/src/usrp_sink_base.i index ffc70a984..17fca441d 100644 --- a/gr-usrp/src/usrp_sink_base.i +++ b/gr-usrp/src/usrp_sink_base.i @@ -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(); } diff --git a/gr-usrp/src/usrp_source_base.cc b/gr-usrp/src/usrp_source_base.cc index 778fa1017..b875737ce 100644 --- a/gr-usrp/src/usrp_source_base.cc +++ b/gr-usrp/src/usrp_source_base.cc @@ -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) { diff --git a/gr-usrp/src/usrp_source_base.h b/gr-usrp/src/usrp_source_base.h index 9d8f32ac7..b9c4b9499 100644 --- a/gr-usrp/src/usrp_source_base.h +++ b/gr-usrp/src/usrp_source_base.h @@ -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. diff --git a/gr-usrp/src/usrp_source_base.i b/gr-usrp/src/usrp_source_base.i index 6a70c7412..aed751de9 100644 --- a/gr-usrp/src/usrp_source_base.i +++ b/gr-usrp/src/usrp_source_base.i @@ -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); diff --git a/grc/scripts/usrp_probe b/grc/scripts/usrp_probe index ac786075c..3d7b6f0cb 100755 --- a/grc/scripts/usrp_probe +++ b/grc/scripts/usrp_probe @@ -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() diff --git a/grc/src/grc_gnuradio/usrp/dual_usrp.py b/grc/src/grc_gnuradio/usrp/dual_usrp.py index 47449ae78..f12b5348d 100644 --- a/grc/src/grc_gnuradio/usrp/dual_usrp.py +++ b/grc/src/grc_gnuradio/usrp/dual_usrp.py @@ -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()) diff --git a/grc/src/grc_gnuradio/usrp/simple_usrp.py b/grc/src/grc_gnuradio/usrp/simple_usrp.py index 819a01c2c..58683433e 100644 --- a/grc/src/grc_gnuradio/usrp/simple_usrp.py +++ b/grc/src/grc_gnuradio/usrp/simple_usrp.py @@ -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()) diff --git a/usrp/host/lib/legacy/usrp_standard.cc b/usrp/host/lib/legacy/usrp_standard.cc index d2360cc6f..afbbaa8d9 100644 --- a/usrp/host/lib/legacy/usrp_standard.cc +++ b/usrp/host/lib/legacy/usrp_standard.cc @@ -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 diff --git a/usrp/host/lib/legacy/usrp_standard.h b/usrp/host/lib/legacy/usrp_standard.h index b7145b843..1e018c74d 100644 --- a/usrp/host/lib/legacy/usrp_standard.h +++ b/usrp/host/lib/legacy/usrp_standard.h @@ -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. |