X-Git-Url: https://git.ayoreis.com/Adafruit_Blinka-hackapet.git/blobdiff_plain/976917690f9220b5e9e151f9c09594ac6e366563..8b6a8075b231d37eae4e3fd63281aa44458a4791:/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py diff --git a/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py b/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py index e412926..b7953e1 100644 --- a/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py +++ b/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py @@ -11,6 +11,7 @@ except ImportError: ) from ImportError +# pylint: disable=too-many-branches,too-many-statements class Pin: """Pins dont exist in CPython so...lets make our own!""" @@ -31,10 +32,16 @@ class Pin: self.id = pin_id if isinstance(pin_id, tuple): self._num = int(pin_id[1]) - self._chip = gpiod.chip(str(pin_id[0]), gpiod.chip.OPEN_BY_NUMBER) + if hasattr(gpiod, "Chip"): + self._chip = gpiod.Chip(str(pin_id[0]), gpiod.Chip.OPEN_BY_NUMBER) + else: + self._chip = gpiod.chip(str(pin_id[0]), gpiod.chip.OPEN_BY_NUMBER) else: self._num = int(pin_id) - self._chip = gpiod.chip("gpiochip0", gpiod.chip.OPEN_BY_NAME) + if hasattr(gpiod, "Chip"): + self._chip = gpiod.Chip("gpiochip0", gpiod.Chip.OPEN_BY_NAME) + else: + self._chip = gpiod.chip("gpiochip0", gpiod.chip.OPEN_BY_NAME) self._line = None def __repr__(self): @@ -52,32 +59,65 @@ class Pin: if mode is not None: if mode == self.IN: flags = 0 + self._line.release() if pull is not None: if pull == self.PULL_UP: - raise NotImplementedError( - "Internal pullups not supported in libgpiod, " - "use physical resistor instead!" - ) - if pull == self.PULL_DOWN: - raise NotImplementedError( - "Internal pulldowns not supported in libgpiod, " - "use physical resistor instead!" - ) - raise RuntimeError("Invalid pull for pin: %s" % self.id) + if hasattr(gpiod, "LINE_REQ_FLAG_BIAS_PULL_UP"): + flags |= gpiod.LINE_REQ_FLAG_BIAS_PULL_UP + else: + raise NotImplementedError( + "Internal pullups not supported in this version of libgpiod, " + "use physical resistor instead!" + ) + elif pull == self.PULL_DOWN: + if hasattr(gpiod, "line") and hasattr( + gpiod, "LINE_REQ_FLAG_BIAS_PULL_DOWN" + ): + flags |= gpiod.LINE_REQ_FLAG_BIAS_PULL_DOWN + else: + raise NotImplementedError( + "Internal pulldowns not supported in this version of libgpiod, " + "use physical resistor instead!" + ) + elif pull == self.PULL_NONE: + if hasattr(gpiod, "line") and hasattr( + gpiod, "LINE_REQ_FLAG_BIAS_DISABLE" + ): + flags |= gpiod.LINE_REQ_FLAG_BIAS_DISABLE + else: + raise NotImplementedError( + "Internal pulldowns not supported in this version of libgpiod, " + "use physical resistor instead!" + ) + else: + raise RuntimeError(f"Invalid pull for pin: {self.id}") self._mode = self.IN self._line.release() - self._line.request( - consumer=self._CONSUMER, type=gpiod.LINE_REQ_DIR_IN, flags=flags - ) + if hasattr(gpiod, "LINE_REQ_DIR_IN"): + self._line.request( + consumer=self._CONSUMER, type=gpiod.LINE_REQ_DIR_IN, flags=flags + ) + else: + config = gpiod.line_request() + config.consumer = self._CONSUMER + config.request_type = gpiod.line_request.DIRECTION_INPUT + self._line.request(config) elif mode == self.OUT: if pull is not None: raise RuntimeError("Cannot set pull resistor on output") self._mode = self.OUT self._line.release() - self._line.request(consumer=self._CONSUMER, type=gpiod.LINE_REQ_DIR_OUT) - + if hasattr(gpiod, "LINE_REQ_DIR_OUT"): + self._line.request( + consumer=self._CONSUMER, type=gpiod.LINE_REQ_DIR_OUT + ) + else: + config = gpiod.line_request() + config.consumer = self._CONSUMER + config.request_type = gpiod.line_request.DIRECTION_OUTPUT + self._line.request(config) else: raise RuntimeError("Invalid mode for pin: %s" % self.id)