]> Repositories - Adafruit_Blinka-hackapet.git/commitdiff
Merge pull request #1006 from Gautham103/jetson-thor
authorMelissa LeBlanc-Williams <melissa@adafruit.com>
Wed, 3 Sep 2025 18:10:38 +0000 (11:10 -0700)
committerGitHub <noreply@github.com>
Wed, 3 Sep 2025 18:10:38 +0000 (11:10 -0700)
add support for jetson thor

13 files changed:
setup.py
src/adafruit_blinka/board/orangepi/orangepi5pro.py [new file with mode: 0644]
src/adafruit_blinka/board/particle/__init__.py [new file with mode: 0644]
src/adafruit_blinka/board/particle/tachyon.py [new file with mode: 0644]
src/adafruit_blinka/microcontroller/quectel/__init__.py [new file with mode: 0644]
src/adafruit_blinka/microcontroller/quectel/qcm6490/__init__.py [new file with mode: 0644]
src/adafruit_blinka/microcontroller/quectel/qcm6490/pin.py [new file with mode: 0644]
src/adafruit_blinka/microcontroller/rockchip/rk3588s/pin.py
src/analogio.py
src/board.py
src/digitalio.py
src/microcontroller/__init__.py
src/microcontroller/pin.py

index ddfe51ff69ff0db76b0ccb3ac192b570f19d9058..d5097601fb08ee57769650298c2d7897af9f182c 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -16,6 +16,11 @@ 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:
@@ -28,28 +33,29 @@ if not glob.glob("//usr//include//python3.*//Python.h"):
     )
 
 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
