mirror of
https://github.com/saymrwulf/uhd.git
synced 2026-05-16 21:10:10 +00:00
This adds a new Gpio helper class, which uses libgpiod under the hood instead of the deprecated sysfs GPIO access. This class provides the ability to get/set a specific GPIO, which is looked up by name.
60 lines
1.4 KiB
Python
60 lines
1.4 KiB
Python
#
|
|
# 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)
|