Commit graph

316 commits

Author SHA1 Message Date
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
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
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
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
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
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
Humberto Jimenez
8890e77dff images: Update manifest and compat number for X410 2022-03-23 16:16:05 -05:00
Lane Kolbly
37987a87f4 mpm: x4xx: Remove GPIO classic mode register 2022-03-23 16:14:07 -05:00
Martin Braun
cfcb97616a mpm: e3xx: Fix Pylint warnings in periph_mgr classes
- Whitespace
- Long lines
- Superfluous imports
2022-03-17 14:00:06 -05:00
Aaron Rossetto
910b797e18 images: Update manifest and compat number for X410 2022-03-10 13:53:58 -06:00
Martin Braun
f644c50114 e320: mpm: Remove monitor thread
This thread is a vestige from copy & pasting N310 code, it does
absolutely nothing but occupy resources.
2022-02-24 13:32:36 -06:00
Martin Braun
ba00ff0cf5 Remove FSRU-related files
The FSRU (aka EISCAT) was never supported in UHD 4.0. The FPGA
repository never had the relevant files, and the block controller also
never existed. This removes all the corresponding files from MPM, as
well as some references from makefiles.
2022-02-22 14:41:19 -06:00
Martin Braun
3ad6dc8a69 mpm: eeprom: Improve E320 and N3x0 EEPROM code/comments
- Fix some Pylint warnings in eeprom.py
- Improve comments in n3xx.py and e320.py regarding rev_compat values in
  EEPROM
2022-02-16 14:53:37 -06:00
Lane Kolbly
6c8e9700d3 mpm: x4xx: Add function to map from gpio src list indices
set_gpio_src takes a list of twelve sources to apply to the pins. For
the DIO mapping, this is fine, because the twelve pins are zero through
eleven. However, for the HDMI mapping, the pin indices range from one
to nineteen. This commit adds a function to convert from the set_gpio_src
list indices into the pin number.
2022-02-11 07:57:37 -06:00
Aaron Rossetto
7956d0dbc3 images: Revert x4xx manifest and FPGA compat update 2022-02-08 15:23:57 -06:00
Aaron Rossetto
b229b0e796 mpm: x4xx: Update FPGA minor compat number 2022-02-07 07:20:39 -06:00
Lane Kolbly
3d045685ab mpm: x4xx: Align get/set_gpio_src mappings with HDMI pinouts 2022-01-24 14:24:53 -06:00
Lars Amsel
0e7553cd1a MPM: X410: Set correct tuning word
The comment behind the tuning word is correct but 0x200 does not
give a voltage of 1.65V but 2.5V, because the full range of the
DAC is 5V not 3.3V).
2022-01-10 14:55:44 -06:00
Martin Braun
57e8c028d8 mpm: x410: Fix docstrings related to GPS sensors
No code changes, only comment changes.
2022-01-10 08:02:51 -06:00
Martin Braun
4fd1cb317f mpm: x4xx: Add log message for older DIO boards
Older DIO boards don't support all the features of newer ones, but from
the log messages, it's not clear what revision the board has. We add
a log statement to clarify.
2021-12-09 13:09:28 -08:00
Martin Braun
db5ce31b0e mpm: x4xx: Move DioControl into its own module
No functional changes whatsoever, only:
- Move DioControl to its own module (x4xx_dio_control.py)
- Where PyLint was complaining about whitespace issues, fix those
- Fix import list in x4xx_periphs.py after removing DioControl
- Fix import list in x4xx.py to import DioControl from the correct
  location
2021-12-09 13:09:28 -08:00
Martin Braun
8ce91bc738 mpm: x4xx: Add checks before accessing self.dio_control
The X4x0 MPM code doesn't always load the object for the DIO control, it
only does that when certain checks pass (EEPROM readouts need to match
expected values). Therefore, `self.dio_control` may be NoneObject during
operations, and in other areas of the code, we already check if that's
the case.

The APIs added in c36fc5f don't have these checks, which means accessing
these new APIs may result in odd exceptions when trying to dereference
a NoneType object. By adding checks for the initialization state of
`self.dio_control`, we can avoid these and either substitute better
error messages / exception messages, or return safe values.

