Commit graph

804 commits

Author SHA1 Message Date
Martin Braun
d398a02da7 mpm: x4xx: Prepare clock management for multi-mcr
This by itself does not enable dual-rate (or multi-mcr), but it
refactors the code to enable it in the future. Additional changes may be
required.

X4xxClockMgr is renamed to X4xxClockManager.
2023-05-20 11:12:51 -05:00
Martin Braun
cf1b65143d mpm: x4xx: Let RFDC control use clock policy
Before this change, x4xx_rfdc_ctrl.py had various backdoors to read out
required settings. Now that we have the clock policy object, we can
simply read them out from there.

This obviates some code paths (get_rfdc_resampling_factor(),
get_default_mcr(), set_rfdc_reset_cb()).
2023-05-17 13:16:27 -05:00
Martin Braun
3246aec020 mpm: x4xx: Check for tear_down()'s existence
On tear_down() (this is most commonly seen by users when updating the
FPGA image), we add a check to verify that subcomponents of the X4xx are
actually initialized, to avoid displaying a non-fatal error message that
looks like this:

[ERROR] [MPM.RPCServer] Error in update_component while resetting:
    'NoneType' object has no attribute 'tear_down'

The most common/easy way to trigger this error is by loading MPM with
a bitfile that has an invalid compat number (which would stop MPM from
initializing the RFDC controls) and then running `uhd_image_loader`
(which would force a tear_down()). In that circumstance, MPM would try
to call tear_down() on an uninitialized object.
2023-05-17 13:14:35 -05:00
Martin Braun
040d4bb0df mpm: x4xx: Factor clock control out of X4xxClockManager
This splits up x4xx_clk_mgr.py into PLL controls (which go into
x4xx_clock_ctrl.py) and just clock management (which stays in
x4xx_clk_mgr.py).
2023-05-16 18:18:56 -05:00
Martin Braun
8fdbcac6f0 mpm: x4xx: Trust the clock policy's default MCR
This removes a duplicate get_default_mcr() implementation.
2023-05-16 10:47:11 -05:00
Martin Braun
f22b392a00 mpm: x4xx: Rename 'both' argument to 'all'
All call sites that use 'both' as an argument for channel numbers now
use 'all', in preparation for daughterboards that have more than
2 channels.
2023-05-16 10:47:11 -05:00
Martin Braun
62eb62c781 mpm: rfdc: Remove set_sample_rate() API call
This API call is superseded by configure_pll(), and now we match the
RFDC API more closely.
2023-05-16 09:12:29 -05:00
Martin Braun
0b65839d03 x4xx: Update BIST to match clocking refactoring 2023-05-12 15:43:29 -05:00
Martin Braun
cf04329058 mpm: x4xx: Introduce X4xxClockPolicy
This new class encapsulates all clocking-related infos into a single
file and makes it easier to modify clocking settings.
2023-05-12 15:43:29 -05:00
Martin Braun
ac2799fac6 mpm: Fix ZBX CPLD updater
In 01ccb69, changes to the MB CPLD code were made which caused the
following issue when updating the CPLD:

root@ni-x4xx-xxxxxxx:~# zbx_update_cpld --dboards 0
Traceback (most recent call last):
File "/usr/bin/zbx_update_cpld", line 22, in <module>
from usrp_mpm.periph_manager.x4xx_mb_cpld import MboardCPLD
ImportError: cannot import name 'MboardCPLD' from
'usrp_mpm.periph_manager.x4xx_mb_cpld'
(/usr/lib/python3.7/site-packages/usrp_mpm/periph_manager/x4xx_mb_cpld.py)

This fixes this bug.
2023-05-09 17:20:06 -05:00
Martin Braun
f106875a47 mpm: x4xx: Move enable_iq_swap to x4xx_rfdc_ctrl.py
This fixes two issues:
- RfdcRegsControl.enable_iq_swap() now is consistent with other APIs in
  that it takes a channel number, not a block ID
- X4xxDboardIface.enable_iq_swap() doesn't use a backdoor API call to
  fish the enable_iq_swap() API out of the _rfdc_regs object that it
  doesn't own
