From: Melissa LeBlanc-Williams Date: Mon, 3 Jun 2024 19:30:50 +0000 (-0700) Subject: Merge pull request #817 from burberius/raxda-zero3 X-Git-Tag: 8.40.0~1 X-Git-Url: https://git.ayoreis.com/Adafruit_Blinka-hackapet.git/commitdiff_plain/a21448d300e760515c80bcbd7682f5c7f2f0d844?hp=89028b7fe874bf72ea080b017fd63acfa8dbd1ed Merge pull request #817 from burberius/raxda-zero3 Add Raxda ZERO 3 support --- diff --git a/src/adafruit_blinka/board/generic_agnostic_board.py b/src/adafruit_blinka/board/generic_agnostic_board.py index 925e7ba..7cdfa80 100644 --- a/src/adafruit_blinka/board/generic_agnostic_board.py +++ b/src/adafruit_blinka/board/generic_agnostic_board.py @@ -11,9 +11,11 @@ Dx_INPUT_TRUE_PULL_UP = pin.D2 Dx_INPUT_TRUE_PULL_DOWN = pin.D3 Dx_OUTPUT = pin.D4 Dx_INPUT_TOGGLE = pin.D7 -# Special "digital" pins -NEOPIXEL = pin.D6 +# Special digital pins for pixels +NEOPIXEL = pin.D6 +DOTSTAR_DATA = pin.D8 +DOTSTAR_CLK = pin.D9 # Analog pins Ax_INPUT_RAND_INT = pin.A0 @@ -33,6 +35,9 @@ MOSI = pin.MOSI MISO = pin.MISO CS = pin.D6 +# SPI port +spiPorts = ((0, SCK, MOSI, MISO),) + # UART pins UART_TX = pin.UART_TX UART_RX = pin.UART_RX diff --git a/src/adafruit_blinka/microcontroller/generic_agnostic_board/neopixel.py b/src/adafruit_blinka/microcontroller/generic_agnostic_board/neopixel.py new file mode 100644 index 0000000..30102d1 --- /dev/null +++ b/src/adafruit_blinka/microcontroller/generic_agnostic_board/neopixel.py @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: 2024 Brent Rubell for Adafruit Industries +# +# SPDX-License-Identifier: MIT +"""NeoPixel write mocks for a generic board.""" + + +# pylint: disable=unused-argument +def neopixel_write(gpio, buf): + """Mocks a neopixel_write function""" + # pad output buffer from 3 bpp to 4 bpp + buffer = [] + for i in range(0, len(buf), 3): + buffer.append(0) + buffer.append(buf[i + 2]) + buffer.append(buf[i + 1]) + buffer.append(buf[i]) + + # then, do nothing diff --git a/src/adafruit_blinka/microcontroller/generic_agnostic_board/pin.py b/src/adafruit_blinka/microcontroller/generic_agnostic_board/pin.py index 47d9754..5830c30 100644 --- a/src/adafruit_blinka/microcontroller/generic_agnostic_board/pin.py +++ b/src/adafruit_blinka/microcontroller/generic_agnostic_board/pin.py @@ -204,7 +204,10 @@ A2 = Pin(9) A3 = Pin(10) A4 = Pin(12) +# Special digital pins for pixels D7 = Pin(11) +D8 = Pin(13) +D9 = Pin(14) # I2C pins SDA = Pin() @@ -217,6 +220,9 @@ MOSI = Pin() MISO = Pin() CS = Pin() +spiPorts = ((0, SCK, MOSI, MISO),) + + # UART pins UART_TX = Pin() UART_RX = Pin() diff --git a/src/adafruit_blinka/microcontroller/generic_agnostic_board/spi.py b/src/adafruit_blinka/microcontroller/generic_agnostic_board/spi.py new file mode 100644 index 0000000..a7ca140 --- /dev/null +++ b/src/adafruit_blinka/microcontroller/generic_agnostic_board/spi.py @@ -0,0 +1,57 @@ +# SPDX-FileCopyrightText: 2024 Brent Rubell for Adafruit Industries +# +# SPDX-License-Identifier: MIT +"""SPI class for a generic agnostic board.""" +# from .rp2040_u2if import rp2040_u2if + + +# pylint: disable=protected-access, no-self-use +class SPI: + """SPI Base Class for a generic agnostic board.""" + + MSB = 0 + + def __init__(self, index, *, baudrate=100000): + self._index = index + self._frequency = baudrate + + # pylint: disable=too-many-arguments,unused-argument + def init( + self, + baudrate=1000000, + polarity=0, + phase=0, + bits=8, + firstbit=MSB, + sck=None, + mosi=None, + miso=None, + ): + """Initialize the Port""" + self._frequency = baudrate + + # pylint: enable=too-many-arguments + + @property + def frequency(self): + """Return the current frequency""" + return self._frequency + + # pylint: disable=unnecessary-pass + def write(self, buf, start=0, end=None): + """Write data from the buffer to SPI""" + pass + + # pylint: disable=unnecessary-pass + def readinto(self, buf, start=0, end=None, write_value=0): + """Read data from SPI and into the buffer""" + pass + + # pylint: disable=too-many-arguments, unnecessary-pass + def write_readinto( + self, buffer_out, buffer_in, out_start=0, out_end=None, in_start=0, in_end=None + ): + """Perform a half-duplex write from buffer_out and then + read data into buffer_in + """ + pass diff --git a/src/analogio.py b/src/analogio.py index f1b9a55..032c016 100644 --- a/src/analogio.py +++ b/src/analogio.py @@ -9,7 +9,6 @@ Not supported by all boards. * Author(s): Carter Nelson, Melissa LeBlanc-Williams """ -import os import sys from adafruit_blinka.agnostic import detector @@ -63,10 +62,7 @@ elif detector.board.itsybitsy_u2if: from adafruit_blinka.microcontroller.rp2040_u2if.analogio import ( AnalogIn_ItsyBitsy as AnalogIn, ) -elif ( - "BLINKA_FORCECHIP" in os.environ - and os.environ["BLINKA_FORCEBOARD"] == "GENERIC_AGNOSTIC_BOARD" -): +elif detector.board.OS_AGNOSTIC_BOARD: from adafruit_blinka.microcontroller.generic_agnostic_board.analogio import AnalogIn from adafruit_blinka.microcontroller.generic_agnostic_board.analogio import ( AnalogOut, diff --git a/src/board.py b/src/board.py index 085743a..8915316 100644 --- a/src/board.py +++ b/src/board.py @@ -17,7 +17,6 @@ __blinka__ = True import sys -import os import adafruit_platformdetect.constants.boards as ap_board from adafruit_blinka.agnostic import board_id, detector @@ -391,10 +390,7 @@ elif board_id == ap_board.LICHEEPI_4A: elif board_id == ap_board.MILKV_DUO: from adafruit_blinka.board.milkv_duo import * -elif ( - "BLINKA_FORCECHIP" in os.environ - and os.environ["BLINKA_FORCEBOARD"] == "GENERIC_AGNOSTIC_BOARD" -): +elif board_id == ap_board.OS_AGNOSTIC_BOARD: from adafruit_blinka.board.generic_agnostic_board import * elif "sphinx" in sys.modules: diff --git a/src/busio.py b/src/busio.py index 70ead88..ffb63fd 100644 --- a/src/busio.py +++ b/src/busio.py @@ -9,8 +9,6 @@ See `CircuitPython:busio` in CircuitPython for more details. * Author(s): cefn """ -import os - try: import threading except ImportError: @@ -56,10 +54,7 @@ class I2C(Lockable): self._i2c = _I2C(frequency=frequency) return - if ( - "BLINKA_FORCECHIP" in os.environ - and os.environ["BLINKA_FORCEBOARD"] == "GENERIC_AGNOSTIC_BOARD" - ): + if detector.board.OS_AGNOSTIC_BOARD: from adafruit_blinka.microcontroller.generic_agnostic_board.i2c import ( I2C as _I2C, ) @@ -363,6 +358,10 @@ class SPI(Lockable): from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI elif detector.board.ftdi_ft2232h: from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.spi import SPI as _SPI + elif detector.board.OS_AGNOSTIC_BOARD: + from adafruit_blinka.microcontroller.generic_agnostic_board.spi import ( + SPI as _SPI, + ) else: from adafruit_blinka.microcontroller.generic_micropython.spi import ( SPI as _SPI, diff --git a/src/digitalio.py b/src/digitalio.py index ecdc98e..8577765 100644 --- a/src/digitalio.py +++ b/src/digitalio.py @@ -9,7 +9,6 @@ See `CircuitPython:digitalio` in CircuitPython for more details. * Author(s): cefn """ -import os from adafruit_blinka.agnostic import board_id, detector # pylint: disable=ungrouped-imports,wrong-import-position,unused-wildcard-import,wildcard-import @@ -137,10 +136,7 @@ elif detector.chip.RP2040: from machine import Pin elif detector.chip.CV1800B: from adafruit_blinka.microcontroller.cv1800b.pin import Pin -elif ( - "BLINKA_FORCECHIP" in os.environ - and os.environ["BLINKA_FORCEBOARD"] == "GENERIC_AGNOSTIC_BOARD" -): +elif detector.chip.OS_AGNOSTIC: from adafruit_blinka.microcontroller.generic_agnostic_board.pin import Pin from adafruit_blinka import Enum, ContextManaged diff --git a/src/microcontroller/__init__.py b/src/microcontroller/__init__.py index 394d274..cf51a81 100644 --- a/src/microcontroller/__init__.py +++ b/src/microcontroller/__init__.py @@ -150,10 +150,7 @@ elif chip_id == ap_chip.TH1520: from adafruit_blinka.microcontroller.thead.th1520 import * elif chip_id == ap_chip.GENERIC_X86: print("WARNING: GENERIC_X86 is not fully supported. Some features may not work.") -elif ( - "BLINKA_FORCECHIP" in os.environ - and os.environ["BLINKA_FORCEBOARD"] == "GENERIC_AGNOSTIC_BOARD" -): +elif chip_id == ap_chip.OS_AGNOSTIC: from adafruit_blinka.microcontroller.generic_agnostic_board import * elif chip_id is None: print( diff --git a/src/microcontroller/pin.py b/src/microcontroller/pin.py index 0d083a0..fcaa155 100644 --- a/src/microcontroller/pin.py +++ b/src/microcontroller/pin.py @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: MIT """Pins named after their chip name.""" -import os import sys from adafruit_platformdetect.constants import chips as ap_chip, boards as ap_boards from adafruit_blinka.agnostic import board_id, chip_id @@ -96,6 +95,8 @@ elif chip_id == ap_chip.BINHO: from adafruit_blinka.microcontroller.nova.pin import * elif chip_id == ap_chip.LPC4330: from adafruit_blinka.microcontroller.nxp_lpc4330.pin import * +elif chip_id == ap_chip.OS_AGNOSTIC: + from adafruit_blinka.microcontroller.generic_agnostic_board.pin import * elif chip_id == ap_chip.MCP2221: from adafruit_blinka.microcontroller.mcp2221.pin import * elif chip_id == ap_chip.A10: @@ -149,11 +150,6 @@ elif "sphinx" in sys.modules: elif chip_id == ap_chip.GENERIC_X86: print("WARNING: GENERIC_X86 is not fully supported. Some features may not work.") from adafruit_blinka.microcontroller.generic_micropython import Pin -elif ( - "BLINKA_FORCECHIP" in os.environ - and os.environ["BLINKA_FORCEBOARD"] == "GENERIC_AGNOSTIC_BOARD" -): - from adafruit_blinka.microcontroller.generic_agnostic_board.pin import * elif chip_id is None: print( "WARNING: chip_id == None is not fully supported. Some features may not work." diff --git a/src/neopixel_write.py b/src/neopixel_write.py index 7c4f757..77e5776 100644 --- a/src/neopixel_write.py +++ b/src/neopixel_write.py @@ -19,6 +19,10 @@ if detector.board.any_raspberry_pi: from adafruit_blinka.microcontroller.bcm283x import neopixel as _neopixel elif detector.board.pico_u2if: from adafruit_blinka.microcontroller.rp2040_u2if import neopixel as _neopixel +elif detector.board.OS_AGNOSTIC_BOARD: + from adafruit_blinka.microcontroller.generic_agnostic_board import ( + neopixel as _neopixel, + ) elif ( detector.board.feather_u2if or detector.board.feather_can_u2if diff --git a/tests/test_generic_agnostic_board_analogio.py b/tests/test_generic_agnostic_board_analogio.py index 3658380..aa36907 100644 --- a/tests/test_generic_agnostic_board_analogio.py +++ b/tests/test_generic_agnostic_board_analogio.py @@ -9,7 +9,7 @@ import analogio # Analog Outputs def test_Ax_OUTPUT(): """Test analog output pin functionality.""" - assert board.board_id == "GENERIC_AGNOSTIC_BOARD" + assert board.board_id == "OS_AGNOSTIC_BOARD" pin_out = analogio.AnalogOut(board.Ax_OUTPUT) # Test boundaries of setting the value and reading it back @@ -76,7 +76,7 @@ sawtooth_wave = [ def test_Ax_INPUT_RAND_INT(): """Test random integer from pin Ax_INPUT_RAND_INT""" - assert board.board_id == "GENERIC_AGNOSTIC_BOARD" + assert board.board_id == "OS_AGNOSTIC_BOARD" pin_random = analogio.AnalogIn(board.Ax_INPUT_RAND_INT) assert isinstance(pin_random.value, int) @@ -86,7 +86,7 @@ def test_Ax_INPUT_RAND_INT(): def test_Ax_INPUT_FIXED_INT_PI(): """Test fixed integer from pin Ax_INPUT_FIXED_INT_PI""" - assert board.board_id == "GENERIC_AGNOSTIC_BOARD" + assert board.board_id == "OS_AGNOSTIC_BOARD" pin_pi = analogio.AnalogIn(board.Ax_INPUT_FIXED_INT_PI) assert pin_pi.value == 31415 @@ -96,7 +96,7 @@ def test_Ax_INPUT_FIXED_INT_PI(): def test_Ax_INPUT_WAVE_SINE(): """Test sine wave from pin Ax_INPUT_WAVE_SINE""" - assert board.board_id == "GENERIC_AGNOSTIC_BOARD" + assert board.board_id == "OS_AGNOSTIC_BOARD" pin_sine_wave = analogio.AnalogIn(board.Ax_INPUT_WAVE_SINE) # Run through the sine wave once @@ -112,7 +112,7 @@ def test_Ax_INPUT_WAVE_SINE(): def test_Ax_INPUT_WAVE_SAW(): """Test sawtooth wave from pin Ax_INPUT_WAVE_SAW""" - assert board.board_id == "GENERIC_AGNOSTIC_BOARD" + assert board.board_id == "OS_AGNOSTIC_BOARD" pin_saw_wave = analogio.AnalogIn(board.Ax_INPUT_WAVE_SAW) # Run through the sine wave once diff --git a/tests/test_generic_agnostic_board_digitalio.py b/tests/test_generic_agnostic_board_digitalio.py index a9ebb32..47a112f 100644 --- a/tests/test_generic_agnostic_board_digitalio.py +++ b/tests/test_generic_agnostic_board_digitalio.py @@ -10,7 +10,7 @@ import digitalio def test_Dx_OUTPUT_TRUE(): """Test digital output pin functionality.""" - assert board.board_id == "GENERIC_AGNOSTIC_BOARD" + assert board.board_id == "OS_AGNOSTIC_BOARD" pin_out = digitalio.DigitalInOut(board.Dx_OUTPUT) pin_out.direction = digitalio.Direction.OUTPUT # Test setting the value and reading it back @@ -26,7 +26,7 @@ def test_Dx_OUTPUT_TRUE(): def test_Dx_INPUT_TRUE(): """Test digital input pin Dx_INPUT_TRUE.""" - assert board.board_id == "GENERIC_AGNOSTIC_BOARD" + assert board.board_id == "OS_AGNOSTIC_BOARD" pin_true = digitalio.DigitalInOut(board.Dx_INPUT_TRUE) pin_true.direction = digitalio.Direction.INPUT assert pin_true.value is True @@ -36,7 +36,7 @@ def test_Dx_INPUT_TRUE(): def test_Dx_INPUT_TRUE_PULL_DOWN(): """Test digital input pin Dx_INPUT_TRUE w/pull down.""" - assert board.board_id == "GENERIC_AGNOSTIC_BOARD" + assert board.board_id == "OS_AGNOSTIC_BOARD" pin_true = digitalio.DigitalInOut(board.Dx_INPUT_TRUE) pin_true.direction = digitalio.Direction.INPUT assert pin_true.value is True @@ -48,7 +48,7 @@ def test_Dx_INPUT_TRUE_PULL_DOWN(): def test_Dx_INPUT_FALSE_PULL_UP(): """Test digital input pin Dx_INPUT_FALSE w/pull up.""" - assert board.board_id == "GENERIC_AGNOSTIC_BOARD" + assert board.board_id == "OS_AGNOSTIC_BOARD" pin_false = digitalio.DigitalInOut(board.Dx_INPUT_FALSE) pin_false.direction = digitalio.Direction.INPUT assert pin_false.value is False @@ -60,7 +60,7 @@ def test_Dx_INPUT_FALSE_PULL_UP(): def test_Dx_INPUT_FALSE(): """Test digital input pin Dx_INPUT_FALSE""" - assert board.board_id == "GENERIC_AGNOSTIC_BOARD" + assert board.board_id == "OS_AGNOSTIC_BOARD" pin_false = digitalio.DigitalInOut(board.Dx_INPUT_FALSE) pin_false.direction = digitalio.Direction.INPUT assert pin_false.value is False @@ -70,7 +70,7 @@ def test_Dx_INPUT_FALSE(): def test_Dx_INPUT_TOGGLE(): """Test digital input pin Dx_INPUT_TOGGLE""" - assert board.board_id == "GENERIC_AGNOSTIC_BOARD" + assert board.board_id == "OS_AGNOSTIC_BOARD" pin_toggle = digitalio.DigitalInOut(board.Dx_INPUT_TOGGLE) pin_toggle.direction = digitalio.Direction.INPUT assert pin_toggle.value is True