The RFNoC code in UHD that is used by the dissector was updated to use
more recent C++ features, such as std::optional. This change updates
the C++ requirement for the dissector to match UHD.
This adds support for using block write, block read, and poll control
packets in RFNoC. Previously, block write/read operations were done by
issuing multiple individual single-word write/read control packets. Now
a single control packet can be used to read or write up to 15 words.
The poll operation is now also supported and no longer throws an
assertion when called.
A new burst write/read mode is also supported, in which the standard
OP_WRITE/OP_READ opcodes are used with multiple data words to perform
repeated reads or writes to the same address.
This change also removes the requirement for dummy data words to be
present in read request packets as well as write and sleep response
packets. This improves efficiency of the control interface, especially
for block and burst operations.
This adds support for block write, block read, and poll operations in
the AXIS-Ctrl endpoint.
A burst mode is also now supported, in which the READ or WRITE opcode
with NumData > 1 allows repeated reads or writes to the same address,
unlike block write/read, which auto-increments the address.
This change also removes the requirement for dummy data words to be
present in read request packets as well as write and sleep response
packets. This improves efficiency of the control interface, especially
for block and burst operations.
Introduce HwmonTempSensors (sysfs_hwmon.py) and refactor
SysfsThermalSensors (sysfs_thermal.py) to enumerate available sensors
once at construction time and cache device references in a sensor_map
dict, avoiding repeated udev context creation and device-tree walks on
every readout.
HwmonTempSensors supports the cros-ec hwmon subsystem and accepts a
sensor_list parameter to discover both temp and fan sensors. A new
read_fan_sensor_value() method is added alongside the existing
read_thermal_sensor_value(). Multiple subsystems (hwmon, iio) and
sensor formats are supported via a read_sysfs_sensors_value() utility.
SysfsThermalSensors is extended to support multiple subsystems (IIO
and thermal) and a data_probe parameter for flexible attribute reading.
A read_fan_sensor_value() method is added to match the hwmon interface.
Both classes expose the same read_thermal_sensor_value(sensor_names,
reduce_fn) interface, making them interchangeable at the call site.
All affected peripheral managers are updated:
- E320: updated to use the new sensor abstraction pattern
- N3xx: refactored temp and fan sensor methods for hwmon/thermal backends
- X4xx: unified _temp_fan_sensors handle with hwmon/thermal dispatch,
add missing HwmonTempSensors import
- E310: add dynamic MB temperature sensor type detection instead of
hardcoding "jc-42.4-temp", fixing usrp_list_sensors compatibility
A _hwmon_based_sensors flag at init time selects the correct backend
for fan and temperature reads on all platforms.
The i2c-adapter subsystem was meant as a temporary compatibility
layer. The recommended option always was to rely on i2c-dev
subsystem only. With commit 7e722083fc the i2c-adapter subsystem
was finally removed from Linux kernel 6.12.
The logic for resolving the i2c-dev device node was changed
accordingly.
This change also adopts all occurances in the code where the I2C
bus or device node is resolved to use resolving by devicetree
symbol. E.g. in n3xx.py, the N32X QSFP I2C node was resolved by
devicetree label before.
Overall, two functions are now provided by sys_utils.i2c_dev:
- dt_symbol_get_i2c_bus: Get the I2C bus (as pyudev.Device) for
a given device tree symbol. This function is used if the
returned value is further used for filtering devices using
udev, e.g. searching for certain devices on the same I2C bus.
- dt_symbol_get_i2c_device_node: Get the i2c-dev device node
(e.g. "/dev/i2c-0") for a given device tree symbol. This function
is used in cases where only the device node is of interest, e.g.
when passing it to a C/C++ library.
For repoducible builds which use the variable SOURCE_DATE_EPOCH, ensure
reproducible C_FLAGS and CXX_FLAGS by replacing the actual build directory
by BUILD_DIR.
The change is based on the patch omit-build-path from pkg-uhd repository,
original author "A. Maitland Bottoms" <bottoms@debian.org>.
In 8f6c7e5 we cleaned up uhd::find to have a consistent experience independend
from the underlying registered device type (usrp1/usrp2/b200/mpm/…).
Removing the filtering of found devices from the find_t broke existing
workflows. The image loader uses the find_t of, e.g. of mpm which now does
no filtering anymore, so
uhd_image_loader --args addr=<ip>,tpye=x4xx,fpga=X4_200
would load the bitfile, because when finding for a specific ID UHD does no
broadcast so the result will be either no or a single result while
uhd_image_loader --args serial=<id>,tpye=x4xx,fpga=X4_200
would do a broadcast an find a potentially more that one device. The
image loader will then fail, because we do not support multi device updates.
This commit fixes this by moving the filtering methods into some place
visible for all find_t methods. uhd::find does not filter anymore.
Instead the filtering is done in the find_t's itself. This ensures that the
filter is also applied if the find_t is invoked by anything else than
uhd::find (e.g. the image loader). At the same time it is ensured that we
keep the cleaned up find we introduces in the commit mentioned above.
Previously, the `nco_locked` sensor value only returned the reset status
(i.e., was the NCO out of reset). We now also include the status of the
fail flag, i.e., the NCO must be out of reset, and the fail flag must be
clear to signal a positive `nco_locked` value.
Note that the `nco_locked` sensor is named this way to mimic the
lo_locked sensors available on other daughterboards. Those other sensors
report on the physical lock status of analog PLLs, but this simply
returns the status of the NCO.
Two new APIs are added to x400_rfdc_control:
- get_nco_good(): Combines the reset and FAIL flags into a single "good"
value
- get_nco_no_fail(): Provides information on the current status of the
NCO reset FAIL flag
install(DIRECTORY) in UHD_PYTHON_INSTALL_MODULE copies the entire
build-tree module directory verbatim, including cmake_install.cmake
and CTestTestfile.cmake files generated by CMake. These files embed
absolute build paths and do not belong on the target system.
Add PATTERN EXCLUDE rules to drop cmake_install.cmake and
CTestTestfile.cmake during installation.
The recent change in 2e7ec47 exposed a new corner case:
- Assume two consecutive sessions with external clock and otherwise
identical device args. In this case, the second session would usually
start without forcing a re-init, because we assume the clocks are
still fine.
- Now what if the external ref clock glitches between sessions, i.e.,
when no UHD is running? In this case, the `spll_unlock_event` flag
would never be set
- Because the reference lock check was implicitly sticky before the
change, this would still cause a forced re-init in the past, but not
anymore
This commit calls get_ref_stable() during session initialization to
scoop up any sticky bits that occurred between the last successful UHD
session and the new one. The ref-stable sensor state will be
reconfigured during device initialization, so this does not lose any
information.
When the SPLL loses reference lock and then re-locks to the reference,
its R-dividers will be out of sync. This change allows a new argument to
the set_sync_source() API call to resynchronize SPLL R-dividers to the
PPS flank. This is not a supported operation, and it may leave the FPGA
in an unknown state. For this reason, this option should only be
exercised by experienced users who know exactly which consequences this
may have.
To call this feature, use the reset_spll_r_divider key in the sync args:
```python
my_usrp.set_sync_source("reset_spll_r_divider=1")
```
If a reset was necessary and the R-divider reset was successful, it will
be necessary to also resynchronize timestamps between devices and
timekeepers.
With the most recent changes, Boost.Thread and all Boost date/time
libraries are no longer required. This updates the CMake and Debian
files to reflect those changes.
This adds a new sensor called `ref_stable` to the X4xx series. Unlike
`ref_locked`, which only checks the current ref-lock status, this will
also query the sticky bits of the LMK04832 lock-detect circuitry, and
then clear them. This allows checking if ref-lock was lost any time
between queries to the `ref_stable` sensor (unlike the `ref_locked`
sensor, which queries the current ref-lock status).
This changes the LMK04832 class to only optionally (and not always)
check the sticky LD_LOST flags in the 0x182 lock-detect register of the
LMK04832. As a result, the ref_locked sensor will now only return the
current lock status of this PLL, and the ref-locked LED
Adjusting the MPM code to enable the correct generation of data_clk and
data_clk_2x based on the fabric resampler rate. Further increasing the
rfdc_clocks to match the desired higher sampling rates of the RFDC.
Main changes are:
- Creating Xilinx FIR filters based on the X410 ones
- Writing TX and RX resamplers with seperate testbenches
- Creating a RF core around the resamplers and rf_core_full for the 200M variant
specifically.
- Integration of the core into the FPGA top level based on conditional
parameters generated by the rfnoc_image_builder workflow
- Changing the 8 SPC to 2 SPC to save DSP resources for the 200M image only
- Adding reset handling from ps_rfdc_bd to the new rf_core.