diff --git a/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.cc b/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.cc index 35ac26dac..c44e7b11c 100644 --- a/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.cc +++ b/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.cc @@ -59,7 +59,7 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con filename0_(configuration->property(role + ".filename", empty_string)), rf_gain_rx1_(configuration->property(role + ".gain_rx1", default_manual_gain_rx1)), rf_gain_rx2_(configuration->property(role + ".gain_rx1", default_manual_gain_rx2)), - freq_(configuration->property(role + ".freq", static_cast(GPS_L1_FREQ_HZ))), + freq0_(configuration->property(role + ".freq", 0)), sample_rate_(configuration->property(role + ".sampling_frequency", default_bandwidth)), bandwidth_(configuration->property(role + ".bandwidth", default_bandwidth)), samples_to_skip_(0), @@ -98,6 +98,12 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con const double seconds_to_skip = configuration->property(role + ".seconds_to_skip", 0.0); const size_t header_size = configuration->property(role + ".header_size", 0); + if (freq0_ == 0) + { + freq0_ = configuration->property(role + ".freq0", static_cast(GPS_L1_FREQ_HZ)); + freq1_ = configuration->property(role + ".freq1", static_cast(GPS_L5_FREQ_HZ)); + } + if (filter_auto_) { filter_source_ = configuration->property(role + ".filter_source", std::string("Auto")); @@ -340,12 +346,13 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con LOG(WARNING) << "Invalid configuration value for bandwidth parameter. Set to bandwidth=" << default_bandwidth; } - std::cout << "LO frequency : " << freq_ << " Hz\n"; + std::cout << "LO frequency : " << freq0_ << " Hz\n"; try { config_ad9361_rx_local(bandwidth_, sample_rate_, - freq_, + freq0_, + freq1_, rf_port_select_, rx1_enable_, rx2_enable_, diff --git a/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.h b/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.h index 62e3d2e63..c2feb998d 100644 --- a/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.h +++ b/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.h @@ -126,7 +126,8 @@ private: double rf_gain_rx1_; double rf_gain_rx2_; - uint64_t freq_; // frequency of local oscillator + uint64_t freq0_; // frequency of local oscillator for ADRV9361-A 0 + uint64_t freq1_; // frequency of local oscillator for ADRV9361-B (if present) uint64_t sample_rate_; uint64_t bandwidth_; uint64_t samples_to_skip_; diff --git a/src/algorithms/signal_source/libs/ad9361_manager.cc b/src/algorithms/signal_source/libs/ad9361_manager.cc index 834b43e5f..48701d44e 100644 --- a/src/algorithms/signal_source/libs/ad9361_manager.cc +++ b/src/algorithms/signal_source/libs/ad9361_manager.cc @@ -92,32 +92,6 @@ bool get_ad9361_stream_ch(struct iio_context *ctx __attribute__((unused)), enum } -/* finds AD9361 phy IIO configuration channel with id chid */ -bool get_phy_chan(struct iio_context *ctx, enum iodev d, int chid, struct iio_channel **chn) -{ - std::stringstream name; - switch (d) - { - case RX: - name.str(""); - name << "voltage"; - name << chid; - *chn = iio_device_find_channel(get_ad9361_phy(ctx), name.str().c_str(), false); - return *chn != nullptr; - break; - case TX: - name.str(""); - name << "voltage"; - name << chid; - *chn = iio_device_find_channel(get_ad9361_phy(ctx), name.str().c_str(), true); - return *chn != nullptr; - break; - default: - return false; - } -} - - /* finds AD9361 local oscillator IIO configuration channels */ bool get_lo_chan(struct iio_context *ctx, enum iodev d, struct iio_channel **chn) { @@ -137,24 +111,15 @@ bool get_lo_chan(struct iio_context *ctx, enum iodev d, struct iio_channel **chn /* applies streaming configuration through IIO */ -bool cfg_ad9361_streaming_ch(struct iio_context *ctx, struct stream_cfg *cfg, enum iodev type, int chid) +bool cfg_ad9361_streaming_ch(struct iio_context *ctx, struct stream_cfg *cfg, enum iodev type, iio_channel *chn) { - struct iio_channel *chn = nullptr; - // Configure phy and lo channels - // LOG(INFO)<<"* Acquiring AD9361 phy channel"<rfport); wr_ch_lli(chn, "rf_bandwidth", cfg->bw_hz); wr_ch_lli(chn, "sampling_frequency", cfg->fs_hz); // Configure LO channel - // LOG(INFO)<<"* Acquiring AD9361 "<(Fpass_), static_cast(Fstop_), bandwidth_, bandwidth_); + ad9361_phy_dev, sample_rate_, static_cast(Fpass_), static_cast(Fstop_), bandwidth_, bandwidth_); if (ret) { throw std::runtime_error("Unable to set BB rate"); } - ret = iio_device_attr_write(ad9361_phy, "in_voltage0_rf_port_select", rf_port_select_.c_str()); + ret = iio_device_attr_write(ad9361_phy_dev, "in_voltage0_rf_port_select", rf_port_select_.c_str()); if (ret) { throw std::runtime_error("Unable to set rf_port_select"); } - wr_ch_lli(rx_chan1, "rf_bandwidth", bandwidth_); - if (!get_lo_chan(ctx, RX, &rx_chan1)) + wr_ch_lli(rx_chan, "rf_bandwidth", bandwidth_); + if (!get_lo_chan(ctx, RX, &rx_chan)) { return -1; } - wr_ch_lli(rx_chan1, "frequency", freq_); + wr_ch_lli(rx_chan, "frequency", freq_); } #endif else @@ -258,7 +223,7 @@ int setup_filter(std::string filter_source_, uint64_t bandwidth_, uint64_t sampl // Filters can only be disabled after the sample rate has been set if (filter_source_ == "Off") { - ret = ad9361_set_trx_fir_enable(ad9361_phy, false); + ret = ad9361_set_trx_fir_enable(ad9361_phy_dev, false); if (ret) { throw std::runtime_error("Unable to disable filters"); @@ -267,52 +232,52 @@ int setup_filter(std::string filter_source_, uint64_t bandwidth_, uint64_t sampl return 0; } -int setup_device_parameters(iio_device *ad9361_phy, bool quadrature_, bool rfdc_, bool bbdc_, const std::string &gain_mode_rx1_, const std::string &gain_mode_rx2_) +int setup_device_parameters(iio_device *ad9361_phy_dev, bool quadrature_, bool rfdc_, bool bbdc_, const std::string &gain_mode_rx1_, const std::string &gain_mode_rx2_) { int ret; - ret = iio_device_attr_write(ad9361_phy, "trx_rate_governor", "nominal"); + ret = iio_device_attr_write(ad9361_phy_dev, "trx_rate_governor", "nominal"); if (ret < 0) { std::cout << "Failed to set trx_rate_governor: " << ret << '\n'; return ret; } - ret = iio_device_attr_write(ad9361_phy, "ensm_mode", "fdd"); + ret = iio_device_attr_write(ad9361_phy_dev, "ensm_mode", "fdd"); if (ret < 0) { std::cout << "Failed to set ensm_mode: " << ret << '\n'; return ret; } - ret = iio_device_attr_write(ad9361_phy, "calib_mode", "auto"); + ret = iio_device_attr_write(ad9361_phy_dev, "calib_mode", "auto"); if (ret < 0) { std::cout << "Failed to set calib_mode: " << ret << '\n'; return ret; } - ret = iio_device_attr_write_bool(ad9361_phy, "in_voltage_quadrature_tracking_en", quadrature_); + ret = iio_device_attr_write_bool(ad9361_phy_dev, "in_voltage_quadrature_tracking_en", quadrature_); if (ret < 0) { std::cout << "Failed to set in_voltage_quadrature_tracking_en: " << ret << '\n'; return ret; } - ret = iio_device_attr_write_bool(ad9361_phy, "in_voltage_rf_dc_offset_tracking_en", rfdc_); + ret = iio_device_attr_write_bool(ad9361_phy_dev, "in_voltage_rf_dc_offset_tracking_en", rfdc_); if (ret < 0) { std::cout << "Failed to set in_voltage_rf_dc_offset_tracking_en: " << ret << '\n'; return ret; } - ret = iio_device_attr_write_bool(ad9361_phy, "in_voltage_bb_dc_offset_tracking_en", bbdc_); + ret = iio_device_attr_write_bool(ad9361_phy_dev, "in_voltage_bb_dc_offset_tracking_en", bbdc_); if (ret < 0) { std::cout << "Failed to set in_voltage_bb_dc_offset_tracking_en: " << ret << '\n'; return ret; } - ret = iio_device_attr_write(ad9361_phy, "in_voltage0_gain_control_mode", gain_mode_rx1_.c_str()); + ret = iio_device_attr_write(ad9361_phy_dev, "in_voltage0_gain_control_mode", gain_mode_rx1_.c_str()); if (ret < 0) { std::cout << "Failed to set in_voltage0_gain_control_mode: " << ret << '\n'; return ret; } - ret = iio_device_attr_write(ad9361_phy, "in_voltage1_gain_control_mode", gain_mode_rx2_.c_str()); + ret = iio_device_attr_write(ad9361_phy_dev, "in_voltage1_gain_control_mode", gain_mode_rx2_.c_str()); if (ret < 0) { std::cout << "Failed to set in_voltage1_gain_control_mode: " << ret << '\n'; @@ -322,7 +287,8 @@ int setup_device_parameters(iio_device *ad9361_phy, bool quadrature_, bool rfdc_ bool config_ad9361_rx_local(uint64_t bandwidth_, uint64_t sample_rate_, - uint64_t freq_, + uint64_t freq0_, + uint64_t freq1_, const std::string &rf_port_select_, bool rx1_enable_, bool rx2_enable_, @@ -340,12 +306,12 @@ bool config_ad9361_rx_local(uint64_t bandwidth_, { // RX stream config - std::cout << "AD9361 Acquiring IIO LOCAL context\n"; + struct iio_context *ctx; // Streaming devices struct iio_device *rx; + struct iio_channel *rx_chan0; struct iio_channel *rx_chan1; - struct iio_channel *rx_chan2; int ret; #ifndef LIBAD9361_VERSION_GREATER_THAN_01 @@ -362,7 +328,7 @@ bool config_ad9361_rx_local(uint64_t bandwidth_, #endif // iio context - + std::cout << "Acquiring IIO LOCAL context\n"; ctx = iio_create_default_context(); if (!ctx) { @@ -378,10 +344,11 @@ bool config_ad9361_rx_local(uint64_t bandwidth_, // AD9361-A struct iio_device *ad9361_phy; + std::cout << "Acquiring AD9361 phy devices\n"; ad9361_phy = iio_context_find_device(ctx, RX_DEV_A.c_str()); if (!ad9361_phy) { - std::cout << "No rx dev found\n"; + std::cout << "No " << RX_DEV_A << " dev found\n"; throw std::runtime_error("AD9361 IIO no rx dev found"); } @@ -391,32 +358,32 @@ bool config_ad9361_rx_local(uint64_t bandwidth_, ad9361_phy_B = iio_context_find_device(ctx, RX_DEV_B.c_str()); if (ad9361_phy_B) { - enable_ad9361_b = true; + enable_ad9361_b = true; // the RF board has two AD9361 devices } else { - enable_ad9361_b = false; + enable_ad9361_b = false; // the RF board has one AD9361 device } // set-up AD9361-A stream device - std::cout << "* Acquiring AD9361 streaming devices\n"; std::string rx_stream_dev_a = (enable_ad9361_b ? RX_STREAM_DEV_A : RX_STREAM_DEV); + std::cout << "* Acquiring " << rx_stream_dev_a << " streaming device\n"; rx = iio_context_find_device(ctx, rx_stream_dev_a.c_str()); if (!rx) { - std::cout << "No rx stream dev found\n"; - throw std::runtime_error("AD9361 IIO No rx stream dev found"); + std::cout << "No " << rx_stream_dev_a << " stream dev found\n"; + throw std::runtime_error("AD9361 IIO No " + rx_stream_dev_a + " stream dev found"); } - // get AD9361-A stream device channel 1 as rx channel 1 - - if (!get_ad9361_stream_ch(ctx, RX, rx, 0, &rx_chan1)) + // get AD9361-A stream device channel 0 as rx channel 0 + std::cout << "* Acquiring " << rx_stream_dev_a << " phy channel 0\n"; + if (!get_ad9361_stream_ch(ctx, RX, rx, 0, &rx_chan0)) { - std::cout << "RX channel 1 not found\n"; - throw std::runtime_error("RX channel 1 not found"); + std::cout << rx_stream_dev_a << " channel 0 not found\n"; + throw std::runtime_error(rx_stream_dev_a + "RX channel 0 not found"); } - if (setup_filter(filter_source_, bandwidth_, sample_rate_, freq_, rf_port_select_, ctx, ad9361_phy, rx_chan1, filter_filename_, Fpass_, Fstop_) == -1) + if (setup_filter(filter_source_, bandwidth_, sample_rate_, freq0_, rf_port_select_, ctx, ad9361_phy, rx_chan0, filter_filename_, Fpass_, Fstop_) == -1) { return false; } @@ -425,36 +392,36 @@ bool config_ad9361_rx_local(uint64_t bandwidth_, { // set-up AD9361-B stream device - std::cout << "* Acquiring AD9361 streaming devices\n"; + std::cout << "* Acquiring " << RX_STREAM_DEV_B << " streaming device\n"; rx = iio_context_find_device(ctx, RX_STREAM_DEV_B.c_str()); if (!rx) { - std::cout << "No rx stream dev found\n"; - throw std::runtime_error("AD9361 IIO No rx stream dev found"); + std::cout << "No " << RX_STREAM_DEV_B << " stream dev found\n"; + throw std::runtime_error("AD9361 IIO No " + RX_STREAM_DEV_B + " stream dev found"); } - // get AD9361-A stream device channel 1 as rx channel 2 - - if (!get_ad9361_stream_ch(ctx, RX, rx, 0, &rx_chan2)) + // get AD9361-B stream device channel 0 as rx channel 1 + std::cout << "* Acquiring " << RX_STREAM_DEV_B << " phy channel 0\n"; + if (!get_ad9361_stream_ch(ctx, RX, rx, 0, &rx_chan1)) { - std::cout << "RX channel 1 not found\n"; - throw std::runtime_error("RX channel 1 not found"); + std::cout << RX_STREAM_DEV_B << " channel 0 not found\n"; + throw std::runtime_error(RX_STREAM_DEV_B + "RX channel 0 not found"); } - if (setup_filter(filter_source_, bandwidth_, sample_rate_, freq_, rf_port_select_, ctx, ad9361_phy_B, rx_chan2, filter_filename_, Fpass_, Fstop_) == -1) + if (setup_filter(filter_source_, bandwidth_, sample_rate_, freq1_, rf_port_select_, ctx, ad9361_phy_B, rx_chan1, filter_filename_, Fpass_, Fstop_) == -1) { return false; } } else { - // GET ad9361-A stream device channel 2 as rx channel 2 - - if (!get_ad9361_stream_ch(ctx, RX, rx, 1, &rx_chan2)) + // GET ad9361-A stream device channel 1 as rx channel 1 + std::cout << "* Acquiring " << rx_stream_dev_a << " phy channel 1\n"; + if (!get_ad9361_stream_ch(ctx, RX, rx, 1, &rx_chan1)) { - std::cout << "RX channel 2 not found\n"; - throw std::runtime_error("RX channel 2 not found"); + std::cout << rx_stream_dev_a << " channel 1 not found\n"; + throw std::runtime_error(rx_stream_dev_a + "RX channel 1 not found"); } - if (setup_filter(filter_source_, bandwidth_, sample_rate_, freq_, rf_port_select_, ctx, ad9361_phy, rx_chan2, filter_filename_, Fpass_, Fstop_) == -1) + if (setup_filter(filter_source_, bandwidth_, sample_rate_, freq0_, rf_port_select_, ctx, ad9361_phy, rx_chan1, filter_filename_, Fpass_, Fstop_) == -1) { return false; } @@ -463,26 +430,28 @@ bool config_ad9361_rx_local(uint64_t bandwidth_, std::cout << "* Enabling IIO streaming channels\n"; if (rx1_enable_) { - iio_channel_enable(rx_chan1); + iio_channel_enable(rx_chan0); } if (rx2_enable_) { - iio_channel_enable(rx_chan2); + iio_channel_enable(rx_chan1); } if (!rx1_enable_ and !rx2_enable_) { std::cout << "WARNING: No Rx channels enabled.\n"; } + std::cout << "configuring " << RX_DEV_A << " device parameters\n"; if (setup_device_parameters(ad9361_phy, quadrature_, rfdc_, bbdc_, gain_mode_rx1_, gain_mode_rx2_) < 0) { - throw std::runtime_error("setup AD9361 device parameters failed"); + throw std::runtime_error("configuring " + RX_DEV_A + " device parameters failed\n"); } if (enable_ad9361_b) { + std::cout << "configuring " << RX_DEV_B << " device parameters\n"; if (setup_device_parameters(ad9361_phy_B, quadrature_, rfdc_, bbdc_, gain_mode_rx1_, gain_mode_rx2_) < 0) { - throw std::runtime_error("setup AD9361 device parameters failed"); + throw std::runtime_error("configuring " + RX_DEV_B + " device parameters failed\n"); } } @@ -510,7 +479,7 @@ bool config_ad9361_rx_local(uint64_t bandwidth_, { if (gain_mode_rx2_ == "manual") { - ret = iio_device_attr_write_double(ad9361_phy_B, "in_voltage1_hardwaregain", rf_gain_rx2_); + ret = iio_device_attr_write_double(ad9361_phy_B, "in_voltage0_hardwaregain", rf_gain_rx2_); if (ret < 0) { std::cout << "Failed to set in_voltage1_hardwaregain: " << ret << '\n'; @@ -548,8 +517,8 @@ bool config_ad9361_rx_remote(const std::string &remote_host, struct iio_context *ctx; // Streaming devices struct iio_device *rx; + struct iio_channel *rx_chan0; struct iio_channel *rx_chan1; - struct iio_channel *rx_chan2; #ifndef LIBAD9361_VERSION_GREATER_THAN_01 if (filter_source_ == "Design") @@ -592,124 +561,31 @@ bool config_ad9361_rx_remote(const std::string &remote_host, int ret; std::cout << "* Initializing AD9361 IIO streaming channels\n"; - if (!get_ad9361_stream_ch(ctx, RX, rx, 0, &rx_chan1)) + if (!get_ad9361_stream_ch(ctx, RX, rx, 0, &rx_chan0)) { std::cout << "RX channel 1 not found\n"; throw std::runtime_error("RX channel 1 not found"); } - if (!get_ad9361_stream_ch(ctx, RX, rx, 1, &rx_chan2)) + if (!get_ad9361_stream_ch(ctx, RX, rx, 1, &rx_chan1)) { std::cout << "RX channel 2 not found\n"; throw std::runtime_error("RX channel 2 not found"); } - if (filter_source_ == "Off") + if (setup_filter(filter_source_, bandwidth_, sample_rate_, freq_, rf_port_select_, ctx, ad9361_phy, rx_chan0, filter_filename_, Fpass_, Fstop_) == -1) { - struct stream_cfg rxcfg; - rxcfg.bw_hz = bandwidth_; - rxcfg.fs_hz = sample_rate_; - rxcfg.lo_hz = freq_; - rxcfg.rfport = rf_port_select_.c_str(); - - if (!cfg_ad9361_streaming_ch(ctx, &rxcfg, RX, 0)) - { - std::cout << "RX port 0 not found\n"; - throw std::runtime_error("AD9361 IIO RX port 0 not found"); - } - } - else if (filter_source_ == "Auto") - { - ret = ad9361_set_bb_rate(ad9361_phy, sample_rate_); - if (ret) - { - throw std::runtime_error("Unable to set BB rate"); - // set bw - // params.push_back("in_voltage_rf_bandwidth=" + boost::to_string(bandwidth)); - } - // wr_ch_str(rx_chan1, "rf_port_select", rf_port_select_.c_str()); - ret = iio_device_attr_write(ad9361_phy, "in_voltage0_rf_port_select", rf_port_select_.c_str()); - if (ret) - { - throw std::runtime_error("Unable to set rf_port_select"); - } - wr_ch_lli(rx_chan1, "rf_bandwidth", bandwidth_); - if (!get_lo_chan(ctx, RX, &rx_chan1)) - { - return false; - } - wr_ch_lli(rx_chan1, "frequency", freq_); - } - else if (filter_source_ == "File") - { - try - { - if (!load_fir_filter(filter_filename_, ad9361_phy)) - { - throw std::runtime_error("Unable to load filter file"); - } - } - catch (const std::runtime_error &e) - { - std::cout << "Exception cached when configuring the RX FIR filter: " << e.what() << '\n'; - } - ret = iio_device_attr_write(ad9361_phy, "in_voltage0_rf_port_select", rf_port_select_.c_str()); - if (ret) - { - throw std::runtime_error("Unable to set rf_port_select"); - } - wr_ch_lli(rx_chan1, "rf_bandwidth", bandwidth_); - if (!get_lo_chan(ctx, RX, &rx_chan1)) - { - return false; - } - wr_ch_lli(rx_chan1, "frequency", freq_); - } -#if LIBAD9361_VERSION_GREATER_THAN_01 - else if (filter_source_ == "Design") - { - ret = ad9361_set_bb_rate_custom_filter_manual( - ad9361_phy, sample_rate_, static_cast(Fpass_), static_cast(Fstop_), bandwidth_, bandwidth_); - if (ret) - { - throw std::runtime_error("Unable to set BB rate"); - } - ret = iio_device_attr_write(ad9361_phy, "in_voltage0_rf_port_select", rf_port_select_.c_str()); - if (ret) - { - throw std::runtime_error("Unable to set rf_port_select"); - } - wr_ch_lli(rx_chan1, "rf_bandwidth", bandwidth_); - if (!get_lo_chan(ctx, RX, &rx_chan1)) - { - return false; - } - wr_ch_lli(rx_chan1, "frequency", freq_); - } -#endif - else - { - throw std::runtime_error("Unknown filter configuration"); - } - - // Filters can only be disabled after the sample rate has been set - if (filter_source_ == "Off") - { - ret = ad9361_set_trx_fir_enable(ad9361_phy, false); - if (ret) - { - throw std::runtime_error("Unable to disable filters"); - } + return false; } std::cout << "* Enabling IIO streaming channels\n"; if (rx1_enable_) { - iio_channel_enable(rx_chan1); + iio_channel_enable(rx_chan0); } if (rx2_enable_) { - iio_channel_enable(rx_chan2); + iio_channel_enable(rx_chan1); } if (!rx1_enable_ and !rx2_enable_) { @@ -790,6 +666,7 @@ bool config_ad9361_lo_local(uint64_t bandwidth_, { // TX stream config std::cout << "Start of AD9361 TX Local Oscillator DDS configuration\n"; + struct iio_channel *tx_chan; struct stream_cfg txcfg; txcfg.bw_hz = bandwidth_; txcfg.fs_hz = sample_rate_; @@ -817,15 +694,23 @@ bool config_ad9361_lo_local(uint64_t bandwidth_, } std::cout << "* Configuring AD9361 for streaming TX\n"; - if (!cfg_ad9361_streaming_ch(ctx, &txcfg, TX, 0)) - { - std::cout << "TX port 0 not found\n"; - throw std::runtime_error("AD9361 IIO TX port 0 not found"); - } // ENABLE DDS on TX1 struct iio_device *ad9361_phy; ad9361_phy = iio_context_find_device(ctx, "ad9361-phy"); + + if (!get_ad9361_stream_ch(ctx, TX, ad9361_phy, 0, &tx_chan)) + { + std::cout << "TX channel 0 not found\n"; + throw std::runtime_error("TX channel 0 not found"); + } + + if (!cfg_ad9361_streaming_ch(ctx, &txcfg, TX, tx_chan)) + { + std::cout << "TX LO channel not found\n"; + throw std::runtime_error("TX LO channel not found"); + } + int ret; // set output amplifier attenuation ret = iio_device_attr_write_double(ad9361_phy, "out_voltage0_hardwaregain", -std::abs(tx_attenuation_db_)); @@ -932,6 +817,7 @@ bool config_ad9361_lo_remote(const std::string &remote_host, { // TX stream config std::cout << "Start of AD9361 TX Local Oscillator DDS configuration\n"; + struct iio_channel *tx_chan; struct stream_cfg txcfg; txcfg.bw_hz = bandwidth_; txcfg.fs_hz = sample_rate_; @@ -959,15 +845,22 @@ bool config_ad9361_lo_remote(const std::string &remote_host, } std::cout << "* Configuring AD9361 for streaming TX\n"; - if (!cfg_ad9361_streaming_ch(ctx, &txcfg, TX, 0)) - { - std::cout << "TX port 0 not found\n"; - throw std::runtime_error("AD9361 IIO TX port 0 not found"); - } // ENABLE DDS on TX1 struct iio_device *ad9361_phy; ad9361_phy = iio_context_find_device(ctx, "ad9361-phy"); + + if (!get_ad9361_stream_ch(ctx, TX, ad9361_phy, 0, &tx_chan)) + { + std::cout << "TX channel 0 not found\n"; + throw std::runtime_error("TX channel 0 not found"); + } + + if (!cfg_ad9361_streaming_ch(ctx, &txcfg, TX, tx_chan)) + { + std::cout << "TX LO channel not found\n"; + throw std::runtime_error("TX LO channel not found"); + } int ret; // set output amplifier attenuation ret = iio_device_attr_write_double(ad9361_phy, "out_voltage0_hardwaregain", -std::abs(tx_attenuation_db_)); @@ -1197,8 +1090,8 @@ bool disable_ad9361_rx_local() { struct iio_context *ctx; struct iio_device *rx; + struct iio_channel *rx_chan0; struct iio_channel *rx_chan1; - struct iio_channel *rx_chan2; ctx = iio_create_default_context(); if (!ctx) @@ -1219,20 +1112,20 @@ bool disable_ad9361_rx_local() return false; } - if (!get_ad9361_stream_ch(ctx, RX, rx, 0, &rx_chan1)) + if (!get_ad9361_stream_ch(ctx, RX, rx, 0, &rx_chan0)) { std::cout << "RX channel 1 not found when disabling RX channels\n"; return false; } - if (!get_ad9361_stream_ch(ctx, RX, rx, 1, &rx_chan2)) + if (!get_ad9361_stream_ch(ctx, RX, rx, 1, &rx_chan1)) { std::cout << "RX channel 2 not found when disabling RX channels\n"; return false; } + iio_channel_disable(rx_chan0); iio_channel_disable(rx_chan1); - iio_channel_disable(rx_chan2); iio_context_destroy(ctx); return true; } @@ -1242,8 +1135,8 @@ bool disable_ad9361_rx_remote(const std::string &remote_host) { struct iio_context *ctx; struct iio_device *rx; + struct iio_channel *rx_chan0; struct iio_channel *rx_chan1; - struct iio_channel *rx_chan2; ctx = iio_create_network_context(remote_host.c_str()); if (!ctx) @@ -1258,19 +1151,19 @@ bool disable_ad9361_rx_remote(const std::string &remote_host) return false; } - if (!get_ad9361_stream_ch(ctx, RX, rx, 0, &rx_chan1)) + if (!get_ad9361_stream_ch(ctx, RX, rx, 0, &rx_chan0)) { std::cout << "RX channel 1 not found at " << remote_host << " when disabling RX channels\n"; return false; } - if (!get_ad9361_stream_ch(ctx, RX, rx, 1, &rx_chan2)) + if (!get_ad9361_stream_ch(ctx, RX, rx, 1, &rx_chan1)) { std::cout << "RX channel 2 not found at " << remote_host << " when disabling RX channels\n"; return false; } + iio_channel_disable(rx_chan0); iio_channel_disable(rx_chan1); - iio_channel_disable(rx_chan2); iio_context_destroy(ctx); return true; } diff --git a/src/algorithms/signal_source/libs/ad9361_manager.h b/src/algorithms/signal_source/libs/ad9361_manager.h index 9ddbfbe80..2d93c2c57 100644 --- a/src/algorithms/signal_source/libs/ad9361_manager.h +++ b/src/algorithms/signal_source/libs/ad9361_manager.h @@ -84,7 +84,8 @@ bool cfg_ad9361_streaming_ch(struct iio_context *ctx, struct stream_cfg *cfg, en bool config_ad9361_rx_local(uint64_t bandwidth_, uint64_t sample_rate_, - uint64_t freq_, + uint64_t freq0_, + uint64_t freq1_, const std::string &rf_port_select_, bool rx1_enable_, bool rx2_enable_,