-    elif b"brcm,bcm2712" in compat:
-        board_reqs = [
-            "rpi_ws281x>=4.0.0",
-            "lgpio;python_version<'3.11'",
-            "Adafruit-Blinka-Raspberry-Pi5-Neopixel",
-        ]
-    # Pi 4 and Earlier
+    # 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.GPIO", "rpi_ws281x>=4.0.0"]
+        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"]
@@ -120,3 +126,10 @@ setup(
         "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/board/orangepi/orangepi5pro.py b/src/adafruit_blinka/board/orangepi/orangepi5pro.py
new file mode 100644 (file)
index 0000000..976a713
--- /dev/null
@@ -0,0 +1,96 @@
+# SPDX-FileCopyrightText: 2022 Corebb
+#
+# SPDX-License-Identifier: MIT
+"""Pin definitions for the Orange Pi 5 Pro"""
+
+from adafruit_blinka.microcontroller.rockchip.rk3588 import pin
+
+# D pin number is ordered by physical pin sequence
+
+# D1 = +3.3V
+# D2 = +5V
+D3 = pin.GPIO1_D3
+# D4 = +5V
+D5 = pin.GPIO1_D2
+# D6 = GND
+D7 = pin.GPIO1_B7
+D8 = pin.GPIO0_B5
+# D9 = GND
+D10 = pin.GPIO0_B6
+D11 = pin.GPIO4_B2
+D12 = pin.GPIO1_A7
+D13 = pin.GPIO4_B3
+# D14 = GND
+D15 = pin.GPIO1_B6
+D16 = pin.GPIO1_A1
+# D17 = +3.3V
+D18 = pin.GPIO1_A0
+D19 = pin.GPIO1_B2
+# D20 = GND
+D21 = pin.GPIO1_B1
+D22 = pin.GPIO1_B0
+D23 = pin.GPIO1_B3
+D24 = pin.GPIO1_B4
+# D25 = GND
+D26 = pin.GPIO1_B5
+D27 = pin.GPIO1_A2
+D28 = pin.GPIO1_A3
+D29 = pin.GPIO1_A4
+# D30 = GND
+D31 = pin.GPIO1_A6
+D32 = pin.GPIO1_D6
+D33 = pin.GPIO1_D7
+# D34 = GND
+D35 = pin.GPIO4_A7
+D36 = pin.GPIO4_A3
+D37 = pin.GPIO4_A6
+D38 = pin.GPIO4_A4
+# D39 = GND
+D40 = pin.GPIO4_A5
+
+# UART
+UART0_TX = pin.GPIO4_A3
+UART0_RX = pin.GPIO4_A4
+UART1_TX = pin.GPIO1_B6
+UART1_RX = pin.GPIO1_B7
+UART3_TX = pin.GPIO4_A5
+UART3_RX = pin.GPIO4_A6
+UART4_TX = pin.GPIO1_D2
+UART4_RX = pin.GPIO1_D3
+
+# Default UART
+TX = UART0_TX
+RX = UART0_RX
+TXD = UART0_TX
+RXD = UART0_RX
+
+# I2C
+I2C1_SCL = pin.GPIO1_D2
+I2C1_SDA = pin.GPIO1_D3
+I2C4_SCL = pin.GPIO1_A3
+I2C4_SDA = pin.GPIO1_A2
+I2C5_SCL = pin.GPIO1_B6
+I2C5_SDA = pin.GPIO1_B7
+I2C8_SCL = pin.GPIO1_D6
+I2C8_SDA = pin.GPIO1_D7
+
+# Default I2C
+SCL = I2C1_SCL
+SDA = I2C1_SDA
+
+# SPI
+SPI0_MISO = pin.GPIO1_B1
+SPI0_MOSI = pin.GPIO1_B2
+SPI0_CLK = pin.GPIO1_B3
+SPI0_CS0 = pin.GPIO1_B4
+SPI0_CS1 = pin.GPIO1_B5
+SPI4_MISO = pin.GPIO1_A0
+SPI4_MOSI = pin.GPIO1_A1
+SPI4_CLK = pin.GPIO1_A2
+SPI4_CS0 = pin.GPIO1_A3
+
+# Default SPI
+MOSI = SPI0_MOSI
+MISO = SPI0_MISO
+SCLK = SPI0_CLK
+CS = SPI0_CS1
diff --git a/src/adafruit_blinka/board/particle/__init__.py b/src/adafruit_blinka/board/particle/__init__.py
new file mode 100644 (file)
index 0000000..306b834
--- /dev/null
@@ -0,0 +1,4 @@
+# SPDX-FileCopyrightText: 2025 Brett Walach for Particle
+#
+# SPDX-License-Identifier: MIT
+"""Board definitions from Particle"""
diff --git a/src/adafruit_blinka/board/particle/tachyon.py b/src/adafruit_blinka/board/particle/tachyon.py
new file mode 100644 (file)
index 0000000..c428636
--- /dev/null
@@ -0,0 +1,53 @@
+# SPDX-FileCopyrightText: 2025 Brett Walach for Particle
+#
+# SPDX-License-Identifier: MIT
+"""Pin definitions for the Tachyon."""
+
+from adafruit_blinka.microcontroller.quectel.qcm6490 import pin
+
+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]
+
+D0 = pin.GPIO_36
+D1 = pin.GPIO_37
+D2 = pin.GPIO_8
+D3 = pin.GPIO_9
+D4 = pin.GPIO_61
+D5 = pin.GPIO_18
+D6 = pin.GPIO_19
+D7 = pin.GPIO_62
+D8 = pin.GPIO_59
+D9 = pin.GPIO_56
+D10 = pin.GPIO_57
+D11 = pin.GPIO_58
+D12 = pin.GPIO_78
+D13 = pin.GPIO_106
+D14 = pin.GPIO_34
+D15 = pin.GPIO_35
+D16 = pin.GPIO_32
+D17 = pin.GPIO_33
+D18 = pin.GPIO_144
+D19 = pin.GPIO_145
+D20 = pin.GPIO_146
+D21 = pin.GPIO_147
+D22 = pin.GPIO_158
+D23 = pin.GPIO_165
+D24 = pin.GPIO_166
+D25 = pin.GPIO_24
+D26 = pin.GPIO_6
+D27 = pin.GPIO_44
+
+CS = D8
+MISO = D9
+MOSI = D10
+SCLK = D11
+SCK = SCLK
+
+UART_TX = D14
+UART_RX = D15
+
+PWM1 = D13
diff --git a/src/adafruit_blinka/microcontroller/quectel/__init__.py b/src/adafruit_blinka/microcontroller/quectel/__init__.py
new file mode 100644 (file)
index 0000000..0bbe8c1
--- /dev/null
@@ -0,0 +1,4 @@
+# SPDX-FileCopyrightText: 2025 Brett Walach for Particle
+#
+# SPDX-License-Identifier: MIT
+"""Definition of all Quectel chips"""
diff --git a/src/adafruit_blinka/microcontroller/quectel/qcm6490/__init__.py b/src/adafruit_blinka/microcontroller/quectel/qcm6490/__init__.py
new file mode 100644 (file)
index 0000000..8fba2cf
--- /dev/null
@@ -0,0 +1,4 @@
+# SPDX-FileCopyrightText: 2025 Brett Walach for Particle
+#
+# SPDX-License-Identifier: MIT
+"""Definition for the Quectel QCM6490 chip"""
diff --git a/src/adafruit_blinka/microcontroller/quectel/qcm6490/pin.py b/src/adafruit_blinka/microcontroller/quectel/qcm6490/pin.py
new file mode 100644 (file)
index 0000000..d14d237
--- /dev/null
@@ -0,0 +1,140 @@
+# SPDX-FileCopyrightText: 2025 Brett Walach for Particle
+#
+# SPDX-License-Identifier: MIT
+"""Quectel QCM6490 pin names"""
+
+from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin
+
+# Use with libgpiod_pin
+GPIO_BASE = 0
+
+GPIO_6 = Pin(GPIO_BASE + 6)
+UART01_TXD = GPIO_6
+PWM1 = GPIO_6
+
+GPIO_8 = Pin(GPIO_BASE + 8)
+I2C02_SDA = GPIO_8
+SDA = GPIO_8
+
+GPIO_9 = Pin(GPIO_BASE + 9)
+I2C02_SCL = GPIO_9
+SCL = GPIO_9
+
+GPIO_18 = Pin(GPIO_BASE + 18)
+UART04_TXD = GPIO_18
+SPI04_CLK = GPIO_18
+
+GPIO_19 = Pin(GPIO_BASE + 19)
+UART04_RXD = GPIO_19
+SPI04_CS0 = GPIO_19
+
+GPIO_24 = Pin(GPIO_BASE + 24)
+
+GPIO_32 = Pin(GPIO_BASE + 32)
+UART10_CTS = GPIO_32
+CTS = GPIO_32
+
+GPIO_33 = Pin(GPIO_BASE + 33)
+UART10_RTS = GPIO_33
+RTS = GPIO_33
+
+GPIO_34 = Pin(GPIO_BASE + 34)
+UART10_TXD = GPIO_34
+
+GPIO_35 = Pin(GPIO_BASE + 35)
+UART10_RXD = GPIO_35
+
+GPIO_36 = Pin(GPIO_BASE + 36)
+UART11_CTS = GPIO_36
+SPI11_MISO = GPIO_36
+I2C11_SDA = GPIO_36
+EEPROM_SDA = GPIO_36
+
+GPIO_37 = Pin(GPIO_BASE + 37)
+UART11_RTS = GPIO_37
+SPI11_MOSI = GPIO_37
+I2C11_SCL = GPIO_37
+EEPROM_SCL = GPIO_37
+
+GPIO_40 = Pin(GPIO_BASE + 40)
+QWIIC_I2C12_SDA = GPIO_40
+
+GPIO_41 = Pin(GPIO_BASE + 41)
+QWIIC_I2C12_SCL = GPIO_41
+
+GPIO_44 = Pin(GPIO_BASE + 44)
+
+GPIO_56 = Pin(GPIO_BASE + 56)
+SPI16_MISO = GPIO_56
+I2C16_SDA = GPIO_56
+UART16_CTS = GPIO_56
+MISO = GPIO_56
+
+GPIO_57 = Pin(GPIO_BASE + 57)
+SPI16_MOSI = GPIO_57
+I2C16_SCL = GPIO_57
+UART16_RTS = GPIO_57
+MOSI = GPIO_57
+
+GPIO_58 = Pin(GPIO_BASE + 58)
+SPI16_CLK = GPIO_58
+UART16_TXD = GPIO_58
+SCK = GPIO_58
+
+GPIO_59 = Pin(GPIO_BASE + 59)
+SPI16_CS0 = GPIO_59
+UART16_RXD = GPIO_59
+CE0 = GPIO_59
+
+GPIO_61 = Pin(GPIO_BASE + 61)
+
+GPIO_62 = Pin(GPIO_BASE + 62)
+SPI16_CS1 = GPIO_62
+CE1 = GPIO_62
+
+GPIO_78 = Pin(GPIO_BASE + 78)
+PWM0 = GPIO_78
+
+GPIO_106 = Pin(GPIO_BASE + 106)
+MI2S1_SCLK = GPIO_106
+PWM = GPIO_106
+PWM1 = GPIO_106
+
+GPIO_144 = Pin(GPIO_BASE + 144)
+LPI_MI2S_SCLK = GPIO_144
+
+GPIO_145 = Pin(GPIO_BASE + 145)
+LPI_MI2S_WS = GPIO_145
+MISO1 = GPIO_145
+
+GPIO_146 = Pin(GPIO_BASE + 146)
+LPI_MI2S_DATA0 = GPIO_146
+MOSI1 = GPIO_146
+
+GPIO_147 = Pin(GPIO_BASE + 147)
+LPI_MI2S_DATA1 = GPIO_147
+SCK1 = GPIO_147
+
+GPIO_158 = Pin(GPIO_BASE + 158)
+
+GPIO_165 = Pin(GPIO_BASE + 165)
+
+GPIO_166 = Pin(GPIO_BASE + 166)
+
+# ordered as i2cId, i2cSclId, i2cSdaId
+i2cPorts = (
+    (1, I2C02_SCL, I2C02_SDA),
+    (2, QWIIC_I2C12_SCL, QWIIC_I2C12_SDA),
+)
+
+# ordered as spiId, sckId, mosiId, misoId
+spiPorts = (
+    (0, SPI16_CLK, SPI16_MOSI, SPI16_MISO),
+    (1, SPI16_CLK, SPI16_MOSI, SPI16_MISO),
+)
+
+# ordered as uartId, txId, rxId
+uartPorts = ((10, UART10_TXD, UART10_RXD),)
+
+# ordered as pwmChipId, pwmChannelId, pwmId
+pwmOuts = (((0, 0), PWM1),)
index 91483d3222b3227fe8f3702b8e2744316f84786c..b2a690e7a4684eb68c7dc5c04c4a0db1053c7812 100644 (file)
@@ -209,8 +209,8 @@ uartPorts = (
 # I2C0_SDA_M1 = GPIO4_C6
 I2C1_SCL_M0 = GPIO0_B5
 I2C1_SDA_M0 = GPIO0_B6
-# I2C1_SCL_M4 = GPIO1_B1
-# I2C1_SDA_M4 = GPIO1_B2
+I2C1_SCL_M4 = GPIO1_D2
+I2C1_SDA_M4 = GPIO1_D3
 I2C2_SCL_M4 = GPIO1_A1
 I2C2_SDA_M4 = GPIO1_A0
 # I2C3_SCL_M1 = GPIO3_B7
@@ -228,7 +228,7 @@ I2C8_SDA_M2 = GPIO1_D7
 
 # ordered as i2cId, sclId, sdaId
 i2cPorts = (
-    (1, I2C1_SCL_M0, I2C1_SDA_M0),
+    (1, I2C1_SCL_M4, I2C1_SDA_M4),
     (2, I2C2_SCL_M4, I2C2_SDA_M4),
     (4, I2C4_SCL_M3, I2C4_SDA_M3),
     (6, I2C6_SCL_M3, I2C6_SDA_M3),
index 02a41b283e59e96dcc8f96498c4c613530466f10..89c82be6f159433c9d6cf9c2c41d2f1c7bfaac6b 100644 (file)
@@ -32,6 +32,8 @@ elif detector.chip.RK3399:
     from adafruit_blinka.microcontroller.generic_linux.sysfs_analogin import AnalogIn
 elif detector.chip.RK3588:
     from adafruit_blinka.microcontroller.generic_linux.sysfs_analogin import AnalogIn
+elif detector.chip.RK3588S:
+    from adafruit_blinka.microcontroller.generic_linux.sysfs_analogin import AnalogIn
 elif detector.chip.RK3568:
     from adafruit_blinka.microcontroller.generic_linux.sysfs_analogin import AnalogIn
 elif detector.chip.RK3566:
index 3d4d0d7209e37b5373c9d87d11a405003011023a..357cfe759e1437b106fc108bf397d09cdfbfbf22 100644 (file)
@@ -146,6 +146,9 @@ elif board_id == ap_board.ORANGE_PI_4_LTS:
 elif board_id in (ap_board.ORANGE_PI_5, ap_board.ORANGE_PI_5_MAX):
     from adafruit_blinka.board.orangepi.orangepi5 import *
 
+elif board_id == ap_board.ORANGE_PI_5_PRO:
+    from adafruit_blinka.board.orangepi.orangepi5pro import *
+
 elif board_id == ap_board.ORANGE_PI_5_PLUS:
     from adafruit_blinka.board.orangepi.orangepi5plus import *
 
@@ -470,6 +473,9 @@ elif board_id == ap_board.INDIEDROID_NOVA:
 elif board_id == ap_board.RDK_X3:
     from adafruit_blinka.board.horizon.rdkx3 import *
 
+elif board_id == ap_board.PARTICLE_TACHYON:
+    from adafruit_blinka.board.particle.tachyon import *
+
 elif "sphinx" in sys.modules:
     pass
 
index 04437dc3870a0d7fa116269204b99386886d5bf0..68299b0b1a1704229f82aa9a7adadbef188836c2 100644 (file)
@@ -89,6 +89,8 @@ elif detector.chip.RK3399_T:
     from adafruit_blinka.microcontroller.rockchip.rk3399.pin import Pin
 elif detector.chip.RK3588:
     from adafruit_blinka.microcontroller.rockchip.rk3588.pin import Pin
+elif detector.chip.RK3588S:
+    from adafruit_blinka.microcontroller.rockchip.rk3588s.pin import Pin
 elif detector.chip.RK3328:
     from adafruit_blinka.microcontroller.rockchip.rk3328.pin import Pin
 elif detector.chip.RK3566:
@@ -153,6 +155,8 @@ elif detector.chip.RV1103:
     from adafruit_blinka.microcontroller.rockchip.rv1103.pin import Pin
 elif detector.chip.RV1106:
     from adafruit_blinka.microcontroller.rockchip.rv1106.pin import Pin
+elif detector.chip.QCM6490:
+    from adafruit_blinka.microcontroller.quectel.qcm6490.pin import Pin
 elif detector.chip.OS_AGNOSTIC:
     from adafruit_blinka.microcontroller.generic_agnostic_board.pin import Pin
 
index 3c927fc8d0a8dea5cb5620405d5c86067bfe1b24..65015760385514db34d706df3c9ee209276070cf 100644 (file)
@@ -111,6 +111,8 @@ elif chip_id == ap_chip.RK3399_T:
     from adafruit_blinka.microcontroller.rockchip.rk3399 import *
 elif chip_id == ap_chip.RK3588:
     from adafruit_blinka.microcontroller.rockchip.rk3588 import *
+elif chip_id == ap_chip.RK3588S:
+    from adafruit_blinka.microcontroller.rockchip.rk3588s import *
 elif chip_id == ap_chip.RK3328:
     from adafruit_blinka.microcontroller.rockchip.rk3328 import *
 elif chip_id == ap_chip.RK3566:
@@ -171,6 +173,8 @@ elif chip_id == ap_chip.RZV2H:
     from adafruit_blinka.microcontroller.renesas.rzv2h import *
 elif chip_id == ap_chip.SUNRISE_X3:
     from adafruit_blinka.microcontroller.horizon.sunrise_x3 import *
+elif chip_id == ap_chip.QCM6490:
+    from adafruit_blinka.microcontroller.quectel.qcm6490 import *
 elif chip_id == ap_chip.GENERIC_X86:
     print("WARNING: GENERIC_X86 is not fully supported. Some features may not work.")
 elif chip_id == ap_chip.OS_AGNOSTIC:
index 6dbf9be89ccffd162f24b2f8147c0ebdca23e299..b84b367731aac587ea916b043f66bc14e21dea25 100644 (file)
@@ -120,6 +120,8 @@ elif chip_id == ap_chip.RK3399_T:
     from adafruit_blinka.microcontroller.rockchip.rk3399.pin import *
 elif chip_id == ap_chip.RK3588:
     from adafruit_blinka.microcontroller.rockchip.rk3588.pin import *
+elif chip_id == ap_chip.RK3588S:
+    from adafruit_blinka.microcontroller.rockchip.rk3588s.pin import *
 elif chip_id == ap_chip.RK3328:
     from adafruit_blinka.microcontroller.rockchip.rk3328.pin import *
 elif chip_id == ap_chip.RK3566:
@@ -161,6 +163,8 @@ elif chip_id == ap_chip.RV1106:
     from adafruit_blinka.microcontroller.rockchip.rv1106.pin import *
 elif chip_id == ap_chip.SUNRISE_X3:
     from adafruit_blinka.microcontroller.horizon.sunrise_x3.pin import *
+elif chip_id == ap_chip.QCM6490:
+    from adafruit_blinka.microcontroller.quectel.qcm6490.pin import *
 elif "sphinx" in sys.modules:
     # pylint: disable=unused-import
     from adafruit_blinka.microcontroller.generic_micropython import Pin