1 # SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
 
   3 # SPDX-License-Identifier: MIT
 
   4 """SPI Classes for RP2040s with u2if firmware"""
 
   5 from .rp2040_u2if import rp2040_u2if
 
   8 # pylint: disable=protected-access, no-self-use
 
  10     """SPI Base Class for RP2040 u2if"""
 
  14     def __init__(self, index, *, baudrate=100000):
 
  16         self._frequency = baudrate
 
  17         rp2040_u2if.spi_set_port(self._index)
 
  18         rp2040_u2if.spi_configure(self._frequency)
 
  20     # pylint: disable=too-many-arguments,unused-argument
 
  32         """Initialize the Port"""
 
  33         self._frequency = baudrate
 
  34         rp2040_u2if.spi_set_port(self._index)
 
  35         rp2040_u2if.spi_configure(self._frequency)
 
  37     # pylint: enable=too-many-arguments
 
  41         """Return the current frequency"""
 
  42         return self._frequency
 
  44     def write(self, buf, start=0, end=None):
 
  45         """Write data from the buffer to SPI"""
 
  46         rp2040_u2if.spi_write(buf, start=start, end=end)
 
  48     def readinto(self, buf, start=0, end=None, write_value=0):
 
  49         """Read data from SPI and into the buffer"""
 
  50         rp2040_u2if.spi_readinto(buf, start=start, end=end, write_value=write_value)
 
  52     # pylint: disable=too-many-arguments
 
  54         self, buffer_out, buffer_in, out_start=0, out_end=None, in_start=0, in_end=None
 
  56         """Perform a half-duplex write from buffer_out and then
 
  57         read data into buffer_in
 
  59         rp2040_u2if.spi_write_readinto(
 
  68     # pylint: enable=too-many-arguments
 
  72     """SPI Class for Pico u2if"""
 
  74     def __init__(self, clock, *, baudrate=100000):
 
  81             raise ValueError("No SPI port on specified pin.")
 
  82         super().__init__(index, baudrate=baudrate)
 
  85 class SPI_Feather(SPI):
 
  86     """SPI Class for Feather u2if"""
 
  88     def __init__(self, clock, *, baudrate=100000):
 
  93             raise ValueError("No SPI port on specified pin.")
 
  94         super().__init__(index, baudrate=baudrate)
 
  97 class SPI_Feather_CAN(SPI):
 
  98     """SPI Class for Feather EPD u2if"""
 
 100     def __init__(self, clock, *, baudrate=100000):
 
 105             raise ValueError("No SPI port on specified pin.")
 
 106         super().__init__(index, baudrate=baudrate)
 
 109 class SPI_Feather_EPD(SPI):
 
 110     """SPI Class for Feather EPD u2if"""
 
 112     def __init__(self, clock, *, baudrate=100000):
 
 119             raise ValueError("No SPI port on specified pin.")
 
 120         super().__init__(index, baudrate=baudrate)
 
 123 class SPI_Feather_RFM(SPI):
 
 124     """SPI Class for Feather EPD u2if"""
 
 126     def __init__(self, clock, *, baudrate=100000):
 
 131             raise ValueError("No SPI port on specified pin.")
 
 132         super().__init__(index, baudrate=baudrate)
 
 136     """SPI Class for QT Py u2if"""
 
 138     def __init__(self, clock, *, baudrate=100000):
 
 143             raise ValueError("No SPI port on specified pin.")
 
 144         super().__init__(index, baudrate=baudrate)
 
 147 class SPI_ItsyBitsy(SPI):
 
 148     """SPI Class for ItsyBitsy u2if"""
 
 150     def __init__(self, clock, *, baudrate=100000):
 
 155             raise ValueError("No SPI port on specified pin.")
 
 156         super().__init__(index, baudrate=baudrate)
 
 159 class SPI_MacroPad(SPI):
 
 160     """SPI Class for MacroPad u2if"""
 
 162     def __init__(self, clock, *, baudrate=100000):
 
 167             raise ValueError("No SPI port on specified pin.")
 
 168         super().__init__(index, baudrate=baudrate)
 
 171 class SPI_KB2040(SPI):
 
 172     """SPI Class for KB2040 u2if"""
 
 174     def __init__(self, clock, *, baudrate=100000):
 
 179             raise ValueError("No SPI port on specified pin.")
 
 180         super().__init__(index, baudrate=baudrate)