1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
|
//
// Copyright 2011,2013-2014 Ettus Research LLC
// Copyright 2018 Ettus Research, a National Instruments Company
//
// SPDX-License-Identifier: GPL-3.0-or-later
//
#ifndef INCLUDED_LIBUHD_USRP_DBOARD_DB_WBX_COMMON_HPP
#define INCLUDED_LIBUHD_USRP_DBOARD_DB_WBX_COMMON_HPP
#include <uhd/types/device_addr.hpp>
#include <uhdlib/usrp/common/adf435x.hpp>
// LO Related
#define ADF435X_CE (1 << 3)
#define ADF435X_PDBRF (1 << 2)
#define ADF435X_MUXOUT (1 << 1) // INPUT!!!
#define LOCKDET_MASK (1 << 0) // INPUT!!!
// TX IO Pins
#define TX_PUP_5V (1 << 7) // enables 5.0V power supply
#define TX_PUP_3V (1 << 6) // enables 3.3V supply
#define TXMOD_EN (1 << 4) // on UNIT_TX, 1 enables TX Modulator
// RX IO Pins
#define RX_PUP_5V (1 << 7) // enables 5.0V power supply
#define RX_PUP_3V (1 << 6) // enables 3.3V supply
#define RXBB_PDB (1 << 4) // on UNIT_RX, 1 powers up RX baseband
// TX Attenuator Pins (v3 only)
#define TX_ATTN_16 (1 << 14)
#define TX_ATTN_8 (1 << 5)
#define TX_ATTN_4 (1 << 4)
#define TX_ATTN_2 (1 << 3)
#define TX_ATTN_1 (1 << 1)
#define TX_ATTN_MASK \
(TX_ATTN_16 | TX_ATTN_8 | TX_ATTN_4 | TX_ATTN_2 \
| TX_ATTN_1) // valid bits of TX Attenuator Control
#define RX_ATTN_SHIFT 8 // lsb of RX Attenuator Control
#define RX_ATTN_MASK (63 << RX_ATTN_SHIFT) // valid bits of RX Attenuator Control
// Mixer functions
#define TX_MIXER_ENB \
(TXMOD_EN \
| ADF435X_PDBRF) // for v3, TXMOD_EN tied to ADF435X_PDBRF rather than separate
#define TX_MIXER_DIS 0
#define RX_MIXER_ENB (RXBB_PDB | ADF435X_PDBRF)
#define RX_MIXER_DIS 0
// Power functions
#define TX_POWER_UP (TX_PUP_5V | TX_PUP_3V) // high enables power supply
#define TX_POWER_DOWN 0
#define RX_POWER_UP (RX_PUP_5V | RX_PUP_3V | ADF435X_CE) // high enables power supply
#define RX_POWER_DOWN 0
#include <uhd/types/dict.hpp>
#include <uhd/types/ranges.hpp>
#include <uhd/types/sensors.hpp>
#include <uhd/usrp/dboard_base.hpp>
#include <uhd/utils/log.hpp>
#include <uhd/utils/static.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/format.hpp>
#include <boost/math/special_functions/round.hpp>
#include <functional>
#include <memory>
namespace uhd { namespace usrp {
/***********************************************************************
* The WBX Common dboard constants
**********************************************************************/
static const uhd::dict<std::string, gain_range_t> wbx_rx_gain_ranges =
boost::assign::map_list_of("PGA0", gain_range_t(0, 31.5, 0.5));
static const freq_range_t wbx_tx_lo_5dbm =
boost::assign::list_of(range_t(0.05e9, 1.7e9))(range_t(1.9e9, 2.2e9));
static const freq_range_t wbx_tx_lo_m1dbm = boost::assign::list_of(range_t(1.7e9, 1.9e9));
static const freq_range_t wbx_rx_lo_5dbm = boost::assign::list_of(range_t(0.05e9, 1.4e9));
static const freq_range_t wbx_rx_lo_2dbm = boost::assign::list_of(range_t(1.4e9, 2.2e9));
/***********************************************************************
* The WBX dboard base class
**********************************************************************/
class wbx_base : public xcvr_dboard_base
{
public:
wbx_base(ctor_args_t args);
~wbx_base(void) override;
protected:
virtual double set_rx_gain(double gain, const std::string& name);
virtual void set_rx_enabled(bool enb);
/*!
* Get the lock detect status of the LO.
*
* This operation is identical for all versions of the WBX board.
* \param unit which unit rx or tx
* \return true for locked
*/
virtual sensor_value_t get_locked(dboard_iface::unit_t unit);
/*!
* Version-agnostic ABC that wraps version-specific implementations of the
* WBX base daughterboard.
*
* This class is an abstract base class, and thus is impossible to
* instantiate.
*/
class wbx_versionx
{
public:
wbx_versionx() : self_base(NULL) {}
virtual ~wbx_versionx(void) {}
virtual double set_tx_gain(double gain, const std::string& name) = 0;
virtual void set_tx_enabled(bool enb) = 0;
virtual double set_lo_freq(dboard_iface::unit_t unit, double target_freq) = 0;
/*! This is the registered instance of the wrapper class, wbx_base. */
wbx_base* self_base;
property_tree::sptr get_rx_subtree(void)
{
return self_base->get_rx_subtree();
}
property_tree::sptr get_tx_subtree(void)
{
return self_base->get_tx_subtree();
}
adf435x_iface::sptr _txlo;
adf435x_iface::sptr _rxlo;
void write_lo_regs(dboard_iface::unit_t unit, const std::vector<uint32_t>& regs);
};
/*!
* Version 2 of the WBX Daughterboard
*
* Basically the original release of the DB.
*/
class wbx_version2 : public wbx_versionx
{
public:
wbx_version2(wbx_base* _self_wbx_base);
~wbx_version2(void) override;
double set_tx_gain(double gain, const std::string& name) override;
void set_tx_enabled(bool enb) override;
double set_lo_freq(dboard_iface::unit_t unit, double target_freq) override;
};
/*!
* Version 3 of the WBX Daughterboard
*
* Fixed a problem with the AGC from Version 2.
*/
class wbx_version3 : public wbx_versionx
{
public:
wbx_version3(wbx_base* _self_wbx_base);
~wbx_version3(void) override;
double set_tx_gain(double gain, const std::string& name) override;
void set_tx_enabled(bool enb) override;
double set_lo_freq(dboard_iface::unit_t unit, double target_freq) override;
};
/*!
* Version 4 of the WBX Daughterboard
*
* Upgrades the Frequnecy Synthensizer from ADF4350 to ADF4351.
*/
class wbx_version4 : public wbx_versionx
{
public:
wbx_version4(wbx_base* _self_wbx_base);
~wbx_version4(void) override;
double set_tx_gain(double gain, const std::string& name) override;
void set_tx_enabled(bool enb) override;
double set_lo_freq(dboard_iface::unit_t unit, double target_freq) override;
};
/*!
* Handle to the version-specific implementation of the WBX.
*
* Since many of this class's functions are dependent on the version of the
* WBX board, this class will instantiate an object of the appropriate
* wbx_version_* subclass, and invoke any relevant functions through that
* object. This pointer is set to the proper object at construction time.
*/
typedef std::shared_ptr<wbx_versionx> wbx_versionx_sptr;
wbx_versionx_sptr db_actual;
uhd::dict<std::string, double> _tx_gains, _rx_gains;
bool _rx_enabled, _tx_enabled;
};
}} // namespace uhd::usrp
#endif /* INCLUDED_LIBUHD_USRP_DBOARD_DB_WBX_COMMON_HPP */
|