aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mpm/python/usrp_mpm/dboard_manager/rh_periphs.py22
-rw-r--r--mpm/python/usrp_mpm/dboard_manager/rhodium.py10
2 files changed, 23 insertions, 9 deletions
diff --git a/mpm/python/usrp_mpm/dboard_manager/rh_periphs.py b/mpm/python/usrp_mpm/dboard_manager/rh_periphs.py
index 7df734f06..31104153a 100644
--- a/mpm/python/usrp_mpm/dboard_manager/rh_periphs.py
+++ b/mpm/python/usrp_mpm/dboard_manager/rh_periphs.py
@@ -9,7 +9,7 @@ Rhodium dboard peripherals (CPLD, port expander, dboard regs)
import time
-from usrp_mpm.sys_utils.sysfs_gpio import SysFSGPIO, GPIOBank
+from usrp_mpm.sys_utils.sysfs_gpio import SysFSGPIO, GPIOBank, find_gpio_device
from usrp_mpm.mpmutils import poll_with_timeout
@@ -56,6 +56,10 @@ class FPGAtoLoDist(object):
EXPECTED_BOARD_REV = 0
POWER_ON_TIMEOUT = 20 #ms
POWER_ON_POLL_INTERVAL = 1 #ms
+ GPIO_DEV_ID = {
+ 'label': 'tca6424',
+ 'device/of_node/name': 'rhodium-lodist-gpio',
+ }
pins = (
'BD_REV_0', #Board revision bit 0
@@ -81,14 +85,26 @@ class FPGAtoLoDist(object):
'P3_3V_RF_EN' #3.3V LDO for RF enable
)
+ @staticmethod
+ def lo_dist_present(i2c_dev):
+ """
+ Returns True if the I2C board is present.
+ """
+ dev, _ = find_gpio_device(FPGAtoLoDist.GPIO_DEV_ID, i2c_dev)
+ return dev is not None
+
def __init__(self, i2c_dev):
assert i2c_dev is not None
- self._gpios = SysFSGPIO({'label': 'tca6424', 'device/of_node/name': 'rhodium-lodist-gpio'}, 0x1FFF0F, 0x1FFF00, 0x00A500, i2c_dev)
+ self._gpios = \
+ SysFSGPIO(self.GPIO_DEV_ID, 0x1FFF0F, 0x1FFF00, 0x00A500, i2c_dev)
board_rev = self._gpios.get(self.pins.index('BD_REV_0')) + \
self._gpios.get(self.pins.index('BD_REV_1')) << 1 + \
self._gpios.get(self.pins.index('BD_REV_2')) << 2
if board_rev != self.EXPECTED_BOARD_REV:
- raise RuntimeError('LO distribution board revision did not match: Expected: {0} Actual: {1}'.format(self.EXPECTED_BOARD_REV, board_rev))
+ raise RuntimeError(
+ 'LO distribution board revision did not match: '
+ 'Expected: {0} Actual: {1}'
+ .format(self.EXPECTED_BOARD_REV, board_rev))
self._gpios.set(self.pins.index('P6_8V_EN'), 1)
if not poll_with_timeout(
lambda: bool(self._gpios.get(self.pins.index('P6_8V_PG'))),
diff --git a/mpm/python/usrp_mpm/dboard_manager/rhodium.py b/mpm/python/usrp_mpm/dboard_manager/rhodium.py
index 8e036aa81..f3dad4a92 100644
--- a/mpm/python/usrp_mpm/dboard_manager/rhodium.py
+++ b/mpm/python/usrp_mpm/dboard_manager/rhodium.py
@@ -246,13 +246,11 @@ class Rhodium(BfrfsEEPROM, DboardManagerBase):
}
self._port_expander = TCA6408(_get_i2c_dev())
self._daughterboard_gpio = FPGAtoDbGPIO(self.slot_idx)
- # TODO: applying the overlay without checking for the presence of the
- # LO dist board will create a kernel error. Fix this when the I2C API
- # is implemented by checking if the board is present before applying.
- try:
+ if FPGAtoLoDist.lo_dist_present(_get_i2c_dev()):
+ self.log.info("Enabling LO distribution board")
self._lo_dist = FPGAtoLoDist(_get_i2c_dev())
- except RuntimeError:
- self._lo_dist = None
+ else:
+ self.log.debug("No LO distribution board detected")
self.log.debug("Turning on Module and RF power supplies")
self._power_on()
BfrfsEEPROM.__init__(self)