Note that mpmd_mb_controller also accesses this object indirectly by
checking the length of the return value of get_gpio_banks(). This check
is not affected by this change, as we now are guaranteed to return an
empty list if there is no self.dio_control.
2021-12-06 07:09:14 -08:00
Martin Braun
e1e1aad5c5 mpm: x4xx: Remove superfluous import 2021-12-06 07:09:14 -08:00
Virendra Kakade
3bd6afb51e mpm: x4xx: update mboard_max_rev
Signed-off-by: Virendra Kakade <virendra.kakade@ni.com>
2021-12-02 06:42:09 -08:00
Virendra Kakade
6d6fc2a01d uhd: add support for max10 variants
Signed-off-by: Virendra Kakade <virendra.kakade@ni.com>
2021-12-02 06:42:09 -08:00
Lane Kolbly
86190b4406 mpm: x4xx: Allow retrieving external power state
The external power can, broadly speaking, be in one of three possible
states:
- OFF (the default)
- ON (the user has enabled external power, and it's working normally)
- FAULT (the external power has encountered a fault condition)

This commit allows the client of MPM to distinguish between these
three conditions.
2021-11-05 12:02:19 -07:00
Lane Kolbly
ae12c802e7 mpm: x4xx: Allow GPIO0 and GPIO1 as port names 2021-11-04 11:32:21 -07:00
Lane Kolbly
e454fdbdee fixup! mpm: x4xx: add DIO GPIO API configuration methods 2021-11-03 06:04:50 -07:00
Dhiren Wijesinghe
c36fc5f6c0 mpm: x4xx: add DIO GPIO API configuration methods
These methods allow for reconfiguration of GPIO masters for x4xx.
The method names are get_gpio_banks, get_gpio_srcs, get_gpio_src,
and set_gpio_src.
2021-11-03 06:04:50 -07:00
Lane Kolbly
7ba25a638e mpm: rfdc: Tear down RFDC on teardown
So, the Python garbage collector is a bit pernicious, in that it happens
behind the scenes in a way which is difficult to predict. The rfdc_ctrl
class expects that its "lifetime" will be a single live/die cycle of the
FPGA (i.e. that when a new FPGA is loaded, it will be destructed).
However, by default the Python GC will keep the X4xxRfdcCtrl class alive
for an arbitrary amount of time, meaning that it's possible that
multiple (C++) rfdc_ctrl classes can be alive at a single time.

When the GC reaps all of these classes, libmetal segfaults when we call
metal_finish several times in a row. This change works around that
issue, if not the overall GC issue, by explicitly deleting the rfdc_ctrl
object.
2021-10-11 10:43:46 -07:00
Grant Meyerhoff
18de8c3271 mpmd: Add discoverable feature for trig i/o mode 2021-09-02 13:34:02 -05:00
Andrew Lynch
61d5cd5a0b mpm: x4xx: update mboard_max_rev 2021-08-25 15:28:22 -05:00
Michael Dickens
fc864f3675 MPM: add X410 support for 250e6 master clock rate 2021-08-24 15:27:35 -05:00
michael-west
d06eb0b44e n3xx: Add support for rev 10
No hardware interface change, so just bumping max revision.

Signed-off-by: michael-west <michael.west@ettus.com>
2021-08-16 15:42:13 -05:00
Sam O'Brien
3688056acd mpm: Expose motherboard regs for debugging
There currently isn't a way to access the motherboard register using MPM
(the ones defined in x4xx_global_regs). This commit adds a simple
interface to peek and poke them which is very similar to the current
interface for the daughter board registers.

Signed-off-by: Sam O'Brien <sam.obrien@ni.com>
2021-08-13 15:51:04 -05:00
Humberto Jimenez
d5c2750e3e mpm: update x410 fpga minor compat number 2021-06-24 13:52:25 -05:00
Lane Kolbly
8adbc72f0d mpm: Move cal freeze defaults to x4xx
This fixes an issue where the slot 0 ADC blocks would erroneously
report that they were unfrozen.

Additionally, adds logic to restore a saved cal freeze state on
sync source change.
2021-06-23 13:15:47 -05:00
Grant Meyerhoff
a8cb5d6359 mpm: restore rfdc nco frequency after setting sync source
After setting sync sources, the RFDCs get reset, we need to restore the previously set frequencies so that the device continues to transmit/receive at the requested frequency
2021-06-22 07:44:09 -05:00
Lars Amsel
2a575bf9b5 uhd: Add support for the USRP X410
Co-authored-by: Lars Amsel <lars.amsel@ni.com>
Co-authored-by: Michael Auchter <michael.auchter@ni.com>
Co-authored-by: Martin Braun <martin.braun@ettus.com>
Co-authored-by: Paul Butler <paul.butler@ni.com>
Co-authored-by: Cristina Fuentes <cristina.fuentes-curiel@ni.com>
Co-authored-by: Humberto Jimenez <humberto.jimenez@ni.com>
Co-authored-by: Virendra Kakade <virendra.kakade@ni.com>
Co-authored-by: Lane Kolbly <lane.kolbly@ni.com>
Co-authored-by: Max Köhler <max.koehler@ni.com>
Co-authored-by: Andrew Lynch <andrew.lynch@ni.com>
Co-authored-by: Grant Meyerhoff <grant.meyerhoff@ni.com>
Co-authored-by: Ciro Nishiguchi <ciro.nishiguchi@ni.com>
Co-authored-by: Thomas Vogel <thomas.vogel@ni.com>
2021-06-10 12:01:53 -05:00
Lars Amsel
60a147a6a1 mpm: Remove helper classes from RPC API
All public callables are exported as part of the RPC API. Because
classes are callable in Python they are now protected to prevent
export. Having theses inner helper classes marked as protected
also matches better their purpose as the are not meant to be used
outside the class.
2021-06-03 09:34:37 -05:00
Lars Amsel
0d55f572b7 mpm: Add symbol name based EEPROM read, cleanup EEPROM handling
Handling of EEPROM read was cleanup in PeriphManagerBase such that EEPROM
reading for mother and daugther board have similar names and signatures.

Base class supports symbol names for the nvmem files which make it easy
to find them by name such as db0_eeprom instead of addresses like
ff020000.i2c:cros-ec@3c:db0-i2c-tunnel.

Base class furthermore reads out all available auxiliary board EEPROM
files and stores them in a dictionary member.
2021-05-31 05:28:47 -07:00
Michael Dickens
ca076ab3ba MPM for N32x: Add 'XQ' image as valid when using sfp0 as time_source 2021-05-18 14:52:08 -05:00
Martin Braun
99e5230e4b mpm: PeriphManagerBase: Add _add_public_methods()
This allows conditionally adding public API methods.
2021-04-29 14:34:55 -05:00
Martin Braun
87b65cf7ab mpm: periph_mgr: Demote "no SPI nodes" warning
When there are SPI nodes declared for a daughterboard, MPM will emit
a warning: "No SPI nodes for dboard". The warning is misleading, because
this only occurs when no SPI nodes where *declared*, not when they were
declared but not found. This is entirely normal for USRPs where the
daughterboards do not have SPI nodes, and thus, not even worth a debug
statement.
2021-04-21 15:19:46 -05:00