diff options
Diffstat (limited to 'mpm/python/usrp_mpm/sys_utils/gpio.py')
-rw-r--r-- | mpm/python/usrp_mpm/sys_utils/gpio.py | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/mpm/python/usrp_mpm/sys_utils/gpio.py b/mpm/python/usrp_mpm/sys_utils/gpio.py new file mode 100644 index 000000000..b609479f1 --- /dev/null +++ b/mpm/python/usrp_mpm/sys_utils/gpio.py @@ -0,0 +1,60 @@ +# +# Copyright 2020 Ettus Research, a National Instruments Brand +# +# SPDX-License-Identifier: GPL-3.0-or-later +# +""" +Access to GPIOs via libgpiod +""" + +import contextlib +import gpiod + + +@contextlib.contextmanager +def request_gpio(line, direction): + """ + Context manager for a GPIO line + """ + line.request(consumer='mpm', type=direction) + try: + yield line + finally: + line.release() + + +class Gpio: + """ + Class for accessing a named GPIO line via libgpiod + """ + + INPUT = gpiod.LINE_REQ_DIR_IN + OUTPUT = gpiod.LINE_REQ_DIR_OUT + + def __init__(self, name, direction=INPUT, default_val=None): + self._direction = direction + self._line = gpiod.find_line(name) + self._out_value = False + if self._line is None: + raise RuntimeError('failed to find gpio with name %s' % name) + + if default_val is not None and direction == Gpio.OUTPUT: + self.set(default_val) + + def get(self): + """ + Read the value of this GPIO + """ + if self._direction == self.OUTPUT: + return self._out_value + + with request_gpio(self._line, self._direction) as gpio: + return bool(gpio.get_value()) + + def set(self, value): + """ + Set the value of this GPIO + """ + with request_gpio(self._line, self._direction) as gpio: + gpio.set_value(int(value)) + self._out_value = bool(value) |