usrp-users@lists.ettus.com

Discussion and technical support related to USRP, UHD, RFNoC

View all threads

[UHD] Announcing UHD 4.10.0.0 Release Candidate 1

MK
marian.koop@emerson.com
Tue, Apr 7, 2026 10:38 PM

The first release candidate of UHD 4.10.0.0 is available for testing.
This release includes support for USRP X420 and the addition of timed complex
gain feature to RFNoC radio blocks. For a complete list
of new features, updates and bug fixes see the CHANGELOG (see also below).

Tag for the UHD release candidate:
https://github.com/EttusResearch/uhd/releases/tag/v4.10.0.0-rc1

Tag for the file system release candidate:
https://github.com/EttusResearch/meta-ettus/releases/tag/v4.10.0.0-rc1

Known Issues:

  • The utilities uhd_images_downloader and usrp_update_fs fail to locate the filesystem images.
    Users must manually download the file system images from:
    https://files.ettus.com/binaries/cache/<usrp family>/meta-ettus-v4.10.0.0-rc1
    where <usrp family> is one of: e3xx, n3xx, or x4xx.

Thanks,

Marian

CHANGELOG:

004.010.000.000

  • Highlights / Main Changes

    • Support for USRP X420

    • Addition of timed complex gain feature, which allows setting a complex gain
      value to fix phase and amplitude of signals from radio blocks

  • New Features

    • CMake:

      • Create UHD::uhd package for improved integration in downstream build
        processes. The init_usrp example is used to showcase this feature.

      • Improved options for RFNoC OOT modules to write unit tests.

    • Add helper routines to up- and download data (reliably) from and to the
      DRAM block

    • X310: Allow daughterboards to set dboard clock rate

    • Improve finding of MPM-based devices by making parts of the find call
      asynchronous and allowing to skip reachability checks.

    • RFNoC:

      • Added new optional feature to all Radio blocks - Timed complex gain:

        • Allows specifying complex gain coefficients to be applied to all
          TX and/or RX samples of a radio channel at the specified time.

        • Enabled by default for all TX and RX channels of the radio blocks,
          but can be disabled at FPGA build time via the EN_COMP_GAIN_TX
          and EN_COMP_GAIN_RX parameters of the radio blocks.

        • NOTE: For the x440_X4_400 default FPGA design provided with UHD,
          enabling this feature for all 8 RX and TX channels necessitated
          restricting the existing crossbar connections between the replay
          blocks and the radio blocks. As a result, only blocks with the same
          indices can be connected (e.g. replay0<->radio0 and replay1<->radio1
          only) when using this pre-built USRP FPGA image.

      • Blocks may now drive the front-panel GPIO pins on all RFNoC-capable
        devices. New IO signatures are added, and all device BSPs have IO ports
        for accessing the GPIOs. Device controls are updated such that the user
        can choose the source for GPIOs dynamically in this case (i.e., the
        radio blocks and other GPIO sources are still available). In some cases,
        the device BSP HDL had to be significantly refactored.

      • Add names and descriptions for block's and module's YAML files, so that
        other tools may read information about those in an automated fashion

      • Allow mtu stream argument, which overrides the MTU value that is
        derived from the link information.

      • Action handling is now moved to its own thread (there is one action
        handling thread per graph). This allows actions to be handled
        asynchronously, e.g., when triggering actions from async message handlers.

      • Add radio_state IO signature, so that other blocks can monitor the ATR
        state of radio blocks.

      • All RFNoC devices can now take an mtu stream argument (which overrides
        the detected link MTU) and a force_mtu device argument (which skips
        automatic MTU detection and forces a fixed value). These are helpful in
        scenarios where a specific network topology interferes with path MTU
        discovery, and for remote streaming when the MTU for a remote stream link
        cannot be inferred from UHD.

      • rfnoc_modtool has improved support for generating unit tests.

      • Add PPS IO signature for all targets

      • Add stream command to start receiving when a transmit occurs

      • Null source/sink: Add finite mode.

      • Add UX1/UX2/UX4 QSFP configurations for X4xx

  • API Changes

    • meta_range_t and uhd::dict can now be initialized from initializer lists

    • Add rfnoc_graph::get_chdr_xport_adapters()

    • Python API now allows creating SubdevSpec from a string

    • Some public APIs that used boost::optional now also work with std::optional

    • Unit tests for RFNoC blocks (in-tree and out-of-tree) no longer require a
      dummy implementation of ~make_args_t()

    • uhd::cast::to_str() was added and uhd::cast::from_str() was extended to
      be a full replacement for boost::lexical_cast

  • Examples

    • Overhauled many of the examples to improve documentation, as well as some
      minor conveniences or bug fixes

    • Added continuous streaming to tx_samples_from_file

    • Improved gpio example.

  • Bug Fixes

    • Fix static UHD library builds

    • Fix compatibility with Boost 1.89

    • RFNoC:

      • Fix slicing notation in rfnoc_image_builder

      • Fix building of GRC files with empty default target (this would affect
        builds of X410 and X440 device bitfiles from GNU Radio)

      • Fix installation of OOT modules in Python venvs

      • Fix time alignment of first sample

      • Unit tests in RFNoC OOT modules now preload their DLLs to ensure the
        correct library version is loaded

      • Fix generation of GNU Radio C++ block controllers

      • rfnoc_modtool: Fix creation of spurious unit tests, fix package_data for
        Python module installation

      • rfnoc_modtool: Fix connection check for invalid ports

      • Fix alignment of first sample coming from radio block.

      • Fix bug in ctrlport_endpoint which could cause the software to believe
        the associated RFNoC block's command FIFO was full when packets were lost

      • Add parameter to skip waiting for ACKs in async messages

    • E31x: Fix GPIO control

    • E3xx/B2xx: Fix rounding bug for RF PLL tuning

    • B2xx: Fix image loading via b200_image_loader when multiple devices are
      attached

    • X410: Fix tuning when power calibration and non-default gain profiles are
      used.

    • Power calibration tools: Fix settings for E320, allow non-default sampling
      rate, other minor fixes

    • FPGA

      • Fix various simulation-related bugs
    • USRP Simulator: Update to match current UHD.

    • multi_usrp:

      • Improved bank name check in multi_usrp::{set,get}_gpio_attr()
    • CMake:

      • Allow absolute paths for install dirs in pkg-config

      • Fix target include path for Python module

    • USRP1: Fix converter name in property tree

    • FPGA:

      • Fix various simulation/testbench issues.

      • Improve resource utilization in various places.

    • MPM:

      • Fix file descriptor leaks by using with/open everywhere.

      • Fix double-free issue in rpclib.

      • Remove tolerance for non-existing EEPROMs.

    • Examples: Properly report errors when opening a file failed.

    • Python: When installing into venvs, no longer force a reinstallation of
      dependencies.

  • Dependencies changes

    • Increase minimum required versions

      • Boost to 1.71

      • DPDK to 19.11

      • Changed minimum CMake versions for various non-UHD projects, e.g.
        firmware builds, to stay compatible with CMake 4

  • Documentation

    • Restructured the UHD manual, improved chapter structure, improved getting
      started content, added RFNoC specification.

    • Fixed some external links

    • Many smaller improvements (typos, duplicate entries removed, formatting,
      etc.)

  • Codebase Management

    • Increased C++ version to 20 for UHD library, examples, and utilities

    • Removed Boost in multiple locations and replaced with standard library
      calls

    • Fix numerous (mostly harmless) compiler and Doxygen warnings

    • Improve CMake linking instructions

  • Validated OS Environments
    (Versions for build and runtime dependencies can be determined from the
    docker container definitions in the UHD repository at .ci/docker/...)

    • Linux:

      • Ubuntu: jammy (22.04), noble (24.04), questing (25.10)

      • Fedora: 40, 41, 42

    • Windows: 10 22H2, 11 24H2

    • MacOS: Sequoia (15.6)

