diff options
Diffstat (limited to 'mpm/lib')
-rw-r--r-- | mpm/lib/mykonos/ad937x_ctrl.cpp | 64 | ||||
-rw-r--r-- | mpm/lib/mykonos/ad937x_device.cpp | 65 | ||||
-rw-r--r-- | mpm/lib/mykonos/ad937x_device.hpp | 4 |
3 files changed, 75 insertions, 58 deletions
diff --git a/mpm/lib/mykonos/ad937x_ctrl.cpp b/mpm/lib/mykonos/ad937x_ctrl.cpp index a3119cb89..0e76daac0 100644 --- a/mpm/lib/mykonos/ad937x_ctrl.cpp +++ b/mpm/lib/mykonos/ad937x_ctrl.cpp @@ -28,7 +28,64 @@ using namespace mpm::chips; using namespace mpm::ad937x::device; - +//Init cals mask +const uint32_t ad937x_ctrl::TX_BB_FILTER = ::TX_BB_FILTER; +const uint32_t ad937x_ctrl::ADC_TUNER = ::ADC_TUNER; +const uint32_t ad937x_ctrl::TIA_3DB_CORNER = ::TIA_3DB_CORNER; +const uint32_t ad937x_ctrl::DC_OFFSET = ::DC_OFFSET; +const uint32_t ad937x_ctrl::TX_ATTENUATION_DELAY = ::TX_ATTENUATION_DELAY; +const uint32_t ad937x_ctrl::RX_GAIN_DELAY = ::RX_GAIN_DELAY; +const uint32_t ad937x_ctrl::FLASH_CAL = ::FLASH_CAL; +const uint32_t ad937x_ctrl::PATH_DELAY = ::PATH_DELAY; +const uint32_t ad937x_ctrl::TX_LO_LEAKAGE_INTERNAL = ::TX_LO_LEAKAGE_INTERNAL; +const uint32_t ad937x_ctrl::TX_LO_LEAKAGE_EXTERNAL = ::TX_LO_LEAKAGE_EXTERNAL; +const uint32_t ad937x_ctrl::TX_QEC_INIT = ::TX_QEC_INIT; +const uint32_t ad937x_ctrl::LOOPBACK_RX_LO_DELAY = ::LOOPBACK_RX_LO_DELAY; +const uint32_t ad937x_ctrl::LOOPBACK_RX_RX_QEC_INIT = ::LOOPBACK_RX_RX_QEC_INIT; +const uint32_t ad937x_ctrl::RX_LO_DELAY = ::RX_LO_DELAY; +const uint32_t ad937x_ctrl::RX_QEC_INIT = ::RX_QEC_INIT; +const uint32_t ad937x_ctrl::DPD_INIT = ::DPD_INIT; +const uint32_t ad937x_ctrl::CLGC_INIT = ::CLGC_INIT; +const uint32_t ad937x_ctrl::VSWR_INIT = ::VSWR_INIT; +//Tracking Cals mask +const uint32_t ad937x_ctrl::TRACK_RX1_QEC = ::TRACK_RX1_QEC; +const uint32_t ad937x_ctrl::TRACK_RX2_QEC = ::TRACK_RX2_QEC; +const uint32_t ad937x_ctrl::TRACK_ORX1_QEC = ::TRACK_ORX1_QEC; +const uint32_t ad937x_ctrl::TRACK_ORX2_QEC = ::TRACK_ORX2_QEC; +const uint32_t ad937x_ctrl::TRACK_TX1_LOL = ::TRACK_TX1_LOL; +const uint32_t ad937x_ctrl::TRACK_TX2_LOL = ::TRACK_TX2_LOL; +const uint32_t ad937x_ctrl::TRACK_TX1_QEC = ::TRACK_TX1_QEC; +const uint32_t ad937x_ctrl::TRACK_TX2_QEC = ::TRACK_TX2_QEC; +const uint32_t ad937x_ctrl::TRACK_TX1_DPD = ::TRACK_TX1_DPD; +const uint32_t ad937x_ctrl::TRACK_TX2_DPD = ::TRACK_TX2_DPD; +const uint32_t ad937x_ctrl::TRACK_TX1_CLGC = ::TRACK_TX1_CLGC; +const uint32_t ad937x_ctrl::TRACK_TX2_CLGC = ::TRACK_TX2_CLGC; +const uint32_t ad937x_ctrl::TRACK_TX1_VSWR = ::TRACK_TX1_VSWR; +const uint32_t ad937x_ctrl::TRACK_TX2_VSWR = ::TRACK_TX2_VSWR; +const uint32_t ad937x_ctrl::TRACK_ORX1_QEC_SNLO = ::TRACK_ORX1_QEC_SNLO; +const uint32_t ad937x_ctrl::TRACK_ORX2_QEC_SNLO = ::TRACK_ORX2_QEC_SNLO; +const uint32_t ad937x_ctrl::TRACK_SRX_QEC = ::TRACK_SRX_QEC; +const uint32_t ad937x_ctrl::DEFAULT_INIT_CALS_MASKS = + ad937x_ctrl::TX_BB_FILTER | + ad937x_ctrl::ADC_TUNER | + ad937x_ctrl::TIA_3DB_CORNER | + ad937x_ctrl::DC_OFFSET | + ad937x_ctrl::TX_ATTENUATION_DELAY | + ad937x_ctrl::RX_GAIN_DELAY | + ad937x_ctrl::FLASH_CAL | + ad937x_ctrl::PATH_DELAY | + ad937x_ctrl::TX_LO_LEAKAGE_INTERNAL | + ad937x_ctrl::TX_QEC_INIT | + ad937x_ctrl::LOOPBACK_RX_LO_DELAY | + ad937x_ctrl::RX_QEC_INIT + ; +const uint32_t ad937x_ctrl::DEFAULT_TRACKING_CALS_MASKS = + ad937x_ctrl::TRACK_RX1_QEC | + ad937x_ctrl::TRACK_RX2_QEC | + ad937x_ctrl::TRACK_TX1_QEC | + ad937x_ctrl::TRACK_TX2_QEC + ; +const uint32_t ad937x_ctrl::DEFAULT_INIT_CALS_TIMEOUT = 60000; static uhd::direction_t _get_direction_from_antenna(const std::string& antenna) { auto sub = antenna.substr(0, 2); @@ -145,6 +202,11 @@ public: device.finish_initialization(); } + virtual void setup_cal(uint32_t init_cals_mask, uint32_t tracking_cals_mask, uint32_t timeout) + { + std::lock_guard<std::mutex> lock(*spi_mutex); + device.setup_cal(init_cals_mask, tracking_cals_mask, timeout); + } virtual void start_jesd_rx() { std::lock_guard<std::mutex> lock(*spi_mutex); diff --git a/mpm/lib/mykonos/ad937x_device.cpp b/mpm/lib/mykonos/ad937x_device.cpp index 2614be600..de3671849 100644 --- a/mpm/lib/mykonos/ad937x_device.cpp +++ b/mpm/lib/mykonos/ad937x_device.cpp @@ -19,7 +19,6 @@ #include "adi/mykonos.h" #include "adi/mykonos_gpio.h" #include "adi/mykonos_debug/mykonos_dbgjesd.h" - #include <boost/format.hpp> #include <functional> @@ -49,50 +48,6 @@ static const uint32_t AD9371_PRODUCT_ID = 0x3; static const size_t ARM_BINARY_SIZE = 98304; static const uint32_t PLL_LOCK_TIMEOUT_MS = 200; -static const uint32_t INIT_CAL_TIMEOUT_MS = 10000; - -// TODO: actually figure out what cals we want to run -// minimum required cals are 0x4F -static const uint32_t INIT_CALS = - TX_BB_FILTER | - ADC_TUNER | - TIA_3DB_CORNER | - DC_OFFSET | - TX_ATTENUATION_DELAY | - RX_GAIN_DELAY | - FLASH_CAL | - PATH_DELAY | - TX_LO_LEAKAGE_INTERNAL | -//// TX_LO_LEAKAGE_EXTERNAL | - TX_QEC_INIT | - LOOPBACK_RX_LO_DELAY | - LOOPBACK_RX_RX_QEC_INIT | - RX_LO_DELAY | - RX_QEC_INIT | -//// DPD_INIT | -//// CLGC_INIT | -//// VSWR_INIT | - 0; - -static const uint32_t TRACKING_CALS = - TRACK_RX1_QEC | - TRACK_RX2_QEC | -// TRACK_ORX1_QEC | -// TRACK_ORX2_QEC | -//// TRACK_TX1_LOL | -//// TRACK_TX2_LOL | - TRACK_TX1_QEC | - TRACK_TX2_QEC | -//// TRACK_TX1_DPD | -//// TRACK_TX2_DPD | -//// TRACK_TX1_CLGC | -//// TRACK_TX2_CLGC | -//// TRACK_TX1_VSWR | -//// TRACK_TX2_VSWR | -//// TRACK_ORX1_QEC_SNLO | -//// TRACK_ORX2_QEC_SNLO | -//// TRACK_SRX_QEC | - 0; /****************************************************** Helper functions @@ -318,8 +273,7 @@ ad937x_device::ad937x_device( { } -void ad937x_device::_initialize_rf() -{ +void ad937x_device::_setup_rf(){ // TODO: add setRfPllLoopFilter here // Set frequencies @@ -345,19 +299,21 @@ void ad937x_device::_initialize_rf() set_gain(uhd::TX_DIRECTION, chain_t::ONE, TX_DEFAULT_GAIN); set_gain(uhd::TX_DIRECTION, chain_t::TWO, TX_DEFAULT_GAIN); - // Run and wait for init cals - CALL_API(MYKONOS_runInitCals(mykonos_config.device, INIT_CALS)); +} + +void ad937x_device::setup_cal(uint32_t init_cals_mask, uint32_t tracking_cals_mask, uint32_t timeout){ + // Run and wait for init cals + CALL_API(MYKONOS_runInitCals(mykonos_config.device, init_cals_mask)); uint8_t errorFlag = 0, errorCode = 0; - CALL_API(MYKONOS_waitInitCals(mykonos_config.device, INIT_CAL_TIMEOUT_MS, &errorFlag, &errorCode)); + CALL_API(MYKONOS_waitInitCals(mykonos_config.device, timeout, &errorFlag, &errorCode)); if ((errorFlag != 0) || (errorCode != 0)) { throw mpm::runtime_error("Init cals failed!"); // TODO: add more debugging information here } - - CALL_API(MYKONOS_enableTrackingCals(mykonos_config.device, TRACKING_CALS)); + CALL_API(MYKONOS_enableTrackingCals(mykonos_config.device, tracking_cals_mask)); // ready for radioOn } @@ -389,9 +345,8 @@ void ad937x_device::finish_initialization() // TODO: check ARM version before or after the load of the ARM // currently binary has no readable version number until after it's loaded - - // TODO: separate initialize rf into its own step - _initialize_rf(); + //Run setup RF + _setup_rf(); } void ad937x_device::start_jesd_tx() diff --git a/mpm/lib/mykonos/ad937x_device.hpp b/mpm/lib/mykonos/ad937x_device.hpp index 8ea0623a0..8dae6f2d3 100644 --- a/mpm/lib/mykonos/ad937x_device.hpp +++ b/mpm/lib/mykonos/ad937x_device.hpp @@ -54,6 +54,7 @@ public: void begin_initialization(); void finish_initialization(); + void setup_cal(uint32_t init_cals_mask, uint32_t tracking_cals_mask, uint32_t timeout); void start_jesd_rx(); void start_jesd_tx(); void start_radio(); @@ -109,14 +110,13 @@ private: ad937x_gain_ctrl_config_t gain_ctrl; void _apply_gain_pins(uhd::direction_t direction, mpm::ad937x::device::chain_t chain); - + void _setup_rf(); void _call_api_function(const std::function<mykonosErr_t()>& func); void _call_gpio_api_function(const std::function<mykonosGpioErr_t()>& func); std::string _get_arm_binary_path(); std::vector<uint8_t> _get_arm_binary(); - void _initialize_rf(); void _verify_product_id(); void _verify_multichip_sync_status(multichip_sync_t mcs); |