2023-05-05 11:43:50 -05:00
Martin Braun
b25ed2b6c6 mpm: x4xx: Extend x4xx_rfdc_regs
- Add stubs for APIs we'll need in the future
- Add hard-coded versions of get_converter_mapping() and get_rfdc_info()
2023-05-05 11:43:50 -05:00
Martin Braun
94be5df1e8 mpm: x4xx: Move all clock control to single class
All code in x4xx.py that is specific to clocking is moved to
x4xx_clk_mgr.py. All ancillary code is adapted to call APIs from the
right places.
2023-05-05 11:43:50 -05:00
Martin Braun
d98e0e4994 mpm: Refactor LMK04832X4xx and LMK03328X4xx
- Add class-level attributes to store constants on the chips
- LMK04832X4xx.config() is changed use a SpllConfig object, which is
  temporarily defined in x4xx_clk_mgr.py before calling config()
2023-04-27 22:38:59 -05:00
Martin Braun
997d788353 mpm: x4xx: Minor preparations to x4xx.py for X440 support 2023-04-27 22:31:08 -05:00
Volkan Öz
e88c8e6d11 mpm: Simplify x4xx_bist nsync_fabric
The PLL itself looks good since
it can lock to the OCXO which provides a clean clock.
The Fabric Clock is very jittery which can lead to false fails.
That is why instead of locking to jittry reference signals we will just use
the internal amplitude monitor which per default is enabled and read back the status bit.

Once a signal has been detected the test will pass.
2023-04-20 23:42:12 -05:00
Lars Amsel
677cc33fc5 MPM: fix get_product_id in x4xx BIST
This fixes the eeprom-id mb call such that it also returns
correct values when a module ID for the device is set.

That fix enables resolving the TODO in the x4xx BIST.
It can now use the default implementation to get the
product ID from EEPROM.
2023-04-06 13:15:00 -05:00
Martin Anderseck
400abc624e cpld: Adapt CPLD updater for future X4x0 dboards
This change updates the call to the MB CPLD CTRL and adds logic to
distinguish between X410 and other USRPs, so that we can only force a
wrong CPLD image on a given device.
2023-04-05 13:02:18 -05:00
Martin Braun
36be4006d9 mpm: lmk04832: Move general APIs to base class
The X4xx-specific child class of LMK04832 had implemented some generic
APIs, which are moved into the parent class.
2023-04-03 22:10:45 -05:00
Martin Braun
f3e0f17647 mpm: dboard_iface: Remove {set/get}_if_freq() APIs
These APIs are not used, and are implemented by accessing private
members of child attributes, which is not a good style. Since they are
not used or needed, they can be removed without substitute.
2023-04-02 22:24:31 -05:00
Martin Braun
b17e907923 mpm: x4xx: Conditionally initialize DB flash
ZBX has a daughterboard flash memory, but other daughterboards for X4xx
do not. We therefore add a flag to class ZBX that declares its usage of
a DB flash memory, and X4xxDboardIface uses that flag to conditionally
initialize the DB flash.
2023-04-02 22:24:31 -05:00
Martin Braun
b16631cf5e mpm: Add dboard_info to db_iface initialization 2023-04-02 22:24:31 -05:00
Martin Braun
e08d827346 mpm: Bump compat number to 5.0
This covers the two recent changes:
- Moving the get-rate API into the daughterboard
- Add the new synchronization procedure
2023-03-24 16:08:30 -07:00
Martin Braun
87423d1d75 lib/mpm: Add MPM synchronization API
This adds a new synchronization step in the MPMD device initialization.

- Add API calls to PeriphManagerBase and rpc.py (synchronize() and
  aggregate_sync_data())
- Add sane default implementations to PeriphManagerBase

Note: This adds new APIs to MPM, but we won't change the compat number
in this commit, since the new API is not yet being used.
2023-03-24 16:08:30 -07:00
Martin Braun
d5505e44a8 mpm: x4xx: Move get_master_clock_rate() to DB-RPC
The X4x0 device is an outlier with respect to all other MPM devices when
it comes to this API. All other MPM-devices define this API on the
daughterboard, not the motherboard.