The first release candidate of UHD 4.10.0.0 is available for testing.\ This release includes support for USRP X420 and the addition of timed complex \ gain feature to RFNoC radio blocks. For a complete list\ of new features, updates and bug fixes see the CHANGELOG (see also below). Tag for the UHD release candidate:\ [https://github.com/EttusResearch/uhd/releases/tag/v4.10.0.0-rc1](https://github.com/EttusResearch/uhd/releases/tag/v4.7.0.0-rc1) Tag for the file system release candidate:\ [https://github.com/EttusResearch/meta-ettus/releases/tag/v4.10.0.0-rc1](https://github.com/EttusResearch/meta-ettus/releases/tag/v4.7.0.0-rc1) Known Issues: * The utilities uhd_images_downloader and usrp_update_fs fail to locate the filesystem images.\ Users must manually download the file system images from:\ <https://files.ettus.com/binaries/cache/><usrp family>/meta-ettus-v4.10.0.0-rc1\ where <usrp family> is one of: e3xx, n3xx, or x4xx. Thanks, Marian CHANGELOG: ### 004.010.000.000 * Highlights / Main Changes * Support for USRP X420 * Addition of timed complex gain feature, which allows setting a complex gain\ value to fix phase and amplitude of signals from radio blocks * New Features * CMake: * Create UHD::uhd package for improved integration in downstream build\ processes. The init_usrp example is used to showcase this feature. * Improved options for RFNoC OOT modules to write unit tests. * Add helper routines to up- and download data (reliably) from and to the\ DRAM block * X310: Allow daughterboards to set dboard clock rate * Improve finding of MPM-based devices by making parts of the find call\ asynchronous and allowing to skip reachability checks. * RFNoC: * Added new optional feature to all Radio blocks - Timed complex gain: * Allows specifying complex gain coefficients to be applied to all\ TX and/or RX samples of a radio channel at the specified time. * Enabled by default for all TX and RX channels of the radio blocks,\ but can be disabled at FPGA build time via the `EN_COMP_GAIN_TX`\ and `EN_COMP_GAIN_RX` parameters of the radio blocks. * NOTE: For the x440_X4_400 default FPGA design provided with UHD,\ enabling this feature for all 8 RX and TX channels necessitated\ restricting the existing crossbar connections between the replay\ blocks and the radio blocks. As a result, only blocks with the same\ indices can be connected (e.g. replay0<->radio0 and replay1<->radio1\ only) when using this pre-built USRP FPGA image. * Blocks may now drive the front-panel GPIO pins on all RFNoC-capable\ devices. New IO signatures are added, and all device BSPs have IO ports\ for accessing the GPIOs. Device controls are updated such that the user\ can choose the source for GPIOs dynamically in this case (i.e., the\ radio blocks and other GPIO sources are still available). In some cases,\ the device BSP HDL had to be significantly refactored. * Add names and descriptions for block's and module's YAML files, so that\ other tools may read information about those in an automated fashion * Allow `mtu` stream argument, which overrides the MTU value that is\ derived from the link information. * Action handling is now moved to its own thread (there is one action\ handling thread per graph). This allows actions to be handled\ asynchronously, e.g., when triggering actions from async message handlers. * Add radio_state IO signature, so that other blocks can monitor the ATR\ state of radio blocks. * All RFNoC devices can now take an `mtu` stream argument (which overrides\ the detected link MTU) and a `force_mtu` device argument (which skips\ automatic MTU detection and forces a fixed value). These are helpful in\ scenarios where a specific network topology interferes with path MTU\ discovery, and for remote streaming when the MTU for a remote stream link\ cannot be inferred from UHD. * rfnoc_modtool has improved support for generating unit tests. * Add PPS IO signature for all targets * Add stream command to start receiving when a transmit occurs * Null source/sink: Add finite mode. * Add UX1/UX2/UX4 QSFP configurations for X4xx * API Changes * meta_range_t and uhd::dict can now be initialized from initializer lists * Add rfnoc_graph::get_chdr_xport_adapters() * Python API now allows creating SubdevSpec from a string * Some public APIs that used `boost::optional` now also work with `std::optional` * Unit tests for RFNoC blocks (in-tree and out-of-tree) no longer require a\ dummy implementation of `~make_args_t()` * `uhd::cast::to_str()` was added and `uhd::cast::from_str()` was extended to\ be a full replacement for `boost::lexical_cast` * Examples * Overhauled many of the examples to improve documentation, as well as some\ minor conveniences or bug fixes * Added continuous streaming to tx_samples_from_file * Improved gpio example. * Bug Fixes * Fix static UHD library builds * Fix compatibility with Boost 1.89 * RFNoC: * Fix slicing notation in rfnoc_image_builder * Fix building of GRC files with empty default target (this would affect\ builds of X410 and X440 device bitfiles from GNU Radio) * Fix installation of OOT modules in Python venvs * Fix time alignment of first sample * Unit tests in RFNoC OOT modules now preload their DLLs to ensure the\ correct library version is loaded * Fix generation of GNU Radio C++ block controllers * rfnoc_modtool: Fix creation of spurious unit tests, fix package_data for\ Python module installation * rfnoc_modtool: Fix connection check for invalid ports * Fix alignment of first sample coming from radio block. * Fix bug in ctrlport_endpoint which could cause the software to believe\ the associated RFNoC block's command FIFO was full when packets were lost * Add parameter to skip waiting for ACKs in async messages * E31x: Fix GPIO control * E3xx/B2xx: Fix rounding bug for RF PLL tuning * B2xx: Fix image loading via b200_image_loader when multiple devices are\ attached * X410: Fix tuning when power calibration and non-default gain profiles are\ used. * Power calibration tools: Fix settings for E320, allow non-default sampling\ rate, other minor fixes * FPGA * Fix various simulation-related bugs * USRP Simulator: Update to match current UHD. * multi_usrp: * Improved bank name check in multi_usrp::{set,get}_gpio_attr() * CMake: * Allow absolute paths for install dirs in pkg-config * Fix target include path for Python module * USRP1: Fix converter name in property tree * FPGA: * Fix various simulation/testbench issues. * Improve resource utilization in various places. * MPM: * Fix file descriptor leaks by using with/open everywhere. * Fix double-free issue in rpclib. * Remove tolerance for non-existing EEPROMs. * Examples: Properly report errors when opening a file failed. * Python: When installing into venvs, no longer force a reinstallation of\ dependencies. * Dependencies changes * Increase minimum required versions * Boost to 1.71 * DPDK to 19.11 * Changed minimum CMake versions for various non-UHD projects, e.g.\ firmware builds, to stay compatible with CMake 4 * Documentation * Restructured the UHD manual, improved chapter structure, improved getting\ started content, added RFNoC specification. * Fixed some external links * Many smaller improvements (typos, duplicate entries removed, formatting,\ etc.) * Codebase Management * Increased C++ version to 20 for UHD library, examples, and utilities * Removed Boost in multiple locations and replaced with standard library\ calls * Fix numerous (mostly harmless) compiler and Doxygen warnings * Improve CMake linking instructions * Validated OS Environments\ (Versions for build and runtime dependencies can be determined from the\ docker container definitions in the UHD repository at .ci/docker/...) * Linux: * Ubuntu: jammy (22.04), noble (24.04), questing (25.10) * Fedora: 40, 41, 42 * Windows: 10 22H2, 11 24H2 * MacOS: Sequoia (15.6)