aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGrant Meyerhoff <grant.meyerhoff@ni.com>2021-08-19 14:26:35 -0500
committerAaron Rossetto <aaron.rossetto@ni.com>2021-09-02 13:34:02 -0500
commit18de8c32716f04fb394822921a1482aa64a0b87d (patch)
tree87b6223857474ade95188b04d16dc060e1542d01
parent570b4c6ab30be081a0119a2bf2f1d8ee7fb7f5b9 (diff)
downloaduhd-18de8c32716f04fb394822921a1482aa64a0b87d.tar.gz
uhd-18de8c32716f04fb394822921a1482aa64a0b87d.tar.bz2
uhd-18de8c32716f04fb394822921a1482aa64a0b87d.zip
mpmd: Add discoverable feature for trig i/o mode
-rw-r--r--host/include/uhd/features/discoverable_feature.hpp1
-rw-r--r--host/include/uhd/features/trig_io_mode_iface.hpp40
-rw-r--r--host/include/uhd/types/trig_io_mode.hpp20
-rw-r--r--host/lib/include/uhdlib/usrp/common/mpmd_mb_controller.hpp17
-rw-r--r--host/lib/usrp/mpmd/mpmd_mb_controller.cpp27
-rw-r--r--mpm/python/usrp_mpm/periph_manager/x4xx.py2
6 files changed, 105 insertions, 2 deletions
diff --git a/host/include/uhd/features/discoverable_feature.hpp b/host/include/uhd/features/discoverable_feature.hpp
index 8cbe8e13f..b1a03eaea 100644
--- a/host/include/uhd/features/discoverable_feature.hpp
+++ b/host/include/uhd/features/discoverable_feature.hpp
@@ -34,6 +34,7 @@ public:
FPGA_LOAD_NOTIFICATION,
ADC_SELF_CALIBRATION,
REF_CLK_CALIBRATION,
+ TRIG_IO_MODE,
};
virtual ~discoverable_feature() = default;
diff --git a/host/include/uhd/features/trig_io_mode_iface.hpp b/host/include/uhd/features/trig_io_mode_iface.hpp
new file mode 100644
index 000000000..53b0ff19f
--- /dev/null
+++ b/host/include/uhd/features/trig_io_mode_iface.hpp
@@ -0,0 +1,40 @@
+//
+// Copyright 2021 Ettus Research, a National Instruments Brand
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+
+#pragma once
+
+#include <uhd/features/discoverable_feature.hpp>
+#include <uhd/types/trig_io_mode.hpp>
+#include <memory>
+#include <string>
+
+namespace uhd { namespace features {
+
+/*! Interface to provide access to set the mode of the Trig In/Out port.
+ * Currently, only the X4xx series of devices supports this.
+ */
+class trig_io_mode_iface : public discoverable_feature
+{
+public:
+ using sptr = std::shared_ptr<trig_io_mode_iface>;
+
+ static discoverable_feature::feature_id_t get_feature_id()
+ {
+ return discoverable_feature::TRIG_IO_MODE;
+ }
+
+ std::string get_feature_name() const
+ {
+ return "Trig IO Mode";
+ }
+
+ virtual ~trig_io_mode_iface() = default;
+
+ //! Set the mode for the trig i/o port
+ virtual void set_trig_io_mode(const uhd::trig_io_mode_t mode) = 0;
+};
+
+}} // namespace uhd::features
diff --git a/host/include/uhd/types/trig_io_mode.hpp b/host/include/uhd/types/trig_io_mode.hpp
new file mode 100644
index 000000000..13053e926
--- /dev/null
+++ b/host/include/uhd/types/trig_io_mode.hpp
@@ -0,0 +1,20 @@
+//
+// Copyright 2021 Ettus Research, a National Instruments Brand
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+
+#pragma once
+
+namespace uhd {
+
+enum class trig_io_mode_t {
+ //! Output PPS signal from port
+ PPS_OUTPUT,
+ //! Use port as input
+ INPUT,
+ //! Port is turned off
+ OFF
+};
+
+} // namespace uhd
diff --git a/host/lib/include/uhdlib/usrp/common/mpmd_mb_controller.hpp b/host/lib/include/uhdlib/usrp/common/mpmd_mb_controller.hpp
index e7498b9f5..2d751a4e5 100644
--- a/host/lib/include/uhdlib/usrp/common/mpmd_mb_controller.hpp
+++ b/host/lib/include/uhdlib/usrp/common/mpmd_mb_controller.hpp
@@ -7,10 +7,11 @@
#pragma once
#include <uhd/features/ref_clk_calibration_iface.hpp>
+#include <uhd/features/trig_io_mode_iface.hpp>
#include <uhd/rfnoc/mb_controller.hpp>
-#include <uhdlib/usrp/common/rpc.hpp>
#include <uhdlib/features/discoverable_feature_registry.hpp>
#include <uhdlib/features/fpga_load_notification_iface.hpp>
+#include <uhdlib/usrp/common/rpc.hpp>
#include <uhdlib/utils/rpc.hpp>
#include <memory>
@@ -155,8 +156,22 @@ public:
uhd::usrp::mpmd_rpc_iface::sptr _rpcc;
};
+ class trig_io_mode : public uhd::features::trig_io_mode_iface
+ {
+ public:
+ using sptr = std::shared_ptr<trig_io_mode>;
+
+ trig_io_mode(uhd::usrp::mpmd_rpc_iface::sptr rpcc);
+
+ void set_trig_io_mode(const uhd::trig_io_mode_t mode) override;
+
+ private:
+ uhd::usrp::mpmd_rpc_iface::sptr _rpcc;
+ };
+
fpga_onload::sptr _fpga_onload;
ref_clk_calibration::sptr _ref_clk_cal;
+ trig_io_mode::sptr _trig_io_mode;
};
}} // namespace uhd::rfnoc
diff --git a/host/lib/usrp/mpmd/mpmd_mb_controller.cpp b/host/lib/usrp/mpmd/mpmd_mb_controller.cpp
index 665a38152..b79abcee0 100644
--- a/host/lib/usrp/mpmd/mpmd_mb_controller.cpp
+++ b/host/lib/usrp/mpmd/mpmd_mb_controller.cpp
@@ -52,6 +52,28 @@ void mpmd_mb_controller::ref_clk_calibration::store_ref_clk_tuning_word(uint32_t
_rpcc->store_ref_clk_tuning_word(tuning_word);
}
+mpmd_mb_controller::trig_io_mode::trig_io_mode(uhd::usrp::mpmd_rpc_iface::sptr rpcc)
+ : _rpcc(rpcc)
+{
+}
+
+void mpmd_mb_controller::trig_io_mode::set_trig_io_mode(const uhd::trig_io_mode_t mode)
+{
+ switch (mode) {
+ case uhd::trig_io_mode_t::PPS_OUTPUT:
+ _rpcc->set_trigger_io("pps_output");
+ break;
+ case uhd::trig_io_mode_t::INPUT:
+ _rpcc->set_trigger_io("input");
+ break;
+ case uhd::trig_io_mode_t::OFF:
+ _rpcc->set_trigger_io("off");
+ break;
+ default:
+ throw uhd::value_error("set_trig_io_mode: Requested mode is invalid.");
+ }
+}
+
mpmd_mb_controller::mpmd_mb_controller(
uhd::usrp::mpmd_rpc_iface::sptr rpcc, uhd::device_addr_t device_info)
: _rpc(rpcc), _device_info(device_info)
@@ -79,6 +101,11 @@ mpmd_mb_controller::mpmd_mb_controller(
_ref_clk_cal = std::make_shared<ref_clk_calibration>(_rpc);
register_feature(_ref_clk_cal);
}
+
+ if (_rpc->supports_feature("trig_io_mode")) {
+ _trig_io_mode = std::make_shared<trig_io_mode>(_rpc);
+ register_feature(_trig_io_mode);
+ }
}
/******************************************************************************
diff --git a/mpm/python/usrp_mpm/periph_manager/x4xx.py b/mpm/python/usrp_mpm/periph_manager/x4xx.py
index e0adcd47a..a9db6f510 100644
--- a/mpm/python/usrp_mpm/periph_manager/x4xx.py
+++ b/mpm/python/usrp_mpm/periph_manager/x4xx.py
@@ -214,7 +214,7 @@ class x4xx(ZynqComponents, PeriphManagerBase):
'reset': False,
},
}
- discoverable_features = ["ref_clk_calibration", "time_export"]
+ discoverable_features = ["ref_clk_calibration", "time_export", "trig_io_mode"]
#
# End of overridables from PeriphManagerBase
###########################################################################