aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/utils
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/utils')
-rw-r--r--host/lib/utils/CMakeLists.txt1
-rw-r--r--host/lib/utils/compat_check.cpp114
2 files changed, 115 insertions, 0 deletions
diff --git a/host/lib/utils/CMakeLists.txt b/host/lib/utils/CMakeLists.txt
index afaf99274..c7de9fbf8 100644
--- a/host/lib/utils/CMakeLists.txt
+++ b/host/lib/utils/CMakeLists.txt
@@ -160,6 +160,7 @@ SET_SOURCE_FILES_PROPERTIES(
LIBUHD_APPEND_SOURCES(
${CMAKE_CURRENT_SOURCE_DIR}/csv.cpp
${CMAKE_CURRENT_SOURCE_DIR}/config_parser.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/compat_check.cpp
${CMAKE_CURRENT_SOURCE_DIR}/eeprom_utils.cpp
${CMAKE_CURRENT_SOURCE_DIR}/gain_group.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ihex.cpp
diff --git a/host/lib/utils/compat_check.cpp b/host/lib/utils/compat_check.cpp
new file mode 100644
index 000000000..aebf6e6bf
--- /dev/null
+++ b/host/lib/utils/compat_check.cpp
@@ -0,0 +1,114 @@
+//
+// Copyright 2018 Ettus Research, a National Instruments Company
+//
+// SPDX-License-Identifier: GPL-3.0
+//
+
+#include <uhd/exception.hpp>
+#include <uhd/utils/log.hpp>
+#include <uhdlib/utils/compat_check.hpp>
+#include <boost/format.hpp>
+
+void uhd::assert_fpga_compat(
+ const size_t uhd_major,
+ const size_t uhd_minor,
+ const uint64_t fpga_compat,
+ const std::string& fpga_component,
+ const std::string& log_component,
+ const bool fail_on_minor_behind
+) {
+ const size_t fpga_major = fpga_compat >> 32;
+ const size_t fpga_minor = fpga_compat & 0xFFFFFFFF;
+
+ if (!log_component.empty()) {
+ UHD_LOGGER_DEBUG(log_component)
+ << "Checking compat number for FPGA component `" << fpga_component
+ << "': Expecting " << uhd_major << "." << uhd_minor << ", actual: "
+ << fpga_major << "." << fpga_minor << "."
+ ;
+ }
+
+ if (uhd_major > fpga_major) {
+ if (!log_component.empty()) {
+ UHD_LOGGER_ERROR(log_component)
+ << "Major compat number mismatch for " << fpga_component << ":"
+ " Expecting " << uhd_major << ", got " << fpga_major << "."
+ ;
+ }
+ throw uhd::runtime_error(str(
+ boost::format("FPGA component `%s' is revision %d and UHD supports"
+ " revision %d. Please either upgrade the FPGA"
+ " image (recommended) or downgrade UHD.")
+ % fpga_component
+ % fpga_major
+ % uhd_major
+ ));
+ }
+ if (uhd_major < fpga_major) {
+ if (!log_component.empty()) {
+ UHD_LOGGER_ERROR(log_component)
+ << "Major compat number mismatch for " << fpga_component << ":"
+ " Expecting " << uhd_major << ", got " << fpga_major << "."
+ ;
+ }
+ throw uhd::runtime_error(str(
+ boost::format("FPGA component `%s' is revision %d and UHD supports"
+ " revision %d. Please either upgrade UHD "
+ " (recommended) or downgrade the FPGA image.")
+ % fpga_component
+ % fpga_major
+ % uhd_major
+ ));
+
+ }
+ if (uhd_minor > fpga_minor) {
+ if (fail_on_minor_behind) {
+ if (!log_component.empty()) {
+ UHD_LOGGER_ERROR(log_component) << str(
+ boost::format("Minor compat number mismatch for `%s':"
+ " Expecting %d.%d, got %d.%d.")
+ % fpga_component
+ % uhd_major
+ % uhd_minor
+ % fpga_major
+ % fpga_minor
+ );
+ }
+ throw uhd::runtime_error(str(
+ boost::format("FPGA component `%s' is revision %d.%d and UHD supports"
+ " revision %d.%d. Please either upgrade UHD "
+ " (recommended) or downgrade the FPGA image.")
+ % fpga_component
+ % fpga_major
+ % fpga_minor
+ % uhd_major
+ % uhd_minor
+ ));
+ } else {
+ if (!log_component.empty()) {
+ UHD_LOGGER_WARNING(log_component) << str(
+ boost::format("Non-critical minor compat number mismatch "
+ "for `%s': Expecting %d.%d, got %d.%d.")
+ % fpga_component
+ % uhd_major
+ % uhd_minor
+ % fpga_major
+ % fpga_minor
+ );
+ }
+ }
+ } else if (uhd_minor < fpga_minor) {
+ if (!log_component.empty()) {
+ UHD_LOGGER_WARNING(log_component) << str(
+ boost::format("Non-critical minor compat number mismatch "
+ "for `%s': Expecting %d.%d, got %d.%d.")
+ % fpga_component
+ % uhd_major
+ % uhd_minor
+ % fpga_major
+ % fpga_minor
+ );
+ }
+ }
+ // We got here? Then all is good.
+}