From: DarkMechanikum Date: Wed, 3 Jul 2024 10:29:23 +0000 (+0300) Subject: migrated from libgpio to VisionFive.gpio, added pwmio X-Git-Tag: 8.46.0~2^2~1^2~12 X-Git-Url: https://git.ayoreis.com/Adafruit_Blinka-hackapet.git/commitdiff_plain/ad60894608702cae48932dce189445f976aef126 migrated from libgpio to VisionFive.gpio, added pwmio --- diff --git a/src/adafruit_blinka/board/starfive/__init__.py b/src/adafruit_blinka/board/starfive/__init__.py index 06d9822..2cb7cfb 100644 --- a/src/adafruit_blinka/board/starfive/__init__.py +++ b/src/adafruit_blinka/board/starfive/__init__.py @@ -1 +1,4 @@ -"""Starffive boards defenition""" +# SPDX-FileCopyrightText: 2024 Vladimir Shtarev +# +# SPDX-License-Identifier: MIT +"""Starfive boards defenition""" diff --git a/src/adafruit_blinka/board/starfive/visionfive2.py b/src/adafruit_blinka/board/starfive/visionfive2.py index 63509ce..75d15de 100644 --- a/src/adafruit_blinka/board/starfive/visionfive2.py +++ b/src/adafruit_blinka/board/starfive/visionfive2.py @@ -1,46 +1,47 @@ +# SPDX-FileCopyrightText: 2024 Vladimir Shtarev +# +# SPDX-License-Identifier: MIT +"""Starfive VisionFive2 board config""" from adafruit_blinka.microcontroller.starfive.JH7110 import pin -D0 = pin.D0 -D1 = pin.D1 -D4 = pin.D4 + +D3 = pin.D3 D5 = pin.D5 -D6 = pin.D6 D7 = pin.D7 D8 = pin.D8 -D9 = pin.D9 D10 = pin.D10 D11 = pin.D11 D12 = pin.D12 D13 = pin.D13 -D14 = pin.D14 D15 = pin.D15 D16 = pin.D16 -D17 = pin.D17 D18 = pin.D18 D19 = pin.D19 -D20 = pin.D20 D21 = pin.D21 D22 = pin.D22 D23 = pin.D23 D24 = pin.D24 -D25 = pin.D25 D26 = pin.D26 D27 = pin.D27 - +D28 = pin.D28 +D29 = pin.D29 +D31 = pin.D31 +D32 = pin.D32 +D33 = pin.D33 +D35 = pin.D35 +D36 = pin.D36 +D37 = pin.D37 +D38 = pin.D38 +D40 = pin.D40 # I2C -SDA = pin.I2C1_SDA -SCL = pin.I2C1_SCL -SDA2 = pin.I2C2_SDA -SCL2 = pin.I2C2_SCL -SDA3 = pin.I2C3_SDA -SCL3 = pin.I2C3_SCL +I2C_SDA = pin.I2C_SDA +I2C_SCL = pin.I2C_SCL # SPI SPI_MISO = pin.SPI_MISO SPI_MOSI = pin.SPI_MOSI SPI_SCLK = pin.SPI_SCLK - # UART UART_TX = pin.UART_TX UART_RX = pin.UART_RX diff --git a/src/adafruit_blinka/microcontroller/generic_micropython/i2c.py b/src/adafruit_blinka/microcontroller/generic_micropython/i2c.py index c609249..2036233 100755 --- a/src/adafruit_blinka/microcontroller/generic_micropython/i2c.py +++ b/src/adafruit_blinka/microcontroller/generic_micropython/i2c.py @@ -8,7 +8,6 @@ from machine import I2C as _I2C class I2C: """I2C Class for Generic MicroPython""" - MASTER = 0 # pylint: disable=unused-argument diff --git a/src/adafruit_blinka/microcontroller/starfive/JH7110/__init__.py b/src/adafruit_blinka/microcontroller/starfive/JH7110/__init__.py index 2a4aa83..1fccb29 100644 --- a/src/adafruit_blinka/microcontroller/starfive/JH7110/__init__.py +++ b/src/adafruit_blinka/microcontroller/starfive/JH7110/__init__.py @@ -1 +1,4 @@ +# SPDX-FileCopyrightText: 2024 Vladimir Shtarev +# +# SPDX-License-Identifier: MIT """Definition for the StarFive JH7110 chip""" diff --git a/src/adafruit_blinka/microcontroller/starfive/JH7110/pin.py b/src/adafruit_blinka/microcontroller/starfive/JH7110/pin.py index 5fdbf2c..b1f07c9 100644 --- a/src/adafruit_blinka/microcontroller/starfive/JH7110/pin.py +++ b/src/adafruit_blinka/microcontroller/starfive/JH7110/pin.py @@ -1,60 +1,116 @@ -# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries +# SPDX-FileCopyrightText: 2024 Vladimir Shtarev # # SPDX-License-Identifier: MIT """A Pin class for use with StarFive JH7110.""" -from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin - -D0 = Pin(9) -D1 = Pin(10) -D4 = Pin(46) -D5 = Pin(8) -D6 = Pin(6) -D7 = Pin(11) -D8 = Pin(15) -D9 = Pin(16) -D10 = Pin(18) -D11 = Pin(12) -D12 = Pin(7) -D13 = Pin(5) -D14 = Pin(14) -D15 = Pin(13) -D16 = Pin(4) -D17 = Pin(44) -D18 = Pin(45) -D19 = Pin(3) -D20 = Pin(2) -D21 = Pin(0) -D22 = Pin(20) -D23 = Pin(21) -D24 = Pin(19) -D25 = Pin(17) -D26 = Pin(1) -D27 = Pin(22) +import VisionFive.gpio as GPIO +GPIO.setmode(GPIO.BOARD) + + +class Pin: + """Pins don't exist in CPython so...lets make our own!""" + + IN = 0 + OUT = 1 + LOW = 0 + HIGH = 1 + PULL_NONE = 0 + PULL_UP = 1 + PULL_DOWN = 2 + + id = None + _value = LOW + _mode = IN + + def __init__(self, bcm_number): + self.id = bcm_number + + def __repr__(self): + return str(self.id) + + def __eq__(self, other): + return self.id == other + + def init(self, mode=IN, pull=None): + """Initialize the Pin""" + if mode is not None: + if mode == self.IN: + self._mode = self.IN + GPIO.setup(self.id, GPIO.IN) + elif mode == self.OUT: + self._mode = self.OUT + GPIO.setup(self.id, GPIO.OUT) + else: + raise RuntimeError("Invalid mode for pin: %s" % self.id) + if pull is not None: + if self._mode != self.IN: + raise RuntimeError("Cannot set pull resistor on output") + if pull == self.PULL_UP: + GPIO.setup(self.id, GPIO.IN, pull_up_down=GPIO.PUD_UP) + elif pull == self.PULL_DOWN: + GPIO.setup(self.id, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) + else: + raise RuntimeError("Invalid pull for pin: %s" % self.id) + + def value(self, val=None): + """Set or return the Pin Value""" + if val is not None: + if val == self.LOW: + self._value = val + GPIO.output(self.id, val) + elif val == self.HIGH: + self._value = val + GPIO.output(self.id, val) + else: + raise RuntimeError("Invalid value for pin") + return None + return GPIO.input(self.id) + + +D3 = Pin(3) +D5 = Pin(5) +D7 = Pin(7) +D8 = Pin(9) +D10 = Pin(10) +D11 = Pin(11) +D12 = Pin(12) +D13 = Pin(13) +D15 = Pin(15) +D16 = Pin(16) +D18 = Pin(18) +D19 = Pin(19) +D21 = Pin(21) +D22 = Pin(22) +D23 = Pin(23) +D24 = Pin(24) +D26 = Pin(26) +D27 = Pin(27) +D28 = Pin(28) +D29 = Pin(29) +D31 = Pin(31) +D32 = Pin(32) +D33 = Pin(33) +D35 = Pin(35) +D36 = Pin(36) +D37 = Pin(37) +D38 = Pin(38) +D40 = Pin(40) # I2C -I2C1_SDA = Pin(48) -I2C1_SCL = Pin(47) -I2C2_SDA = Pin(59) -I2C2_SCL = Pin(60) -I2C3_SDA = Pin(61) -I2C3_SCL = Pin(62) +I2C_SDA = D3 +I2C_SCL = D5 # SPI -SPI_MISO = D9 -SPI_MOSI = D10 -SPI_SCLK = D11 +SPI_MISO = D21 +SPI_MOSI = D19 +SPI_SCLK = D23 # UART -UART_TX = D14 -UART_RX = D15 +UART_TX = D8 +UART_RX = D10 # ordered as i2cId, SCL, SDA -i2cPorts = ( - (0, I2C1_SCL, I2C1_SDA), - (1, I2C2_SCL, I2C2_SDA), - (2, I2C3_SCL, I2C3_SDA), -) +i2cPorts = ((0, I2C_SCL, I2C_SDA),) # ordered as spiId, sckId, mosiId, misoId spiPorts = ((0, SPI_SCLK, SPI_MOSI, SPI_MISO),) diff --git a/src/adafruit_blinka/microcontroller/starfive/JH7110/pwmio/PWMOut.py b/src/adafruit_blinka/microcontroller/starfive/JH7110/pwmio/PWMOut.py new file mode 100644 index 0000000..34e494a --- /dev/null +++ b/src/adafruit_blinka/microcontroller/starfive/JH7110/pwmio/PWMOut.py @@ -0,0 +1,164 @@ +# SPDX-FileCopyrightText: 2024 Vladimir Shtarev +# +# SPDX-License-Identifier: MIT +"""Custom PWMOut Wrapper for VisionFive.GPIO PWM Class""" + +import VisionFive.gpio as GPIO + +GPIO.setmode(GPIO.Board) + + +# pylint: disable=unnecessary-pass +class PWMError(IOError): + """Base class for PWM errors.""" + + pass + + +# pylint: enable=unnecessary-pass + + +class PWMOut: + """Pulse Width Modulation Output Class""" + + def __init__(self, pin, *, frequency=500, duty_cycle=0, variable_frequency=False): + self._pwmpin = None + self._period = 0 + self._open(pin, duty_cycle, frequency, variable_frequency) + + def __del__(self): + self.deinit() + + def __enter__(self): + return self + + def __exit__(self, t, value, traceback): + self.deinit() + + def _open(self, pin, duty=0, freq=500, variable_frequency=True): + self._pin = pin + GPIO.setup(pin.id, GPIO.OUT) + self._pwmpin = GPIO.PWM(pin.id, freq) + + if variable_frequency: + print("Variable Frequency is not supported, continuing without it...") + + # set frequency + self.frequency = freq + # set duty + self.duty_cycle = duty + + self.enabled = True + + def deinit(self): + """Deinit the PWM.""" + if self._pwmpin is not None: + self._pwmpin.stop() + GPIO.cleanup(self._pin.id) + self._pwmpin = None + + def _is_deinited(self): + if self._pwmpin is None: + raise ValueError( + "Object has been deinitialize and can no longer " + "be used. Create a new object." + ) + + @property + def period(self): + """Get or set the PWM's output period in seconds. + + Raises: + PWMError: if an I/O or OS error occurs. + TypeError: if value type is not int or float. + + :type: int, float + """ + return 1.0 / self.frequency + + @period.setter + def period(self, period): + if not isinstance(period, (int, float)): + raise TypeError("Invalid period type, should be int or float.") + + self.frequency = 1.0 / period + + @property + def duty_cycle(self): + """Get or set the PWM's output duty cycle which is the fraction of + each pulse which is high. + + Raises: + PWMError: if an I/O or OS error occurs. + TypeError: if value type is not int or float. + ValueError: if value is out of bounds of 0.0 to 100.0. + + :type: int, float + """ + return int(self._duty_cycle) + + @duty_cycle.setter + def duty_cycle(self, duty_cycle): + if not isinstance(duty_cycle, (int, float)): + raise TypeError("Invalid duty cycle type, should be int or float.") + + if not 0 <= duty_cycle <= 100: + raise ValueError( + "Invalid duty cycle value, should be between 0.0 and 100.0" + ) + + self._duty_cycle = duty_cycle + self._pwmpin.ChangeDutyCycle(round(self._duty_cycle)) + + @property + def frequency(self): + """Get or set the PWM's output frequency in Hertz. + + Raises: + PWMError: if an I/O or OS error occurs. + TypeError: if value type is not int or float. + + :type: int, float + """ + + return self._frequency + + @frequency.setter + def frequency(self, frequency): + if not isinstance(frequency, (int, float)): + raise TypeError("Invalid frequency type, should be int or float.") + + self._pwmpin.ChangeFrequency(round(frequency)) + self._frequency = frequency + + @property + def enabled(self): + """Get or set the PWM's output enabled state. + + Raises: + PWMError: if an I/O or OS error occurs. + TypeError: if value type is not bool. + + :type: bool + """ + return self._enabled + + @enabled.setter + def enabled(self, value): + if not isinstance(value, bool): + raise TypeError("Invalid enabled type, should be string.") + + if value: + self._pwmpin.start(round(self._duty_cycle * 100)) + else: + self._pwmpin.stop() + + self._enabled = value + + # String representation + def __str__(self): + return "pin %s (freq=%f Hz, duty_cycle=%f%%)" % ( + self._pin, + self.frequency, + self.duty_cycle, + ) diff --git a/src/adafruit_blinka/microcontroller/starfive/JH7110/pwmio/__init__.py b/src/adafruit_blinka/microcontroller/starfive/JH7110/pwmio/__init__.py new file mode 100644 index 0000000..50cbf1c --- /dev/null +++ b/src/adafruit_blinka/microcontroller/starfive/JH7110/pwmio/__init__.py @@ -0,0 +1,4 @@ +# SPDX-FileCopyrightText: 2024 Vladimir Shtarev +# +# SPDX-License-Identifier: MIT +"""Custom PWMOut Wrapper for VisionFive.GPIO PWM Class""" diff --git a/src/board.py b/src/board.py index 0706f42..599979b 100644 --- a/src/board.py +++ b/src/board.py @@ -441,7 +441,6 @@ elif board_id is None: ) else: - raise NotImplementedError(f"Board not supported {board_id}.") if "SCL" in locals() and "SDA" in locals(): diff --git a/src/microcontroller/__init__.py b/src/microcontroller/__init__.py index 187d642..036fbc9 100644 --- a/src/microcontroller/__init__.py +++ b/src/microcontroller/__init__.py @@ -50,7 +50,7 @@ elif chip_id == ap_chip.AM65XX: elif chip_id == ap_chip.JH71X0: from adafruit_blinka.microcontroller.starfive.JH71x0 import * elif chip_id == ap_chip.JH7110: - from adafruit_blinka.microcontroller.starfive.JH7110 import * + from adafruit_blinka.microcontroller.starfive.JH7110 import * elif chip_id == ap_chip.SUN4I: from adafruit_blinka.microcontroller.allwinner.a20 import * elif chip_id == ap_chip.SUN7I: diff --git a/src/microcontroller/pin.py b/src/microcontroller/pin.py index 115d71a..5872271 100644 --- a/src/microcontroller/pin.py +++ b/src/microcontroller/pin.py @@ -35,7 +35,7 @@ elif chip_id == ap_chip.AM65XX: elif chip_id == ap_chip.JH71X0: from adafruit_blinka.microcontroller.starfive.JH71x0.pin import * elif chip_id == ap_chip.JH7110: - from adafruit_blinka.microcontroller.starfive.JH7110.pin import * + from adafruit_blinka.microcontroller.starfive.JH7110.pin import * elif chip_id == ap_chip.SUN4I: from adafruit_blinka.microcontroller.allwinner.a20.pin import * elif chip_id == ap_chip.SUN7I: