From: Melissa LeBlanc-Williams Date: Thu, 14 Dec 2023 22:42:19 +0000 (-0800) Subject: Merge pull request #751 from how2flow/odroid X-Git-Tag: 8.28.0~4 X-Git-Url: https://git.ayoreis.com/Adafruit_Blinka-hackapet.git/commitdiff_plain/2110b0ecfe874b2ad56b54ad5174db8cdff9a95b?hp=7e3dd258df030fa97c8bbf82eaf4e828067415c6 Merge pull request #751 from how2flow/odroid To support pwm on ODROIDs --- diff --git a/src/adafruit_blinka/microcontroller/alias.py b/src/adafruit_blinka/microcontroller/alias.py index ab5067e..3686919 100644 --- a/src/adafruit_blinka/microcontroller/alias.py +++ b/src/adafruit_blinka/microcontroller/alias.py @@ -3,7 +3,8 @@ # SPDX-License-Identifier: MIT """ -Device Tree Alias Functions +Functions to find aliases for all hardware, +including those defined in the device tree. """ from typing import Optional @@ -23,3 +24,15 @@ def get_dts_alias(device: str) -> Optional[str]: if match: return match.group(1).upper() return None + + +def get_pwm_chipid(device: str): + """Get the PWM Chip ID""" + for chipid in range(32): + pwm_sys_path = "/sys/class/pwm/pwmchip{}".format(chipid) + if not os.path.exists(pwm_sys_path): + continue + if device in os.path.realpath(pwm_sys_path): + alias = "PWM" + str(chipid) + return alias + return None diff --git a/src/adafruit_blinka/microcontroller/rockchip/rk3566/pin.py b/src/adafruit_blinka/microcontroller/rockchip/rk3566/pin.py index 9fae71c..cda852d 100644 --- a/src/adafruit_blinka/microcontroller/rockchip/rk3566/pin.py +++ b/src/adafruit_blinka/microcontroller/rockchip/rk3566/pin.py @@ -7,6 +7,7 @@ from adafruit_blinka.agnostic import detector from adafruit_blinka.microcontroller.alias import get_dts_alias +from adafruit_blinka.microcontroller.alias import get_pwm_chipid from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin GPIO0_A2 = Pin((0, 2)) @@ -167,10 +168,10 @@ spiPorts = [ ] # SysFS pwm outputs, pwm channel and pin in first tuple -pwmOuts = ( +pwmOuts = [ ((0, 0), PWM0), ((0, 0), PWM1), -) +] uartPorts = [] @@ -184,6 +185,18 @@ if board in ("ODROID_M1S"): globals()[alias + "_SCL"] = GPIO3_B5 globals()[alias + "_SDA"] = GPIO3_B6 i2cPorts.append((int(alias[3]), GPIO3_B5, GPIO3_B6)) + alias = get_pwm_chipid("fdd70010.pwm") + if alias is not None: + globals()["PWM" + alias] = GPIO0_C0 + pwmOuts.append(((int(alias[3]), 0), GPIO0_C0)) + alias = get_pwm_chipid("fdd70020.pwm") + if alias is not None: + globals()["PWM" + alias] = GPIO0_C1 + pwmOuts.append(((int(alias[3]), 0), GPIO0_C1)) + alias = get_pwm_chipid("fdd70030.pwm") + if alias is not None: + globals()["PWM" + alias] = GPIO0_C2 + pwmOuts.append(((int(alias[3]), 0), GPIO0_C2)) alias = get_dts_alias("fe620000.spi") if alias is not None: globals()[alias + "_CLK"] = GPIO3_C3 @@ -202,5 +215,6 @@ if board in ("ODROID_M1S"): uartPorts.append((int(alias[3]), GPIO2_A4, GPIO2_A3)) i2cPorts = tuple(i2cPorts) +pwmOuts = tuple(pwmOuts) spiPorts = tuple(spiPorts) uartPorts = tuple(uartPorts) diff --git a/src/adafruit_blinka/microcontroller/rockchip/rk3568b2/pin.py b/src/adafruit_blinka/microcontroller/rockchip/rk3568b2/pin.py index ee928ef..d7abb83 100644 --- a/src/adafruit_blinka/microcontroller/rockchip/rk3568b2/pin.py +++ b/src/adafruit_blinka/microcontroller/rockchip/rk3568b2/pin.py @@ -7,6 +7,7 @@ from adafruit_blinka.agnostic import detector from adafruit_blinka.microcontroller.alias import get_dts_alias +from adafruit_blinka.microcontroller.alias import get_pwm_chipid from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin GPIO3C_6 = Pin((3, 22)) @@ -71,6 +72,9 @@ i2cPorts = [ # ordered as spiId, sckId, mosiId, misoId spiPorts = ((0, SPI0_SCLK_M1, SPI0_MOSI_M1, SPI0_MISO_M1),) +# SysFS pwm outputs, pwm channel and pin in first tuple +pwmOuts = [] + # ordered as uartId, txId, rxId uartPorts = [] @@ -87,6 +91,18 @@ if board in ("ODROID_M1"): globals()[alias + "_SCL"] = GPIO3B_5 globals()[alias + "_SDA"] = GPIO3B_6 i2cPorts.append((int(alias[3]), GPIO3B_5, GPIO3B_6)) + alias = get_pwm_chipid("fdd70010.pwm") + if alias is not None: + globals()["PWM" + alias] = GPIO0C_0 + pwmOuts.append(((int(alias[3]), 0), GPIO0C_0)) + alias = get_pwm_chipid("fdd70020.pwm") + if alias is not None: + globals()["PWM" + alias] = GPIO0C_1 + pwmOuts.append(((int(alias[3]), 0), GPIO0C_1)) + alias = get_pwm_chipid("fe6f0010.pwm") + if alias is not None: + globals()["PWM" + alias] = GPIO3B_2 + pwmOuts.append(((int(alias[3]), 0), GPIO3B_2)) alias = get_dts_alias("fdd50000.serial") if alias is not None: globals()[alias + "_TX"] = GPIO0C_1 @@ -100,4 +116,5 @@ if board in ("ODROID_M1"): i2cPorts = tuple(i2cPorts) +pwmOuts = tuple(pwmOuts) uartPorts = tuple(uartPorts) diff --git a/src/pulseio.py b/src/pulseio.py index c6aa49e..a454613 100644 --- a/src/pulseio.py +++ b/src/pulseio.py @@ -21,8 +21,9 @@ if detector.board.any_raspberry_pi: elif "sphinx" in sys.modules: pass elif detector.board.any_odroid_40_pin: - from adafruit_blinka.microcontroller.amlogic.meson_g12_common.pulseio.PulseIn import ( - PulseIn, - ) + if detector.board.id in ("ODROID_C4", "ODROID_N2"): + from adafruit_blinka.microcontroller.amlogic.meson_g12_common.pulseio.PulseIn import ( + PulseIn, + ) else: raise NotImplementedError("pulseio not supported for this board.") diff --git a/src/pwmio.py b/src/pwmio.py index 9ded9fd..397120b 100644 --- a/src/pwmio.py +++ b/src/pwmio.py @@ -30,6 +30,8 @@ elif detector.board.any_lemaker: from adafruit_blinka.microcontroller.generic_linux.sysfs_pwmout import PWMOut elif detector.board.any_siemens_simatic_iot2000: from adafruit_blinka.microcontroller.am65xx.pwmout import PWMOut +elif detector.board.any_odroid_40_pin: + from adafruit_blinka.microcontroller.generic_linux.sysfs_pwmout import PWMOut elif detector.board.any_rock_pi_board: from adafruit_blinka.microcontroller.rockchip.PWMOut import PWMOut elif detector.board.binho_nova: