Commit graph

769 commits

Author SHA1 Message Date
Martin Braun
21107ff36c mpm: Fix test utilities
- Fix MockGpiod object: This class should mock the gpiod module, but it was
  missing the LINE_REQ_EV_FALLING_EDGE attribute.
- While we're at it, fix some pylint warnings.
2023-02-08 16:59:34 -06:00
Volkan Öz
6932a7ceb9 MPM: fix GPS lock sensor method name
Method to get the lock status of the GPS sensor should be

    get_gps_lock_sensor

instead of

    get_gps_locked_sensor

Changing this conforms the x4xx with other USRPs and also
makes the call in get_gps_sensor_status executable at all.
2023-02-07 23:53:28 -08:00
Martin Braun
574be8564c mpm: mpmutils: Add parse_multi_device_arg() function 2023-01-31 13:03:01 -08:00
Martin Braun
e4c23129cc mpm: mpmutils: Fix Pylint warning 2023-01-31 13:03:01 -08:00
Martin Braun
71d957df29 mpm: x4xx: Remove references to white rabbit
At least in this version of UHD, there is no White Rabbit support on
X410. The references in x4xx.py are vestigial code snippets.
2023-01-05 12:00:27 -08:00
Lars Amsel
2b50249f4c host: ADC cal: Add ability to set calibration mode explicitly
We currently do not set the calibration mode during ADC self
calbration. The default mode is selected in Vivado configuration.
Nevertheless we have seen issues where not setting the mode
lead to poor results in ADC self calibration.

This commit enable the RPC to call the set_calibration_mode
which was already implemented in our RFDC lib.
2022-12-18 18:28:12 -06:00
Wade Fife
7de96848df mpm: rfdc: Add X4xx 125e6 master clock rate 2022-12-06 11:29:15 -06:00
David Raeman
8cb6699772 e320: Allow internal GPSDO to be powered-down via UHD session args
Currently the E320's integrated GPSDO can be disabled using the
"enable_gps" argment at MPM initialization time (e.g. when the radio
powers on and launches the MPM daemon). However, there is no way for
a UHD application to disable the GPSDO at connection time.

This patch allows the existing "enable_gps" arg to be accepted when
initiating an MPM session from UHD, such that an application can pass
the arg "enable_gps=0" at connection time to disable the GPSDO. The
default power state of the GPSDO is restored when the session ends.

Edit: On top of the original commit by draeman-synoptic, the MPM minor
compat number was also increased to denote new non-breaking feature
support.

Co-authored-by: mattprost <matt.prost@ni.com>
Signed-off-by: mattprost <matt.prost@ni.com>
2022-11-16 09:51:57 -06:00
Martin Braun
b8b988da11 mpm: Move parse_encoded_git_hash() to mpmutils
This function was identically implemented twice, and this removes this
duplication.
2022-11-02 11:00:17 -05:00
mattprost
ba1d4bfaf7 mpm: Add a lock to the rpc server timer
This prevents any concurrency issues that might arise from killing and
spawning a new timer in the rpc server.

Signed-off-by: mattprost <matt.prost@ni.com>
2022-10-20 10:12:21 -05:00
mattprost
458f73b195 mpm: rpc server: Capture claim token value before releasing state lock
This removes the race condition that can occur by reading the value of
the rpc server's shared state claim token value without a lock. After
the lock is released, it is possible that another process could preempt
and modify the value with a different claim operation. Also, added
timeouts to acquire the shared state lock for claim, reclaim, and
unclaim operations.

Signed-off-by: mattprost <matt.prost@ni.com>
2022-10-20 10:12:21 -05:00
mattprost
cf0c6b5a13 mpm: Fix rpc process shared state and port argument positions
The rpc_server_process was spawning with its parameters reversed. The
calling function also had its parameters reversed, so this is
functionally the same. This change makes sure that the parameters are
aligned with the arguments throughout the callstack.

Signed-off-by: mattprost <matt.prost@ni.com>
2022-10-20 10:12:21 -05:00
Lars Amsel
d09b8c358a MPM: Better error message for multiple assigned MACs
Each MAC address should be only assigned to one link at a time.
If the motherboard EEPROM is messed up, it might happen that
there are more links connected to a single MAC.

So in that case a

  [link_index] = ip2.link_lookup(address=mac_addr)

results in a ValueError (too many values to unpack) which gives
no clue on what actually went wrong. Instead we check the len
of he link_lookup result and give a more meaningful error message.
2022-10-11 15:29:50 -05:00
Martin Braun
4d6b7263f5 Revert "uhd: Revert Raw UDP Host Changes"
This reverts commit 6cb1dcca83.

Raw UDP support is added back in on both MPM and UHD side.
2022-09-21 15:35:55 -07:00
Steven Koo
6cb1dcca83 uhd: Revert Raw UDP Host Changes
This reverts the Raw UDP host changes which is breaking
multiple interface streaming.

Commits addb81aa5d2d6adcd3a0c7a8d59fcd96af0c1ec4^..b1ca51f97aaa2226ed6ef339fb26fbea54ab7593
are reverted.

Reverts:
doc: Update manual on streaming
examples: Add remote RX streaming example
rfnoc: Enable remote UDP streaming
mpm: e320: Enable raw UDP streaming
mpm: n3xx: Enable raw UDP streaming
mpm: x4xx: Enable transport manager adapter
mpm: Enable opt-in transport adapter control
rfnoc: Transition stream managers and mgmt_portal to topo_graph_t
rfnoc: Add topology graph object
uhd/mpm: Add API to set remote routes
mpm: xports: Add XportAdapterMgr class
2022-09-12 17:00:19 -05:00
Steven Koo
01170bc8c5 mpm: bump fpga compat for raw udp streaming
Signed-off-by: Steven Koo <steven.koo@ni.com>
2022-08-30 13:43:36 -05:00
Martin Braun
7dbfca44f7 mpm: e320: Enable raw UDP streaming
- Checks FPGA compat number is 6.1
- If so, it enables the transport adapter manager
- Note that E320 may still have raw UDP streaming feature disabled. In
  that case, it simply doesn't report that capability.
2022-08-30 13:43:36 -05:00
Martin Braun
a6ec732b0a mpm: n3xx: Enable raw UDP streaming
- Checks if the compat number is at least 8.1
- If so, enables the transport adapter managers
- Note N3xx FPGA may still not have raw UDP streaming enabled, in which
  case that capability is simply not reported.
2022-08-30 13:43:36 -05:00
Martin Braun
3eef5f8cc5 mpm: x4xx: Enable transport manager adapter
This checks if the FPGA compat number is at least 7.9, and if yes,
enables the 'remote_streaming' FPGA feature.
2022-08-30 13:43:36 -05:00
Martin Braun
10c54be063 mpm: Enable opt-in transport adapter control
N3xx and E320 (although potentially other USRPs too) don't always enable
the raw UDP streaming capabilities. This change updates the transport
adapter control to not provide access to any registers or features that
are unavailable to the transport adapter. This way, the FPGA bitfile can
be kept minimal (by not providing raw UDP streaming capabilities) and
software can determine those capabilities easily.
2022-08-30 13:43:36 -05:00
Martin Braun
40b66c9e56 uhd/mpm: Add API to set remote routes
This is an addition to both PeriphManagerBase (MPM) and mb_iface (UHD).
Main changes:

- Addition of mb_iface::add_remote_chdr_route() and
  mb_iface::get_chdr_xport_adapters()
- In X3x0, these APIs are stubbed out.
- In mpmd, these APIs are implemented and call the new MPM APIs (see
  below)
- Addition of PeriphManagerBase.add_remote_chdr_route() and
  PeriphManagerBase.get_chdr_xport_adapters()
- The PeriphManagerBase implements these APIs fully when the
  'remote_udp_streaming' FPGA feature is detected.
