aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/multi_usrp_rfnoc.cpp
Commit message (Collapse)AuthorAgeFilesLines
* host: Add static_assert to prevent meta_range_t(0,0)Lane Kolbly2021-07-141-2/+2
| | | | | | | meta_range_t(0,0) actually calls the iterator-based constructor for meta_range_t, which is almost certainly not the intended constructor for that call syntax. Therefore, we add a static_assert to prevent such usage, and fix all failing instances.
* uhd: Use chain's block channel to get power ref keysGrant Meyerhoff2021-06-231-2/+2
|
* uhd: Add missing channel parameter when reading power ref keysLars Amsel2021-06-181-2/+2
|
* multi_usrp: Factor out make_overall_tune_range() and fix limitsMartin Braun2021-06-091-23/+1
| | | | | | | | | This function had an issue where it might return negative frequency values. A quick fix was to limit it to positive frequencies. Since this function was duplicated between multi_usrp and multi_usrp_rfnoc, this patch also moves it to a common location to not have to fix it twice.
* multi_usrp_rfnoc: Fix get_device()->get_tree()michael-west2021-05-051-6/+3
| | | | | | | | | | | | | | | Property tree access via the device tree was resulting in a segmentation fault because the device::_tree member was not properly initialized for the redirector_device class. The redirector_device also had a get_tree() method that was not actually called because the get_tree() method in the parent class was not declared virtual and all calls to get_tree() were done on the parent class (i.e. get_device()->get_tree(). - Added initializer for device::_tree member in redirector_device class constructor - Removed redirector_device::get_tree() method Signed-off-by: michael-west <michael.west@ettus.com>
* UHD: Fix typo in has_tx_power_referenceLars Amsel2021-04-091-1/+1
| | | | The has_tx_power_reference called has_rx_power_reference by mistake.
* host: Update code base using clang-tidyMartin Braun2021-03-041-156/+176
| | | | | | | | | The checks from the new clang-tidy file are applied to the source tree using: $ find . -name "*.cpp" | sort -u | xargs \ --max-procs 8 --max-args 1 clang-tidy --format-style=file \ --fix -p /path/to/compile_commands.json
* uhd: throw error if edge list is emptyGrant Meyerhoff2020-12-211-0/+8
|
* multi_usrp_rfnoc: Serialize make_rfnoc_deviceAaron Rossetto2020-12-041-1/+24
| | | | | | | | | | | | | | | In certain execution environments (e.g. NI's LabVIEW), the instantiation of multi_usrp objects may execute in parallel in two different threads. As the RFNoC block instances are shared between the multi_usrp instances, there is a risk that threads racing to configure the initial state of the Tx and Rx chains may operate on inconsistent or incomplete views of the state of the RFNoC blocks that make up the chain, leaving them in an invalid state that leads to client-facing errors. This commit serializes calls to make_rfnoc_device to prevent creating multiple multi_usrp objects in parallel. It also creates a map of existing multi_usrp devices and returns the existing multi_usrp object if it exists.
* multi_usrp: Fix typos in streamer destruction callbackmichael-west2020-11-051-4/+4
| | | | Signed-off-by: michael-west <michael.west@ettus.com>
* multi_usrp: Fix streamer destruction callbackmichael-west2020-10-221-91/+74
| | | | | | | | | | | | | | | | | The streamers were keeping a reference to the multi_usrp object, so the object would not destruct when the user deleted or reset the shared pointer to the object. An error would occur if the user attempted to make the same device and get streamers on it without explicitly deleting the streamers first. This change refactors the code such that the streamer destructor only depends on the existence of a weak_ptr to the underlying rfnoc_graph and a vector of edges returned by the connect function. It checks to see if the graph has been deleted before calling the functions to disconnect the edges. This allows the multi_usrp object and streamer objects to be destructed in any order. Signed-off-by: michael-west <michael.west@ettus.com>
* multi_usrp: Add get_mb_controller() API callCristina Fuentes2020-09-241-27/+32
|
* uhd: Add APIs for getting the available power rangeMartin Braun2020-08-171-0/+12
| | | | | | | | | The previously added APIs for getting/setting power reference levels was missing an option to read back the currently available power levels (minimum and maximum power levels). This adds getters for TX and RX power ranges to multi_usrp and radio_control. The power API is thus now more similar to the gain API, which always had getters for gain ranges.
* multi_usrp: Use multi_usrp::sptrs in graph disconnect lambdasAaron Rossetto2020-08-171-9/+12
|
* multi_usrp: Fix connect/disconnect of RFNoC chainsmichael-west2020-08-041-80/+202
| | | | | | | | | - Added helper methods to connect and disconnect TX and RX chains. - Directly create streamer objects and register local disconnect methods to make sure chains are disconnected and the streamer is removed from the graph when streamers are destroyed. Signed-off-by: michael-west <michael.west@ettus.com>
* multi_usrp: Add get_radio_control() API callMartin Braun2020-07-161-0/+5
| | | | | This is an advanced API call that allows direct underlying access to the radio_control object for RFNoC devices.
* multi_usrp: Assert that edge_lists are non-empty before accessingSteve Czabaniuk2020-06-221-0/+2
| | | | | The edge_list for a given rx/tx chain should never be empty so this explicitly performs that check, which prevents a potential bad access.
* multi_usrp: Various multi_usrp_rfnoc fixesmichael-west2020-06-101-134/+158
| | | | | | | | | | | | | - Fix serial and PID info in get_usrp_xx_info methods - Make defaults match multi_usrp base class - Make support of ALL_MBOARDS and ALL_CHANS consistent across all set methods - Make set/clear_time_commands honor the mboard argument - Fix get_rx_lo_sources() to use rx_chain.block_chan - Fix typos in get_tx_freq_range that were calling rx functions instead of tx Signed-off-by: michael-west <michael.west@ettus.com>
* multi_usrp: Fix get_tx_freq() for RFNoC devicesMartin Braun2020-05-291-2/+8
| | | | | | | | | | | | | | | | get_tx_freq(), unlike get_rx_freq(), would not factor in the DSP frequency. Before, this would happen: >>> U = uhd.usrp.MultiUSRP("type=x300") >>> tr = uhd.types.TuneRequest(1e9, 10e6) >>> res = U.set_tx_freq(tr) >>> res.clipped_rf_freq 1000000000.0 >>> U.get_tx_freq() 1010000000.0 In other words, the TuneResult object was correct, but the return value of get_tx_freq() was not. This fixes the issue.
* multi_usrp: Amend get_usrp_{rx,tx}_info() to include cal keysMartin Braun2020-05-201-0/+12
| | | | | | This adds two more keys to the dictionary return from get_usrp_{rx,tx}_info() which can be used to query the calibration key and serial.
* multi_usrp_rfnoc: Misc fixesMichael West2020-05-121-6/+7
| | | | | | | | | - Change get_master_clock_rate() to return tick rate instead of sample rate - Make warning of incompatible rates conditional so it does not display for first channel Signed-off-by: Michael West <michael.west@ettus.com>
* uhd: Add reference power level API to multi_usrp and radio_controlMartin Braun2020-04-171-0/+36
| | | | | | | | | | | | | | | | | | This adds the following API calls: - multi_usrp::has_{rx,tx}_power_reference() - multi_usrp::set_{rx,tx}_power_reference() - multi_usrp::get_{rx,tx}_power_reference() - radio_control::has_{rx,tx}_power_reference() - radio_control::set_{rx,tx}_power_reference() - radio_control::get_{rx,tx}_power_reference() It also adds a manual page explaining the philosophy of the API. Note that this does not actually add this feature to any device implementation. Calling the new API calls will thus result in `uhd::not_implemented_error` exceptions being thrown. This commit is to lock down the API and ABI.
* multi_usrp: Approximate legacy behaviour for recv_async_msg()Martin Braun2020-04-131-5/+29
| | | | | | | | | | | | | When using multi_usrp with an RFNoC device, the previous behaviour was to throw an exception when calling recv_async_msg() so users would know they're not supposed to call it (calling tx_stream::recv_async_msg is preferred). However, this breaks too many existing applications. Instead, we keep a weak pointer to the streamer, the same way that older devices do, and query the async message from that. This means that calling recv_async_msg() when there are multiple streamers can lead to unexpected behaviour, but that's a general issue with multi_usrp::recv_async_msg() and this way, the RFNoC devices now behave like older devices do.
* multi_usrp_rfnoc: Manually pass sample rate to ddc/ducsteviez2020-04-131-0/+14
| | | | | | | | | | | | | | This adds (and calls) methods to manually pass radio block sample rate to the input/output properties of the ddc/duc during creation of the multi_usrp_rfnoc object. The ddc/duc require this information in order to return valid, possible output/input sample rates in get_rx_rates()/get_tx_rates(). Before, the ddc/duc wouldn't have this rate until the rfnoc_graph had been connected and committed, which happens in get_rx_stream()/get_tx_stream(). Thus, this fixes an issue where a user was unable to query possible sample rates prior to specifying a sample rate and creating a stream.
* multi_usrp_rfnoc: Fix get_rx/tx_rates()steviez2020-04-131-12/+10
| | | | | This replaces incorrect code with the proper function calls to retrieve the range of possible sample rates.
* multi_usrp: Fix ALL_CHAN and ALL_MBOARDS API calls for Gen-3 devicesMartin Braun2020-03-311-105/+64
| | | | | | | | Most of the API calls that default an arg to ALL_CHANS or ALL_MBOARDS were in fact broken. This adds a macro to efficiently mux out API calls that take such wildcard arguments so we don't have to repeat the same loop all over the place, even for those API calls that already correctly implemented wildcards (for consistency).
* multi_usrp: Provide valid return value for multi_usrp::get_device()Martin Braun2020-03-121-3/+51
| | | | | | | | | | | | For RFNoC devices, multi_usrp::get_device() no longer returns a device pointer, rather, it returns a nullptr. This is intentional because access to the underlying device is no longer allowed. However, legacy code can segfault (e.g. portions ofr gr-uhd). This patch returns a faux uhd::device class, which almost mimicks the original behaviour perfectly, by redirecting its class methods back to multi_usrp_rfnoc. The only exception is recv_async_msg(), which requires a TX streamer. This function will always return false now.
* multi_usrp: Add get_tree() API callMartin Braun2020-02-041-0/+5
| | | | | | This allows access to the underlying property tree without having to refer to the device object. Useful for RFNoC objects, where the device object is not accessible.
* multi_usrp: Amend APIs for GPIO source controlMartin Braun2020-01-231-0/+5
| | | | | | | | | | | This adds a new API call to multi_usrp: get_gpio_src_banks(). This returns a list of GPIO banks who's source can be controlled through the motherboard controller. The remaining GPIO source methods' docstrings are improved, to explain the difference between GPIO banks for set_gpio_attr() and set_gpio_src(). The former controls the actual value on a GPIO bank, and the latter who drives it. These can be different banks.
* rfnoc_graph: Modify find_blocks() to sort return valueMartin Braun2019-11-261-35/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | With this patch, the elements of of the return value of find_blocks() are sorted lexicographically (specifically, using uhd::rfnoc::block_id_it::operator<()). The underlying block_container class stores the blocks in an unordered set, so the return value for find_blocks() was always sorted randomly. multi_usrp_rfnoc had to sort the return values every time find_blocks() was used to get a useful return value. Because find_blocks() had no contract for the order of returned blocks, this change simply sorts the return value before returning it. multi_usrp_rfnoc is modified to remove all the sorts that are now superfluous. A good way to see the change is to run uhd_usrp_probe, which will now contain content like this: | _____________________________________________________ | / | | RFNoC blocks on this device: | | | | * 0/DDC#0 | | * 0/DDC#1 | | * 0/DUC#0 | | * 0/DUC#1 | | * 0/DmaFIFO#0 | | * 0/Radio#0 | | * 0/Radio#1 Assuming the blocks don't change, the order of this list will always be the same following this patch. Note that the order is unrelated to the order on the control crossbar, which it never was.
* multi_usrp: Fix GPIO bank selectionMartin Braun2019-11-261-11/+68
| | | | | | | | | | When calling a multi_usrp object like this: usrp->set_gpio_attr("TXB", "CTRL", 0xFFFF); Previously, it would only be able to address daughterboard A. Now, there is a full backward-compatible solution (compatible with 3.15), that will address either daughterboard's GPIOs.
* multi_usrp: Add set_rx_spp() callMartin Braun2019-11-261-1/+16
| | | | | | | | This API call is a more explicit way of setting the spp than passing in an spp value in the args of the stream args when creating streamers. For pre-RFNoC devices, this is done by injecting the spp arg back into the stream args. For RFNoC devices, the set_property() call on the radio is called.
* rfnoc: Use graph_utils in multi_usrp chan generationBrent Stapleton2019-11-261-113/+142
|
* uhd: Replace usage of boost smart pointers with C++11 counterpartsMartin Braun2019-11-261-2/+2
| | | | | | | | | | | | | | | | | | | This removes the following Boost constructs: - boost::shared_ptr, boost::weak_ptr - boost::enable_shared_from_this - boost::static_pointer_cast, boost::dynamic_pointer_cast The appropriate includes were also removed. All C++11 versions of these require #include <memory>. Note that the stdlib and Boost versions have the exact same syntax, they only differ in the namespace (boost vs. std). The modifications were all done using sed, with the exception of boost::scoped_ptr, which was replaced by std::unique_ptr. References to boost::smart_ptr were also removed. boost::intrusive_ptr is not removed in this commit, since it does not have a 1:1 mapping to a C++11 construct.
* rfnoc: Add multi_usrp_rfnoc, modify multi_usrpBrent Stapleton2019-11-261-0/+2217
This adds a separate version of multi_usrp for RFNoC devices. It is compatible with RFNoC devices only, and prefers C++ APIs over property tree usage. The factory of multi_usrp is modified such that it picks the correct version, users of multi_usrp don't care about this change. This also introduces some API changes: - Removing redundant GPIO functions. Now all GPIO control, setting, and readback is done with uint32_t's. - Adding getter/setter for GPIO source. This was done to simplify the other GPIO settings, as the source for each pin is not always a binary. The CTRL mode, for example, can either be ATR or GPIO. However, the source can be controlled by various radios or "PS" or some other source. - Removing the mask from the RFNoC radio controllers' set_gpio_attr(). - Adding state caching to gpio_atr_3000, and a getter for it. Whenever an attribute is set, that value is cached, and can now be retreieved. - Remove low-level register API. Since UHD 3.10, there is no USRP that implements that API. Modifying the filter API in the following ways: - Splitting filter API getter/setter/list into separate RX and TX functions - Adding channel numbers as an argument - The filter name will no longer be a property tree path, but rather a filter name. For RFNoC devices, this will take the form `BLOCK_ID:FILTER_NAME`. For non-RFNoC devices, this will just be the filter name (e.g. `HB_1`) - Removing search mask from listing function. Users can do their own searching Co-Authored-By: Martin Braun <martin.braun@ettus.com>