diff options
-rw-r--r-- | mpm/python/usrp_mpm/dboard_manager/rh_periphs.py | 22 | ||||
-rw-r--r-- | mpm/python/usrp_mpm/dboard_manager/rhodium.py | 10 |
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) |