# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+# SPDX-FileCopyrightText: 2023 Steve Jeong for Hardkernel
#
# SPDX-License-Identifier: MIT
"""
linux/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
"""
-from typing import Optional
-import os
-import re
-import gpiod
+from adafruit_blinka.agnostic import detector
+from adafruit_blinka.microcontroller.alias import get_dts_alias, get_pwm_chipid
from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin
+from adafruit_blinka.microcontroller.generic_linux.libgpiod_chip import Chip
-chip0 = gpiod.Chip("0")
-chip1 = gpiod.Chip("1")
+chip0 = Chip("0")
+chip1 = Chip("1")
-if chip0.num_lines() < 20:
+chip0lines = chip0.num_lines
+chip1lines = chip1.num_lines
+
+if chip0lines < 20:
aobus = 0
periphs = 1
- periphs_offset = chip1.num_lines() - 85
+ periphs_offset = chip1lines - 85
else:
aobus = 1
periphs = 0
- periphs_offset = chip0.num_lines() - 85
+ periphs_offset = chip0lines - 85
-chip0.close()
-chip1.close()
+del chip0
+del chip1
GPIOAO_0 = GPIO496 = Pin((aobus, 0))
GPIOAO_1 = GPIO497 = Pin((aobus, 1))
SPI0_MOSI = GPIOX_8
SPI0_CS0 = GPIOX_10
-# ordered as spiId, sckId, mosiId, misoId
-spiPorts = ((0, SPI0_SCLK, SPI0_MOSI, SPI0_MISO),)
-
UART1_TX = GPIOX_12
UART1_RX = GPIOX_13
-# ordered as uartId, txId, rxId
-uartPorts = ((1, UART1_TX, UART1_RX),)
-
-
-def get_dts_alias(device: str) -> Optional[str]:
- """Get the Device Tree Alias"""
- uevent_path = "/sys/bus/platform/devices/" + device + "/uevent"
- if os.path.exists(uevent_path):
- with open(uevent_path, "r", encoding="utf-8") as fd:
- pattern = r"^OF_ALIAS_0=(.*)$"
- uevent = fd.read().split("\n")
- for line in uevent:
- match = re.search(pattern, line)
- if match:
- return match.group(1).upper()
- return None
-
-
# ordered as i2cId, sclId, sdaId
i2cPorts = []
-alias = get_dts_alias("ffd1d000.i2c")
-if alias is not None:
- globals()[alias + "_SCL"] = GPIOX_18
- globals()[alias + "_SDA"] = GPIOX_17
- i2cPorts.append((int(alias[3]), GPIOX_18, GPIOX_17))
+# ordered as spiId, sckId, mosiId, misoId
+spiPorts = ((0, SPI0_SCLK, SPI0_MOSI, SPI0_MISO),)
-alias = get_dts_alias("ffd1c000.i2c")
-if alias is not None:
- globals()[alias + "_SCL"] = GPIOA_15
- globals()[alias + "_SDA"] = GPIOA_14
- i2cPorts.append((int(alias[3]), GPIOA_15, GPIOA_14))
+# SysFs pwm outputs, pwm channel and pin in first tuple
+pwmOuts = []
+# ordered as uartId, txId, rxId
+uartPorts = [
+ (1, UART1_TX, UART1_RX),
+]
+
+# SysFS analog inputs, Ordered as analog analogInId, device, and channel
+analogIns = []
+
+board = detector.board.id
+if board in ("ODROID_C4", "ODROID_N2"):
+ alias = get_dts_alias("ffd1d000.i2c")
+ if alias is not None:
+ globals()[alias + "_SCL"] = GPIOX_18
+ globals()[alias + "_SDA"] = GPIOX_17
+ i2cPorts.append((int(alias[-1]), GPIOX_18, GPIOX_17))
+ alias = get_dts_alias("ffd1c000.i2c")
+ if alias is not None:
+ globals()[alias + "_SCL"] = GPIOA_15
+ globals()[alias + "_SDA"] = GPIOA_14
+ i2cPorts.append((int(alias[-1]), GPIOA_15, GPIOA_14))
+ alias = get_dts_alias("ffd24000.serial")
+ if alias is not None:
+ globals()[alias + "_TX"] = GPIOX_12
+ globals()[alias + "_RX"] = GPIOX_13
+ uartPorts.append((int(alias[-1]), GPIOX_12, GPIOX_13))
+ alias = get_dts_alias("ffd23000.serial")
+ if alias is not None:
+ globals()[alias + "_TX"] = GPIOX_6
+ globals()[alias + "_RX"] = GPIOX_7
+ uartPorts.append((int(alias[-1]), GPIOX_6, GPIOX_7))
+
+if board in ("ODROID_C4"):
+ alias = get_pwm_chipid("ffd1b000.pwm")
+ if alias is not None:
+ globals()["PWMA"] = GPIOX_6
+ globals()["PWMB"] = GPIOX_19
+ pwmOuts.append(((int(alias[-1]), 0), GPIOX_6))
+ pwmOuts.append(((int(alias[-1]), 1), GPIOX_19))
+ alias = get_pwm_chipid("ffd1a000.pwm")
+ if alias is not None:
+ globals()["PWMC"] = GPIOX_5
+ globals()["PWMD"] = GPIOX_3
+ pwmOuts.append(((int(alias[-1]), 0), GPIOX_5))
+ pwmOuts.append(((int(alias[-1]), 1), GPIOX_3))
+ alias = get_pwm_chipid("ffd19000.pwm")
+ if alias is not None:
+ globals()["PWME"] = GPIOX_16
+ globals()["PWMF"] = GPIOX_7
+ pwmOuts.append(((int(alias[-1]), 0), GPIOX_16))
+ pwmOuts.append(((int(alias[-1]), 1), GPIOX_7))
+ analogIns.append((37, 0, 2))
+ analogIns.append((40, 0, 0))
+if board in ("ODROID_N2"):
+ alias = get_pwm_chipid("ffd1a000.pwm")
+ if alias is not None:
+ globals()["PWMC"] = GPIOX_5
+ globals()["PWMD"] = GPIOX_6
+ pwmOuts.append(((int(alias[-1]), 0), GPIOX_5))
+ pwmOuts.append(((int(alias[-1]), 1), GPIOX_6))
+ alias = get_pwm_chipid("ffd19000.pwm")
+ if alias is not None:
+ globals()["PWME"] = GPIOX_16
+ globals()["PWMF"] = GPIOX_7
+ pwmOuts.append(((int(alias[-1]), 0), GPIOX_16))
+ pwmOuts.append(((int(alias[-1]), 1), GPIOX_7))
+ analogIns.append((37, 0, 3))
+ analogIns.append((40, 0, 2))
+
+analogIns = tuple(analogIns)
i2cPorts = tuple(i2cPorts)
+pwmOuts = tuple(pwmOuts)
+uartPorts = tuple(uartPorts)