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=[]):
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):
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)
{
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.
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(); }
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)
{
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.
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);
"""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()
)
#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)
)
#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())
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)
#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())
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)
}
}
-
+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
* 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.
* 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.