aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/x300/x300_impl.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/usrp/x300/x300_impl.hpp')
-rw-r--r--host/lib/usrp/x300/x300_impl.hpp57
1 files changed, 41 insertions, 16 deletions
diff --git a/host/lib/usrp/x300/x300_impl.hpp b/host/lib/usrp/x300/x300_impl.hpp
index 1fb3676a0..259ea253d 100644
--- a/host/lib/usrp/x300/x300_impl.hpp
+++ b/host/lib/usrp/x300/x300_impl.hpp
@@ -82,8 +82,8 @@ static const double X300_DEFAULT_SYSREF_RATE = 10e6;
#define X300_XB_DST_E0 0
#define X300_XB_DST_E1 1
-#define X300_XB_DST_R0 2
-#define X300_XB_DST_R1 3
+#define X300_XB_DST_R0 2 // Radio 0 -> Slot A
+#define X300_XB_DST_R1 3 // Radio 1 -> Slot B
#define X300_XB_DST_CE0 4
#define X300_XB_DST_CE1 5
#define X300_XB_DST_CE2 5
@@ -191,12 +191,13 @@ private:
i2c_core_100_wb32::sptr zpu_i2c;
//perifs in each radio
- radio_perifs_t radio_perifs[2];
+ radio_perifs_t radio_perifs[2]; //!< This is hardcoded s.t. radio_perifs[0] points to slot A and [1] to B
uhd::usrp::dboard_eeprom_t db_eeproms[8];
-
- //per mboard frontend mapping
- uhd::usrp::subdev_spec_t rx_fe_map;
- uhd::usrp::subdev_spec_t tx_fe_map;
+ //! Return the index of a radio component, given a slot name. This means DSPs, radio_perifs
+ size_t get_radio_index(const std::string &slot_name) {
+ UHD_ASSERT_THROW(slot_name == "A" or slot_name == "B");
+ return slot_name == "A" ? 0 : 1;
+ }
//other perifs on mboard
x300_clock_ctrl::sptr clock;
@@ -204,14 +205,16 @@ private:
gpio_core_200::sptr fp_gpio;
//clock control register bits
- int clock_control_regs__clock_source;
- int clock_control_regs__pps_select;
- int clock_control_regs__pps_out_enb;
- int clock_control_regs__tcxo_enb;
- int clock_control_regs__gpsdo_pwr;
+ int clock_control_regs_clock_source;
+ int clock_control_regs_pps_select;
+ int clock_control_regs_pps_out_enb;
+ int clock_control_regs_tcxo_enb;
+ int clock_control_regs_gpsdo_pwr;
//which FPGA image is loaded
std::string loaded_fpga_image;
+
+ size_t hw_rev;
};
std::vector<mboard_members_t> _mb;
@@ -222,7 +225,20 @@ private:
void register_loopback_self_test(uhd::wb_iface::sptr iface);
- void setup_radio(const size_t, const size_t which_radio, const std::string &db_name);
+ /*! \brief Initialize the radio component on a given slot.
+ *
+ * Call this function once per slot (A and B) and motherboard to initialize all the radio components.
+ * This will:
+ * - Reset and init DACs and ADCs
+ * - Setup controls for DAC, ADC, SPI and LEDs
+ * - Self test ADC
+ * - Sync DACs (for MIMO)
+ * - Initialize the property tree for control objects etc. (gain, rate...)
+ *
+ * \param mb_i Motherboard index
+ * \param slot_name Slot name (A or B).
+ */
+ void setup_radio(const size_t, const std::string &slot_name);
size_t _sid_framer;
struct sid_config_t
@@ -253,7 +269,7 @@ private:
size_t recv_frame_size;
size_t send_frame_size;
};
- frame_size_t max_frame_sizes;
+ frame_size_t _max_frame_sizes;
/*!
* Automatically determine the maximum frame size available by sending a UDP packet
@@ -288,8 +304,15 @@ private:
void set_rx_fe_corrections(const uhd::fs_path &mb_path, const std::string &fe_name, const double lo_freq);
- void update_rx_subdev_spec(const size_t, const uhd::usrp::subdev_spec_t &spec);
- void update_tx_subdev_spec(const size_t, const uhd::usrp::subdev_spec_t &spec);
+ /*! Update the IQ MUX settings for the radio peripheral according to given subdev spec.
+ *
+ * Also checks if the given subdev is valid for this device and updates the channel to DSP mapping.
+ *
+ * \param tx_rx "tx" or "rx", depending where you're setting the subdev spec
+ * \param mb_i Mainboard index number.
+ * \param spec Subdev spec
+ */
+ void update_subdev_spec(const std::string &tx_rx, const size_t mb_i, const uhd::usrp::subdev_spec_t &spec);
void set_tick_rate(mboard_members_t &, const double);
void update_tick_rate(mboard_members_t &, const double);
@@ -302,6 +325,8 @@ private:
void update_time_source(mboard_members_t&, const std::string &);
uhd::sensor_value_t get_ref_locked(uhd::wb_iface::sptr);
+ void wait_for_ref_locked(uhd::wb_iface::sptr, double timeout = 0.0);
+ bool is_pps_present(uhd::wb_iface::sptr);
void set_db_eeprom(uhd::i2c_iface::sptr i2c, const size_t, const uhd::usrp::dboard_eeprom_t &);
void set_mb_eeprom(uhd::i2c_iface::sptr i2c, const uhd::usrp::mboard_eeprom_t &);