- The MPM compat number is bumped to 4.3. UHD will continue to work with
  lower compat numbers. It will query the compat number and act
  accordingly.
2022-08-30 13:43:36 -05:00
Martin Braun
addb81aa5d mpm: xports: Add XportAdapterMgr class
This provides an API to program remote streams from a transport adapter.
2022-08-30 13:43:36 -05:00
Wade Fife
3c3da4c62f fpga: lib: Add advanced features to IPv4 SV transport adapter
This adds several features to the SystemVerilog Eth/IPv4/UDP transport
adaptor including:

- Compat register
- NODE_INST register
- Capabilities register
- KV map access for custom routing on RX data paths
- CHDR header removal for raw payloads to be sent over UDP

Also adds xport_adapter_ctrl.py, which allows controlling the new
registers.

Co-authored-by: Martin Braun <martin.braun@ettus.com>
2022-08-29 17:01:45 -05:00
Steven Koo
8a8a555d8c mpm: bump x4xx fpga compat
Signed-off-by: Steven Koo <steven.koo@ni.com>
2022-08-29 16:58:50 -05:00
Martin Braun
e62a92793d fixup! mpm: Add CompatNumber utility class
The original commit did not add the compat_num.py file to the
CMakeLists.txt file. This would only be a problem when re-running
CMake with a different branch.
2022-07-20 17:08:33 -05:00
Martin Braun
216f1871f6 mpm: Factor out transport API into PeriphManagerBase
All MPM devices use identical implementations of the transport API.
Minor differences between the actual lines of code in the various
transport adapters are due to minor optimizations, such as hard-coding
'udp' as the only valid transport type for the N3xx series.

This change moves the implementation of the transport API calls
(get_chdr_link_options() and get_chdr_link_types()) into
PeriphManagerBase. The class attributes _xport_adapter_mgrs is also
declared in that class, but defining them is left up to the individual
device implementations.
2022-07-12 13:10:39 -05:00
Martin Braun
780c921835 mpm: Introduce fpga_features set
This is a set of strings, each of which describe features the FPGA has.
The purpose of this is to provide a standard location to store knowledge
about available features. Typically, the code will read the compat
numbers to see if a feature is available, and then store a corresponding
string in this set.
2022-07-08 05:51:29 -07:00
Martin Braun
3a355837ea mpm: xportmgr_udp: Include iface name in info
XportMgrUDP.get_chdr_link_options() now also returns the interface name
(e.g., sfp0) in its return values, which is very useful for identifying
a transport in a different context (e.g., when only the node_inst value
of a transport is known).
2022-06-29 12:24:13 -07:00
Martin Braun
ee75bd984c mpm: Add CompatNumber utility class
This is a class that allows handling compat numbers as a type:

>>> cn = CompatNumber(4, 3)
>>> print(cn.major)
4
>>> cn < CompatNumber(4, 5)
True
>>> cn == CompatNumber(4.3)
True
2022-06-29 12:08:02 -07:00
Martin Braun
cc02485aa6 mpm: x4xx: Make get_chdr_link_types() more generic
This code was copy/pasta'd from N3x0. In theory, X410 can have more
options regarding streaming than UDP, although for now, this function
returns the exact same as before, it's just no longer hard coded.
2022-06-14 05:29:26 -07:00
Martin Braun
3da73de4ab mpm: udp: Fix Pylint warnings in UDP-related files
Fixes long lines, missing docstrings, and deprecated Pythonisms from
ethdispatch.py and xportmgr_udp.py.
2022-06-08 13:44:19 -07:00
Aaron Rossetto
e80495654f N320: Revert PLL lock time reduction
This commit reverts the changes made in commit 81a9cc1f8 to reduce the
time for the LMK PLL to report lock status. The decision to revert the
change comes after an investigation found that reducing the overall time
to detect lock correlates with an increase in an error reported by the
TDC ('[ERROR] TDC measurements show a wide range of values!  Check your
clock rates for incompatibilities. ...  Uncaught exception in method
set_clock_source: TDC measurement out of expected range!').  Despite the
LMK PLL reporting lock status, our investigation revealed that it takes
additional time for the PLL to align the daughterboards' clocks closely
enough to pass the TDC measurement's range limit (i.e., no samples
exceeding the measurement mean +/- 500 ps). Reverting the change
increases the amount of time between achieving lock status and taking
the TDC measurements, thus greatly reducing the likelihood of the
reported error.
2022-06-03 13:58:23 -07:00
Virendra Kakade
09936d54c7 mpm: add support for lattice zbx cpld
Co-authored-by: Steven Koo <steven.koo@ni.com>
Signed-off-by: Virendra Kakade <virendra.kakade@ni.com>
2022-05-16 06:18:09 -07:00
Wade Fife
6b96f718fa mpm: Fix expected CPLD filename for x4xx
Change the filename expected by x4xx_update_cpld to match the name used
by package_images and downloaded by uhd_images_downloader.
2022-05-06 06:54:32 -07:00
Martin Anderseck
b9a3ae9bcc mpm: x4xx: Add back SPI as source for GPIO
In commit bc8713e7af the SPI functionality was made available
conditionally depending on the FPGA version number. For this,
all SPI entries were removed from the X4XX_GPIO_SRC_RADIO variable
and put into an own variable. But therefore SPI was not available
anymore as valid source for GPIO. This change reintroduces SPI and
thus enables the SPI functionality again.

Co-authored-by: Javier Valenzuela <javier.valenzuela@ni.com>
2022-04-29 06:08:18 -07:00
mattprost
b8acf58798 n310: Add Filter API to n310
Add the Filter API to n3xx specifically for the AD937x device.  The TX
filter is limited to 32 taps, and the RX filter is limited to 48 taps.

This feature requires MPM version 4.2 or later on the device.

Co-authored-by: bpadalino <bpadalino@gmail.com>
Signed-off-by: mattprost <matt.prost@ni.com>
2022-04-07 13:28:02 -07:00
mattprost
a8ad4917d3 n310: Add frontend bandwidth control
Allow users to control the Mykonos frontend bandwidth settings for
Rx and Tx. Note that this operation requires the daughterboard to
re-initialize, so it may take some time. Values for frontend filter
settings were derived using ADI's AD9371 Filter Wizard.

This feature requires MPM version 4.1 or later on the device.

Co-authored-by: bpadalino <bpadalino@gmail.com>
Signed-off-by: mattprost <matt.prost@ni.com>
2022-04-07 13:28:02 -07:00
Martin Braun
38fb5e262b debian: Update control and package building
- Update dependencies
- Add python3-uhd package
- Add uhd-doc package

In part, this changeset is to further align with the official Debian
upstream at https://salsa.debian.org/bottoms/pkg-uhd.git, which is
maintained by Maitland Bottoms.
2022-04-06 14:30:49 -07:00
Martin Anderseck
bc8713e7af host: SPI: Read number of supported SPI slaves from device
Add support for reading the number of supported SPI slaves from
the device. This has become necessary because we may have bitfiles
with different capabilities and we want to report this back correctly.
2022-04-04 12:27:18 -07:00
Martin Braun
af9e13f4dc cmake: mpm: Skip installing binaries for SIM
When running MPM as a simulator, none of the board-specific tools like
the BISTs, or usrp_update_fs need be installed.
2022-04-04 12:24:10 -07:00
Martin Braun
9573640db7 mpm: x4xx: Fix clock/time source API
In f73e327, we modified PeriphManagerBase to explicitly list all
required methods as per the MPM/UHD API. This had an unintended side
effect: Because the clocking methods on x4xx are imported from
X4xxClockMgr, and not defined on x4xx itself, the method used to import
methods from X4xxClockMgr onto x4xx would refuse to re-define API calls
such as set_clock_source(), get_clock_source(), and so on.

The solution is to allow _add_public_methods() to overwrite existing
methods, which means we can overwrite abstract methods from
PeriphManagerBase in this fashion.

