Skip to content

Commit 9b4f41d

Browse files
committed
Support for Particle Tachyon
1 parent f79764b commit 9b4f41d

File tree

9 files changed

+216
-0
lines changed

9 files changed

+216
-0
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# SPDX-FileCopyrightText: 2025 Brett Walach for Particle
2+
#
3+
# SPDX-License-Identifier: MIT
4+
"""Board definitions from Particle"""
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# SPDX-FileCopyrightText: 2025 Brett Walach for Particle
2+
#
3+
# SPDX-License-Identifier: MIT
4+
"""Pin definitions for the Tachyon."""
5+
6+
from adafruit_blinka.microcontroller.quectel.qcm6490 import pin
7+
8+
for it in pin.i2cPorts:
9+
globals()["SCL" + str(it[0])] = it[1]
10+
globals()["SDA" + str(it[0])] = it[2]
11+
12+
SCL = pin.i2cPorts[0][1]
13+
SDA = pin.i2cPorts[0][2]
14+
15+
D0 = pin.GPIO_36
16+
D1 = pin.GPIO_37
17+
D2 = pin.GPIO_8
18+
D3 = pin.GPIO_9
19+
D4 = pin.GPIO_61
20+
D5 = pin.GPIO_18
21+
D6 = pin.GPIO_19
22+
D7 = pin.GPIO_62
23+
D8 = pin.GPIO_59
24+
D9 = pin.GPIO_56
25+
D10 = pin.GPIO_57
26+
D11 = pin.GPIO_58
27+
D12 = pin.GPIO_158
28+
D13 = pin.GPIO_6
29+
D14 = pin.GPIO_50
30+
D15 = pin.GPIO_51
31+
D16 = pin.GPIO_48
32+
D17 = pin.GPIO_49
33+
D18 = pin.GPIO_144
34+
D19 = pin.GPIO_145
35+
D20 = pin.GPIO_146
36+
D21 = pin.GPIO_147
37+
D22 = pin.GPIO_34
38+
D23 = pin.GPIO_165
39+
D24 = pin.GPIO_166
40+
D25 = pin.GPIO_24
41+
D26 = pin.GPIO_106
42+
D27 = pin.GPIO_33
43+
44+
CS = D8
45+
MISO = D9
46+
MOSI = D10
47+
SCLK = D11
48+
SCK = SCLK
49+
50+
UART_TX = D14
51+
UART_RX = D15
52+
53+
PWM1 = D13
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# SPDX-FileCopyrightText: 2025 Brett Walach for Particle
2+
#
3+
# SPDX-License-Identifier: MIT
4+
"""Definition of all Quectel chips"""
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# SPDX-FileCopyrightText: 2025 Brett Walach for Particle
2+
#
3+
# SPDX-License-Identifier: MIT
4+
"""Definition for the Quectel QCM6490 chip"""
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
# SPDX-FileCopyrightText: 2025 Brett Walach for Particle
2+
#
3+
# SPDX-License-Identifier: MIT
4+
"""Quectel QCM6490 pin names"""
5+
# from adafruit_blinka.microcontroller.generic_linux.sysfs_pin import Pin
6+
# from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin
7+
from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin as GenericLinuxPin
8+
9+
import os
10+
11+
# Release (unexport) all pins on init and set to INPUT mode
12+
class Pin(GenericLinuxPin):
13+
def __init__(self, pin_id):
14+
self._release_sysfs_gpio(pin_id)
15+
super().__init__(pin_id)
16+
17+
def _release_sysfs_gpio(self, pin_id, base_offset=336):
18+
# pin_id might be a tuple like (chip_id, line_number)
19+
if isinstance(pin_id, tuple):
20+
_, line_number = pin_id
21+
else:
22+
line_number = pin_id
23+
24+
gpio_num = base_offset + int(line_number)
25+
gpio_path = f"/sys/class/gpio/gpio{gpio_num}"
26+
27+
try:
28+
if not os.path.exists(gpio_path):
29+
with open("/sys/class/gpio/export", "w") as f:
30+
f.write(f"{gpio_num}")
31+
with open(f"{gpio_path}/direction", "w") as f:
32+
f.write("in")
33+
with open("/sys/class/gpio/unexport", "w") as f:
34+
f.write(f"{gpio_num}")
35+
except Exception:
36+
# fail silently if not allowed
37+
pass
38+
39+
# Use with sysfs_pin
40+
# GPIO_BASE = 336
41+
42+
# Use with libgpiod_pin
43+
GPIO_BASE = 0
44+
45+
GPIO_6 = Pin(GPIO_BASE + 6)
46+
UART01_TXD = GPIO_6
47+
PWM1 = GPIO_6
48+
GPIO_8 = Pin(GPIO_BASE + 8)
49+
I2C02_SDA = GPIO_8
50+
SDA = GPIO_8
51+
GPIO_9 = Pin(GPIO_BASE + 9)
52+
I2C02_SCL = GPIO_9
53+
SCL = GPIO_9
54+
GPIO_18 = Pin(GPIO_BASE + 18)
55+
UART04_TXD = GPIO_18
56+
SPI04_CLK = GPIO_18
57+
GPIO_19 = Pin(GPIO_BASE + 19)
58+
UART04_RXD = GPIO_19
59+
SPI04_CS0 = GPIO_19
60+
GPIO_24 = Pin(GPIO_BASE + 24)
61+
GPIO_33 = Pin(GPIO_BASE + 33)
62+
UART10_RTS = GPIO_33
63+
SPI10_MOSI = GPIO_33
64+
I2C10_SCL = GPIO_33
65+
GPIO_34 = Pin(GPIO_BASE + 34)
66+
UART10_TXD = GPIO_34
67+
SPI10_CLK = GPIO_34
68+
GPIO_36 = Pin(GPIO_BASE + 36)
69+
UART11_CTS = GPIO_36
70+
SPI11_MISO = GPIO_36
71+
I2C11_SDA = GPIO_36
72+
EEPROM_SDA = GPIO_36
73+
GPIO_37 = Pin(GPIO_BASE + 37)
74+
UART11_RTS = GPIO_37
75+
SPI11_MOSI = GPIO_37
76+
I2C11_SCL = GPIO_37
77+
GPIO_48 = Pin(GPIO_BASE + 48)
78+
UART14_CTS = GPIO_48
79+
I2C14_SDA = GPIO_48
80+
SPI14_MISO = GPIO_48
81+
CTS = GPIO_48
82+
GPIO_49 = Pin(GPIO_BASE + 49)
83+
UART14_RTS = GPIO_49
84+
I2C14_SCL = GPIO_49
85+
SPI14_MOSI = GPIO_49
86+
RTS = GPIO_49
87+
GPIO_50 = Pin(GPIO_BASE + 50)
88+
UART14_TXD = GPIO_50
89+
SPI14_CLK = GPIO_50
90+
SPI16_CS3 = GPIO_50
91+
TX = GPIO_50
92+
GPIO_51 = Pin(GPIO_BASE + 51)
93+
UART14_RXD = GPIO_51
94+
SPI14_CS0 = GPIO_51
95+
RX = GPIO_51
96+
GPIO_56 = Pin(GPIO_BASE + 56)
97+
MISO = GPIO_56
98+
GPIO_57 = Pin(GPIO_BASE + 57)
99+
SPI16_MOSI = GPIO_57
100+
I2C16_SCL = GPIO_57
101+
UART16_RTS = GPIO_57
102+
SPI16_MISO = GPIO_57
103+
I2C16_SDA = GPIO_57
104+
UART16_CTS = GPIO_57
105+
MOSI = GPIO_57
106+
GPIO_58 = Pin(GPIO_BASE + 58)
107+
SPI16_CLK = GPIO_58
108+
UART16_TXD = GPIO_58
109+
SCK = GPIO_58
110+
GPIO_59 = Pin(GPIO_BASE + 59)
111+
SPI16_CS0 = GPIO_59
112+
UART16_RXD = GPIO_59
113+
GPIO_61 = Pin((0, GPIO_BASE + 61))
114+
GPIO_62 = Pin(GPIO_BASE + 62)
115+
SPI16_CS1 = GPIO_62
116+
GPIO_106 = Pin(GPIO_BASE + 106)
117+
UART13_TXD = GPIO_106
118+
SPI13_CLK = GPIO_106
119+
GPIO_144 = Pin(GPIO_BASE + 144)
120+
PRI_MI2S_MCLK = GPIO_144
121+
GPIO_145 = Pin(GPIO_BASE + 145)
122+
MI2S0_WS = GPIO_145
123+
MISO1 = GPIO_145
124+
GPIO_146 = Pin(GPIO_BASE + 146)
125+
MI2S0_DATA0 = GPIO_146
126+
GPIO_147 = Pin(GPIO_BASE + 147)
127+
MI2S0_DATA1 = GPIO_147
128+
GPIO_158 = Pin(GPIO_BASE + 158)
129+
GPIO_165 = Pin(GPIO_BASE + 165)
130+
GPIO_166 = Pin(GPIO_BASE + 166)
131+
132+
# ordered as i2cId, i2cSclId, i2cSdaId
133+
i2cPorts = ((1, I2C02_SCL, I2C02_SDA),)
134+
135+
# ordered as spiId, sckId, mosiId, misoId
136+
spiPorts = ((16, SPI16_CLK, SPI16_MOSI, SPI16_MISO),)
137+
138+
# ordered as uartId, txId, rxId
139+
uartPorts = ((14, UART14_TXD, UART14_RXD),)
140+
141+
# ordered as pwmChipId, pwmChannelId, pwmId
142+
pwmOuts = (((0, 0), PWM1),)

