aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2011-02-17 16:44:31 -0800
committerJosh Blum <josh@joshknows.com>2011-02-17 16:44:31 -0800
commit1628434a32321f8af6355f5eb828e8b06da52b90 (patch)
tree5f30009c16a86001d2d27c0532c1fc606fc20896
parent11bf23d994fab2a01a27541db959dcc6991b5dd0 (diff)
downloaduhd-1628434a32321f8af6355f5eb828e8b06da52b90.tar.gz
uhd-1628434a32321f8af6355f5eb828e8b06da52b90.tar.bz2
uhd-1628434a32321f8af6355f5eb828e8b06da52b90.zip
uhd: work on multiple dsp in host wrapper
-rw-r--r--host/include/uhd/usrp/codec_props.hpp12
-rw-r--r--host/include/uhd/usrp/dboard_props.hpp16
-rw-r--r--host/include/uhd/usrp/device_props.hpp8
-rw-r--r--host/include/uhd/usrp/dsp_props.hpp14
-rw-r--r--host/include/uhd/usrp/mboard_props.hpp39
-rw-r--r--host/include/uhd/usrp/multi_usrp.hpp26
-rw-r--r--host/include/uhd/usrp/subdev_props.hpp30
-rw-r--r--host/lib/usrp/multi_usrp.cpp74
-rw-r--r--host/lib/usrp/usrp2/mboard_impl.cpp9
9 files changed, 124 insertions, 104 deletions
diff --git a/host/include/uhd/usrp/codec_props.hpp b/host/include/uhd/usrp/codec_props.hpp
index 5d0a2913c..b0a79e3f6 100644
--- a/host/include/uhd/usrp/codec_props.hpp
+++ b/host/include/uhd/usrp/codec_props.hpp
@@ -28,12 +28,12 @@ namespace uhd{ namespace usrp{
* Other properties can be discovered through the others prop.
*/
enum codec_prop_t{
- CODEC_PROP_NAME = 'n', //ro, std::string
- CODEC_PROP_OTHERS = 'o', //ro, prop_names_t
- CODEC_PROP_GAIN_I = 'i', //rw, double
- CODEC_PROP_GAIN_Q = 'q', //rw, double
- CODEC_PROP_GAIN_RANGE = 'r', //ro, gain_range_t
- CODEC_PROP_GAIN_NAMES = 'G' //ro, prop_names_t
+ CODEC_PROP_NAME, //ro, std::string
+ CODEC_PROP_OTHERS, //ro, prop_names_t
+ CODEC_PROP_GAIN_I, //rw, double
+ CODEC_PROP_GAIN_Q , //rw, double
+ CODEC_PROP_GAIN_RANGE, //ro, gain_range_t
+ CODEC_PROP_GAIN_NAMES //ro, prop_names_t
};
diff --git a/host/include/uhd/usrp/dboard_props.hpp b/host/include/uhd/usrp/dboard_props.hpp
index aab6c31ce..32ec1c1bf 100644
--- a/host/include/uhd/usrp/dboard_props.hpp
+++ b/host/include/uhd/usrp/dboard_props.hpp
@@ -1,5 +1,5 @@
//
-// Copyright 2010 Ettus Research LLC
+// Copyright 2010-2011 Ettus Research LLC
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -28,13 +28,13 @@ namespace uhd{ namespace usrp{
* A dboard is considered to be unidirectional (RX or TX).
*/
enum dboard_prop_t{
- DBOARD_PROP_NAME = 'n', //ro, std::string
- DBOARD_PROP_SUBDEV = 's', //ro, wax::obj
- DBOARD_PROP_SUBDEV_NAMES = 'S', //ro, prop_names_t
- DBOARD_PROP_DBOARD_ID = 'i', //rw, dboard_id_t
- DBOARD_PROP_DBOARD_IFACE = 'f', //ro, dboard_iface::sptr
- DBOARD_PROP_CODEC = 'c', //ro, wax::obj
- DBOARD_PROP_GAIN_GROUP = 'g' //ro, gain_group
+ DBOARD_PROP_NAME, //ro, std::string
+ DBOARD_PROP_SUBDEV, //ro, wax::obj
+ DBOARD_PROP_SUBDEV_NAMES, //ro, prop_names_t
+ DBOARD_PROP_DBOARD_ID, //rw, dboard_id_t
+ DBOARD_PROP_DBOARD_IFACE, //ro, dboard_iface::sptr
+ DBOARD_PROP_CODEC, //ro, wax::obj
+ DBOARD_PROP_GAIN_GROUP //ro, gain_group
};
}} //namespace
diff --git a/host/include/uhd/usrp/device_props.hpp b/host/include/uhd/usrp/device_props.hpp
index 346eec179..3c8f7e225 100644
--- a/host/include/uhd/usrp/device_props.hpp
+++ b/host/include/uhd/usrp/device_props.hpp
@@ -1,5 +1,5 @@
//
-// Copyright 2010 Ettus Research LLC
+// Copyright 2010-2011 Ettus Research LLC
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -29,9 +29,9 @@ namespace uhd{ namespace usrp{
* will be present in the interface for configuration.
*/
enum device_prop_t{
- DEVICE_PROP_NAME = 'n', //ro, std::string
- DEVICE_PROP_MBOARD = 'm', //ro, wax::obj
- DEVICE_PROP_MBOARD_NAMES = 'M' //ro, prop_names_t
+ DEVICE_PROP_NAME, //ro, std::string
+ DEVICE_PROP_MBOARD, //ro, wax::obj
+ DEVICE_PROP_MBOARD_NAMES, //ro, prop_names_t
};
}} //namespace
diff --git a/host/include/uhd/usrp/dsp_props.hpp b/host/include/uhd/usrp/dsp_props.hpp
index 54ea5666b..e68e11deb 100644
--- a/host/include/uhd/usrp/dsp_props.hpp
+++ b/host/include/uhd/usrp/dsp_props.hpp
@@ -1,5 +1,5 @@
//
-// Copyright 2010 Ettus Research LLC
+// Copyright 2010-2011 Ettus Research LLC
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -37,12 +37,12 @@ namespace uhd{ namespace usrp{
* Set the shift property and read it back to get actual shift.
*/
enum dsp_prop_t{
- DSP_PROP_NAME = 'n', //ro, std::string
- DSP_PROP_OTHERS = 'o', //ro, prop_names_t
- DSP_PROP_FREQ_SHIFT = 'f', //rw, double Hz
- DSP_PROP_FREQ_SHIFT_NAMES = 'F', //ro, prop_names_t
- DSP_PROP_CODEC_RATE = 'c', //ro, double Sps
- DSP_PROP_HOST_RATE = 'h' //rw, double Sps
+ DSP_PROP_NAME, //ro, std::string
+ DSP_PROP_OTHERS, //ro, prop_names_t
+ DSP_PROP_STREAM_CMD, //wo, stream_cmd_t
+ DSP_PROP_FREQ_SHIFT, //rw, double Hz
+ DSP_PROP_CODEC_RATE, //ro, double Sps
+ DSP_PROP_HOST_RATE //rw, double Sps
};
}} //namespace
diff --git a/host/include/uhd/usrp/mboard_props.hpp b/host/include/uhd/usrp/mboard_props.hpp
index d04ad012c..2145ab446 100644
--- a/host/include/uhd/usrp/mboard_props.hpp
+++ b/host/include/uhd/usrp/mboard_props.hpp
@@ -1,5 +1,5 @@
//
-// Copyright 2010 Ettus Research LLC
+// Copyright 2010-2011 Ettus Research LLC
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -29,24 +29,25 @@ namespace uhd{ namespace usrp{
* and discovered though the others property.
*/
enum mboard_prop_t{
- MBOARD_PROP_NAME = 'n', //ro, std::string
- MBOARD_PROP_OTHERS = 'o', //ro, prop_names_t
- MBOARD_PROP_CLOCK_RATE = 'c', //rw, double
- MBOARD_PROP_RX_DSP = 'd', //ro, wax::obj
- MBOARD_PROP_RX_DSP_NAMES = 'D', //ro, prop_names_t
- MBOARD_PROP_TX_DSP = 'u', //ro, wax::obj
- MBOARD_PROP_TX_DSP_NAMES = 'U', //ro, prop_names_t
- MBOARD_PROP_RX_DBOARD = 'e', //ro, wax::obj
- MBOARD_PROP_RX_DBOARD_NAMES = 'E', //ro, prop_names_t
- MBOARD_PROP_TX_DBOARD = 'v', //ro, wax::obj
- MBOARD_PROP_TX_DBOARD_NAMES = 'V', //ro, prop_names_t
- MBOARD_PROP_RX_SUBDEV_SPEC = 'r', //rw, subdev_spec_t
- MBOARD_PROP_TX_SUBDEV_SPEC = 'R', //rw, subdev_spec_t
- MBOARD_PROP_CLOCK_CONFIG = 'C', //rw, clock_config_t
- MBOARD_PROP_TIME_NOW = 't', //rw, time_spec_t
- MBOARD_PROP_TIME_PPS = 'T', //wo, time_spec_t
- MBOARD_PROP_STREAM_CMD = 's', //wo, stream_cmd_t
- MBOARD_PROP_EEPROM_MAP = 'M' //wr, mboard_eeprom_t::sptr
+ MBOARD_PROP_NAME, //ro, std::string
+ MBOARD_PROP_OTHERS, //ro, prop_names_t
+ MBOARD_PROP_SENSOR, //ro, sensor_value_t
+ MBOARD_PROP_SENSOR_NAMES, //ro, prop_names_t
+ MBOARD_PROP_CLOCK_RATE, //rw, double
+ MBOARD_PROP_RX_DSP, //ro, wax::obj
+ MBOARD_PROP_RX_DSP_NAMES, //ro, prop_names_t
+ MBOARD_PROP_TX_DSP, //ro, wax::obj
+ MBOARD_PROP_TX_DSP_NAMES, //ro, prop_names_t
+ MBOARD_PROP_RX_DBOARD, //ro, wax::obj
+ MBOARD_PROP_RX_DBOARD_NAMES, //ro, prop_names_t
+ MBOARD_PROP_TX_DBOARD, //ro, wax::obj
+ MBOARD_PROP_TX_DBOARD_NAMES, //ro, prop_names_t
+ MBOARD_PROP_RX_SUBDEV_SPEC, //rw, subdev_spec_t
+ MBOARD_PROP_TX_SUBDEV_SPEC, //rw, subdev_spec_t
+ MBOARD_PROP_CLOCK_CONFIG, //rw, clock_config_t
+ MBOARD_PROP_TIME_NOW, //rw, time_spec_t
+ MBOARD_PROP_TIME_PPS, //wo, time_spec_t
+ MBOARD_PROP_EEPROM_MAP //wr, mboard_eeprom_t::sptr
};
}} //namespace
diff --git a/host/include/uhd/usrp/multi_usrp.hpp b/host/include/uhd/usrp/multi_usrp.hpp
index 60b757f50..9215652a6 100644
--- a/host/include/uhd/usrp/multi_usrp.hpp
+++ b/host/include/uhd/usrp/multi_usrp.hpp
@@ -86,6 +86,9 @@ public:
//! A wildcard motherboard index
static const size_t ALL_MBOARDS = size_t(~0);
+ //! A wildcard channel index
+ static const size_t ALL_CHANS = size_t(~0);
+
//! A wildcard gain element name
static const std::string ALL_GAINS;
@@ -214,8 +217,9 @@ public:
* to ensure that the packets can be aligned by their time specs.
*
* \param stream_cmd the stream command to issue
+ * \param chan the channel index 0 to N-1
*/
- virtual void issue_stream_cmd(const stream_cmd_t &stream_cmd) = 0;
+ virtual void issue_stream_cmd(const stream_cmd_t &stream_cmd, size_t chan = ALL_CHANS) = 0;
/*!
* Set the clock configuration for the usrp device.
@@ -266,16 +270,18 @@ public:
virtual std::string get_rx_subdev_name(size_t chan = 0) = 0;
/*!
- * Set the RX sample rate across all channels.
+ * Set the RX sample rate.
* \param rate the rate in Sps
+ * \param chan the channel index 0 to N-1
*/
- virtual void set_rx_rate(double rate) = 0;
+ virtual void set_rx_rate(double rate, size_t chan = ALL_CHANS) = 0;
/*!
- * Gets the RX sample rate for all channels.
+ * Gets the RX sample rate.
+ * \param chan the channel index 0 to N-1
* \return the rate in Sps
*/
- virtual double get_rx_rate(void) = 0;
+ virtual double get_rx_rate(size_t chan = 0) = 0;
/*!
* Set the RX center frequency.
@@ -445,16 +451,18 @@ public:
virtual std::string get_tx_subdev_name(size_t chan = 0) = 0;
/*!
- * Set the TX sample rate across all channels.
+ * Set the TX sample rate.
* \param rate the rate in Sps
+ * \param chan the channel index 0 to N-1
*/
- virtual void set_tx_rate(double rate) = 0;
+ virtual void set_tx_rate(double rate, size_t chan = ALL_CHANS) = 0;
/*!
- * Gets the TX sample rate for all channels.
+ * Gets the TX sample rate.
+ * \param chan the channel index 0 to N-1
* \return the rate in Sps
*/
- virtual double get_tx_rate(void) = 0;
+ virtual double get_tx_rate(size_t chan) = 0;
/*!
* Set the TX center frequency.
diff --git a/host/include/uhd/usrp/subdev_props.hpp b/host/include/uhd/usrp/subdev_props.hpp
index 8d05f4c27..40b339703 100644
--- a/host/include/uhd/usrp/subdev_props.hpp
+++ b/host/include/uhd/usrp/subdev_props.hpp
@@ -42,21 +42,21 @@ namespace uhd{ namespace usrp{
* Possible device subdev properties
*/
enum subdev_prop_t{
- SUBDEV_PROP_NAME = 'n', //ro, std::string
- SUBDEV_PROP_OTHERS = 'o', //ro, prop_names_t
- SUBDEV_PROP_GAIN = 'g', //rw, double
- SUBDEV_PROP_GAIN_RANGE = 'r', //ro, gain_range_t
- SUBDEV_PROP_GAIN_NAMES = 'G', //ro, prop_names_t
- SUBDEV_PROP_FREQ = 'f', //rw, double
- SUBDEV_PROP_FREQ_RANGE = 'F', //ro, freq_range_t
- SUBDEV_PROP_ANTENNA = 'a', //rw, std::string
- SUBDEV_PROP_ANTENNA_NAMES = 'A', //ro, prop_names_t
- SUBDEV_PROP_LO_LOCKED = 'L', //ro, bool
- SUBDEV_PROP_CONNECTION = 'c', //ro, subdev_conn_t
- SUBDEV_PROP_ENABLED = 'e', //rw, bool
- SUBDEV_PROP_USE_LO_OFFSET = 'l', //ro, bool
- SUBDEV_PROP_RSSI = 'R', //ro, double
- SUBDEV_PROP_BANDWIDTH = 'B' //rw, double
+ SUBDEV_PROP_NAME, //ro, std::string
+ SUBDEV_PROP_OTHERS, //ro, prop_names_t
+ SUBDEV_PROP_SENSOR, //ro, sensor_value_t
+ SUBDEV_PROP_SENSOR_NAMES, //ro, prop_names_t
+ SUBDEV_PROP_GAIN, //rw, double
+ SUBDEV_PROP_GAIN_RANGE, //ro, gain_range_t
+ SUBDEV_PROP_GAIN_NAMES, //ro, prop_names_t
+ SUBDEV_PROP_FREQ, //rw, double
+ SUBDEV_PROP_FREQ_RANGE, //ro, freq_range_t
+ SUBDEV_PROP_ANTENNA, //rw, std::string
+ SUBDEV_PROP_ANTENNA_NAMES, //ro, prop_names_t
+ SUBDEV_PROP_CONNECTION, //ro, subdev_conn_t
+ SUBDEV_PROP_ENABLED, //rw, bool
+ SUBDEV_PROP_USE_LO_OFFSET, //ro, bool
+ SUBDEV_PROP_BANDWIDTH //rw, double
};
}} //namespace
diff --git a/host/lib/usrp/multi_usrp.cpp b/host/lib/usrp/multi_usrp.cpp
index 4bdb2bf2e..9f001595d 100644
--- a/host/lib/usrp/multi_usrp.cpp
+++ b/host/lib/usrp/multi_usrp.cpp
@@ -85,17 +85,14 @@ public:
//----------- rx side of life ----------------------------------
for (size_t m = 0, chan = 0; m < get_num_mboards(); m++){
- buff += str(boost::format(
- " RX DSP %d: %s\n"
- ) % m
- % _rx_dsp(m)[DSP_PROP_NAME].as<std::string>()
- );
for (; chan < (m + 1)*get_rx_subdev_spec(m).size(); chan++){
buff += str(boost::format(
" RX Channel: %u\n"
+ " RX DSP: %s\n"
" RX Dboard: %s\n"
" RX Subdev: %s\n"
) % chan
+ % _rx_dsp(chan)[DSP_PROP_NAME].as<std::string>()
% _rx_dboard(chan)[DBOARD_PROP_NAME].as<std::string>()
% _rx_subdev(chan)[SUBDEV_PROP_NAME].as<std::string>()
);
@@ -104,17 +101,14 @@ public:
//----------- tx side of life ----------------------------------
for (size_t m = 0, chan = 0; m < get_num_mboards(); m++){
- buff += str(boost::format(
- " TX DSP %d: %s\n"
- ) % m
- % _tx_dsp(m)[DSP_PROP_NAME].as<std::string>()
- );
for (; chan < (m + 1)*get_tx_subdev_spec(m).size(); chan++){
buff += str(boost::format(
" TX Channel: %u\n"
+ " TX DSP: %s\n"
" TX Dboard: %s\n"
" TX Subdev: %s\n"
) % chan
+ % _tx_dsp(chan)[DSP_PROP_NAME].as<std::string>()
% _tx_dboard(chan)[DBOARD_PROP_NAME].as<std::string>()
% _tx_subdev(chan)[SUBDEV_PROP_NAME].as<std::string>()
);
@@ -194,9 +188,13 @@ public:
return true;
}
- void issue_stream_cmd(const stream_cmd_t &stream_cmd){
- for (size_t m = 0; m < get_num_mboards(); m++){
- _mboard(m)[MBOARD_PROP_STREAM_CMD] = stream_cmd;
+ void issue_stream_cmd(const stream_cmd_t &stream_cmd, size_t chan){
+ if (chan != ALL_CHANS){
+ _rx_dsp(chan)[DSP_PROP_STREAM_CMD] = stream_cmd;
+ return;
+ }
+ for (size_t c = 0; m < get_rx_num_channels(); m++){
+ issue_stream_cmd(stream_cmd, c);
}
}
@@ -240,28 +238,32 @@ public:
}
void set_rx_rate(double rate){
- for (size_t m = 0; m < get_num_mboards(); m++){
- _rx_dsp(m)[DSP_PROP_HOST_RATE] = rate;
+ if (chan != ALL_CHANS){
+ _rx_dsp(chan)[DSP_PROP_HOST_RATE] = rate;
+ do_samp_rate_warning_message(rate, get_rx_rate(chan), "RX");
+ return;
+ }
+ for (size_t c = 0; m < get_rx_num_channels(); m++){
+ set_rx_rate(rate, c);
}
- do_samp_rate_warning_message(rate, get_rx_rate(), "RX");
}
- double get_rx_rate(void){
- return _rx_dsp(0)[DSP_PROP_HOST_RATE].as<double>();
+ double get_rx_rate(size_t chan){
+ return _rx_dsp(chan)[DSP_PROP_HOST_RATE].as<double>();
}
tune_result_t set_rx_freq(const tune_request_t &tune_request, size_t chan){
- tune_result_t r = tune_rx_subdev_and_dsp(_rx_subdev(chan), _rx_dsp(chan/rx_cpm()), chan%rx_cpm(), tune_request);
+ tune_result_t r = tune_rx_subdev_and_dsp(_rx_subdev(chan), _rx_dsp(chan), chan%rx_cpm(), tune_request);
do_tune_freq_warning_message(tune_request.target_freq, get_rx_freq(chan), "RX");
return r;
}
double get_rx_freq(size_t chan){
- return derive_freq_from_rx_subdev_and_dsp(_rx_subdev(chan), _rx_dsp(chan/rx_cpm()), chan%rx_cpm());
+ return derive_freq_from_rx_subdev_and_dsp(_rx_subdev(chan), _rx_dsp(chan), chan%rx_cpm());
}
freq_range_t get_rx_freq_range(size_t chan){
- return add_dsp_shift(_rx_subdev(chan)[SUBDEV_PROP_FREQ_RANGE].as<freq_range_t>(), _rx_dsp(chan/rx_cpm()));
+ return add_dsp_shift(_rx_subdev(chan)[SUBDEV_PROP_FREQ_RANGE].as<freq_range_t>(), _rx_dsp(chan));
}
void set_rx_gain(double gain, const std::string &name, size_t chan){
@@ -338,28 +340,32 @@ public:
}
void set_tx_rate(double rate){
- for (size_t m = 0; m < get_num_mboards(); m++){
- _tx_dsp(m)[DSP_PROP_HOST_RATE] = rate;
+ if (chan != ALL_CHANS){
+ _tx_dsp(chan)[DSP_PROP_HOST_RATE] = rate;
+ do_samp_rate_warning_message(rate, get_tx_rate(chan), "TX");
+ return;
+ }
+ for (size_t c = 0; m < get_tx_num_channels(); m++){
+ set_tx_rate(rate, c);
}
- do_samp_rate_warning_message(rate, get_tx_rate(), "TX");
}
- double get_tx_rate(void){
- return _tx_dsp(0)[DSP_PROP_HOST_RATE].as<double>();
+ double get_tx_rate(size_t chan){
+ return _tx_dsp(chan)[DSP_PROP_HOST_RATE].as<double>();
}
tune_result_t set_tx_freq(const tune_request_t &tune_request, size_t chan){
- tune_result_t r = tune_tx_subdev_and_dsp(_tx_subdev(chan), _tx_dsp(chan/tx_cpm()), chan%tx_cpm(), tune_request);
+ tune_result_t r = tune_tx_subdev_and_dsp(_tx_subdev(chan), _tx_dsp(chan), chan%tx_cpm(), tune_request);
do_tune_freq_warning_message(tune_request.target_freq, get_tx_freq(chan), "TX");
return r;
}
double get_tx_freq(size_t chan){
- return derive_freq_from_tx_subdev_and_dsp(_tx_subdev(chan), _tx_dsp(chan/tx_cpm()), chan%tx_cpm());
+ return derive_freq_from_tx_subdev_and_dsp(_tx_subdev(chan), _tx_dsp(chan), chan%tx_cpm());
}
freq_range_t get_tx_freq_range(size_t chan){
- return add_dsp_shift(_tx_subdev(chan)[SUBDEV_PROP_FREQ_RANGE].as<freq_range_t>(), _tx_dsp(chan/tx_cpm()));
+ return add_dsp_shift(_tx_subdev(chan)[SUBDEV_PROP_FREQ_RANGE].as<freq_range_t>(), _tx_dsp(chan));
}
void set_tx_gain(double gain, const std::string &name, size_t chan){
@@ -433,11 +439,13 @@ private:
std::string mb_name = (*_dev)[DEVICE_PROP_MBOARD_NAMES].as<prop_names_t>().at(mboard);
return (*_dev)[named_prop_t(DEVICE_PROP_MBOARD, mb_name)];
}
- wax::obj _rx_dsp(size_t mboard){
- return _mboard(mboard)[MBOARD_PROP_RX_DSP];
+ wax::obj _rx_dsp(size_t chan){
+ prop_names_t dsp_names = _mboard(chan/rx_cpm())[MBOARD_PROP_RX_DSP_NAMES].as<prop_names_t>();
+ return _mboard(chan/rx_cpm())[named_prop_t(MBOARD_PROP_RX_DSP, dsp_names.at(chan%rx_cpm())];
}
- wax::obj _tx_dsp(size_t mboard){
- return _mboard(mboard)[MBOARD_PROP_TX_DSP];
+ wax::obj _tx_dsp(size_t chan){
+ prop_names_t dsp_names = _mboard(chan/tx_cpm())[MBOARD_PROP_TX_DSP_NAMES].as<prop_names_t>();
+ return _mboard(chan/tx_cpm())[named_prop_t(MBOARD_PROP_TX_DSP, dsp_names.at(chan%tx_cpm())];
}
wax::obj _rx_dboard(size_t chan){
std::string db_name = get_rx_subdev_spec(chan/rx_cpm()).at(chan%rx_cpm()).db_name;
diff --git a/host/lib/usrp/usrp2/mboard_impl.cpp b/host/lib/usrp/usrp2/mboard_impl.cpp
index d8ce9824d..5fbbfc0ee 100644
--- a/host/lib/usrp/usrp2/mboard_impl.cpp
+++ b/host/lib/usrp/usrp2/mboard_impl.cpp
@@ -399,10 +399,13 @@ void usrp2_mboard_impl::set(const wax::obj &key, const wax::obj &val){
_rx_subdev_spec = val.as<subdev_spec_t>();
verify_rx_subdev_spec(_rx_subdev_spec, this->get_link());
//sanity check
- UHD_ASSERT_THROW(_rx_subdev_spec.size() == 1);
+ UHD_ASSERT_THROW(_rx_subdev_spec.size() <= 2);
//set the mux
- _iface->poke32(_iface->regs.dsp0_rx_mux, dsp_type1::calc_rx_mux_word(
- _dboard_manager->get_rx_subdev(_rx_subdev_spec.front().sd_name)[SUBDEV_PROP_CONNECTION].as<subdev_conn_t>()
+ if (_rx_subdev_spec.size() >= 1) _iface->poke32(_iface->regs.dsp0_rx_mux, dsp_type1::calc_rx_mux_word(
+ _dboard_manager->get_rx_subdev(_rx_subdev_spec[0].sd_name)[SUBDEV_PROP_CONNECTION].as<subdev_conn_t>()
+ ));
+ if (_rx_subdev_spec.size() >= 2)_iface->poke32(_iface->regs.dsp1_rx_mux, dsp_type1::calc_rx_mux_word(
+ _dboard_manager->get_rx_subdev(_rx_subdev_spec[1].sd_name)[SUBDEV_PROP_CONNECTION].as<subdev_conn_t>()
));
return;