|
virtual double | set_rate (const double rate)=0 |
| Set the sample rate. More...
|
|
virtual double | get_rate () const =0 |
| Get the sample rate. More...
|
|
virtual uhd::meta_range_t | get_rate_range () const =0 |
| Return a list of valid rates. More...
|
|
virtual size_t | get_spc () const =0 |
| Return the samples per clock (SPC) value of this radio. More...
|
|
virtual uint64_t | get_ticks_now ()=0 |
|
virtual uhd::time_spec_t | get_time_now ()=0 |
|
virtual std::vector< std::string > | get_tx_gain_profile_names (const size_t chan) const =0 |
|
virtual std::vector< std::string > | get_rx_gain_profile_names (const size_t chan) const =0 |
|
virtual void | set_tx_gain_profile (const std::string &profile, const size_t chan)=0 |
|
virtual void | set_rx_gain_profile (const std::string &profile, const size_t chan)=0 |
|
virtual std::string | get_tx_gain_profile (const size_t chan) const =0 |
|
virtual std::string | get_rx_gain_profile (const size_t chan) const =0 |
|
virtual void | set_tx_dc_offset (const std::complex< double > &offset, size_t chan)=0 |
|
virtual meta_range_t | get_tx_dc_offset_range (size_t chan) const =0 |
|
virtual void | set_tx_iq_balance (const std::complex< double > &correction, size_t chan)=0 |
|
virtual void | set_rx_dc_offset (const bool enb, size_t chan=ALL_CHANS)=0 |
|
virtual void | set_rx_dc_offset (const std::complex< double > &offset, size_t chan)=0 |
|
virtual meta_range_t | get_rx_dc_offset_range (size_t chan) const =0 |
|
virtual void | set_rx_iq_balance (const bool enb, size_t chan)=0 |
|
virtual void | set_rx_iq_balance (const std::complex< double > &correction, size_t chan)=0 |
|
virtual std::vector< std::string > | get_gpio_banks () const =0 |
|
virtual void | set_gpio_attr (const std::string &bank, const std::string &attr, const uint32_t value)=0 |
|
virtual uint32_t | get_gpio_attr (const std::string &bank, const std::string &attr)=0 |
|
virtual std::vector< std::string > | get_rx_sensor_names (size_t chan) const =0 |
|
virtual uhd::sensor_value_t | get_rx_sensor (const std::string &name, size_t chan)=0 |
|
virtual std::vector< std::string > | get_tx_sensor_names (size_t chan) const =0 |
|
virtual uhd::sensor_value_t | get_tx_sensor (const std::string &name, size_t chan)=0 |
|
virtual void | issue_stream_cmd (const uhd::stream_cmd_t &stream_cmd, const size_t port)=0 |
|
virtual void | enable_rx_timestamps (const bool enable, const size_t chan)=0 |
|
virtual std::string | get_slot_name () const =0 |
| Returns this radio's slot name (typically "A" or "B") More...
|
|
virtual size_t | get_chan_from_dboard_fe (const std::string &fe, const uhd::direction_t direction) const =0 |
| Return the channel that corresponds to a frontend's name. More...
|
|
virtual std::string | get_dboard_fe_from_chan (const size_t chan, const uhd::direction_t direction) const =0 |
| Return the frontend name for a channel index. More...
|
|
virtual std::string | get_fe_name (const size_t chan, const uhd::direction_t direction) const =0 |
| Return the name of the frontend, as given by the dboard driver. More...
|
|
virtual void | set_db_eeprom (const uhd::eeprom_map_t &db_eeprom)=0 |
| Update the daughterboard EEPROM. More...
|
|
virtual uhd::eeprom_map_t | get_db_eeprom ()=0 |
| Return the content of the daughterboard EEPROM. More...
|
|
| ~noc_block_base () override |
|
std::string | get_unique_id () const override |
| Unique ID for an RFNoC block is its block ID. More...
|
|
size_t | get_num_input_ports () const override |
|
size_t | get_num_output_ports () const override |
|
noc_id_t | get_noc_id () const |
|
const block_id_t & | get_block_id () const |
|
double | get_tick_rate () const |
|
size_t | get_mtu (const res_source_info &edge) |
|
size_t | get_chdr_hdr_len (const bool account_for_ts=true) const |
|
size_t | get_max_payload_size (const res_source_info &edge, const bool account_for_ts=true) |
|
uhd::device_addr_t | get_block_args () const |
|
uhd::property_tree::sptr & | get_tree () const |
| Return a reference to this block's subtree. More...
|
|
uhd::property_tree::sptr & | get_tree () |
| Return a reference to this block's subtree (non-const version) More...
|
|
std::shared_ptr< mb_controller > | get_mb_controller () |
|
| node_t () |
|
virtual | ~node_t () |
|
std::vector< std::string > | get_property_ids () const |
|
template<typename prop_data_t > |
void | set_property (const std::string &id, const prop_data_t &val, const size_t instance=0) |
|
void | set_properties (const uhd::device_addr_t &props, const size_t instance=0) |
|
template<typename prop_data_t > |
const prop_data_t & | get_property (const std::string &id, const size_t instance=0) |
|
virtual void | set_command_time (uhd::time_spec_t time, const size_t instance) |
|
virtual uhd::time_spec_t | get_command_time (const size_t instance) const |
|
virtual void | clear_command_time (const size_t instance) |
|
| register_iface_holder (register_iface::sptr reg) |
|
virtual | ~register_iface_holder ()=default |
|
register_iface & | regs () |
|
virtual | ~core_iface ()=default |
|
virtual std::string | get_tx_antenna (const size_t chan) const =0 |
|
virtual std::vector< std::string > | get_tx_antennas (const size_t chan) const =0 |
|
virtual void | set_tx_antenna (const std::string &ant, const size_t chan)=0 |
|
virtual std::string | get_rx_antenna (const size_t chan) const =0 |
|
virtual std::vector< std::string > | get_rx_antennas (const size_t chan) const =0 |
|
virtual void | set_rx_antenna (const std::string &ant, const size_t chan)=0 |
|
virtual double | get_tx_frequency (const size_t chan)=0 |
|
virtual double | set_tx_frequency (const double freq, size_t chan)=0 |
|
virtual void | set_tx_tune_args (const uhd::device_addr_t &args, const size_t chan)=0 |
|
virtual uhd::freq_range_t | get_tx_frequency_range (const size_t chan) const =0 |
|
virtual double | get_rx_frequency (const size_t chan)=0 |
|
virtual double | set_rx_frequency (const double freq, const size_t chan)=0 |
|
virtual void | set_rx_tune_args (const uhd::device_addr_t &args, const size_t chan)=0 |
|
virtual uhd::freq_range_t | get_rx_frequency_range (const size_t chan) const =0 |
|
virtual std::vector< std::string > | get_tx_gain_names (const size_t chan) const =0 |
|
virtual uhd::gain_range_t | get_tx_gain_range (const size_t chan) const =0 |
|
virtual uhd::gain_range_t | get_tx_gain_range (const std::string &name, const size_t chan) const =0 |
|
virtual double | get_tx_gain (const size_t chan)=0 |
|
virtual double | get_tx_gain (const std::string &name, const size_t chan)=0 |
|
virtual double | set_tx_gain (const double gain, const size_t chan)=0 |
|
virtual double | set_tx_gain (const double gain, const std::string &name, const size_t chan)=0 |
|
virtual std::vector< std::string > | get_rx_gain_names (const size_t chan) const =0 |
|
virtual uhd::gain_range_t | get_rx_gain_range (const size_t chan) const =0 |
|
virtual uhd::gain_range_t | get_rx_gain_range (const std::string &name, const size_t chan) const =0 |
|
virtual double | get_rx_gain (const size_t chan)=0 |
|
virtual double | get_rx_gain (const std::string &name, const size_t chan)=0 |
|
virtual double | set_rx_gain (const double gain, const size_t chan)=0 |
|
virtual double | set_rx_gain (const double gain, const std::string &name, const size_t chan)=0 |
|
virtual void | set_rx_agc (const bool enable, const size_t chan)=0 |
|
virtual meta_range_t | get_tx_bandwidth_range (size_t chan) const =0 |
|
virtual double | get_tx_bandwidth (const size_t chan)=0 |
|
virtual double | set_tx_bandwidth (const double bandwidth, const size_t chan)=0 |
|
virtual meta_range_t | get_rx_bandwidth_range (size_t chan) const =0 |
|
virtual double | get_rx_bandwidth (const size_t chan)=0 |
|
virtual double | set_rx_bandwidth (const double bandwidth, const size_t chan)=0 |
|
virtual std::vector< std::string > | get_rx_lo_names (const size_t chan) const =0 |
|
virtual std::vector< std::string > | get_rx_lo_sources (const std::string &name, const size_t chan) const =0 |
|
virtual freq_range_t | get_rx_lo_freq_range (const std::string &name, const size_t chan) const =0 |
|
virtual void | set_rx_lo_source (const std::string &src, const std::string &name, const size_t chan)=0 |
|
virtual std::string | get_rx_lo_source (const std::string &name, const size_t chan)=0 |
|
virtual void | set_rx_lo_export_enabled (bool enabled, const std::string &name, const size_t chan)=0 |
|
virtual bool | get_rx_lo_export_enabled (const std::string &name, const size_t chan)=0 |
|
virtual double | set_rx_lo_freq (double freq, const std::string &name, const size_t chan)=0 |
|
virtual double | get_rx_lo_freq (const std::string &name, const size_t chan)=0 |
|
virtual std::vector< std::string > | get_tx_lo_names (const size_t chan) const =0 |
|
virtual std::vector< std::string > | get_tx_lo_sources (const std::string &name, const size_t chan) const =0 |
|
virtual freq_range_t | get_tx_lo_freq_range (const std::string &name, const size_t chan)=0 |
|
virtual void | set_tx_lo_source (const std::string &src, const std::string &name, const size_t chan)=0 |
|
virtual std::string | get_tx_lo_source (const std::string &name, const size_t chan)=0 |
|
virtual void | set_tx_lo_export_enabled (const bool enabled, const std::string &name, const size_t chan)=0 |
|
virtual bool | get_tx_lo_export_enabled (const std::string &name, const size_t chan)=0 |
|
virtual double | set_tx_lo_freq (const double freq, const std::string &name, const size_t chan)=0 |
|
virtual double | get_tx_lo_freq (const std::string &name, const size_t chan)=0 |
|
virtual | ~power_reference_iface ()=default |
|
virtual bool | has_rx_power_reference (const size_t chan=0)=0 |
|
virtual void | set_rx_power_reference (const double power_dbm, const size_t chan=0)=0 |
|
virtual double | get_rx_power_reference (const size_t chan=0)=0 |
|
virtual std::vector< std::string > | get_rx_power_ref_keys (const size_t chan=0)=0 |
|
virtual meta_range_t | get_rx_power_range (const size_t chan)=0 |
|
virtual bool | has_tx_power_reference (const size_t chan=0)=0 |
|
virtual void | set_tx_power_reference (const double power_dbm, const size_t chan=0)=0 |
|
virtual double | get_tx_power_reference (const size_t chan=0)=0 |
|
virtual std::vector< std::string > | get_tx_power_ref_keys (const size_t chan=0)=0 |
|
virtual meta_range_t | get_tx_power_range (const size_t chan)=0 |
|
virtual | ~discoverable_feature_getter_iface ()=default |
|
template<typename T > |
T & | get_feature () |
| Retrieves a feature of the specified type. More...
|
|
template<typename T > |
bool | has_feature () |
| Determines whether a given feature exists. More...
|
|
virtual std::vector< std::string > | enumerate_features ()=0 |
| Enumerate all discoverable features present on the device. More...
|
|
Parent class for radio block controllers
Overrun Handling
When the radio block on the FPGA detects an overrun (i.e., a buffer filled up and was not emptied fast enough), the radio block sends an asynchronous message to the radio block controller to notify the software of an overrun.
When streaming samples into a user application, the radio block is however not the recipient of the streaming data. Rather, the recipient is a streamer object.
Because the topology of the RFNoC graph is not known at compile time, overruns are handled with a special protocol. As an example, assume that multiple radios are streaming to the host via a custom DSP block, and that Radio0 has detected an overrun:
┌─────────┐ O
│ Radio0 ├──┐
└─────────┘ │ ┌──────────────────┐ ┌─────────────┐
├───> Custom DSP Block ├────> RX Streamer │
┌─────────┐ │ └──────────────────┘ └─────────────┘
│ Radio1 ├──┘
└─────────┘
In all cases, when the radio block controller is notified of an overrun by the FPGA, it will log a 'O' character (using UHD_LOG_FASTPATH()) and post an uhd::rfnoc::rx_event_action_info object downstream. The custom DSP block may choose to act upon the overrun notification by registering an event handler for such an action message, or it can ignore the message, in which case RFNoC will forward the message downstream to the RX Streamer. If the user is calling uhd::rx_streamer::recv(), then the overrun will be declared as part of the uhd::rx_metadata_t object.
Note that the FPGA will immediately stop streaming when overrun occurs, as it has nowhere to put the received sample data. However, there is a special case where UHD performs a more elaborate overrun handling: When the user requested continuous streaming data (the stream command mode was stream_cmd_t::STREAM_MODE_START_CONTINUOUS), the streamer will attempt to restart the stream. This restarting of the stream is implemented as handshake between the streamer and the radio blocks.
In the example above, the following steps will be taken:
- At some point, the application starts requests a continuous stream from the radios. The radio block controllers will take a note of this continuous streaming state.
- Now the overrun occurs in Radio0. It will send an overrun notification downstream. We assume that the custom DSP block is not handling the message. The rx_event_action_info object with the overrun information is then delivered to the RX Streamer. This object also contains a flag whether or not the radio block controller was in continuous streaming mode.
- The RX Streamer will switch to overrun handling mode. This is to prevent it from overreacting from other overrun messages (e.g., Radio1 could be stalled by Radio0 and then also send an overrun message).
- The RX Streamer then sends a stop stream command to all upstream blocks. This is to ensure that other radios (in this example, Radio1) are no longer streaming.
- At some point, the RX streamer will run out of data to receive (because the upstream radios have either stopped due to an overrun, or because they were told to stop by the streamer). When this happens, the rx_streamer::recv() call will flag an overrun.
- If the overrun happened during continuous streaming, the RX streamer will now issue a restart request to the radio that first flagged an overrun (in this example, Radio0) by posting another uhd::rfnoc::action_info object.
- When Radio0 receives the restart request, it will send a new continuous stream command downstream to the RX streamer, with a timestamp that is sufficiently far enough in the future.
- The RX streamer sends the start-stream command back upstream to all radios. This ensures that all upstream radios start streaming at the same time. It also leaves overrun handling mode.
- Note that if either the radio block controller or the RX streamer receive a stop-stream command from outside, this overrun handling mode is interrupted and there will be no further attempts to restart the radio.