src/board.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,9 @@
467467
elif board_id == ap_board.RDK_X3:
468468
from adafruit_blinka.board.horizon.rdkx3 import *
469469

470+
elif board_id == ap_board.PARTICLE_TACHYON:
471+
from adafruit_blinka.board.particle.tachyon import *
472+
470473
elif "sphinx" in sys.modules:
471474
pass
472475

src/digitalio.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,8 @@
151151
from adafruit_blinka.microcontroller.rockchip.rv1103.pin import Pin
152152
elif detector.chip.RV1106:
153153
from adafruit_blinka.microcontroller.rockchip.rv1106.pin import Pin
154+
elif detector.chip.QCM6490:
155+
from adafruit_blinka.microcontroller.quectel.qcm6490.pin import Pin
154156
elif detector.chip.OS_AGNOSTIC:
155157
from adafruit_blinka.microcontroller.generic_agnostic_board.pin import Pin
156158

src/microcontroller/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@ def delay_us(delay):
169169
from adafruit_blinka.microcontroller.renesas.rzv2h import *
170170
elif chip_id == ap_chip.SUNRISE_X3:
171171
from adafruit_blinka.microcontroller.horizon.sunrise_x3 import *
172+
elif chip_id == ap_chip.QCM6490:
173+
from adafruit_blinka.microcontroller.quectel.qcm6490 import *
172174
elif chip_id == ap_chip.GENERIC_X86:
173175
print("WARNING: GENERIC_X86 is not fully supported. Some features may not work.")
174176
elif chip_id == ap_chip.OS_AGNOSTIC:

src/microcontroller/pin.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,8 @@
159159
from adafruit_blinka.microcontroller.rockchip.rv1106.pin import *
160160
elif chip_id == ap_chip.SUNRISE_X3:
161161
from adafruit_blinka.microcontroller.horizon.sunrise_x3.pin import *
162+
elif chip_id == ap_chip.QCM6490:
163+
from adafruit_blinka.microcontroller.quectel.qcm6490.pin import *
162164
elif "sphinx" in sys.modules:
163165
# pylint: disable=unused-import
164166
from adafruit_blinka.microcontroller.generic_micropython import Pin

0 commit comments

Comments
 (0)