For all the reasons laid out in dboard_manager/base.py, we move this API
call for X4x0 also into the daughterboard RPC space.

Both get_master_clock_rate() and set_master_clock_rate() are explicitly
declared @no_rpc in MPM.

This is an API breakage in the UHD/MPM communication API.
2023-03-24 16:08:30 -07:00
Martin Braun
f98dbea429 mpm: e3xx: Fix inheritance order for DB classes
The classes E31x_db and Neon were importing the AD936xDboard mixin class
after their parent class, not before. This means the mixin couldn't be
used to override classes from the parent class, because Python's MRO
will go to the first class in the inheritance list.

Because there is no use of super() in these classes, the reordering has
no other effect than prioritize AD936xDboard over DboardManagerBase when
it comes to resolving parent methods.
2023-03-24 16:08:30 -07:00
Martin Braun
01ccb69459 mpm: x4xx: Move MB CPLD creation to factory
Main changes:
- x4xx_mb_cpld.MboardCPLD is renamed to X4xxMboardCPLD and is now a base
  class. Specific implementations of the MB CPLD require derived classes
  and have to provide their corresponding signature.
- In x4xx.py, we don't init the MB CPLD and then assert we have
  a specific signature. Instead, we init the MB CPLD, and choose
  a derived class based on the signature. If there is no such class,
  then the same error is generated as before (by itself, this means
  there is no behavioural change).
- The MB CPLD image for the X410 (ZBX daughterboards) is moved to
  a derived class X410MboardCPLD.
- New: The ZBX daughterboard driver verifies that the MB CPLD image is
  in fact compatible with the daughterboard. For this, the MB CPLD
  control classes require a COMPATIBLE_DB_PIDS attribute.

By itself, this change has no behavioural- or API changes. However, it
allows easily slotting in new CPLD images with different signatures.
Without further modifications, it does not allow *any* CPLD image
though: The PS API (e.g., enable/disable daughterboards, CMI status,
etc.) remain the same.
2023-03-09 11:10:39 -05:00
Martin Braun
4b007c42b3 mpm: x4xx: mb_cpld: Add missing bitfields
For the sake of completeness, the bitfields and register offsets defined
for interacting with the MB CPLD are matched with the HDL definitions,
even for registers that aren't being used by MPM at this moment.
2023-03-09 11:10:39 -05:00
Martin Braun
f97ca3d80c mpm: x4xx: Move common DB tasks from ZBX class to mixin
This adds a new class, X4xxDbMixin, which can be used for daughterboards
that are installed into an X4xx motherboard. It collects all the common
tasks between such daughterboards.

The mixin is also mixed into the ZBX daughterboard class. The other
dboards (IF test CCA, Debug DB) are not modified.
2023-03-08 16:18:08 -05:00
Martin Braun
507536d3f5 mpm: dboard_manager: Fix linter issues in dboard_manager/base.py 2023-03-08 16:18:08 -05:00
Martin Braun
119c28e5c7 mpm: bist: Improve --help message 2023-03-06 11:51:46 -05:00
Martin Braun
3113054712 mpm: periph_manager: Remove vestigial Python-six 2023-03-06 11:00:52 -05:00
Martin Braun
4cad444604 mpm: Move get_dboard_class_from_pid()
Move get_dboard_class_from_pid() from periph_manager/base.py to
periph_manager/__init__.py. This allows usage of that class elsewhere.
2023-03-06 11:00:52 -05:00
Martin Braun
e60f524647 mpm: x4xx: Remove get_cal_eeprom_spi_node()
This API call does nothing useful, is never called, and references
non-existant attributes of the x4xx class (qspi_cs, qspi_nodes). Most
likely this was used during early revisions of X410 development and
controlled hardware that no longer exists.
2023-03-02 09:01:40 -05:00
Wade Fife
e9590ce238 mpm: x4xx: Add UC FPGA type 2023-02-24 08:07:17 -06:00
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