diff options
| -rw-r--r-- | host/include/uhd/usrp/codec_props.hpp | 12 | ||||
| -rw-r--r-- | host/include/uhd/usrp/dboard_props.hpp | 16 | ||||
| -rw-r--r-- | host/include/uhd/usrp/device_props.hpp | 8 | ||||
| -rw-r--r-- | host/include/uhd/usrp/dsp_props.hpp | 14 | ||||
| -rw-r--r-- | host/include/uhd/usrp/mboard_props.hpp | 39 | ||||
| -rw-r--r-- | host/include/uhd/usrp/multi_usrp.hpp | 26 | ||||
| -rw-r--r-- | host/include/uhd/usrp/subdev_props.hpp | 30 | ||||
| -rw-r--r-- | host/lib/usrp/multi_usrp.cpp | 74 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/mboard_impl.cpp | 9 | 
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; | 
