From 60fa43167c45c1ab162292dcf26d6dce9e001851 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Sun, 22 Oct 2023 21:01:02 -0700 Subject: [PATCH] Added Pi 5 Support, fixed libgpiod pulls --- .../board/raspberrypi/raspi_5b.py | 58 +++++++++++ .../microcontroller/bcm2712/__init__.py | 0 .../microcontroller/bcm2712/pin.py | 95 +++++++++++++++++++ .../generic_linux/libgpiod_pin.py | 33 +++---- src/board.py | 3 + src/busio.py | 11 +-- src/digitalio.py | 14 ++- src/microcontroller/pin.py | 9 +- 8 files changed, 191 insertions(+), 32 deletions(-) create mode 100644 src/adafruit_blinka/board/raspberrypi/raspi_5b.py create mode 100644 src/adafruit_blinka/microcontroller/bcm2712/__init__.py create mode 100644 src/adafruit_blinka/microcontroller/bcm2712/pin.py diff --git a/src/adafruit_blinka/board/raspberrypi/raspi_5b.py b/src/adafruit_blinka/board/raspberrypi/raspi_5b.py new file mode 100644 index 0000000..9ecda91 --- /dev/null +++ b/src/adafruit_blinka/board/raspberrypi/raspi_5b.py @@ -0,0 +1,58 @@ +# SPDX-FileCopyrightText: 2023 Melissa LeBlanc-Williams for Adafruit Industries +# +# SPDX-License-Identifier: MIT +"""Pin definitions for Raspberry Pi 5 models using the BCM2712.""" + +from adafruit_blinka.microcontroller.bcm2712 import pin + +D0 = pin.D0 +D1 = pin.D1 + +D2 = pin.D2 +SDA = pin.SDA +D3 = pin.D3 +SCL = pin.SCL + +D4 = pin.D4 +D5 = pin.D5 +D6 = pin.D6 + +D7 = pin.D7 +CE1 = pin.D7 +D8 = pin.D8 +CE0 = pin.D8 +D9 = pin.D9 +MISO = pin.D9 +D10 = pin.D10 +MOSI = pin.D10 +D11 = pin.D11 +SCLK = pin.D11 +SCK = pin.D11 + +D12 = pin.D12 +D13 = pin.D13 + +D14 = pin.D14 +TXD = pin.D14 +D15 = pin.D15 +RXD = pin.D15 +# create alias for most of the examples +TX = pin.D14 +RX = pin.D15 + +D16 = pin.D16 +D17 = pin.D17 +D18 = pin.D18 +D19 = pin.D19 +MISO_1 = pin.D19 +D20 = pin.D20 +MOSI_1 = pin.D20 +D21 = pin.D21 +SCLK_1 = pin.D21 +SCK_1 = pin.D21 +D22 = pin.D22 +D23 = pin.D23 +D24 = pin.D24 +D25 = pin.D25 +D26 = pin.D26 +D27 = pin.D27 diff --git a/src/adafruit_blinka/microcontroller/bcm2712/__init__.py b/src/adafruit_blinka/microcontroller/bcm2712/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/adafruit_blinka/microcontroller/bcm2712/pin.py b/src/adafruit_blinka/microcontroller/bcm2712/pin.py new file mode 100644 index 0000000..19c8854 --- /dev/null +++ b/src/adafruit_blinka/microcontroller/bcm2712/pin.py @@ -0,0 +1,95 @@ +# SPDX-FileCopyrightText: 2023 Melissa LeBlanc-Williams for Adafruit Industries +# +# SPDX-License-Identifier: MIT +"""Broadcom BCM2712 pin names""" +from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin + +# Pi 1B rev1 only? +D0 = Pin((4, 0)) +D1 = Pin((4, 1)) + +D2 = Pin((4, 2)) +SDA = Pin((4, 2)) +D3 = Pin((4, 3)) +SCL = Pin((4, 3)) + +D4 = Pin((4, 4)) +D5 = Pin((4, 5)) +D6 = Pin((4, 6)) + +D7 = Pin((4, 7)) +CE1 = Pin((4, 7)) +D8 = Pin((4, 8)) +CE0 = Pin((4, 8)) +D9 = Pin((4, 9)) +MISO = Pin((4, 9)) +D10 = Pin((4, 10)) +MOSI = Pin((4, 10)) +D11 = Pin((4, 11)) +SCLK = Pin((4, 11)) # Raspberry Pi naming +SCK = Pin((4, 11)) # CircuitPython naming + +D12 = Pin((4, 12)) +D13 = Pin((4, 13)) + +D14 = Pin((4, 14)) +TXD = Pin((4, 14)) +D15 = Pin((4, 15)) +RXD = Pin((4, 15)) + +D16 = Pin((4, 16)) +D17 = Pin((4, 17)) +D18 = Pin((4, 18)) +D19 = Pin((4, 19)) +MISO_1 = Pin((4, 19)) +D20 = Pin((4, 20)) +MOSI_1 = Pin((4, 20)) +D21 = Pin((4, 21)) +SCLK_1 = Pin((4, 21)) +SCK_1 = Pin((4, 21)) +D22 = Pin((4, 22)) +D23 = Pin((4, 23)) +D24 = Pin((4, 24)) +D25 = Pin((4, 25)) +D26 = Pin((4, 26)) +D27 = Pin((4, 27)) +D28 = Pin((4, 28)) +D29 = Pin((4, 29)) +D30 = Pin((4, 30)) +D31 = Pin((4, 31)) +D32 = Pin((4, 32)) +D33 = Pin((4, 33)) +D34 = Pin((4, 34)) +D35 = Pin((4, 35)) +D36 = Pin((4, 36)) +D37 = Pin((4, 37)) +D38 = Pin((4, 38)) +D39 = Pin((4, 39)) +D40 = Pin((4, 40)) +MISO_2 = Pin((4, 40)) +D41 = Pin((4, 41)) +MOSI_2 = Pin((4, 41)) +D42 = Pin((4, 42)) +SCLK_2 = Pin((4, 42)) +SCK_2 = Pin((4, 43)) +D43 = Pin((4, 43)) +D44 = Pin((4, 44)) +D45 = Pin((4, 45)) + +# ordered as spiId, sckId, mosiId, misoId +spiPorts = ( + (0, SCLK, MOSI, MISO), + (1, SCLK_1, MOSI_1, MISO_1), + (2, SCLK_2, MOSI_2, MISO_2), +) + +# ordered as uartId, txId, rxId +uartPorts = ((1, TXD, RXD),) + +# These are the known hardware I2C ports / pins. +# For software I2C ports created with the i2c-gpio overlay, see: +# https://github.com/adafruit/Adafruit_Python_Extended_Bus +i2cPorts = ( + (1, SCL, SDA), + (0, D1, D0), # both pi 1 and pi 2 i2c ports! +) diff --git a/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py b/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py index 0bb89be..b7953e1 100644 --- a/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py +++ b/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py @@ -62,31 +62,18 @@ class Pin: self._line.release() if pull is not None: if pull == self.PULL_UP: - if hasattr(gpiod, "line") and hasattr( - gpiod.line, "BIAS_PULL_UP" - ): - config = gpiod.line_request() - config.consumer = self._CONSUMER - config.request_type = gpiod.line.BIAS_PULL_UP - self._line.request(config) + if hasattr(gpiod, "LINE_REQ_FLAG_BIAS_PULL_UP"): + flags |= gpiod.LINE_REQ_FLAG_BIAS_PULL_UP else: - self._line.request( - consumer=self._CONSUMER, - type=gpiod.LINE_REQ_DIR_IN, - flags=flags, - ) 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, "BIAS_PULL_DOWN" + gpiod, "LINE_REQ_FLAG_BIAS_PULL_DOWN" ): - config = gpiod.line_request() - config.consumer = self._CONSUMER - config.request_type = gpiod.line.BIAS_PULL_DOWN - self._line.request(config) + flags |= gpiod.LINE_REQ_FLAG_BIAS_PULL_DOWN else: raise NotImplementedError( "Internal pulldowns not supported in this version of libgpiod, " @@ -94,12 +81,14 @@ class Pin: ) elif pull == self.PULL_NONE: if hasattr(gpiod, "line") and hasattr( - gpiod.line, "BIAS_DISABLE" + gpiod, "LINE_REQ_FLAG_BIAS_DISABLE" ): - config = gpiod.line_request() - config.consumer = self._CONSUMER - config.request_type = gpiod.line.BIAS_DISABLE - self._line.request(config) + 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}") diff --git a/src/board.py b/src/board.py index 430145b..ef9deb6 100644 --- a/src/board.py +++ b/src/board.py @@ -39,9 +39,12 @@ elif board_id == ap_board.RASPBERRY_PI_PICO: elif ( detector.board.RASPBERRY_PI_4B or detector.board.RASPBERRY_PI_CM4 + or detector.board.RASPBERRY_PI_CM4S or detector.board.RASPBERRY_PI_400 ): from adafruit_blinka.board.raspberrypi.raspi_4b import * +elif detector.board.RASPBERRY_PI_5: + from adafruit_blinka.board.raspberrypi.raspi_5b import * elif detector.board.any_raspberry_pi_40_pin: from adafruit_blinka.board.raspberrypi.raspi_40pin import * diff --git a/src/busio.py b/src/busio.py index 9d21996..6912f0c 100644 --- a/src/busio.py +++ b/src/busio.py @@ -194,18 +194,17 @@ class I2C(Lockable): if end is None: end = len(buffer) buffer = memoryview(buffer)[start:end] - stop = True # remove for efficiency later - return self._i2c.readfrom_into(address, buffer, stop=stop) + return self._i2c.readfrom_into(address, buffer, stop=True) - def writeto(self, address, buffer, *, start=0, end=None, stop=True): + def writeto(self, address, buffer, *, start=0, end=None): """Write to a device at specified address from a buffer""" if isinstance(buffer, str): buffer = bytes([ord(x) for x in buffer]) if start != 0 or end is not None: if end is None: - return self._i2c.writeto(address, memoryview(buffer)[start:], stop=stop) - return self._i2c.writeto(address, memoryview(buffer)[start:end], stop=stop) - return self._i2c.writeto(address, buffer, stop=stop) + return self._i2c.writeto(address, memoryview(buffer)[start:], stop=True) + return self._i2c.writeto(address, memoryview(buffer)[start:end], stop=True) + return self._i2c.writeto(address, buffer, stop=True) def writeto_then_readfrom( self, diff --git a/src/digitalio.py b/src/digitalio.py index 5dfadf6..53f5904 100644 --- a/src/digitalio.py +++ b/src/digitalio.py @@ -12,11 +12,21 @@ See `CircuitPython:digitalio` in CircuitPython for more details. from adafruit_blinka.agnostic import board_id, detector -# pylint: disable=ungrouped-imports,wrong-import-position +# pylint: disable=ungrouped-imports,wrong-import-position,unused-wildcard-import,wildcard-import # By Chip Class if detector.chip.BCM2XXX: - from adafruit_blinka.microcontroller.bcm283x.pin import Pin + if board_id in ( + "RASPBERRY_PI_4B", + "RASPBERRY_PI_400", + "RASPBERRY_PI_CM4", + "RASPBERRY_PI_CM4S", + ): + from adafruit_blinka.microcontroller.bcm2711.pin import * + elif board_id in ("RASPBERRY_PI_5",): + from adafruit_blinka.microcontroller.bcm2712.pin import * + else: + from adafruit_blinka.microcontroller.bcm283x.pin import Pin elif detector.chip.AM33XX: from adafruit_blinka.microcontroller.am335x.pin import Pin elif detector.chip.AM65XX: diff --git a/src/microcontroller/pin.py b/src/microcontroller/pin.py index 362fe43..1a4c301 100644 --- a/src/microcontroller/pin.py +++ b/src/microcontroller/pin.py @@ -17,14 +17,19 @@ elif chip_id == ap_chip.STM32F405: elif chip_id == ap_chip.RP2040: from adafruit_blinka.microcontroller.rp2040.pin import * elif chip_id == ap_chip.BCM2XXX: - if board_id in [ + if board_id in ( "RASPBERRY_PI_4B", "RASPBERRY_PI_400", "RASPBERRY_PI_CM4", - ]: + "RASPBERRY_PI_CM4S", + ): from adafruit_blinka.microcontroller.bcm2711.pin import * + elif board_id in ("RASPBERRY_PI_5",): + from adafruit_blinka.microcontroller.bcm2712.pin import * else: from adafruit_blinka.microcontroller.bcm283x.pin import * +elif chip_id == ap_chip.BCM2712: + from adafruit_blinka.microcontroller.bcm2712.pin import * elif chip_id == ap_chip.DRA74X: from adafruit_blinka.microcontroller.dra74x.pin import * elif chip_id == ap_chip.AM33XX: -- 2.49.0