Without this patch, UHD sessions could fail in the following manner:

>>> import uhd
>>> U = uhd.usrp.MultiUSRP("type=x4xx")
>>> U.get_clock_source(0)
Traceback (most recent call last):
File "<input>", line 1, in <module>
U.get_clock_source(0)
RuntimeError: RuntimeError: Error during RPC call to `get_clock_source'.
Error message: get_clock_source() not available on this device!
2022-03-30 05:29:00 -07:00
Martin Braun
a705845c4c mpm: e3xx: Fix get_sync_sources() API
get_sync_sources() was not implemented for E31x and E320. Because UHD
assumes this exists, calling this would cause an error like this:

>>> import uhd
>>> U = uhd.usrp.MultiUSRP("type=e3xx")
>>> U.get_sync_sources(0)
Traceback (most recent call last):
File "<input>", line 1, in <module>
U.get_sync_sources(0)
RuntimeError: rpc::timeout: Timeout of 2000ms while calling RPC function
'get_sync_sources'
2022-03-28 12:54:07 -07:00
Martin Braun
f73e32729d mpm: PeriphManagerBase: List all sync-related methods
All PeriphManagerBase childs need to implement

- get_{clock,time,sync}_source()
- get_{clock,time,sync}_sources()
- set_{clock,time,sync}_source()

So we populate PeriphManagerBase with defaults for all of those.
2022-03-28 12:54:07 -07:00
Martin Braun
c176425b85 mpm: Make default clock/time source values state-less
Currently, the default clock/time source is whatever the user configured
in the last session.

This fixes the scenario were you have any MPM device and do this:

    $ benchmark_rate --args $args,clock_source=external

But whoops! You forgot to attach an external 10 MHz. PLL lock fails,
nothing works. No worries, you run it again:

    $ benchmark_rate --args $args

With the previous behaviour, this would retain the setting to
'external', because there's nothing to overwrite it. You would need to
append `clock_source=internal` to get a working device again. Calling
multi_usrp::set_clock_source("internal"), or a similar API call, might
not be sufficient because the PLL lock failure might crash the program
before updating the clock source is possible.

The problem with this is twofold:

- All non-MPM devices behave differently, i.e., they have a fixed
  default ('internal') which is always applied if no other option is
  given. This is an internal inconsistency.
- Some applications (like gr-uhd's GRC bindings) simply don't set
  a clock/time source when selecting a "default", or they try and update
  the clock/time source using the API calls.

Therefore, we align the behaviour of MPM devices with the other devices,
and fall back to an internal source if nothing else is provided.
2022-03-28 12:48:28 -07:00
Martin Braun
7a59bb82da mpm: e3xx: Simplify code referring to self.dboards
The E31x and E320 devices have one virtual daughterboard, and it is
always present. This is different from N3xx, which is where the MPM code
for these devices is based upon.

During the E3xx initialization, we make sure that our single
"daughterboard" exists and is responsive. That means we can remove some
code that tests for the availability and number of daughterboards, which
we need on N3xx (which works with zero, one, or two daughterboards).
This also allows us some minor deduplication of code.
2022-03-28 12:48:28 -07:00
Virendra Kakade
4b94840abf fixup! uhd: add support for max10 variants 2022-03-28 12:47:17 -07:00
David Raeman
e57d22d525 mpm: speed up reading gps mboard sensors
This commit uses a more performant buffered I/O approach for reading the
gpsd socket. Previously, querying a gps mboard sensor on an mpm radio
would take 300-500ms due to the loop reading one byte at a time.
2022-03-23 16:19:04 -05:00
Humberto Jimenez
8890e77dff images: Update manifest and compat number for X410 2022-03-23 16:16:05 -05:00
Aaron Rossetto
ecb4990297 mpm: n3xx: Recommend reboot USRP after BIST 2022-03-23 16:14:22 -05:00
Lane Kolbly
37987a87f4 mpm: x4xx: Remove GPIO classic mode register 2022-03-23 16:14:07 -05:00