From 658584212cde9e7504394b6a05262d1fd2a2745e Mon Sep 17 00:00:00 2001 From: Jan Volckaert Date: Wed, 19 Apr 2023 20:28:05 +0200 Subject: [PATCH] Add pulseio support for odroidc4 - added libgpiod_pulsein binary build on odroidc4 - added libgpiod_pulsein binary as package_data - added extra check to verify if i2c is available - added PulseIn to meson_g12_common that takes Pin instance and update pin id and chip name according to Pin --- .gitignore | 1 + setup.py | 3 + .../board/hardkernel/odroidc4.py | 5 +- .../amlogic/meson_g12_common/pin.py | 27 ++- .../meson_g12_common/pulseio/PulseIn.py | 184 ++++++++++++++++++ .../meson_g12_common/pulseio/__init__.py | 0 .../meson_g12_common/pulseio/libgpiod_pulsein | Bin 0 -> 25216 bytes .../pulseio/libgpiod_pulsein.license | 3 + src/pulseio.py | 2 + 9 files changed, 215 insertions(+), 10 deletions(-) create mode 100644 src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pulseio/PulseIn.py create mode 100644 src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pulseio/__init__.py create mode 100755 src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pulseio/libgpiod_pulsein create mode 100644 src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pulseio/libgpiod_pulsein.license diff --git a/.gitignore b/.gitignore index 5fb597b..814ac79 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ bundles dist **/*.egg-info .vscode +build \ No newline at end of file diff --git a/setup.py b/setup.py index 51df791..c94ab3c 100755 --- a/setup.py +++ b/setup.py @@ -75,6 +75,9 @@ setup( "libgpiod_pulsein", "libgpiod_pulsein64", ], + "adafruit_blinka.microcontroller.amlogic.meson_g12_common.pulseio": [ + "libgpiod_pulsein", + ], "micropython-stubs": ["*.pyi"], }, include_package_data=True, diff --git a/src/adafruit_blinka/board/hardkernel/odroidc4.py b/src/adafruit_blinka/board/hardkernel/odroidc4.py index 2191013..814f374 100644 --- a/src/adafruit_blinka/board/hardkernel/odroidc4.py +++ b/src/adafruit_blinka/board/hardkernel/odroidc4.py @@ -9,8 +9,9 @@ for it in pin.i2cPorts: globals()["SCL" + str(it[0])] = it[1] globals()["SDA" + str(it[0])] = it[2] -SCL = pin.i2cPorts[0][1] -SDA = pin.i2cPorts[0][2] +if pin.i2cPorts: + SCL = pin.i2cPorts[0][1] + SDA = pin.i2cPorts[0][2] SCLK = pin.SPI0_SCLK MOSI = pin.SPI0_MOSI diff --git a/src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pin.py b/src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pin.py index 41cf8f2..87f4571 100644 --- a/src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pin.py +++ b/src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pin.py @@ -14,23 +14,34 @@ Linux kernel 5.4.y (mainline) from typing import Optional import os import re -import gpiod + +try: + import gpiod +except ImportError: + raise ImportError( + "libgpiod Python bindings not found, please install and try again!" + ) from ImportError from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin -chip0 = gpiod.Chip("0") -chip1 = gpiod.Chip("1") +if hasattr(gpiod, "Chip"): + chip0 = gpiod.Chip("0") + chip1 = gpiod.Chip("1") +else: + chip0 = gpiod.chip("0") + chip1 = gpiod.chip("1") + -if chip0.num_lines() < 20: +if chip0.num_lines < 20: aobus = 0 periphs = 1 - periphs_offset = chip1.num_lines() - 85 + periphs_offset = chip1.num_lines - 85 else: aobus = 1 periphs = 0 - periphs_offset = chip0.num_lines() - 85 + periphs_offset = chip0.num_lines - 85 -chip0.close() -chip1.close() +del chip0 +del chip1 GPIOAO_0 = GPIO496 = Pin((aobus, 0)) GPIOAO_1 = GPIO497 = Pin((aobus, 1)) diff --git a/src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pulseio/PulseIn.py b/src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pulseio/PulseIn.py new file mode 100644 index 0000000..9f3bb5d --- /dev/null +++ b/src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pulseio/PulseIn.py @@ -0,0 +1,184 @@ +# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries +# +# SPDX-License-Identifier: MIT +"""Custom PulseIn Class to read PWM signals""" +import time +import subprocess +import os +import atexit +import random +import struct +import sysv_ipc + +DEBUG = False +queues = [] +procs = [] + +# The message queues live outside of python space, and must be formally cleaned! +def final(): + """In case the program is cancelled or quit, we need to clean up the PulseIn + helper process and also the message queue, this is called at exit to do so""" + if DEBUG: + print("Cleaning up message queues", queues) + print("Cleaning up processes", procs) + for q in queues: + q.remove() + for proc in procs: + proc.terminate() + + +atexit.register(final) + +# pylint: disable=c-extension-no-member +class PulseIn: + """PulseIn Class to read PWM signals""" + + def __init__(self, pin, maxlen=2, idle_state=False): + """Create a PulseIn object associated with the given pin. + The object acts as a read-only sequence of pulse lengths with + a given max length. When it is active, new pulse lengths are + added to the end of the list. When there is no more room + (len() == maxlen) the oldest pulse length is removed to make room.""" + + if isinstance(pin.id, tuple): + self._pin = str(pin.id[1]) + self._chip = "gpiochip{}".format(pin.id[0]) + else: + self._pin = str(pin.id) + self._chip = "gpiochip0" + + self._maxlen = maxlen + self._idle_state = idle_state + self._queue_key = random.randint(1, 9999) + try: + self._mq = sysv_ipc.MessageQueue(None, flags=sysv_ipc.IPC_CREX) + if DEBUG: + print("Message Queue Key: ", self._mq.key) + queues.append(self._mq) + except sysv_ipc.ExistentialError: + raise RuntimeError( + "Message queue creation failed" + ) from sysv_ipc.ExistentialError + + # Check if OS is 64-bit + libgpiod_filename = "libgpiod_pulsein" + dir_path = os.path.dirname(os.path.realpath(__file__)) + cmd = [ + dir_path + "/" + libgpiod_filename, + "--pulses", + str(maxlen), + "--queue", + str(self._mq.key), + ] + if idle_state: + cmd.append("-i") + cmd.append(self._chip) + cmd.append(self._pin) + if DEBUG: + print(cmd) + + self._process = subprocess.Popen(cmd) # pylint: disable=consider-using-with + procs.append(self._process) + + # wait for it to start up + if DEBUG: + print("Waiting for startup success message from subprocess") + message = self._wait_receive_msg(timeout=0.25) + if message[0] != b"!": + raise RuntimeError("Could not establish message queue with subprocess") + self._paused = False + + # pylint: disable=redefined-builtin + def _wait_receive_msg(self, timeout=0, type=2): + """Internal helper that will wait for new messages of a given type, + and throw an exception on timeout""" + if timeout > 0: + stamp = time.monotonic() + while (time.monotonic() - stamp) < timeout: + try: + message = self._mq.receive(block=False, type=type) + return message + except sysv_ipc.BusyError: + time.sleep(0.001) # wait a bit then retry! + # uh-oh timed out + raise RuntimeError( + "Timed out waiting for PulseIn message. Make sure libgpiod is installed." + ) + message = self._mq.receive(block=True, type=type) + return message + + # pylint: enable=redefined-builtin + + def deinit(self): + """Deinitialises the PulseIn and releases any hardware and software + resources for reuse.""" + # Clean up after ourselves + self._process.terminate() + procs.remove(self._process) + self._mq.remove() + queues.remove(self._mq) + + def __enter__(self): + """No-op used by Context Managers.""" + return self + + def __exit__(self, exc_type, exc_value, tb): + """Automatically deinitializes the hardware when exiting a context.""" + self.deinit() + + def resume(self, trigger_duration=0): + """Resumes pulse capture after an optional trigger pulse.""" + if trigger_duration != 0: + self._mq.send("t%d" % trigger_duration, True, type=1) + else: + self._mq.send("r", True, type=1) + self._paused = False + + def pause(self): + """Pause pulse capture""" + self._mq.send("p", True, type=1) + self._paused = True + + @property + def paused(self): + """True when pulse capture is paused as a result of pause() or + an error during capture such as a signal that is too fast.""" + return self._paused + + @property + def maxlen(self): + """The maximum length of the PulseIn. When len() is equal to maxlen, + it is unclear which pulses are active and which are idle.""" + return self._maxlen + + def clear(self): + """Clears all captured pulses""" + self._mq.send("c", True, type=1) + + def popleft(self): + """Removes and returns the oldest read pulse.""" + self._mq.send("^", True, type=1) + message = self._wait_receive_msg() + reply = int(message[0].decode("utf-8")) + # print(reply) + if reply == -1: + raise IndexError("pop from empty list") + return reply + + def __len__(self): + """Returns the current pulse length""" + self._mq.send("l", True, type=1) + message = self._wait_receive_msg() + return int(message[0].decode("utf-8")) + + # pylint: disable=redefined-builtin + def __getitem__(self, index, type=None): + """Returns the value at the given index or values in slice.""" + self._mq.send("i%d" % index, True, type=1) + message = self._wait_receive_msg() + ret = int(message[0].decode("utf-8")) + if ret == -1: + raise IndexError("list index out of range") + return ret + + # pylint: enable=redefined-builtin diff --git a/src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pulseio/__init__.py b/src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pulseio/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pulseio/libgpiod_pulsein b/src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pulseio/libgpiod_pulsein new file mode 100755 index 0000000000000000000000000000000000000000..51bcb9acf7e4f7ea226d7d9bcd10b4562b827bae GIT binary patch literal 25216 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 B0$cz9 literal 0 HcmV?d00001 diff --git a/src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pulseio/libgpiod_pulsein.license b/src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pulseio/libgpiod_pulsein.license new file mode 100644 index 0000000..3165372 --- /dev/null +++ b/src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pulseio/libgpiod_pulsein.license @@ -0,0 +1,3 @@ +# SPDX-FileCopyrightText: 2023 Jan Volckaert for Adafruit Industries +# +# SPDX-License-Identifier: MIT diff --git a/src/pulseio.py b/src/pulseio.py index f80459e..2742e94 100644 --- a/src/pulseio.py +++ b/src/pulseio.py @@ -20,5 +20,7 @@ if detector.board.any_raspberry_pi: from adafruit_blinka.microcontroller.bcm283x.pulseio.PulseIn import PulseIn elif "sphinx" in sys.modules: pass +elif detector.board.any_odroid_40_pin: + from adafruit_blinka.microcontroller.amlogic.meson_g12_common.pulseio.PulseIn import PulseIn else: raise NotImplementedError("pulseio not supported for this board.") -- 2.49.0