aboutsummaryrefslogtreecommitdiffstats
path: root/host
diff options
context:
space:
mode:
Diffstat (limited to 'host')
-rw-r--r--host/examples/fpgpio.cpp109
1 files changed, 76 insertions, 33 deletions
diff --git a/host/examples/fpgpio.cpp b/host/examples/fpgpio.cpp
index 151d5645d..c57893669 100644
--- a/host/examples/fpgpio.cpp
+++ b/host/examples/fpgpio.cpp
@@ -23,11 +23,11 @@
// FPGPIO[3] = ATR output 1 during full duplex
// FPGPIO[4] = output
// FPGPIO[5] = input
-// FPGPIO[6] = input
-// FPGPIO[7] = input
-// FPGPIO[8] = input
-// FPGPIO[9] = input
-// FPGPIO[10] = input
+// FPGPIO[6] = input (X series only)
+// FPGPIO[7] = input (X series only)
+// FPGPIO[8] = input (X series only)
+// FPGPIO[9] = input (X series only)
+// FPGPIO[10] = input (X series only)
// The example cycles through idle, TX, RX, and full duplex, spending 2 seconds for each.
// Outputs can be physically looped back to inputs for verification testing.
@@ -42,23 +42,28 @@
#include <csignal>
#include <iostream>
-#define FPGPIO_DEFAULT_CPU_FORMAT "fc32"
-#define FPGPIO_DEFAULT_OTW_FORMAT "sc16"
-#define FPGPIO_DEFAULT_RX_RATE 1e6
-#define FPGPIO_DEFAULT_TX_RATE 1e6
-#define FPGPIO_DEFAULT_DWELL_TIME 2.0
-#define FPGPIO_NUM_BITS 11
-#define FPGPIO_BIT(x) (1 << x)
+static const std::string FPGPIO_DEFAULT_CPU_FORMAT = "fc32";
+static const std::string FPGPIO_DEFAULT_OTW_FORMAT = "sc16";
+static const double FPGPIO_DEFAULT_RX_RATE = 500e3;
+static const double FPGPIO_DEFAULT_TX_RATE = 500e3;
+static const double FPGPIO_DEFAULT_DWELL_TIME = 2.0;
+static const std::string FPGPIO_DEFAULT_GPIO = "FP0";
+static const size_t FPGPIO_DEFAULT_NUM_BITS = 11;
+
+static UHD_INLINE boost::uint32_t FPGPIO_BIT(const size_t x)
+{
+ return (1 << x);
+}
namespace po = boost::program_options;
static bool stop_signal_called = false;
void sig_int_handler(int){stop_signal_called = true;}
-std::string to_bit_string(boost::uint16_t val)
+std::string to_bit_string(boost::uint32_t val, const size_t num_bits)
{
std::string out;
- for (int i = FPGPIO_NUM_BITS - 1; i >= 0; i--)
+ for (int i = num_bits - 1; i >= 0; i--)
{
std::string bit = ((val >> i) & 1) ? "1" : "0";
out += " ";
@@ -67,30 +72,66 @@ std::string to_bit_string(boost::uint16_t val)
return out;
}
-void output_reg_values(const std::string bank, const uhd::usrp::multi_usrp::sptr &usrp)
+void output_reg_values(
+ const std::string bank,
+ const uhd::usrp::multi_usrp::sptr &usrp,
+ const size_t num_bits)
{
std::cout << (boost::format("Bit "));
- for (int i = FPGPIO_NUM_BITS - 1; i >= 0; i--)
+ for (int i = num_bits - 1; i >= 0; i--)
std::cout << (boost::format(" %s%d") % (i < 10 ? " " : "") % i);
std::cout << std::endl;
- std::cout << "CTRL: " << to_bit_string(boost::uint16_t(usrp->get_gpio_attr(bank, std::string("CTRL")))) << std::endl;
- std::cout << "DDR: " << to_bit_string(boost::uint16_t(usrp->get_gpio_attr(bank, std::string("DDR")))) << std::endl;
- std::cout << "ATR_0X: " << to_bit_string(boost::uint16_t(usrp->get_gpio_attr(bank, std::string("ATR_0X")))) << std::endl;
- std::cout << "ATR_RX: " << to_bit_string(boost::uint16_t(usrp->get_gpio_attr(bank, std::string("ATR_RX")))) << std::endl;
- std::cout << "ATR_TX: " << to_bit_string(boost::uint16_t(usrp->get_gpio_attr(bank, std::string("ATR_TX")))) << std::endl;
- std::cout << "ATR_XX: " << to_bit_string(boost::uint16_t(usrp->get_gpio_attr(bank, std::string("ATR_XX")))) << std::endl;
- std::cout << "OUT: " << to_bit_string(boost::uint16_t(usrp->get_gpio_attr(bank, std::string("OUT")))) << std::endl;
- std::cout << "READBACK: " << to_bit_string(boost::uint16_t(usrp->get_gpio_attr(bank, std::string("READBACK")))) << std::endl;
+ std::cout << "CTRL: " << to_bit_string(
+ boost::uint32_t(usrp->get_gpio_attr(bank, std::string("CTRL"))),
+ num_bits)
+ << std::endl;
+
+ std::cout << "DDR: " << to_bit_string(
+ boost::uint32_t(usrp->get_gpio_attr(bank, std::string("DDR"))),
+ num_bits)
+ << std::endl;
+
+ std::cout << "ATR_0X: " << to_bit_string(
+ boost::uint32_t(usrp->get_gpio_attr(bank, std::string("ATR_0X"))),
+ num_bits)
+ << std::endl;
+
+ std::cout << "ATR_RX: " << to_bit_string(
+ boost::uint32_t(usrp->get_gpio_attr(bank, std::string("ATR_RX"))),
+ num_bits)
+ << std::endl;
+
+ std::cout << "ATR_TX: " << to_bit_string(
+ boost::uint32_t(usrp->get_gpio_attr(bank, std::string("ATR_TX"))),
+ num_bits)
+ << std::endl;
+
+ std::cout << "ATR_XX: " << to_bit_string(
+ boost::uint32_t(usrp->get_gpio_attr(bank, std::string("ATR_XX"))),
+ num_bits)
+ << std::endl;
+
+ std::cout << "OUT: " << to_bit_string(
+ boost::uint32_t(usrp->get_gpio_attr(bank, std::string("OUT"))),
+ num_bits)
+ << std::endl;
+
+ std::cout << "READBACK: " << to_bit_string(
+ boost::uint32_t(usrp->get_gpio_attr(bank, std::string("READBACK"))),
+ num_bits)
+ << std::endl;
}
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char *argv[])
+{
uhd::set_thread_priority_safe();
//variables to be set by po
std::string args;
std::string cpu, otw;
double rx_rate, tx_rate, dwell;
- const std::string fpgpio = "FP0";
+ std::string fpgpio;
+ size_t num_bits;
//setup the program options
po::options_description desc("Allowed options");
@@ -103,6 +144,8 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
("rx_rate", po::value<double>(&rx_rate)->default_value(FPGPIO_DEFAULT_RX_RATE), "rx sample rate")
("tx_rate", po::value<double>(&tx_rate)->default_value(FPGPIO_DEFAULT_TX_RATE), "tx sample rate")
("dwell", po::value<double>(&dwell)->default_value(FPGPIO_DEFAULT_DWELL_TIME), "dwell time in seconds for each test case")
+ ("gpio", po::value<std::string>(&fpgpio)->default_value(FPGPIO_DEFAULT_GPIO), "name of gpio bank")
+ ("bits", po::value<size_t>(&num_bits)->default_value(FPGPIO_DEFAULT_NUM_BITS), "number of bits in gpio bank")
;
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
@@ -122,7 +165,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
//print out initial unconfigured state of FP GPIO
std::cout << "Unconfigured GPIO values:" << std::endl;
- output_reg_values(fpgpio, usrp);
+ output_reg_values(fpgpio, usrp, num_bits);
//configure GPIO registers
boost::uint32_t ctrl = 0; // default all as manual
@@ -171,7 +214,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
//print out initial state of FP GPIO
std::cout << "\nConfigured GPIO values:" << std::endl;
- output_reg_values(fpgpio, usrp);
+ output_reg_values(fpgpio, usrp, num_bits);
std::cout << std::endl;
//set up streams
@@ -220,7 +263,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
else
std::cout << "fail" << std::endl;
std::cout << std::endl;
- output_reg_values(fpgpio, usrp);
+ output_reg_values(fpgpio, usrp, num_bits);
usrp->set_gpio_attr(fpgpio, std::string("DDR"), ddr, mask);
while (not stop_signal_called)
@@ -252,7 +295,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
std::cout << "pass" << std::endl;
}
std::cout << std::endl;
- output_reg_values(fpgpio, usrp);
+ output_reg_values(fpgpio, usrp, num_bits);
usrp->set_gpio_attr(fpgpio, "OUT", 0, FPGPIO_BIT(4));
if (stop_signal_called)
break;
@@ -279,7 +322,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
std::cout << "pass" << std::endl;
}
std::cout << std::endl;
- output_reg_values(fpgpio, usrp);
+ output_reg_values(fpgpio, 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 {
@@ -311,7 +354,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
std::cout << "pass" << std::endl;
}
std::cout << std::endl;
- output_reg_values(fpgpio, usrp);
+ output_reg_values(fpgpio, usrp, num_bits);
tx_md.end_of_burst = true;
try {
tx_stream->send(tx_buffs, nsamps_per_buff, tx_md, timeout);
@@ -345,7 +388,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
std::cout << "pass" << std::endl;
}
std::cout << std::endl;
- output_reg_values(fpgpio, usrp);
+ output_reg_values(fpgpio, usrp, num_bits);
rx_stream->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS);
tx_md.end_of_burst = true;
try {