diff options
-rw-r--r-- | host/examples/gpio.cpp | 209 |
1 files changed, 117 insertions, 92 deletions
diff --git a/host/examples/gpio.cpp b/host/examples/gpio.cpp index 962e97450..12bcd26f7 100644 --- a/host/examples/gpio.cpp +++ b/host/examples/gpio.cpp @@ -225,7 +225,7 @@ int UHD_SAFE_MAIN(int argc, char* argv[]) % usrp->get_tx_subdev_spec(0).to_string() << std::endl; - // print out initial unconfigured state of FP GPIO + // print out initial unconfigured state of GPIO std::cout << "Initial GPIO values:" << std::endl; output_reg_values(gpio, usrp, num_bits); @@ -297,25 +297,35 @@ int UHD_SAFE_MAIN(int argc, char* argv[]) // set up streams uhd::stream_args_t rx_args(cpu, otw); uhd::stream_args_t tx_args(cpu, otw); - uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(rx_args); - uhd::tx_streamer::sptr tx_stream = usrp->get_tx_stream(tx_args); + uhd::rx_streamer::sptr rx_stream; + uhd::tx_streamer::sptr tx_stream; uhd::stream_cmd_t rx_cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS); rx_cmd.stream_now = true; - usrp->set_rx_rate(rx_rate); - usrp->set_tx_rate(tx_rate); + if (usrp->get_rx_num_channels()) { + rx_stream = usrp->get_rx_stream(rx_args); + usrp->set_rx_rate(rx_rate); + } + if (usrp->get_tx_num_channels()) { + tx_stream = usrp->get_tx_stream(tx_args); + usrp->set_tx_rate(tx_rate); + } // set up buffers for tx and rx - const size_t max_samps_per_packet = rx_stream->get_max_num_samps(); - const size_t nsamps_per_buff = max_samps_per_packet; - std::vector<char> rx_buff( - max_samps_per_packet * uhd::convert::get_bytes_per_item(cpu)); - std::vector<char> tx_buff( - max_samps_per_packet * uhd::convert::get_bytes_per_item(cpu)); + const size_t rx_spp = rx_stream ? rx_stream->get_max_num_samps() : 0; + const size_t tx_spp = tx_stream ? tx_stream->get_max_num_samps() : 0; + const size_t nsamps_per_buff = std::max(rx_spp, tx_spp); + std::vector<char> rx_buff(nsamps_per_buff * uhd::convert::get_bytes_per_item(cpu)); + std::vector<char> tx_buff(nsamps_per_buff * uhd::convert::get_bytes_per_item(cpu)); std::vector<void*> rx_buffs, tx_buffs; - for (size_t ch = 0; ch < rx_stream->get_num_channels(); ch++) - rx_buffs.push_back(&rx_buff.front()); // same buffer for each channel - for (size_t ch = 0; ch < tx_stream->get_num_channels(); ch++) - tx_buffs.push_back(&tx_buff.front()); // same buffer for each channel + if (rx_stream) { + for (size_t ch = 0; ch < rx_stream->get_num_channels(); ch++) { + rx_buffs.push_back(&rx_buff.front()); // same buffer for each channel + } + } + if (tx_stream) { + for (size_t ch = 0; ch < tx_stream->get_num_channels(); ch++) + tx_buffs.push_back(&tx_buff.front()); // same buffer for each channel + } uhd::rx_metadata_t rx_md; uhd::tx_metadata_t tx_md; @@ -391,104 +401,119 @@ int UHD_SAFE_MAIN(int argc, char* argv[]) if (stop_signal_called) break; - // test ATR RX by receiving for 1 second - std::cout << "\nTesting ATR RX output..." << std::flush; - rx_cmd.stream_mode = uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS; - rx_stream->issue_stream_cmd(rx_cmd); - stop_time = std::chrono::steady_clock::now() + dwell_time; - while ( - not stop_signal_called and std::chrono::steady_clock::now() < stop_time) { + if (rx_stream) { + // test ATR RX by receiving for 1 second + std::cout << "\nTesting ATR RX output..." << std::flush; + rx_cmd.stream_mode = uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS; + rx_stream->issue_stream_cmd(rx_cmd); + stop_time = std::chrono::steady_clock::now() + dwell_time; + while (not stop_signal_called + and std::chrono::steady_clock::now() < stop_time) { + try { + rx_stream->recv(rx_buffs, nsamps_per_buff, rx_md, timeout); + } catch (...) { + } + } + rb = usrp->get_gpio_attr(gpio, "READBACK"); + expected = GPIO_BIT(1); + if ((rb & expected) != expected) { + ++failures; + std::cout << "fail:" << std::endl; + std::cout << "Bit 1 should be set, but is not" << std::endl; + } else { + std::cout << "pass:" << std::endl; + } + output_reg_values(gpio, usrp, num_bits); + rx_stream->issue_stream_cmd( + uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS); + // clear out any data left in the rx stream try { rx_stream->recv(rx_buffs, nsamps_per_buff, rx_md, timeout); } catch (...) { } } - rb = usrp->get_gpio_attr(gpio, "READBACK"); - expected = GPIO_BIT(1); - if ((rb & expected) != expected) { - ++failures; - std::cout << "fail:" << std::endl; - std::cout << "Bit 1 should be set, but is not" << std::endl; - } else { - std::cout << "pass:" << std::endl; - } - output_reg_values(gpio, usrp, num_bits); - rx_stream->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS); - // clear out any data left in the rx stream - try { - rx_stream->recv(rx_buffs, nsamps_per_buff, rx_md, timeout); - } catch (...) { - } if (stop_signal_called) break; - // test ATR TX by transmitting for 1 second - std::cout << "\nTesting ATR TX output..." << std::flush; - stop_time = std::chrono::steady_clock::now() + dwell_time; - tx_md.start_of_burst = true; - tx_md.end_of_burst = false; - while ( - not stop_signal_called and std::chrono::steady_clock::now() < stop_time) { + if (tx_stream) { + // test ATR TX by transmitting for 1 second + std::cout << "\nTesting ATR TX output..." << std::flush; + stop_time = std::chrono::steady_clock::now() + dwell_time; + tx_md.start_of_burst = true; + tx_md.end_of_burst = false; + while (not stop_signal_called + and std::chrono::steady_clock::now() < stop_time) { + try { + tx_stream->send(tx_buffs, nsamps_per_buff, tx_md, timeout); + tx_md.start_of_burst = false; + } catch (...) { + } + } + rb = usrp->get_gpio_attr(gpio, "READBACK"); + expected = GPIO_BIT(2); + if ((rb & expected) != expected) { + ++failures; + std::cout << "fail:" << std::endl; + std::cout << "Bit 2 should be set, but is not" << std::endl; + } else { + std::cout << "pass:" << std::endl; + } + output_reg_values(gpio, usrp, num_bits); + tx_md.end_of_burst = true; try { tx_stream->send(tx_buffs, nsamps_per_buff, tx_md, timeout); - tx_md.start_of_burst = false; } catch (...) { } } - rb = usrp->get_gpio_attr(gpio, "READBACK"); - expected = GPIO_BIT(2); - if ((rb & expected) != expected) { - ++failures; - std::cout << "fail:" << std::endl; - std::cout << "Bit 2 should be set, but is not" << std::endl; - } else { - std::cout << "pass:" << std::endl; - } - output_reg_values(gpio, usrp, num_bits); - tx_md.end_of_burst = true; - try { - tx_stream->send(tx_buffs, nsamps_per_buff, tx_md, timeout); - } catch (...) { - } if (stop_signal_called) break; - // test ATR RX by transmitting and receiving for 1 second - std::cout << "\nTesting ATR full duplex output..." << std::flush; - rx_cmd.stream_mode = uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS; - rx_stream->issue_stream_cmd(rx_cmd); - tx_md.start_of_burst = true; - tx_md.end_of_burst = false; - stop_time = std::chrono::steady_clock::now() + dwell_time; - while ( - not stop_signal_called and std::chrono::steady_clock::now() < stop_time) { + if (rx_stream and tx_stream) { + // test ATR full duplex by transmitting and receiving + std::cout << "\nTesting ATR full duplex output..." << std::flush; + rx_cmd.stream_mode = uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS; + rx_stream->issue_stream_cmd(rx_cmd); + tx_md.start_of_burst = true; + tx_md.end_of_burst = false; + stop_time = std::chrono::steady_clock::now() + dwell_time; + while (not stop_signal_called + and std::chrono::steady_clock::now() < stop_time) { + try { + tx_stream->send(tx_buffs, nsamps_per_buff, tx_md, timeout); + tx_md.start_of_burst = false; + rx_stream->recv(rx_buffs, nsamps_per_buff, rx_md, timeout); + } catch (...) { + } + } + + // Read GPIO + rb = usrp->get_gpio_attr(gpio, "READBACK"); + + // Stop streaming + rx_stream->issue_stream_cmd( + uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS); + tx_md.end_of_burst = true; try { tx_stream->send(tx_buffs, nsamps_per_buff, tx_md, timeout); - tx_md.start_of_burst = false; + } catch (...) { + } + + // clear out any data left in the rx stream + try { rx_stream->recv(rx_buffs, nsamps_per_buff, rx_md, timeout); } catch (...) { } - } - rb = usrp->get_gpio_attr(gpio, "READBACK"); - expected = GPIO_BIT(3); - if ((rb & expected) != expected) { - ++failures; - std::cout << "fail:" << std::endl; - std::cout << "Bit 3 should be set, but is not" << std::endl; - } else { - std::cout << "pass:" << std::endl; - } - output_reg_values(gpio, usrp, num_bits); - rx_stream->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS); - tx_md.end_of_burst = true; - try { - tx_stream->send(tx_buffs, nsamps_per_buff, tx_md, timeout); - } catch (...) { - } - // clear out any data left in the rx stream - try { - rx_stream->recv(rx_buffs, nsamps_per_buff, rx_md, timeout); - } catch (...) { + + // Analyze results + expected = GPIO_BIT(3); + if ((rb & expected) != expected) { + ++failures; + std::cout << "fail:" << std::endl; + std::cout << "Bit 3 should be set, but is not" << std::endl; + } else { + std::cout << "pass:" << std::endl; + } + output_reg_values(gpio, usrp, num_bits); } std::cout << std::endl; |