From fe3705318e1441e2c5a807cf44303b748e0b408a Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Tue, 23 Jun 2026 13:55:21 -0700 Subject: [PATCH 01/18] Update Blinka to pyproject.toml --- pyproject.toml | 15 +++ requirements.txt | 22 ++-- setup.py | 67 ++-------- src/adafruit_blinka/importing.py | 64 +++++++--- .../microcontroller/am335x/pin.py | 9 +- src/board.py | 8 +- src/neopixel_write.py | 56 +++++---- src/pwmio.py | 118 +++++++++--------- 8 files changed, 185 insertions(+), 174 deletions(-) create mode 100644 pyproject.toml diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..d5a006fe --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,15 @@ +# SPDX-FileCopyrightText: 2026 Melissa LeBlanc-Williams for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +[build-system] +requires = [ + "setuptools", + "wheel", + "setuptools-scm", +] +build-backend = "setuptools.build_meta" + +[tool.setuptools_scm] +git_describe_command = "git describe --tags --long" +local_scheme = "no-local-version" diff --git a/requirements.txt b/requirements.txt index aec79110..9525c471 100755 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,13 @@ - # requirements.txt - # - # installs dependencies from ./setup.py, and the package itself, - # in editable mode - # -e . - - # (the -e above is optional). you could also just install the package - # normally with just the line below (after uncommenting) - . +Adafruit-PlatformDetect>=3.70.1 +Adafruit-PureIO>=1.1.7 +binho-host-adapter>=0.1.6 +pyftdi>=0.40.0 +adafruit-circuitpython-typing +sysv_ipc>=1.1.0;sys_platform=='linux' and platform_machine!='mips' +toml>=0.10.2;python_version<'3.11' +Jetson.GPIO;sys_platform=='linux' and platform_machine=='aarch64' +rpi_ws281x>=4.0.0;sys_platform=='linux' and (platform_machine=='armv6l' or platform_machine=='armv7l' or platform_machine=='aarch64') +lgpio>=0.2.2.0;sys_platform=='linux' and python_version<'3.13' and platform_machine=='aarch64' +RPi.GPIO;sys_platform=='linux' and (platform_machine=='armv6l' or platform_machine=='armv7l' or platform_machine=='aarch64') +Adafruit-Blinka-Raspberry-Pi5-Neopixel;sys_platform=='linux' and platform_machine=='aarch64' and python_version>='3.11' +Adafruit_BBIO>=1.2.4;sys_platform=='linux' and platform_machine=='armv7l' diff --git a/setup.py b/setup.py index 23dd627d..4b6f23e9 100644 --- a/setup.py +++ b/setup.py @@ -10,55 +10,23 @@ import io import os -import glob from setuptools import setup, find_packages here = os.path.abspath(os.path.dirname(__file__)) -def yellow_text(text: str) -> str: - return f"\033[33m{text}\033[0m" - - # Import the README and use it as the long-description. # Note: this will only work if 'README.md' is present in your MANIFEST.in file! with io.open(os.path.join(here, "README.rst"), encoding="utf-8") as f: long_description = "\n" + f.read() -if not glob.glob("//usr//include//python3.*//Python.h"): - raise RuntimeError( - "This package requires a Python development environment. " - "Please install the python3-dev package for your distribution." - ) - -board_reqs = [] -raspberry_pi = False -if os.path.exists("/proc/device-tree/compatible"): - with open("/proc/device-tree/compatible", "rb") as f: - compat = f.read() - # Jetson Nano, TX2, Xavier, etc - if b"nvidia,tegra" in compat: - board_reqs = ["Jetson.GPIO"] - # Pi 5 and Earlier - elif ( - b"brcm,bcm2835" in compat - or b"brcm,bcm2836" in compat - or b"brcm,bcm2837" in compat - or b"brcm,bcm2838" in compat - or b"brcm,bcm2711" in compat - or b"brcm,bcm2712" in compat - ): - board_reqs = [ - "rpi_ws281x>=4.0.0", - "lgpio;python_version<'3.13'", - "RPi.GPIO", - "Adafruit-Blinka-Raspberry-Pi5-Neopixel", - ] - raspberry_pi = True - # BeagleBone Black, Green, PocketBeagle, BeagleBone AI, etc. - elif b"ti,am335x" in compat: - board_reqs = ["Adafruit_BBIO"] +with io.open(os.path.join(here, "requirements.txt"), encoding="utf-8") as f: + requirements = [ + line.strip() + for line in f.readlines() + if line.strip() and not line.startswith("#") + ] setup( name="Adafruit-Blinka", @@ -67,13 +35,12 @@ def yellow_text(text: str) -> str: "git_describe_command": "git describe --tags --long", "local_scheme": "no-local-version", }, - setup_requires=["setuptools_scm"], description="CircuitPython APIs for non-CircuitPython versions of Python such as CPython on Linux and MicroPython.", long_description=long_description, long_description_content_type="text/x-rst", author="Adafruit Industries", author_email="circuitpython@adafruit.com", - python_requires=">=3.7.0", + python_requires=">=3.9.0", url="https://github.com/adafruit/Adafruit_Blinka", package_dir={"": "src"}, packages=find_packages("src") + ["micropython-stubs"], @@ -109,16 +76,7 @@ def yellow_text(text: str) -> str: "micropython-stubs": ["*.pyi"], }, include_package_data=True, - install_requires=[ - "Adafruit-PlatformDetect>=3.70.1", - "Adafruit-PureIO>=1.1.7", - "binho-host-adapter>=0.1.6", - "pyftdi>=0.40.0", - "adafruit-circuitpython-typing", - "sysv_ipc>=1.1.0;sys_platform=='linux' and platform_machine!='mips'", - "toml>=0.10.2;python_version<'3.11'", - ] - + board_reqs, + install_requires=requirements, license="MIT", classifiers=[ # Trove classifiers @@ -126,14 +84,7 @@ def yellow_text(text: str) -> str: "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.9", "Programming Language :: Python :: Implementation :: MicroPython", ], ) - -if raspberry_pi and os.sys.version_info >= (3, 13): - print( - yellow_text( - "\n*** Raspberry Pi 5 and later: lgpio will need to be installed manually. See the lgpio homepage for more details: http://abyz.me.uk/lg/download.html ***" - ) - ) diff --git a/src/adafruit_blinka/importing.py b/src/adafruit_blinka/importing.py index acb50800..479d2c31 100644 --- a/src/adafruit_blinka/importing.py +++ b/src/adafruit_blinka/importing.py @@ -25,6 +25,39 @@ def import_module(module_name: str, package: str = None): from adafruit_blinka.agnostic import detector +PLATFORM_DEPENDENCY_INSTALLS = { + "Adafruit_BBIO": "pip install Adafruit_BBIO", + "Jetson": "pip install Jetson.GPIO", + "RPi": "pip install RPi.GPIO", + "_rpi_ws281x": "pip install rpi_ws281x", + "adafruit_raspberry_pi5_neopixel_write": ( + "pip install Adafruit-Blinka-Raspberry-Pi5-Neopixel" + ), + "lgpio": ( + "pip install lgpio --find-links " + "https://github.com/adafruit/lgpio-python-wheels/raw/main/wheels/" + ), +} + + +def raise_for_missing_platform_dependency(error: ModuleNotFoundError): + """Raise a helpful message for known optional platform dependencies.""" + install_command = PLATFORM_DEPENDENCY_INSTALLS.get(error.name) + if install_command is None: + raise error + + message = ( + f"The platform library '{error.name}' was not found. " + f"To install, try typing: {install_command}" + ) + if error.name == "lgpio": + message += ( + "\nOn Raspberry Pi OS, you can also try: " + "sudo apt-get install -y python3-lgpio" + ) + raise RuntimeError(message) from error + + def get_import_file(json_file_name, script_file_location): """Get the full path to the microcontroller imports file.""" try: @@ -43,20 +76,23 @@ def get_import_file(json_file_name, script_file_location): def import_mod(caller_globals, module_name: str, package_name: str = "*"): """Function to allow importing with * or specific package name.""" - if package_name == "*": - module = import_module(module_name) - caller_globals.update( - {name: getattr(module, name) for name in module.__all__} - if hasattr(module, "__all__") - else { - key: value - for (key, value) in module.__dict__.items() - if not key.startswith("_") - } - ) - else: - module = import_module(module_name, package=package_name) - caller_globals[package_name] = getattr(module, package_name) + try: + if package_name == "*": + module = import_module(module_name) + caller_globals.update( + {name: getattr(module, name) for name in module.__all__} + if hasattr(module, "__all__") + else { + key: value + for (key, value) in module.__dict__.items() + if not key.startswith("_") + } + ) + else: + module = import_module(module_name, package=package_name) + caller_globals[package_name] = getattr(module, package_name) + except ModuleNotFoundError as error: + raise_for_missing_platform_dependency(error) def import_microcontroller( diff --git a/src/adafruit_blinka/microcontroller/am335x/pin.py b/src/adafruit_blinka/microcontroller/am335x/pin.py index c6659ca2..a33320da 100644 --- a/src/adafruit_blinka/microcontroller/am335x/pin.py +++ b/src/adafruit_blinka/microcontroller/am335x/pin.py @@ -2,13 +2,12 @@ # # SPDX-License-Identifier: MIT """AM335x pin names""" +from adafruit_blinka.importing import raise_for_missing_platform_dependency + try: from Adafruit_BBIO import GPIO -except ImportError as error: - raise RuntimeError( - "The library 'Adafruit_BBIO' was not found. To install, try typing: " - "pip install Adafruit_BBIO" - ) from error +except ModuleNotFoundError as error: + raise_for_missing_platform_dependency(error) class Pin: diff --git a/src/board.py b/src/board.py index a499d59a..87459cdc 100644 --- a/src/board.py +++ b/src/board.py @@ -48,14 +48,12 @@ elif board_id is None: import platform - import pkg_resources + from importlib.metadata import version - package = str( - pkg_resources.get_distribution("adafruit_platformdetect") - ).split() + package_version = version("adafruit_platformdetect") raise NotImplementedError( f""" - {package[0]} version {package[1]} was unable to identify the board and/or + adafruit-platformdetect version {package_version} was unable to identify the board and/or microcontroller running the {platform.system()} platform. Please be sure you have the latest packages by running: 'pip3 install --upgrade adafruit-blinka adafruit-platformdetect' diff --git a/src/neopixel_write.py b/src/neopixel_write.py index cc9835a7..34e6d66c 100644 --- a/src/neopixel_write.py +++ b/src/neopixel_write.py @@ -14,34 +14,38 @@ import sys from adafruit_blinka.agnostic import detector +from adafruit_blinka.importing import raise_for_missing_platform_dependency -if detector.board.any_raspberry_pi: - if detector.board.any_raspberry_pi_5_board: - import adafruit_raspberry_pi5_neopixel_write as _neopixel +try: + if detector.board.any_raspberry_pi: + if detector.board.any_raspberry_pi_5_board: + import adafruit_raspberry_pi5_neopixel_write as _neopixel + else: + from adafruit_blinka.microcontroller.bcm283x import neopixel as _neopixel + elif detector.board.pico_u2if: + from adafruit_blinka.microcontroller.rp2040_u2if import neopixel as _neopixel + elif detector.board.OS_AGNOSTIC_BOARD: + from adafruit_blinka.microcontroller.generic_agnostic_board import ( + neopixel as _neopixel, + ) + elif ( + detector.board.feather_u2if + or detector.board.feather_can_u2if + or detector.board.feather_epd_u2if + or detector.board.feather_rfm_u2if + or detector.board.qtpy_u2if + or detector.board.itsybitsy_u2if + or detector.board.macropad_u2if + or detector.board.qt2040_trinkey_u2if + or detector.board.kb2040_u2if + ): + from adafruit_blinka.microcontroller.rp2040_u2if import neopixel as _neopixel + elif "sphinx" in sys.modules: + pass else: - from adafruit_blinka.microcontroller.bcm283x import neopixel as _neopixel -elif detector.board.pico_u2if: - from adafruit_blinka.microcontroller.rp2040_u2if import neopixel as _neopixel -elif detector.board.OS_AGNOSTIC_BOARD: - from adafruit_blinka.microcontroller.generic_agnostic_board import ( - neopixel as _neopixel, - ) -elif ( - detector.board.feather_u2if - or detector.board.feather_can_u2if - or detector.board.feather_epd_u2if - or detector.board.feather_rfm_u2if - or detector.board.qtpy_u2if - or detector.board.itsybitsy_u2if - or detector.board.macropad_u2if - or detector.board.qt2040_trinkey_u2if - or detector.board.kb2040_u2if -): - from adafruit_blinka.microcontroller.rp2040_u2if import neopixel as _neopixel -elif "sphinx" in sys.modules: - pass -else: - raise NotImplementedError("Board not supported") + raise NotImplementedError("Board not supported") +except ModuleNotFoundError as error: + raise_for_missing_platform_dependency(error) def neopixel_write(gpio, buf): diff --git a/src/pwmio.py b/src/pwmio.py index 4b3f4c86..afd5190e 100644 --- a/src/pwmio.py +++ b/src/pwmio.py @@ -13,63 +13,67 @@ import sys from adafruit_blinka.agnostic import detector +from adafruit_blinka.importing import raise_for_missing_platform_dependency # pylint: disable=unused-import -if detector.board.any_raspberry_pi_5_board: - from adafruit_blinka.microcontroller.generic_linux.lgpio_pwmout import PWMOut -elif detector.board.any_raspberry_pi: - # Pi 4 or lower - from adafruit_blinka.microcontroller.generic_linux.rpi_gpio_pwmout import PWMOut -elif detector.board.any_bananapi: - from adafruit_blinka.microcontroller.generic_linux.sysfs_pwmout import PWMOut -elif detector.board.any_coral_board: - from adafruit_blinka.microcontroller.generic_linux.sysfs_pwmout import PWMOut -elif detector.board.any_giant_board: - from adafruit_blinka.microcontroller.generic_linux.sysfs_pwmout import PWMOut -elif detector.board.any_pcduino_board: - from adafruit_blinka.microcontroller.generic_linux.sysfs_pwmout import PWMOut -elif detector.board.any_beaglebone: - from adafruit_blinka.microcontroller.am335x.sysfs_pwmout import PWMOut -elif detector.board.any_lemaker: - from adafruit_blinka.microcontroller.generic_linux.sysfs_pwmout import PWMOut -elif detector.board.any_siemens_simatic_iot2000: - from adafruit_blinka.microcontroller.am65xx.pwmout import PWMOut -elif detector.board.any_odroid_40_pin: - from adafruit_blinka.microcontroller.generic_linux.sysfs_pwmout import PWMOut -elif detector.board.any_rock_pi_board: - from adafruit_blinka.microcontroller.rockchip.PWMOut import PWMOut -elif detector.board.binho_nova: - from adafruit_blinka.microcontroller.nova.pwmout import PWMOut -elif detector.board.greatfet_one: - from adafruit_blinka.microcontroller.nxp_lpc4330.pwmout import PWMOut -elif detector.board.any_lubancat: - from adafruit_blinka.microcontroller.generic_linux.sysfs_pwmout import PWMOut -elif detector.board.pico_u2if: - from adafruit_blinka.microcontroller.rp2040_u2if.pwmio import PWMOut -elif detector.board.any_jetson_board: - from adafruit_blinka.microcontroller.tegra.PWMOut import PWMOut -elif detector.board.any_luckfox_pico_board: - from adafruit_blinka.microcontroller.generic_linux.sysfs_pwmout import PWMOut -elif detector.board.any_starfive_id: - from adafruit_blinka.microcontroller.starfive.JH7110.pwmio import PWMOut -elif detector.board.any_horizon_board: - from adafruit_blinka.microcontroller.horizon.pwmio.PWMOut import PWMOut -elif detector.board.OS_AGNOSTIC_BOARD: - from adafruit_blinka.microcontroller.generic_agnostic_board.PWMOut import PWMOut -elif ( - detector.board.feather_u2if - or detector.board.feather_can_u2if - or detector.board.feather_epd_u2if - or detector.board.feather_rfm_u2if - or detector.board.qtpy_u2if - or detector.board.itsybitsy_u2if - or detector.board.macropad_u2if - or detector.board.qt2040_trinkey_u2if - or detector.board.kb2040_u2if -): - from adafruit_blinka.microcontroller.rp2040_u2if.pwmio import PWMOut -elif "sphinx" in sys.modules: - pass -else: - raise NotImplementedError("pwmio not supported for this board.") +try: + if detector.board.any_raspberry_pi_5_board: + from adafruit_blinka.microcontroller.generic_linux.lgpio_pwmout import PWMOut + elif detector.board.any_raspberry_pi: + # Pi 4 or lower + from adafruit_blinka.microcontroller.generic_linux.rpi_gpio_pwmout import PWMOut + elif detector.board.any_bananapi: + from adafruit_blinka.microcontroller.generic_linux.sysfs_pwmout import PWMOut + elif detector.board.any_coral_board: + from adafruit_blinka.microcontroller.generic_linux.sysfs_pwmout import PWMOut + elif detector.board.any_giant_board: + from adafruit_blinka.microcontroller.generic_linux.sysfs_pwmout import PWMOut + elif detector.board.any_pcduino_board: + from adafruit_blinka.microcontroller.generic_linux.sysfs_pwmout import PWMOut + elif detector.board.any_beaglebone: + from adafruit_blinka.microcontroller.am335x.sysfs_pwmout import PWMOut + elif detector.board.any_lemaker: + from adafruit_blinka.microcontroller.generic_linux.sysfs_pwmout import PWMOut + elif detector.board.any_siemens_simatic_iot2000: + from adafruit_blinka.microcontroller.am65xx.pwmout import PWMOut + elif detector.board.any_odroid_40_pin: + from adafruit_blinka.microcontroller.generic_linux.sysfs_pwmout import PWMOut + elif detector.board.any_rock_pi_board: + from adafruit_blinka.microcontroller.rockchip.PWMOut import PWMOut + elif detector.board.binho_nova: + from adafruit_blinka.microcontroller.nova.pwmout import PWMOut + elif detector.board.greatfet_one: + from adafruit_blinka.microcontroller.nxp_lpc4330.pwmout import PWMOut + elif detector.board.any_lubancat: + from adafruit_blinka.microcontroller.generic_linux.sysfs_pwmout import PWMOut + elif detector.board.pico_u2if: + from adafruit_blinka.microcontroller.rp2040_u2if.pwmio import PWMOut + elif detector.board.any_jetson_board: + from adafruit_blinka.microcontroller.tegra.PWMOut import PWMOut + elif detector.board.any_luckfox_pico_board: + from adafruit_blinka.microcontroller.generic_linux.sysfs_pwmout import PWMOut + elif detector.board.any_starfive_id: + from adafruit_blinka.microcontroller.starfive.JH7110.pwmio import PWMOut + elif detector.board.any_horizon_board: + from adafruit_blinka.microcontroller.horizon.pwmio.PWMOut import PWMOut + elif detector.board.OS_AGNOSTIC_BOARD: + from adafruit_blinka.microcontroller.generic_agnostic_board.PWMOut import PWMOut + elif ( + detector.board.feather_u2if + or detector.board.feather_can_u2if + or detector.board.feather_epd_u2if + or detector.board.feather_rfm_u2if + or detector.board.qtpy_u2if + or detector.board.itsybitsy_u2if + or detector.board.macropad_u2if + or detector.board.qt2040_trinkey_u2if + or detector.board.kb2040_u2if + ): + from adafruit_blinka.microcontroller.rp2040_u2if.pwmio import PWMOut + elif "sphinx" in sys.modules: + pass + else: + raise NotImplementedError("pwmio not supported for this board.") +except ModuleNotFoundError as error: + raise_for_missing_platform_dependency(error) From 754d68b9e88c2c9a992e039056a434d46c66828c Mon Sep 17 00:00:00 2001 From: Piclaw Date: Tue, 23 Jun 2026 14:39:22 -0700 Subject: [PATCH 02/18] Add lgpio direct URL wheels for Python 3.13-3.15 on aarch64 --- requirements.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/requirements.txt b/requirements.txt index 9525c471..1a2172b5 100755 --- a/requirements.txt +++ b/requirements.txt @@ -8,6 +8,9 @@ toml>=0.10.2;python_version<'3.11' Jetson.GPIO;sys_platform=='linux' and platform_machine=='aarch64' rpi_ws281x>=4.0.0;sys_platform=='linux' and (platform_machine=='armv6l' or platform_machine=='armv7l' or platform_machine=='aarch64') lgpio>=0.2.2.0;sys_platform=='linux' and python_version<'3.13' and platform_machine=='aarch64' +lgpio @ https://github.com/adafruit/lgpio-python-wheels/raw/main/wheels/lgpio-0.2.2.0-cp313-cp313-linux_aarch64.whl ; sys_platform=='linux' and platform_machine=='aarch64' and python_version=='3.13' +lgpio @ https://github.com/adafruit/lgpio-python-wheels/raw/main/wheels/lgpio-0.2.2.0-cp314-cp314-linux_aarch64.whl ; sys_platform=='linux' and platform_machine=='aarch64' and python_version=='3.14' +lgpio @ https://github.com/adafruit/lgpio-python-wheels/raw/main/wheels/lgpio-0.2.2.0-cp315-cp315-linux_aarch64.whl ; sys_platform=='linux' and platform_machine=='aarch64' and python_version=='3.15' RPi.GPIO;sys_platform=='linux' and (platform_machine=='armv6l' or platform_machine=='armv7l' or platform_machine=='aarch64') Adafruit-Blinka-Raspberry-Pi5-Neopixel;sys_platform=='linux' and platform_machine=='aarch64' and python_version>='3.11' Adafruit_BBIO>=1.2.4;sys_platform=='linux' and platform_machine=='armv7l' From 6e8a4279c7e2246fbd4b9e6dceae1d42c111f31f Mon Sep 17 00:00:00 2001 From: Piclaw Date: Wed, 24 Jun 2026 11:46:19 -0700 Subject: [PATCH 03/18] Add BeaglePlay board support and bump PlatformDetect minimum - Add src/adafruit_blinka/microcontroller/ti/am625x/pin.py with libgpiod Pin definitions for all three I2C buses (MIKROBUS i2c-3, Grove i2c-1, QWIIC i2c-5), USR LEDs, user button, and MIKROBUS GPIOs - Add src/adafruit_blinka/board/beagleboard/beagle_play.py exposing SCL/SDA (MIKROBUS), QWIIC_SCL/SDA, GROVE_SCL/SDA, LED_USRn, USR_BUTTON, and MIKROBUS_GPIO1_N pins - Register BEAGLE_PLAY in board_imports.json and AM625X in microcontroller_imports.json - Bump Adafruit-PlatformDetect minimum from >=3.70.1 to >=3.89.0 (3.89.1 fixes BeaglePlay nvmem path; 3.88.0 broke XU4 detection) Tested on BeaglePlay (aarch64, Debian Trixie, Python 3.13.5): - board.id = BEAGLE_PLAY confirmed - busio.I2C works on all three buses (MIKROBUS, QWIIC, Grove) --- requirements.txt | 2 +- .../board/beagleboard/beagle_play.py | 39 ++++++++++++++ .../microcontroller/ti/__init__.py | 0 .../microcontroller/ti/am625x/__init__.py | 0 .../microcontroller/ti/am625x/pin.py | 54 +++++++++++++++++++ src/board_imports.json | 1 + src/microcontroller_imports.json | 1 + 7 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 src/adafruit_blinka/board/beagleboard/beagle_play.py create mode 100644 src/adafruit_blinka/microcontroller/ti/__init__.py create mode 100644 src/adafruit_blinka/microcontroller/ti/am625x/__init__.py create mode 100644 src/adafruit_blinka/microcontroller/ti/am625x/pin.py diff --git a/requirements.txt b/requirements.txt index 1a2172b5..662c9df9 100755 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -Adafruit-PlatformDetect>=3.70.1 +Adafruit-PlatformDetect>=3.89.0 Adafruit-PureIO>=1.1.7 binho-host-adapter>=0.1.6 pyftdi>=0.40.0 diff --git a/src/adafruit_blinka/board/beagleboard/beagle_play.py b/src/adafruit_blinka/board/beagleboard/beagle_play.py new file mode 100644 index 00000000..a497f966 --- /dev/null +++ b/src/adafruit_blinka/board/beagleboard/beagle_play.py @@ -0,0 +1,39 @@ +# SPDX-FileCopyrightText: 2026 Melissa LeBlanc-Williams for Adafruit Industries +# +# SPDX-License-Identifier: MIT +"""Pin definitions for the BeaglePlay.""" +from adafruit_blinka.microcontroller.ti.am625x import pin + +# MIKROBUS connector I2C (i2c-3, /dev/play/mikrobus/i2c) +SCL = pin.MIKROBUS_SCL +SDA = pin.MIKROBUS_SDA + +# QWIIC / STEMMA QT connector (i2c-5, /dev/play/qwiic/i2c) +QWIIC_SCL = pin.QWIIC_SCL +QWIIC_SDA = pin.QWIIC_SDA + +# Grove connector I2C (i2c-1, /dev/play/grove/i2c) +GROVE_SCL = pin.GROVE_SCL +GROVE_SDA = pin.GROVE_SDA + +# MIKROBUS general-purpose GPIO +MIKROBUS_GPIO1_7 = pin.MIKROBUS_GPIO1_7 +MIKROBUS_GPIO1_8 = pin.MIKROBUS_GPIO1_8 +MIKROBUS_GPIO1_9 = pin.MIKROBUS_GPIO1_9 +MIKROBUS_GPIO1_10 = pin.MIKROBUS_GPIO1_10 +MIKROBUS_GPIO1_11 = pin.MIKROBUS_GPIO1_11 +MIKROBUS_GPIO1_12 = pin.MIKROBUS_GPIO1_12 +MIKROBUS_W1 = pin.MIKROBUS_W1 +MIKROBUS_GPIO1_14 = pin.MIKROBUS_GPIO1_14 +MIKROBUS_GPIO1_24 = pin.MIKROBUS_GPIO1_24 +MIKROBUS_GPIO1_25 = pin.MIKROBUS_GPIO1_25 + +# User LEDs (gpiochip2) +LED_USR0 = pin.USR0 +LED_USR1 = pin.USR1 +LED_USR2 = pin.USR2 +LED_USR3 = pin.USR3 +LED_USR4 = pin.USR4 + +# User button +USR_BUTTON = pin.USR_BUTTON diff --git a/src/adafruit_blinka/microcontroller/ti/__init__.py b/src/adafruit_blinka/microcontroller/ti/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/adafruit_blinka/microcontroller/ti/am625x/__init__.py b/src/adafruit_blinka/microcontroller/ti/am625x/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/adafruit_blinka/microcontroller/ti/am625x/pin.py b/src/adafruit_blinka/microcontroller/ti/am625x/pin.py new file mode 100644 index 00000000..3879e257 --- /dev/null +++ b/src/adafruit_blinka/microcontroller/ti/am625x/pin.py @@ -0,0 +1,54 @@ +# SPDX-FileCopyrightText: 2026 Melissa LeBlanc-Williams for Adafruit Industries +# +# SPDX-License-Identifier: MIT +"""TI AM625X pin names (BeaglePlay)""" +from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin + +# gpiochip1 (4201000.gpio) – MCU domain GPIO +QWIIC_SCL = Pin((1, 17)) # MCU_I2C0_SCL +QWIIC_SDA = Pin((1, 18)) # MCU_I2C0_SDA + +# gpiochip2 (600000.gpio) – main_gpio0 +USR0 = Pin((2, 3)) # USR0 LED +USR1 = Pin((2, 4)) # USR1 LED +USR2 = Pin((2, 5)) # USR2 LED +USR3 = Pin((2, 6)) # USR3 LED +USR4 = Pin((2, 9)) # USR4 LED +USR_BUTTON = Pin((2, 18)) + +# gpiochip3 (601000.gpio) – main_gpio1 +# MIKROBUS I2C (i2c-3) +MIKROBUS_SCL = Pin((3, 22)) # MIKROBUS_GPIO1_22 / main_i2c3_scl +MIKROBUS_SDA = Pin((3, 23)) # MIKROBUS_GPIO1_23 / main_i2c3_sda + +# Grove I2C (i2c-1) +GROVE_SCL = Pin((3, 28)) # main_i2c1_scl +GROVE_SDA = Pin((3, 29)) # main_i2c1_sda + +# MIKROBUS general-purpose GPIO lines +MIKROBUS_GPIO1_7 = Pin((3, 7)) +MIKROBUS_GPIO1_8 = Pin((3, 8)) +MIKROBUS_GPIO1_9 = Pin((3, 9)) +MIKROBUS_GPIO1_10 = Pin((3, 10)) +MIKROBUS_GPIO1_11 = Pin((3, 11)) +MIKROBUS_GPIO1_12 = Pin((3, 12)) +MIKROBUS_W1 = Pin((3, 13)) # 1-Wire GPIO +MIKROBUS_GPIO1_14 = Pin((3, 14)) +MIKROBUS_GPIO1_24 = Pin((3, 24)) +MIKROBUS_GPIO1_25 = Pin((3, 25)) + +# ordered as (i2cId, SCL, SDA) +i2cPorts = ( + (3, MIKROBUS_SCL, MIKROBUS_SDA), # MIKROBUS I2C → /dev/play/mikrobus/i2c + (1, GROVE_SCL, GROVE_SDA), # Grove I2C → /dev/play/grove/i2c + (5, QWIIC_SCL, QWIIC_SDA), # QWIIC → /dev/play/qwiic/i2c +) + +# ordered as (spiId, sckId, mosiId, misoId) +# MIKROBUS SPI is managed by the Greybus/CC1352P7 coprocessor; +# no spidev is exposed by default on stock images. +spiPorts = () + +# ordered as (uartId, txId, rxId) +# MIKROBUS UART = /dev/ttyS0 (main_uart0) +uartPorts = () diff --git a/src/board_imports.json b/src/board_imports.json index 472df3f9..533c7ad1 100644 --- a/src/board_imports.json +++ b/src/board_imports.json @@ -22,6 +22,7 @@ "BEAGLEBONE_BLACK_WIRELESS": "adafruit_blinka.board.beagleboard.beaglebone_black", "BEAGLEBONE_POCKETBEAGLE": "adafruit_blinka.board.beagleboard.beaglebone_pocketbeagle", "BEAGLEBONE_AI": "adafruit_blinka.board.beagleboard.beaglebone_ai", + "BEAGLE_PLAY": "adafruit_blinka.board.beagleboard.beagle_play", "BEAGLEV_STARLIGHT": "adafruit_blinka.board.beagleboard.beaglev_starlight", "ORANGE_PI_PC": "adafruit_blinka.board.orangepi.orangepipc", "ORANGE_PI_PC2": "adafruit_blinka.board.orangepi.orangepipc2", diff --git a/src/microcontroller_imports.json b/src/microcontroller_imports.json index 82cfc424..23f18948 100644 --- a/src/microcontroller_imports.json +++ b/src/microcontroller_imports.json @@ -5,6 +5,7 @@ "default": "adafruit_blinka.microcontroller.bcm283x" }, "AM33XX": "adafruit_blinka.microcontroller.am335x", + "AM625X": "adafruit_blinka.microcontroller.ti.am625x", "AM65XX": "adafruit_blinka.microcontroller.am65xx", "JH7110": "adafruit_blinka.microcontroller.starfive.JH7110", "JH71X0": "adafruit_blinka.microcontroller.starfive.JH71x0", From cc31a6204f0783dd272c921b5e7209da38a3f36f Mon Sep 17 00:00:00 2001 From: Piclaw Date: Wed, 24 Jun 2026 11:48:12 -0700 Subject: [PATCH 04/18] Fix black formatting in am625x pin.py --- .../microcontroller/ti/am625x/pin.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/adafruit_blinka/microcontroller/ti/am625x/pin.py b/src/adafruit_blinka/microcontroller/ti/am625x/pin.py index 3879e257..97efb169 100644 --- a/src/adafruit_blinka/microcontroller/ti/am625x/pin.py +++ b/src/adafruit_blinka/microcontroller/ti/am625x/pin.py @@ -9,11 +9,11 @@ QWIIC_SDA = Pin((1, 18)) # MCU_I2C0_SDA # gpiochip2 (600000.gpio) – main_gpio0 -USR0 = Pin((2, 3)) # USR0 LED -USR1 = Pin((2, 4)) # USR1 LED -USR2 = Pin((2, 5)) # USR2 LED -USR3 = Pin((2, 6)) # USR3 LED -USR4 = Pin((2, 9)) # USR4 LED +USR0 = Pin((2, 3)) # USR0 LED +USR1 = Pin((2, 4)) # USR1 LED +USR2 = Pin((2, 5)) # USR2 LED +USR3 = Pin((2, 6)) # USR3 LED +USR4 = Pin((2, 9)) # USR4 LED USR_BUTTON = Pin((2, 18)) # gpiochip3 (601000.gpio) – main_gpio1 @@ -32,7 +32,7 @@ MIKROBUS_GPIO1_10 = Pin((3, 10)) MIKROBUS_GPIO1_11 = Pin((3, 11)) MIKROBUS_GPIO1_12 = Pin((3, 12)) -MIKROBUS_W1 = Pin((3, 13)) # 1-Wire GPIO +MIKROBUS_W1 = Pin((3, 13)) # 1-Wire GPIO MIKROBUS_GPIO1_14 = Pin((3, 14)) MIKROBUS_GPIO1_24 = Pin((3, 24)) MIKROBUS_GPIO1_25 = Pin((3, 25)) @@ -40,8 +40,8 @@ # ordered as (i2cId, SCL, SDA) i2cPorts = ( (3, MIKROBUS_SCL, MIKROBUS_SDA), # MIKROBUS I2C → /dev/play/mikrobus/i2c - (1, GROVE_SCL, GROVE_SDA), # Grove I2C → /dev/play/grove/i2c - (5, QWIIC_SCL, QWIIC_SDA), # QWIIC → /dev/play/qwiic/i2c + (1, GROVE_SCL, GROVE_SDA), # Grove I2C → /dev/play/grove/i2c + (5, QWIIC_SCL, QWIIC_SDA), # QWIIC → /dev/play/qwiic/i2c ) # ordered as (spiId, sckId, mosiId, misoId) From 27174ea4e363f428acdcb3ff5141254d8bbdfcbd Mon Sep 17 00:00:00 2001 From: Piclaw Date: Wed, 24 Jun 2026 11:50:50 -0700 Subject: [PATCH 05/18] Remove BeaglePlay files from future-proof (moved to PR #1115) --- .../board/beagleboard/beagle_play.py | 39 -------------- .../microcontroller/ti/__init__.py | 0 .../microcontroller/ti/am625x/__init__.py | 0 .../microcontroller/ti/am625x/pin.py | 54 ------------------- src/board_imports.json | 1 - src/microcontroller_imports.json | 1 - 6 files changed, 95 deletions(-) delete mode 100644 src/adafruit_blinka/board/beagleboard/beagle_play.py delete mode 100644 src/adafruit_blinka/microcontroller/ti/__init__.py delete mode 100644 src/adafruit_blinka/microcontroller/ti/am625x/__init__.py delete mode 100644 src/adafruit_blinka/microcontroller/ti/am625x/pin.py diff --git a/src/adafruit_blinka/board/beagleboard/beagle_play.py b/src/adafruit_blinka/board/beagleboard/beagle_play.py deleted file mode 100644 index a497f966..00000000 --- a/src/adafruit_blinka/board/beagleboard/beagle_play.py +++ /dev/null @@ -1,39 +0,0 @@ -# SPDX-FileCopyrightText: 2026 Melissa LeBlanc-Williams for Adafruit Industries -# -# SPDX-License-Identifier: MIT -"""Pin definitions for the BeaglePlay.""" -from adafruit_blinka.microcontroller.ti.am625x import pin - -# MIKROBUS connector I2C (i2c-3, /dev/play/mikrobus/i2c) -SCL = pin.MIKROBUS_SCL -SDA = pin.MIKROBUS_SDA - -# QWIIC / STEMMA QT connector (i2c-5, /dev/play/qwiic/i2c) -QWIIC_SCL = pin.QWIIC_SCL -QWIIC_SDA = pin.QWIIC_SDA - -# Grove connector I2C (i2c-1, /dev/play/grove/i2c) -GROVE_SCL = pin.GROVE_SCL -GROVE_SDA = pin.GROVE_SDA - -# MIKROBUS general-purpose GPIO -MIKROBUS_GPIO1_7 = pin.MIKROBUS_GPIO1_7 -MIKROBUS_GPIO1_8 = pin.MIKROBUS_GPIO1_8 -MIKROBUS_GPIO1_9 = pin.MIKROBUS_GPIO1_9 -MIKROBUS_GPIO1_10 = pin.MIKROBUS_GPIO1_10 -MIKROBUS_GPIO1_11 = pin.MIKROBUS_GPIO1_11 -MIKROBUS_GPIO1_12 = pin.MIKROBUS_GPIO1_12 -MIKROBUS_W1 = pin.MIKROBUS_W1 -MIKROBUS_GPIO1_14 = pin.MIKROBUS_GPIO1_14 -MIKROBUS_GPIO1_24 = pin.MIKROBUS_GPIO1_24 -MIKROBUS_GPIO1_25 = pin.MIKROBUS_GPIO1_25 - -# User LEDs (gpiochip2) -LED_USR0 = pin.USR0 -LED_USR1 = pin.USR1 -LED_USR2 = pin.USR2 -LED_USR3 = pin.USR3 -LED_USR4 = pin.USR4 - -# User button -USR_BUTTON = pin.USR_BUTTON diff --git a/src/adafruit_blinka/microcontroller/ti/__init__.py b/src/adafruit_blinka/microcontroller/ti/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/src/adafruit_blinka/microcontroller/ti/am625x/__init__.py b/src/adafruit_blinka/microcontroller/ti/am625x/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/src/adafruit_blinka/microcontroller/ti/am625x/pin.py b/src/adafruit_blinka/microcontroller/ti/am625x/pin.py deleted file mode 100644 index 97efb169..00000000 --- a/src/adafruit_blinka/microcontroller/ti/am625x/pin.py +++ /dev/null @@ -1,54 +0,0 @@ -# SPDX-FileCopyrightText: 2026 Melissa LeBlanc-Williams for Adafruit Industries -# -# SPDX-License-Identifier: MIT -"""TI AM625X pin names (BeaglePlay)""" -from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin - -# gpiochip1 (4201000.gpio) – MCU domain GPIO -QWIIC_SCL = Pin((1, 17)) # MCU_I2C0_SCL -QWIIC_SDA = Pin((1, 18)) # MCU_I2C0_SDA - -# gpiochip2 (600000.gpio) – main_gpio0 -USR0 = Pin((2, 3)) # USR0 LED -USR1 = Pin((2, 4)) # USR1 LED -USR2 = Pin((2, 5)) # USR2 LED -USR3 = Pin((2, 6)) # USR3 LED -USR4 = Pin((2, 9)) # USR4 LED -USR_BUTTON = Pin((2, 18)) - -# gpiochip3 (601000.gpio) – main_gpio1 -# MIKROBUS I2C (i2c-3) -MIKROBUS_SCL = Pin((3, 22)) # MIKROBUS_GPIO1_22 / main_i2c3_scl -MIKROBUS_SDA = Pin((3, 23)) # MIKROBUS_GPIO1_23 / main_i2c3_sda - -# Grove I2C (i2c-1) -GROVE_SCL = Pin((3, 28)) # main_i2c1_scl -GROVE_SDA = Pin((3, 29)) # main_i2c1_sda - -# MIKROBUS general-purpose GPIO lines -MIKROBUS_GPIO1_7 = Pin((3, 7)) -MIKROBUS_GPIO1_8 = Pin((3, 8)) -MIKROBUS_GPIO1_9 = Pin((3, 9)) -MIKROBUS_GPIO1_10 = Pin((3, 10)) -MIKROBUS_GPIO1_11 = Pin((3, 11)) -MIKROBUS_GPIO1_12 = Pin((3, 12)) -MIKROBUS_W1 = Pin((3, 13)) # 1-Wire GPIO -MIKROBUS_GPIO1_14 = Pin((3, 14)) -MIKROBUS_GPIO1_24 = Pin((3, 24)) -MIKROBUS_GPIO1_25 = Pin((3, 25)) - -# ordered as (i2cId, SCL, SDA) -i2cPorts = ( - (3, MIKROBUS_SCL, MIKROBUS_SDA), # MIKROBUS I2C → /dev/play/mikrobus/i2c - (1, GROVE_SCL, GROVE_SDA), # Grove I2C → /dev/play/grove/i2c - (5, QWIIC_SCL, QWIIC_SDA), # QWIIC → /dev/play/qwiic/i2c -) - -# ordered as (spiId, sckId, mosiId, misoId) -# MIKROBUS SPI is managed by the Greybus/CC1352P7 coprocessor; -# no spidev is exposed by default on stock images. -spiPorts = () - -# ordered as (uartId, txId, rxId) -# MIKROBUS UART = /dev/ttyS0 (main_uart0) -uartPorts = () diff --git a/src/board_imports.json b/src/board_imports.json index 533c7ad1..472df3f9 100644 --- a/src/board_imports.json +++ b/src/board_imports.json @@ -22,7 +22,6 @@ "BEAGLEBONE_BLACK_WIRELESS": "adafruit_blinka.board.beagleboard.beaglebone_black", "BEAGLEBONE_POCKETBEAGLE": "adafruit_blinka.board.beagleboard.beaglebone_pocketbeagle", "BEAGLEBONE_AI": "adafruit_blinka.board.beagleboard.beaglebone_ai", - "BEAGLE_PLAY": "adafruit_blinka.board.beagleboard.beagle_play", "BEAGLEV_STARLIGHT": "adafruit_blinka.board.beagleboard.beaglev_starlight", "ORANGE_PI_PC": "adafruit_blinka.board.orangepi.orangepipc", "ORANGE_PI_PC2": "adafruit_blinka.board.orangepi.orangepipc2", diff --git a/src/microcontroller_imports.json b/src/microcontroller_imports.json index 23f18948..82cfc424 100644 --- a/src/microcontroller_imports.json +++ b/src/microcontroller_imports.json @@ -5,7 +5,6 @@ "default": "adafruit_blinka.microcontroller.bcm283x" }, "AM33XX": "adafruit_blinka.microcontroller.am335x", - "AM625X": "adafruit_blinka.microcontroller.ti.am625x", "AM65XX": "adafruit_blinka.microcontroller.am65xx", "JH7110": "adafruit_blinka.microcontroller.starfive.JH7110", "JH71X0": "adafruit_blinka.microcontroller.starfive.JH71x0", From 07e8909397b90e1a6ddb0dcf58f3924cedda7349 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Wed, 24 Jun 2026 12:26:28 -0700 Subject: [PATCH 06/18] Run pre-commit --- src/board.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/board.py b/src/board.py index 87459cdc..91f3a519 100644 --- a/src/board.py +++ b/src/board.py @@ -53,9 +53,9 @@ package_version = version("adafruit_platformdetect") raise NotImplementedError( f""" - adafruit-platformdetect version {package_version} was unable to identify the board and/or - microcontroller running the {platform.system()} platform. Please be sure you - have the latest packages by running: + adafruit-platformdetect version {package_version} was unable to identify the board + and/or microcontroller running the {platform.system()} platform. + Please be sure you have the latest packages by running: 'pip3 install --upgrade adafruit-blinka adafruit-platformdetect' If you are running the latest package, your board may not yet be supported. Please From 96f55032c76e21ef73c2e94e74add26f11119836 Mon Sep 17 00:00:00 2001 From: Piclaw Date: Wed, 24 Jun 2026 12:40:11 -0700 Subject: [PATCH 07/18] Fix missing glob import in setup.py --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 3770a968..6bc57794 100644 --- a/setup.py +++ b/setup.py @@ -8,6 +8,7 @@ # Note: To use the 'upload' functionality of this file, you must: # $ pip install twine +import glob import io import os From 2e095fd25c49d3519f9a10edb675ebc410caa872 Mon Sep 17 00:00:00 2001 From: Piclaw Date: Wed, 24 Jun 2026 12:46:12 -0700 Subject: [PATCH 08/18] Remove Python.h check from setup.py (Python 3.13 exec/locals compat) --- setup.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/setup.py b/setup.py index 6bc57794..e7af68b0 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,6 @@ # Note: To use the 'upload' functionality of this file, you must: # $ pip install twine -import glob import io import os @@ -22,12 +21,6 @@ with io.open(os.path.join(here, "README.rst"), encoding="utf-8") as f: long_description = "\n" + f.read() -if not glob.glob("//usr//include//python3.*//Python.h"): - raise RuntimeError( - "This package requires a Python development environment. " - "Please install the python3-dev package for your distribution." - ) - board_reqs = [] if os.path.exists("/proc/device-tree/compatible"): with open("/proc/device-tree/compatible", "rb") as f: From 6bbfa30f8601582b517855e4adf9eec8bcb6c9db Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Wed, 24 Jun 2026 13:05:03 -0700 Subject: [PATCH 09/18] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index e7af68b0..28f8f05a 100644 --- a/setup.py +++ b/setup.py @@ -123,6 +123,7 @@ "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: Implementation :: MicroPython", ], From d00c0e4d875ec4ce15de7044237752e6ad42c352 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Wed, 24 Jun 2026 13:09:39 -0700 Subject: [PATCH 10/18] Bump actions Python version to 3.9 --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 80940d0f..5dc7dc28 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,10 +16,10 @@ jobs: - name: Translate Repo Name For Build Tools filename_prefix id: repo-name run: echo "repo-name=Adafruit-Blinka" >> $GITHUB_OUTPUT - - name: Set up Python 3.8 + - name: Set up Python 3.9 uses: actions/setup-python@v4 with: - python-version: 3.8 + python-version: 3.9 - name: Versions run: | python3 --version From 89b26d32f50e506747abd87d74f0d41d13bfaca1 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Wed, 24 Jun 2026 13:14:11 -0700 Subject: [PATCH 11/18] Update reuse tool to v6.2.0 --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a09b8af4..22f3b7f2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,11 +8,11 @@ repos: hooks: - id: black - repo: https://github.com/fsfe/reuse-tool - rev: v1.1.2 + rev: v6.2.0 hooks: - id: reuse - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v6.0.0 hooks: - id: check-yaml - id: check-json From 01b4b3bd1e0a435ab0ad70c8a62d260305650f98 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Wed, 24 Jun 2026 13:24:46 -0700 Subject: [PATCH 12/18] Bump GH actions to python 3.10 for REUSE --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5dc7dc28..1df89a9e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,10 +16,10 @@ jobs: - name: Translate Repo Name For Build Tools filename_prefix id: repo-name run: echo "repo-name=Adafruit-Blinka" >> $GITHUB_OUTPUT - - name: Set up Python 3.9 + - name: Set up Python 3.10 uses: actions/setup-python@v4 with: - python-version: 3.9 + python-version: 3.10 - name: Versions run: | python3 --version From 0b698e7515e7621471b1929dfb089b25933974ea Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Wed, 24 Jun 2026 13:29:42 -0700 Subject: [PATCH 13/18] Put Python 3.10 in quotes so it doesn't think it's 3.1 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1df89a9e..6d074b0d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,7 +19,7 @@ jobs: - name: Set up Python 3.10 uses: actions/setup-python@v4 with: - python-version: 3.10 + python-version: '3.10' - name: Versions run: | python3 --version From da8a980f2ae87939f4779e3425625cecb2e7a221 Mon Sep 17 00:00:00 2001 From: Piclaw Date: Mon, 29 Jun 2026 09:14:36 -0700 Subject: [PATCH 14/18] Fix lgpio install on Pi with Python 3.13+ aarch64 On Python 3.13+, lgpio has no pre-built wheel on PyPI or piwheels for aarch64. When setup.py resolved lgpio as a plain >=0.2.2.0 dependency, pip fell back to building from source and failed with: error: command 'swig' failed: No such file or directory Fix: detect Python version at install time and use the pre-built URL wheel for 3.13/3.14/3.15 on aarch64 (same wheels already referenced in requirements.txt). Non-aarch64 and Python <3.13 keep the plain lgpio>=0.2.2.0 spec since piwheels has those covered. Reported by @FoamyGuy in PR review. --- setup.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index e7af68b0..c315208f 100644 --- a/setup.py +++ b/setup.py @@ -10,6 +10,7 @@ import io import os +import sys from setuptools import setup, find_packages @@ -37,7 +38,18 @@ or b"brcm,bcm2711" in compat or b"brcm,bcm2712" in compat ): - lgpio_req = "lgpio>=0.2.2.0" + _pyver = (sys.version_info.major, sys.version_info.minor) + _machine = os.uname().machine + # Pre-built URL wheels for Python 3.13-3.15 aarch64 (no PyPI wheel, swig not required) + _lgpio_url_versions = {(3, 13), (3, 14), (3, 15)} + if _pyver in _lgpio_url_versions and _machine == "aarch64": + _pytag = f"cp{_pyver[0]}{_pyver[1]}" + lgpio_req = ( + "lgpio @ https://github.com/adafruit/lgpio-python-wheels/raw/main/" + f"wheels/lgpio-0.2.2.0-{_pytag}-{_pytag}-linux_aarch64.whl" + ) + else: + lgpio_req = "lgpio>=0.2.2.0" try: import lgpio except ImportError: From 52dc40ecfb75977a650e38ba4277aeac772ee8c5 Mon Sep 17 00:00:00 2001 From: Piclaw Date: Mon, 29 Jun 2026 12:24:36 -0700 Subject: [PATCH 15/18] Replace lgpio URL wheels with adafruit-lgpio for Python 3.13+ --- requirements.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/requirements.txt b/requirements.txt index 662c9df9..5b3461f0 100755 --- a/requirements.txt +++ b/requirements.txt @@ -7,10 +7,8 @@ sysv_ipc>=1.1.0;sys_platform=='linux' and platform_machine!='mips' toml>=0.10.2;python_version<'3.11' Jetson.GPIO;sys_platform=='linux' and platform_machine=='aarch64' rpi_ws281x>=4.0.0;sys_platform=='linux' and (platform_machine=='armv6l' or platform_machine=='armv7l' or platform_machine=='aarch64') -lgpio>=0.2.2.0;sys_platform=='linux' and python_version<'3.13' and platform_machine=='aarch64' -lgpio @ https://github.com/adafruit/lgpio-python-wheels/raw/main/wheels/lgpio-0.2.2.0-cp313-cp313-linux_aarch64.whl ; sys_platform=='linux' and platform_machine=='aarch64' and python_version=='3.13' -lgpio @ https://github.com/adafruit/lgpio-python-wheels/raw/main/wheels/lgpio-0.2.2.0-cp314-cp314-linux_aarch64.whl ; sys_platform=='linux' and platform_machine=='aarch64' and python_version=='3.14' -lgpio @ https://github.com/adafruit/lgpio-python-wheels/raw/main/wheels/lgpio-0.2.2.0-cp315-cp315-linux_aarch64.whl ; sys_platform=='linux' and platform_machine=='aarch64' and python_version=='3.15' +lgpio>=0.2.2.0; sys_platform=='linux' and python_version<'3.13' and platform_machine in ('aarch64', 'armv7l') +adafruit-lgpio>=0.2.2.0; sys_platform=='linux' and python_version>='3.13' and platform_machine in ('aarch64', 'armv7l') RPi.GPIO;sys_platform=='linux' and (platform_machine=='armv6l' or platform_machine=='armv7l' or platform_machine=='aarch64') Adafruit-Blinka-Raspberry-Pi5-Neopixel;sys_platform=='linux' and platform_machine=='aarch64' and python_version>='3.11' Adafruit_BBIO>=1.2.4;sys_platform=='linux' and platform_machine=='armv7l' From 2865444f1fe3be4048011f5c300dd81a57922949 Mon Sep 17 00:00:00 2001 From: Piclaw Date: Mon, 29 Jun 2026 12:26:28 -0700 Subject: [PATCH 16/18] Update setup.py lgpio logic to use adafruit-lgpio for Python 3.13+ --- setup.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/setup.py b/setup.py index c315208f..cc38407d 100644 --- a/setup.py +++ b/setup.py @@ -39,15 +39,9 @@ or b"brcm,bcm2712" in compat ): _pyver = (sys.version_info.major, sys.version_info.minor) - _machine = os.uname().machine - # Pre-built URL wheels for Python 3.13-3.15 aarch64 (no PyPI wheel, swig not required) - _lgpio_url_versions = {(3, 13), (3, 14), (3, 15)} - if _pyver in _lgpio_url_versions and _machine == "aarch64": - _pytag = f"cp{_pyver[0]}{_pyver[1]}" - lgpio_req = ( - "lgpio @ https://github.com/adafruit/lgpio-python-wheels/raw/main/" - f"wheels/lgpio-0.2.2.0-{_pytag}-{_pytag}-linux_aarch64.whl" - ) + # adafruit-lgpio provides pre-built wheels for Python 3.13+ (aarch64 + armv7l) + if _pyver >= (3, 13): + lgpio_req = "adafruit-lgpio>=0.2.2.0" else: lgpio_req = "lgpio>=0.2.2.0" try: @@ -57,8 +51,8 @@ "\n*** lgpio is not installed. On Raspberry Pi OS, install it with:\n" " sudo apt-get install -y python3-lgpio\n" " Then recreate your virtual environment with --system-site-packages\n" - " or install the wheel from:\n" - " https://github.com/adafruit/lgpio-python-wheels\n" + " or install adafruit-lgpio from PyPI:\n" + " pip install adafruit-lgpio\n" ) board_reqs = [ "rpi_ws281x>=4.0.0", From e47101b3770fd827a38471a6b93767747fce4955 Mon Sep 17 00:00:00 2001 From: Piclaw Date: Mon, 29 Jun 2026 12:29:06 -0700 Subject: [PATCH 17/18] Fix marker syntax: use == with or instead of in tuple --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 5b3461f0..fbf93dc0 100755 --- a/requirements.txt +++ b/requirements.txt @@ -7,8 +7,8 @@ sysv_ipc>=1.1.0;sys_platform=='linux' and platform_machine!='mips' toml>=0.10.2;python_version<'3.11' Jetson.GPIO;sys_platform=='linux' and platform_machine=='aarch64' rpi_ws281x>=4.0.0;sys_platform=='linux' and (platform_machine=='armv6l' or platform_machine=='armv7l' or platform_machine=='aarch64') -lgpio>=0.2.2.0; sys_platform=='linux' and python_version<'3.13' and platform_machine in ('aarch64', 'armv7l') -adafruit-lgpio>=0.2.2.0; sys_platform=='linux' and python_version>='3.13' and platform_machine in ('aarch64', 'armv7l') +lgpio>=0.2.2.0; sys_platform=='linux' and python_version<'3.13' and (platform_machine=='aarch64' or platform_machine=='armv7l') +adafruit-lgpio>=0.2.2.0; sys_platform=='linux' and python_version>='3.13' and (platform_machine=='aarch64' or platform_machine=='armv7l') RPi.GPIO;sys_platform=='linux' and (platform_machine=='armv6l' or platform_machine=='armv7l' or platform_machine=='aarch64') Adafruit-Blinka-Raspberry-Pi5-Neopixel;sys_platform=='linux' and platform_machine=='aarch64' and python_version>='3.11' Adafruit_BBIO>=1.2.4;sys_platform=='linux' and platform_machine=='armv7l' From 448c12e8a1ea677c2a3685f99099174d9e66231e Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Tue, 7 Jul 2026 12:07:35 -0700 Subject: [PATCH 18/18] Implementing Copilot's suggestions --- setup.py | 1 - src/adafruit_blinka/importing.py | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/setup.py b/setup.py index c603a713..cc38407d 100644 --- a/setup.py +++ b/setup.py @@ -129,7 +129,6 @@ "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: Implementation :: MicroPython", ], diff --git a/src/adafruit_blinka/importing.py b/src/adafruit_blinka/importing.py index 479d2c31..1995b70a 100644 --- a/src/adafruit_blinka/importing.py +++ b/src/adafruit_blinka/importing.py @@ -33,10 +33,7 @@ def import_module(module_name: str, package: str = None): "adafruit_raspberry_pi5_neopixel_write": ( "pip install Adafruit-Blinka-Raspberry-Pi5-Neopixel" ), - "lgpio": ( - "pip install lgpio --find-links " - "https://github.com/adafruit/lgpio-python-wheels/raw/main/wheels/" - ), + "lgpio": "pip install adafruit-lgpio", }