]> Repositories - Adafruit_Blinka-hackapet.git/commitdiff
Merge pull request #972 from makermelissa/main 8.60.0
authorMelissa LeBlanc-Williams <melissa@adafruit.com>
Wed, 18 Jun 2025 21:13:51 +0000 (14:13 -0700)
committerGitHub <noreply@github.com>
Wed, 18 Jun 2025 21:13:51 +0000 (14:13 -0700)
Convert Blinka to use pyproject.toml

src/adafruit_blinka/board/radxa_x4_u2if.py [new file with mode: 0644]
src/adafruit_blinka/microcontroller/rp2040_u2if/analogio.py
src/adafruit_blinka/microcontroller/rp2040_u2if/i2c.py
src/adafruit_blinka/microcontroller/rp2040_u2if/spi.py
src/analogio.py
src/board.py
src/busio.py

diff --git a/src/adafruit_blinka/board/radxa_x4_u2if.py b/src/adafruit_blinka/board/radxa_x4_u2if.py
new file mode 100644 (file)
index 0000000..9642406
--- /dev/null
@@ -0,0 +1,117 @@
+# SPDX-FileCopyrightText: 2025 Bernhard Bablok
+#
+# Copied and adapted from pico_u2if.py
+# Copyright: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
+"""Pin definitions for the Raspberry Pi Pico running u2if firmware"""
+from adafruit_blinka.microcontroller.rp2040_u2if import pin
+
+# Pico names
+GP0 = pin.GP0
+GP1 = pin.GP1
+GP2 = pin.GP2
+GP3 = pin.GP3
+GP4 = pin.GP4
+GP5 = pin.GP5
+GP6 = pin.GP6
+GP7 = pin.GP7
+GP8 = pin.GP8
+GP9 = pin.GP9
+GP10 = pin.GP10
+GP11 = pin.GP11
+GP12 = pin.GP12
+GP13 = pin.GP13
+GP14 = pin.GP14
+GP15 = pin.GP15
+GP16 = pin.GP16
+GP17 = pin.GP17
+GP18 = pin.GP18
+GP19 = pin.GP19
+GP20 = pin.GP20
+GP21 = pin.GP21
+GP22 = pin.GP22
+GP23 = pin.GP23
+GP24 = pin.GP24
+GP25 = pin.GP25
+GP26 = pin.GP26
+GP27 = pin.GP27
+GP28 = pin.GP28
+GP29 = pin.GP29
+
+# Pi names left side (top down)
+GPIO2 = GP28
+GPIO3 = GP29
+
+GPIO4 = GP4
+GPIO17 = GP5
+GPIO27 = GP6
+GPIO22 = GP3
+
+GPIO10 = GP11
+GPIO9 = GP8
+GPIO11 = GP10
+
+GPIO0 = GP16
+GPIO5 = GP7
+GPIO6 = GP12
+GPIO13 = GP13
+GPIO19 = GP15
+GPIO26 = GP14
+
+# right side (top down)
+GPIO14 = GP20
+GPIO15 = GP21
+GPIO18 = GP23
+
+GPIO23 = GP22
+GPIO24 = GP27
+
+GPIO25 = GP24
+GPIO8 = GP9
+GPIO7 = GP18
+GPIO1 = GP17
+
+GPIO12 = GP19
+
+GPIO16 = GP26
+GPIO20 = GP2
+GPIO21 = GP25
+
+# specials (INT: internal connection to N100-chip, EXT: on GPIO-pins)
+UART_TX_INT = GP0
+UART_RX_INT = GP1
+UART_RX_EXT = GP20  # GPIO14
+UART_RX_EXT = GP21  # GPIO15
+
+ADC0 = GP26
+ADC1 = GP27
+ADC2 = GP28
+ADC3 = GP29
+
+PWM0 = GPIO12
+PWM1 = GPIO13
+
+# Pi defaults (I2C0 is also mapped to the ID-pins GPIO0/GPIO1 aka GP16/GP17)
+SDA = SDA0 = GP28  # GPIO2
+SCL = SCL0 = GP29  # GPIO3
+
+# other choices have more conflicts
+SDA1 = GP18
+SCL1 = GP19
+
+# Pico-SPI0 (Radxa-X4 does not map Pi-SPI1)
+SCLK0 = SCK0 = GP6
+MOSI0 = GP3
+MISO0 = GP4
+CE0 = GPIO8
+CE1 = GPIO7
+
+# Pi (SPI0) defaults (Radxa-X4 maps Pi-SPI0 to Pico-SPI1)
+SCLK = SCK = SCLK1 = SCK1 = GP10
+MOSI = MOSI1 = GP11
+MISO = MISO1 = GP8
+
+# access u2if via pin instance to open for specifc VID/PID
+# pylint:disable = protected-access
+pin.GP0._u2if_open_hid(0xCAFF, 0x4005)
index 08e36c328ff8161353c26ce6b46ea6486925a604..a76b92cf37ab580f01e2031f942b1b88a8df0d51 100644 (file)
@@ -70,3 +70,12 @@ class AnalogIn_ItsyBitsy(AnalogIn):
         if pin.id not in (26, 27, 28):
             raise ValueError("Pin does not support ADC.")
         super().__init__(pin)
