From 0ee2a409c4796f87d2d311356b775d437a5cc102 Mon Sep 17 00:00:00 2001 From: Lane Kolbly Date: Tue, 14 Sep 2021 14:30:30 -0500 Subject: uhd: zbx: Prevent TX antenna config from disrupting RX So, both the set_tx_antenna_switches and set_rx_antenna_switches functions configure the TX0_ANT_11 register (which controls the final switch before the TX/RX port, switching it between the three TX paths and the RX path). The RX antenna configuration code will, if the RX antenna is set to TX/RX, configure that switch to the TX/RX->RX path when the ATR is set to RX. However, the TX antenna config code will always configure that switch to the "bypass" path, for both the 0X and RX ATR modes, regardless of whether the RX side actually needs that path. Ergo, this change makes set_tx_antenna_switches only configure that switch when it is configuring the XX or TX modes. --- host/lib/usrp/dboard/zbx/zbx_cpld_ctrl.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'host/lib') diff --git a/host/lib/usrp/dboard/zbx/zbx_cpld_ctrl.cpp b/host/lib/usrp/dboard/zbx/zbx_cpld_ctrl.cpp index 8899f2a18..352a7def9 100644 --- a/host/lib/usrp/dboard/zbx/zbx_cpld_ctrl.cpp +++ b/host/lib/usrp/dboard/zbx/zbx_cpld_ctrl.cpp @@ -273,7 +273,10 @@ void zbx_cpld_ctrl::set_tx_antenna_switches( {tx_amp::HIGHBAND, {zbx_cpld_regs_t::TX0_ANT_11_HIGHBAND_AMP, zbx_cpld_regs_t::TX0_ANT_10_HIGHBAND_AMP}} }; // clang-format on - std::tie(_regs.TX0_ANT_11[idx], _regs.TX0_ANT_10[idx]) = amp_map.at(amp); + if (idx == ATR_ADDR_TX || idx == ATR_ADDR_XX) { + _regs.TX0_ANT_11[idx] = std::get<0>(amp_map.at(amp)); + } + _regs.TX0_ANT_10[idx] = std::get<1>(amp_map.at(amp)); } else if (antenna == ANTENNA_CAL_LOOPBACK) { _regs.TX0_ANT_10[idx] = zbx_cpld_regs_t::TX0_ANT_10_CAL_LOOPBACK; _regs.RX0_ANT_1[idx] = zbx_cpld_regs_t::RX0_ANT_1_CAL_LOOPBACK; @@ -294,7 +297,10 @@ void zbx_cpld_ctrl::set_tx_antenna_switches( {tx_amp::HIGHBAND, {zbx_cpld_regs_t::TX1_ANT_11_HIGHBAND_AMP, zbx_cpld_regs_t::TX1_ANT_10_HIGHBAND_AMP}} }; // clang-format on - std::tie(_regs.TX1_ANT_11[idx], _regs.TX1_ANT_10[idx]) = amp_map.at(amp); + if (idx == ATR_ADDR_TX || idx == ATR_ADDR_XX) { + _regs.TX1_ANT_11[idx] = std::get<0>(amp_map.at(amp)); + } + _regs.TX1_ANT_10[idx] = std::get<1>(amp_map.at(amp)); } else if (antenna == ANTENNA_CAL_LOOPBACK) { _regs.TX1_ANT_10[idx] = zbx_cpld_regs_t::TX1_ANT_10_CAL_LOOPBACK; _regs.RX1_ANT_1[idx] = zbx_cpld_regs_t::RX1_ANT_1_CAL_LOOPBACK; -- cgit v1.2.3