diff options
Diffstat (limited to 'mpm')
-rw-r--r-- | mpm/include/mpm/ad937x/ad937x_ctrl.hpp | 4 | ||||
-rw-r--r-- | mpm/lib/mykonos/ad937x_ctrl.cpp | 13 | ||||
-rw-r--r-- | mpm/lib/mykonos/ad937x_device.cpp | 88 | ||||
-rw-r--r-- | mpm/lib/mykonos/ad937x_device.hpp | 6 | ||||
-rw-r--r-- | mpm/lib/mykonos/config/ad937x_config_t.cpp | 22 | ||||
-rw-r--r-- | mpm/lib/mykonos/config/ad937x_config_t.hpp | 4 | ||||
-rw-r--r-- | mpm/lib/mykonos/config/ad937x_default_config.hpp | 2 | ||||
-rw-r--r-- | mpm/python/usrp_mpm/dboard_manager/magnesium.py | 6 |
8 files changed, 135 insertions, 10 deletions
diff --git a/mpm/include/mpm/ad937x/ad937x_ctrl.hpp b/mpm/include/mpm/ad937x/ad937x_ctrl.hpp index 21a6b2892..198e4e2d8 100644 --- a/mpm/include/mpm/ad937x/ad937x_ctrl.hpp +++ b/mpm/include/mpm/ad937x/ad937x_ctrl.hpp @@ -247,6 +247,9 @@ public: */ virtual bool get_lo_locked(const std::string &which) = 0; + //! set master clock rate + virtual void set_master_clock_rate(const double rate) = 0; + //! set the FIR filter for the frontend which virtual void set_fir(const std::string &which, int8_t gain, const std::vector<int16_t> & fir) = 0; @@ -277,6 +280,7 @@ void export_mykonos(){ LIBMPM_BOOST_PREAMBLE("ad937x") using namespace mpm::chips; bp::class_<ad937x_ctrl, boost::noncopyable, std::shared_ptr<ad937x_ctrl>>("ad937x_ctrl", bp::no_init) + .def("set_master_clock_rate", &ad937x_ctrl::set_master_clock_rate) .def("begin_initialization", &ad937x_ctrl::begin_initialization) .def("finish_initialization", &ad937x_ctrl::finish_initialization) .def("update_rx_lo_source", &ad937x_ctrl::update_rx_lo_source) diff --git a/mpm/lib/mykonos/ad937x_ctrl.cpp b/mpm/lib/mykonos/ad937x_ctrl.cpp index 8aeb5b599..d6062c228 100644 --- a/mpm/lib/mykonos/ad937x_ctrl.cpp +++ b/mpm/lib/mykonos/ad937x_ctrl.cpp @@ -431,7 +431,6 @@ public: virtual void set_fir(const std::string &which, int8_t gain, const std::vector<int16_t> & fir) { auto dir = _get_direction_from_antenna(which); - auto chain = _get_chain_from_antenna(which); auto lengths = _get_valid_fir_lengths(which); if (std::find(lengths.begin(), lengths.end(), fir.size()) == lengths.end()) @@ -440,16 +439,15 @@ public: } std::lock_guard<std::mutex> lock(*spi_mutex); - device.set_fir(dir, chain, gain, fir); + device.set_fir(dir, gain, fir); } virtual std::vector<int16_t> get_fir(const std::string &which, int8_t &gain) { auto dir = _get_direction_from_antenna(which); - auto chain = _get_chain_from_antenna(which); std::lock_guard<std::mutex> lock(*spi_mutex); - return device.get_fir(dir, chain, gain); + return device.get_fir(dir, gain); } virtual int16_t get_temperature() @@ -458,6 +456,13 @@ public: return device.get_temperature(); } + virtual void set_master_clock_rate(const double rate) + { + std::lock_guard<std::mutex> lock(*spi_mutex); + // FIXME: Add check for valid rates + device.set_master_clock_rate(rate); + } + virtual void set_enable_gain_pins(const std::string &which, bool enable) { auto dir = _get_direction_from_antenna(which); diff --git a/mpm/lib/mykonos/ad937x_device.cpp b/mpm/lib/mykonos/ad937x_device.cpp index 4b7addc80..1d4a80c48 100644 --- a/mpm/lib/mykonos/ad937x_device.cpp +++ b/mpm/lib/mykonos/ad937x_device.cpp @@ -19,6 +19,8 @@ #include "adi/mykonos.h" #include "adi/mykonos_gpio.h" #include "adi/mykonos_debug/mykonos_dbgjesd.h" +#include "config/ad937x_config_t.hpp" +#include "config/ad937x_default_config.hpp" #include <boost/format.hpp> #include <functional> @@ -643,7 +645,6 @@ void ad937x_device::set_agc_mode(const direction_t direction, const gain_mode_t void ad937x_device::set_fir( const direction_t direction, - const chain_t chain, int8_t gain, const std::vector<int16_t> & fir) { @@ -778,7 +779,6 @@ double ad937x_device::get_gain(const direction_t direction, const chain_t chain) std::vector<int16_t> ad937x_device::get_fir( const direction_t direction, - const chain_t chain, int8_t &gain) { switch (direction) @@ -800,3 +800,87 @@ int16_t ad937x_device::get_temperature() return status.tempCode; } + +void ad937x_device::set_master_clock_rate(const double rate) +{ + if (rate == 125000000) + { + mykonos_config.device->clocks->deviceClock_kHz = 125000; + mykonos_config.device->clocks->clkPllVcoFreq_kHz = 10000000; + mykonos_config.device->clocks->clkPllVcoDiv = ::VCODIV_2; + set_fir(TX_DIRECTION, + mykonos_config.device->tx->txProfile->txFir->gain_dB, + std::vector<int16_t>(ad937x_config_t::DEFAULT_TX_FIR, + ad937x_config_t::DEFAULT_TX_FIR + ad937x_config_t::DEFAULT_TX_FIR_SIZE) + ); + mykonos_config.device->tx->txProfile->iqRate_kHz = 125000; + mykonos_config.device->tx->txProfile->primarySigBandwidth_Hz = 20000000; + mykonos_config.device->tx->txProfile->rfBandwidth_Hz = 102000000; + mykonos_config.device->tx->txProfile->txDac3dBCorner_kHz = 722000; + mykonos_config.device->tx->txProfile->txBbf3dBCorner_kHz = 51000; + + set_fir(RX_DIRECTION, + mykonos_config.device->rx->rxProfile->rxFir->gain_dB, + std::vector<int16_t>(ad937x_config_t::DEFAULT_RX_FIR, + ad937x_config_t::DEFAULT_RX_FIR + ad937x_config_t::DEFAULT_RX_FIR_SIZE) + ); + + mykonos_config.device->rx->rxProfile->iqRate_kHz = 125000; + mykonos_config.device->rx->rxProfile->rxBbf3dBCorner_kHz = 102000; + + mykonos_config.device->obsRx->orxProfile->iqRate_kHz = 125000; + mykonos_config.device->obsRx->orxProfile->rxBbf3dBCorner_kHz = 102000; + } else if (rate == 122880000){ + mykonos_config.device->clocks->deviceClock_kHz = 122880; + mykonos_config.device->clocks->clkPllVcoFreq_kHz = 9830400; + mykonos_config.device->clocks->clkPllVcoDiv = ::VCODIV_2; + set_fir(TX_DIRECTION, + mykonos_config.device->tx->txProfile->txFir->gain_dB, + std::vector<int16_t>(ad937x_config_t::DEFAULT_TX_FIR, + ad937x_config_t::DEFAULT_TX_FIR + ad937x_config_t::DEFAULT_TX_FIR_SIZE) + ); + mykonos_config.device->tx->txProfile->iqRate_kHz = 122880; + mykonos_config.device->tx->txProfile->primarySigBandwidth_Hz = 20000000; + mykonos_config.device->tx->txProfile->rfBandwidth_Hz = 100000000; + mykonos_config.device->tx->txProfile->txDac3dBCorner_kHz = 710539; + mykonos_config.device->tx->txProfile->txBbf3dBCorner_kHz = 50000; + + set_fir(RX_DIRECTION, + mykonos_config.device->rx->rxProfile->rxFir->gain_dB, + std::vector<int16_t>(ad937x_config_t::DEFAULT_RX_FIR, + ad937x_config_t::DEFAULT_RX_FIR + ad937x_config_t::DEFAULT_RX_FIR_SIZE) + ); + mykonos_config.device->rx->rxProfile->iqRate_kHz = 122880; + mykonos_config.device->rx->rxProfile->rxBbf3dBCorner_kHz = 100000; + + mykonos_config.device->obsRx->orxProfile->iqRate_kHz = 122880; + mykonos_config.device->obsRx->orxProfile->rxBbf3dBCorner_kHz = 100000; + } else if (rate == 153660000){ + mykonos_config.device->clocks->deviceClock_kHz = 153600; + mykonos_config.device->clocks->clkPllVcoFreq_kHz = 6144000; + mykonos_config.device->clocks->clkPllVcoDiv = ::VCODIV_1; + set_fir(TX_DIRECTION, + mykonos_config.device->tx->txProfile->txFir->gain_dB, + std::vector<int16_t>(ad937x_config_t::DEFAULT_TX_FIR_15366, + ad937x_config_t::DEFAULT_TX_FIR_15366 + ad937x_config_t::DEFAULT_TX_FIR_SIZE) + ); + mykonos_config.device->tx->txProfile->iqRate_kHz = 153600; + mykonos_config.device->tx->txProfile->primarySigBandwidth_Hz = 10000000; + mykonos_config.device->tx->txProfile->rfBandwidth_Hz = 100000000; + mykonos_config.device->tx->txProfile->txDac3dBCorner_kHz = 100000; + mykonos_config.device->tx->txProfile->txBbf3dBCorner_kHz = 100000; + + set_fir(RX_DIRECTION, + mykonos_config.device->rx->rxProfile->rxFir->gain_dB, + std::vector<int16_t>(ad937x_config_t::DEFAULT_RX_FIR_15366, + ad937x_config_t::DEFAULT_RX_FIR_15366 + ad937x_config_t::DEFAULT_RX_FIR_SIZE) + ); + mykonos_config.device->rx->rxProfile->iqRate_kHz = 153600; + mykonos_config.device->rx->rxProfile->rxBbf3dBCorner_kHz = 100000; + + mykonos_config.device->obsRx->orxProfile->iqRate_kHz = 153600; + mykonos_config.device->obsRx->orxProfile->rxBbf3dBCorner_kHz = 225000; + } else { + MPM_THROW_INVALID_CODE_PATH(); + } +} diff --git a/mpm/lib/mykonos/ad937x_device.hpp b/mpm/lib/mykonos/ad937x_device.hpp index c816680c4..60f78d2e5 100644 --- a/mpm/lib/mykonos/ad937x_device.hpp +++ b/mpm/lib/mykonos/ad937x_device.hpp @@ -51,6 +51,7 @@ public: mpm::types::regs_iface* iface, mpm::ad937x::gpio::gain_pins_t gain_pins ); + void begin_initialization(); void finish_initialization(); void setup_cal(uint32_t init_cals_mask, uint32_t tracking_cals_mask, uint32_t timeout); @@ -83,8 +84,8 @@ public: bool get_pll_lock_status(uint8_t pll, bool wait_for_lock = false); - void set_fir(uhd::direction_t direction, mpm::ad937x::device::chain_t chain, int8_t gain, const std::vector<int16_t> & fir); - std::vector<int16_t> get_fir(uhd::direction_t direction, mpm::ad937x::device::chain_t chain, int8_t &gain); + void set_fir(uhd::direction_t direction, int8_t gain, const std::vector<int16_t> & fir); + std::vector<int16_t> get_fir(uhd::direction_t direction, int8_t &gain); int16_t get_temperature(); @@ -94,6 +95,7 @@ public: void update_tx_lo_source(uint8_t rxPllUseExternalLo); uint8_t get_rx_lo_source(); uint8_t get_tx_lo_source(); + void set_master_clock_rate(const double rate); const static double MIN_FREQ; const static double MAX_FREQ; const static double MIN_RX_GAIN; diff --git a/mpm/lib/mykonos/config/ad937x_config_t.cpp b/mpm/lib/mykonos/config/ad937x_config_t.cpp index 68d1f27bf..a9455502c 100644 --- a/mpm/lib/mykonos/config/ad937x_config_t.cpp +++ b/mpm/lib/mykonos/config/ad937x_config_t.cpp @@ -21,19 +21,41 @@ const int16_t ad937x_config_t::DEFAULT_TX_FIR[DEFAULT_TX_FIR_SIZE] = { -94, -26, 282, 177, -438, -368, 756, 732,-1170,-1337, 1758, 2479,-2648,-5088, 4064,16760, 16759, 4110,-4881,-2247, 2888, 1917,-1440,-1296, 745, 828, -358, -474, 164, 298, -16, -94 }; + +const int16_t ad937x_config_t::DEFAULT_TX_FIR_15366[DEFAULT_TX_FIR_SIZE] = + { 4, -16, -5, 75, -13, -229, 85, 547, -293,-1158, 738, 2290,-1640,-4805, 3687,17108, + 17108, 3687,-4805,-1640, 2290, 738,-1158, -293, 547, 85, -229, -13, 75, -5, -16, 4 }; + const int16_t ad937x_config_t::DEFAULT_RX_FIR[DEFAULT_RX_FIR_SIZE] = { -20, 6, 66, 22, -128, -54, 240, 126, -402, -248, 634, 444, -956, -756, 1400, 1244, -2028,-2050, 2978, 3538,-4646,-7046, 9536,30880,30880, 9536,-7046,-4646, 3538, 2978,-2050,-2028, 1244, 1400, -756, -956, 444, 634, -248, -402, 126, 240, -54, -128, 22, 66, 6, -20 }; + +const int16_t ad937x_config_t::DEFAULT_RX_FIR_15366[DEFAULT_RX_FIR_SIZE] = + { -16, -22, 18, 74, 24, -132, -152, 132, 372, 38, -598, -474, 638, 1178, -206,-1952, + -984, 2362, 3152,-1612,-6544,-2164,12806,26836,26836,12806,-2164,-6544,-1612, 3152, 2362, -984, + -1952, -206, 1178, 638, -474, -598, 38, 372, 132, -152, -132, 24, 74, 18, -22, -16 }; + const int16_t ad937x_config_t::DEFAULT_OBSRX_FIR[DEFAULT_RX_FIR_SIZE] = { -14, -19, 44, 41, -89, -95, 175, 178, -303, -317, 499, 527, -779, -843, 1184, 1317, -1781,-2059, 2760, 3350,-4962,-7433, 9822,32154,32154, 9822,-7433,-4962, 3350, 2760,-2059,-1781, 1317, 1184, -843, -779, 527, 499, -317, -303, 178, 175, -95, -89, 41, 44, -19, -14 }; + +const int16_t ad937x_config_t::DEFAULT_OBSRX_FIR_15366[DEFAULT_RX_FIR_SIZE] = + { -2, 3, 12, -19, -28, 44, 74, -92, -169, 150, 353, -203, -671, 203, 1179, -66, + -1952, -347, 3153, 1307,-5595,-4820,11323,29525,29525,11323,-4820,-5595, 1307, 3153, -347,-1952, + -66, 1179, 203, -671, -203, 353, 150, -169, -92, 74, 44, -28, -19, 12, 3, -2 }; + const int16_t ad937x_config_t::DEFAULT_SNIFFER_FIR[DEFAULT_RX_FIR_SIZE] = { -1, -5, -14, -23, -16, 24, 92, 137, 80, -120, -378, -471, -174, 507, 1174, 1183, 98,-1771,-3216,-2641, 942, 7027,13533,17738,17738,13533, 7027, 942,-2641,-3216,-1771, 98, 1183, 1174, 507, -174, -471, -378, -120, 80, 137, 92, 24, -16, -23, -14, -5, -1 }; +const int16_t ad937x_config_t::DEFAULT_SNIFFER_FIR_15366[DEFAULT_RX_FIR_SIZE] = + { 10, 31, 59, 71, 30, -92, -283, -456, -466, -175, 440, 1192, 1683, 1444, 198,-1871, + -3988, -4942,-3512, 958, 8118,16519,23993,28395,28395,23993,16519, 8118, 958,-3512,-4942,-3988, + -1871, 198, 1444, 1683, 1192, 440, -175, -466, -456, -283, -92, 30, 71, 59, 31, 10 }; + ad937x_config_t::ad937x_config_t(spiSettings_t* sps) : _rx(DEFAULT_RX_SETTINGS), _rxProfile(DEFAULT_RX_PROFILE), diff --git a/mpm/lib/mykonos/config/ad937x_config_t.hpp b/mpm/lib/mykonos/config/ad937x_config_t.hpp index e44039ebe..41d9e9b61 100644 --- a/mpm/lib/mykonos/config/ad937x_config_t.hpp +++ b/mpm/lib/mykonos/config/ad937x_config_t.hpp @@ -37,9 +37,13 @@ public: static const int32_t DEFAULT_RX_FIR_GAIN = -6; static const int16_t DEFAULT_TX_FIR[DEFAULT_TX_FIR_SIZE]; + static const int16_t DEFAULT_TX_FIR_15366[DEFAULT_TX_FIR_SIZE]; static const int16_t DEFAULT_RX_FIR[DEFAULT_RX_FIR_SIZE]; + static const int16_t DEFAULT_RX_FIR_15366[DEFAULT_RX_FIR_SIZE]; static const int16_t DEFAULT_OBSRX_FIR[DEFAULT_RX_FIR_SIZE]; + static const int16_t DEFAULT_OBSRX_FIR_15366[DEFAULT_RX_FIR_SIZE]; static const int16_t DEFAULT_SNIFFER_FIR[DEFAULT_RX_FIR_SIZE]; + static const int16_t DEFAULT_SNIFFER_FIR_15366[DEFAULT_RX_FIR_SIZE]; void set_rx_pll_use_external_lo(uint8_t val); uint8_t get_rx_pll_use_external_lo(); void set_tx_pll_use_external_lo(uint8_t val); diff --git a/mpm/lib/mykonos/config/ad937x_default_config.hpp b/mpm/lib/mykonos/config/ad937x_default_config.hpp index ccf750a30..d756a5cb2 100644 --- a/mpm/lib/mykonos/config/ad937x_default_config.hpp +++ b/mpm/lib/mykonos/config/ad937x_default_config.hpp @@ -35,7 +35,7 @@ static const mykonosRxSettings_t DEFAULT_RX_SETTINGS = }; static const mykonosRxProfile_t DEFAULT_RX_PROFILE = -{ // Rx 100MHz, IQrate 122.88MHz, Dec5 +{ // Rx 100MHz, IQrate 125MSPS, Dec5 1, // The divider used to generate the ADC clock nullptr, // Pointer to Rx FIR filter structure 2, // Rx FIR decimation (1,2,4) diff --git a/mpm/python/usrp_mpm/dboard_manager/magnesium.py b/mpm/python/usrp_mpm/dboard_manager/magnesium.py index 6c100e992..3841a4466 100644 --- a/mpm/python/usrp_mpm/dboard_manager/magnesium.py +++ b/mpm/python/usrp_mpm/dboard_manager/magnesium.py @@ -398,6 +398,10 @@ class Magnesium(DboardManagerBase): } self.cpld = MgCPLD(self._spi_ifaces['cpld'], self.log) self.dboard_clk_control = DboardClockControl(self.dboard_ctrl_regs, self.log) + # Declare some attributes to make linter happy: + self.lmk = None + self.clock_synchronizer = None + self.jesdcore = None def _power_on(self): " Turn on power to daughterboard " @@ -548,7 +552,7 @@ class Magnesium(DboardManagerBase): ) _sync_db_clock(self.clock_synchronizer) # Clocks and PPS are now fully active! - + self.mykonos.set_master_clock_rate(self.master_clock_rate) self.init_jesd(args) self.mykonos.start_radio() return True |