+
+
+class AnalogIn_Radxa_X4(AnalogIn):
+    """AnalogIn Base Class for Radxa X4 u2if"""
+
+    def __init__(self, pin):
+        if pin.id not in (26, 27, 28, 29):
+            raise ValueError("Pin does not support ADC.")
+        super().__init__(pin)
index f294e1e5839e5a9499be729fc2738413619741ef..57e4aed141b0a0149ea03c8000a9823fe2d19916 100644 (file)
@@ -199,3 +199,19 @@ class I2C_KB2040(I2C):
         self._index = index
 
         super().__init__(index, frequency=frequency)
+
+
+class I2C_Radxa_X4(I2C):
+    """I2C Class for Radxa X4 u2if"""
+
+    def __init__(self, scl, sda, *, frequency=100000):
+        index = None
+        if scl.id == 29 and sda.id == 28:
+            index = 0
+        if scl.id == 19 and sda.id == 18:
+            index = 1
+        if index is None:
+            raise ValueError("I2C not found on specified pins.")
+        self._index = index
+
+        super().__init__(index, frequency=frequency)
index 0acc5e62fcde6ad86b5f5fc70f5c607a3dc82a40..0d1faf2c996ca88e9cd7229855f7cbccd27db3d6 100644 (file)
@@ -178,3 +178,17 @@ class SPI_KB2040(SPI):
         if index is None:
             raise ValueError("No SPI port on specified pin.")
         super().__init__(index, baudrate=baudrate)
+
+
+class SPI_Radxa_X4(SPI):
+    """SPI Class for Radxa X4 u2if"""
+
+    def __init__(self, clock, *, baudrate=100000):
+        index = None
+        if clock.id == 6:
+            index = 0
+        if clock.id == 10:
+            index = 1
+        if index is None:
+            raise ValueError("No SPI port on specified pin.")
+        super().__init__(index, baudrate=baudrate)
index e77e0f0528f8858972a597fb72f3a7326346dd0b..02a41b283e59e96dcc8f96498c4c613530466f10 100644 (file)
@@ -66,6 +66,10 @@ elif detector.board.itsybitsy_u2if:
     from adafruit_blinka.microcontroller.rp2040_u2if.analogio import (
         AnalogIn_ItsyBitsy as AnalogIn,
     )
+elif detector.board.radxa_x4_u2if:
+    from adafruit_blinka.microcontroller.rp2040_u2if.analogio import (
+        AnalogIn_Radxa_X4 as AnalogIn,
+    )
 elif detector.board.OS_AGNOSTIC_BOARD:
     from adafruit_blinka.microcontroller.generic_agnostic_board.analogio import AnalogIn
     from adafruit_blinka.microcontroller.generic_agnostic_board.analogio import (
index acf25d66d0f1a842fb891ffcca0dfcda6a428504..f926dd01990b9d083b7f69ebbc36c549a0593c0b 100644 (file)
@@ -440,6 +440,9 @@ elif board_id == ap_board.WALNUT_PI_1B:
 elif board_id == ap_board.RP2040_ONE_U2IF:
     from adafruit_blinka.board.rp2040_one_u2if import *
 
+elif board_id == ap_board.RADXA_X4_U2IF:
+    from adafruit_blinka.board.radxa_x4_u2if import *
+
 elif board_id == ap_board.OS_AGNOSTIC_BOARD:
     from adafruit_blinka.board.generic_agnostic_board import *
 
index 7224a58254b41972f11b9c1cfa7a1f7f38507eaa..13623ea8279190684dbf9362ab89d056cff5ad16 100644 (file)
@@ -131,6 +131,13 @@ class I2C(Lockable):
                 I2C_KB2040 as _I2C,
             )
 
+            self._i2c = _I2C(scl, sda, frequency=frequency)
+            return
+        if detector.board.radxa_x4_u2if:
+            from adafruit_blinka.microcontroller.rp2040_u2if.i2c import (
+                I2C_Radxa_X4 as _I2C,
+            )
+
             self._i2c = _I2C(scl, sda, frequency=frequency)
             return
         if detector.chip.id == ap_chip.RP2040:
@@ -341,6 +348,14 @@ class SPI(Lockable):
                 SPI_KB2040 as _SPI,
             )
 
+            self._spi = _SPI(clock)  # this is really all that's needed
+            self._pins = (clock, clock, clock)  # will determine MOSI/MISO from clock
+            return
+        if detector.board.radxa_x4_u2if:
+            from adafruit_blinka.microcontroller.rp2040_u2if.spi import (
+                SPI_Radxa_X4 as _SPI,
+            )
+
             self._spi = _SPI(clock)  # this is really all that's needed
             self._pins = (clock, clock, clock)  # will determine MOSI/MISO from clock
             return
@@ -442,6 +457,10 @@ class SPI(Lockable):
             )
         elif detector.board.qtpy_u2if:
             from adafruit_blinka.microcontroller.rp2040_u2if.spi import SPI_QTPY as _SPI
+        elif detector.board.radxa_x4_u2if:
+            from adafruit_blinka.microcontroller.rp2040_u2if.spi import (
+                SPI_Radxa_X4 as _SPI,
+            )
         elif detector.chip.id == ap_chip.RP2040:
             from adafruit_blinka.microcontroller.rp2040.spi import SPI as _SPI
         elif detector.board.any_siemens_iot2000: