]> Repositories - Adafruit_Blinka-hackapet.git/commitdiff
Merge branch 'master' of https://github.com/adafruit/Adafruit_Blinka
authorFranklin Harding <franklin@harding.coffee>
Tue, 11 May 2021 07:01:42 +0000 (00:01 -0700)
committerFranklin Harding <franklin@harding.coffee>
Tue, 11 May 2021 07:46:27 +0000 (00:46 -0700)
12 files changed:
1  2 
requirements.txt
setup.py
src/adafruit_blinka/microcontroller/ftdi_mpsse/ft2232h/pin.py
src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/i2c.py
src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/pin.py
src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/spi.py
src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/url.py
src/board.py
src/busio.py
src/digitalio.py
src/microcontroller/__init__.py
src/microcontroller/pin.py

diff --combined requirements.txt
index 59a7ee916a585e7acd382963617089781428c1de,59a7ee916a585e7acd382963617089781428c1de..013f2dccecaf7c7b906cc3a2d28260f9ce8a24fc
@@@ -1,4 -1,4 +1,4 @@@
--Adafruit-PlatformDetect>=3.1.0
++Adafruit-PlatformDetect>=3.13.0
  Adafruit-PureIO>=1.1.7
  Jetson.GPIO; platform_machine=='aarch64'
  RPi.GPIO; platform_machine=='armv7l' or platform_machine=='armv6l'
diff --combined setup.py
index 7e9259614c848eb555d1e71aa1e7549927b281bc,7e9259614c848eb555d1e71aa1e7549927b281bc..5d6ea95a44300b0aac6180b3a28fc2b0050440b8
+++ b/setup.py
@@@ -62,7 -62,7 +62,7 @@@ setup
          "adafruit_blinka.microcontroller.bcm283x.pulseio": ["libgpiod_pulsein"]
      },
      install_requires=[
--        "Adafruit-PlatformDetect>=3.1.0",
++        "Adafruit-PlatformDetect>=3.13.0",
          "Adafruit-PureIO>=1.1.7",
          "pyftdi>=0.40.0",
      ]
index 814a3a95b754d2011a0c3426d83f5e63c035f5da,0000000000000000000000000000000000000000..4fa84401a41f376f126ea6628000ad95ae91aac1
mode 100644,000000..100644
--- /dev/null
@@@ -1,55 -1,0 +1,55 @@@
- AD4 = Pin(4, url="ftdi://ftdi:ft2232h/1")
- AD5 = Pin(5, url="ftdi://ftdi:ft2232h/1")
- AD6 = Pin(6, url="ftdi://ftdi:ft2232h/1")
- AD7 = Pin(7, url="ftdi://ftdi:ft2232h/1")
- AC0 = Pin(8, url="ftdi://ftdi:ft2232h/1")
- AC1 = Pin(9, url="ftdi://ftdi:ft2232h/1")
- AC2 = Pin(10, url="ftdi://ftdi:ft2232h/1")
- AC3 = Pin(11, url="ftdi://ftdi:ft2232h/1")
- AC4 = Pin(12, url="ftdi://ftdi:ft2232h/1")
- AC5 = Pin(13, url="ftdi://ftdi:ft2232h/1")
- AC6 = Pin(14, url="ftdi://ftdi:ft2232h/1")
- AC7 = Pin(15, url="ftdi://ftdi:ft2232h/1")
- SCL0 = Pin(url="ftdi://ftdi:ft2232h/1")
- SDA0 = Pin(url="ftdi://ftdi:ft2232h/1")
- SCK0 = SCLK0 = Pin(url="ftdi://ftdi:ft2232h/1")
- MOSI0 = Pin(url="ftdi://ftdi:ft2232h/1")
- MISO0 = Pin(url="ftdi://ftdi:ft2232h/1")
 +"""FT2232H pin names"""
 +
 +from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.pin import Pin
 +
 +# See https://eblot.github.io/pyftdi/pinout.html for detailed FTDI device pinout information
 +
 +# MPSSE Port A
- BD4 = Pin(4, url="ftdi://ftdi:ft2232h/2")
- BD5 = Pin(5, url="ftdi://ftdi:ft2232h/2")
- BD6 = Pin(6, url="ftdi://ftdi:ft2232h/2")
- BD7 = Pin(7, url="ftdi://ftdi:ft2232h/2")
- BC0 = Pin(8, url="ftdi://ftdi:ft2232h/2")
- BC1 = Pin(9, url="ftdi://ftdi:ft2232h/2")
- BC2 = Pin(10, url="ftdi://ftdi:ft2232h/2")
- BC3 = Pin(11, url="ftdi://ftdi:ft2232h/2")
- BC4 = Pin(12, url="ftdi://ftdi:ft2232h/2")
- BC5 = Pin(13, url="ftdi://ftdi:ft2232h/2")
- BC6 = Pin(14, url="ftdi://ftdi:ft2232h/2")
- BC7 = Pin(15, url="ftdi://ftdi:ft2232h/2")
- SCL1 = Pin(url="ftdi://ftdi:ft2232h/2")
- SDA1 = Pin(url="ftdi://ftdi:ft2232h/2")
- SCK1 = SCLK1 = Pin(url="ftdi://ftdi:ft2232h/2")
- MOSI1 = Pin(url="ftdi://ftdi:ft2232h/2")
- MISO1 = Pin(url="ftdi://ftdi:ft2232h/2")
++AD4 = Pin(4, interface_id=0)
++AD5 = Pin(5, interface_id=0)
++AD6 = Pin(6, interface_id=0)
++AD7 = Pin(7, interface_id=0)
++AC0 = Pin(8, interface_id=0)
++AC1 = Pin(9, interface_id=0)
++AC2 = Pin(10, interface_id=0)
++AC3 = Pin(11, interface_id=0)
++AC4 = Pin(12, interface_id=0)
++AC5 = Pin(13, interface_id=0)
++AC6 = Pin(14, interface_id=0)
++AC7 = Pin(15, interface_id=0)
++
++SCL0 = Pin(interface_id=0)
++SDA0 = Pin(interface_id=0)
++SCK0 = SCLK0 = Pin(interface_id=0)
++MOSI0 = Pin(interface_id=0)
++MISO0 = Pin(interface_id=0)
 +
 +# MPSSE Port B
++BD4 = Pin(4, interface_id=1)
++BD5 = Pin(5, interface_id=1)
++BD6 = Pin(6, interface_id=1)
++BD7 = Pin(7, interface_id=1)
++BC0 = Pin(8, interface_id=1)
++BC1 = Pin(9, interface_id=1)
++BC2 = Pin(10, interface_id=1)
++BC3 = Pin(11, interface_id=1)
++BC4 = Pin(12, interface_id=1)
++BC5 = Pin(13, interface_id=1)
++BC6 = Pin(14, interface_id=1)
++BC7 = Pin(15, interface_id=1)
++
++SCL1 = Pin(interface_id=1)
++SDA1 = Pin(interface_id=1)
++SCK1 = SCLK1 = Pin(interface_id=1)
++MOSI1 = Pin(interface_id=1)
++MISO1 = Pin(interface_id=1)
 +
 +i2cPorts = (
 +    (0, SCL0, SDA0),
 +    (1, SCL1, SDA1),
 +)
 +
 +spiPorts = (
 +    (0, SCLK0, MOSI0, MISO0),
 +    (1, SCLK1, MOSI1, MISO1),
 +)
index 291a77ce5e85e1b842eea35eae0a015939c459bf,28d2644cd90c3ec2d438b475c4389f36a279ef5f..f9539fb4a213c65623df731f3d02e89c8ec92c7d
@@@ -1,20 -1,12 +1,24 @@@
 -"""I2C Class for FT232H"""
 -from adafruit_blinka.microcontroller.ft232h.pin import Pin
 -from adafruit_blinka.microcontroller.ft232h.url import get_ftdi_url
 +"""I2C Class for FTDI MPSSE"""
 +from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.pin import Pin
++from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.url import (
++    get_ft232h_url,
++    get_ft2232h_url,
++)
  
  
  class I2C:
 -    """Custom I2C Class for FT232H"""
 +    """Custom I2C Class for FTDI MPSSE"""
 +
 +    MASTER = 0
 +    SLAVE = 1
 +    _mode = None
 +
 +    # pylint: disable=unused-argument
 +    def __init__(self, i2c_id=None, mode=MASTER, baudrate=None, frequency=400000):
 +        if mode != self.MASTER:
 +            raise NotImplementedError("Only I2C Master supported!")
 +        _mode = self.MASTER
  
 -    def __init__(self, *, frequency=400000):
          # change GPIO controller to I2C
          # pylint: disable=import-outside-toplevel
          from pyftdi.i2c import I2cController
          # pylint: enable=import-outside-toplevel
  
          self._i2c = I2cController()
 -        self._i2c.configure(get_ftdi_url(), frequency=frequency)
 -        Pin.ft232h_gpio = self._i2c.get_gpio()
 +        if i2c_id is None:
-             self._i2c.configure("ftdi://ftdi:ft232h/1", frequency=frequency)
++            self._i2c.configure(get_ft232h_url(), frequency=frequency)
 +        else:
-             self._i2c.configure(
-                 "ftdi://ftdi:ft2232h/{}".format(i2c_id + 1), frequency=frequency
-             )
++            self._i2c.configure(get_ft2232h_url(i2c_id), frequency=frequency)
 +        Pin.mpsse_gpio = self._i2c.get_gpio()
  
      def scan(self):
          """Perform an I2C Device Scan"""
@@@ -59,7 -46,7 +61,7 @@@
          out_end=None,
          in_start=0,
          in_end=None,
 -        stop=False
 +        stop=False,
      ):
          """Write data from buffer_out to an address and then
          read data from an address and into buffer_in
index b5a7475c044a66abff80c62ec0bce84e542d82f2,a138ee735a9dcf63dce22624fe3d24bf51b0f52a..5dc171ea16485524a4b8d4f877fc31a1f04ea051
@@@ -1,8 -1,10 +1,10 @@@
 -"""FT232H pin names"""
 +"""MPSSE pin names"""
  
 -from adafruit_blinka.microcontroller.ft232h.url import get_ftdi_url
++from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.url import get_ft232h_url, get_ft2232h_url
  
  class Pin:
 -    """A basic Pin class for use with FT232H."""
 +    """A basic Pin class for use with FTDI MPSSEs."""
  
      IN = 0
      OUT = 1
      PULL_UP = 1
      PULL_DOWN = 2
  
 -    ft232h_gpio = None
 +    mpsse_gpio = None
  
-     def __init__(self, pin_id=None, url="ftdi://ftdi:ft232h/1"):
 -    def __init__(self, pin_id=None):
++    def __init__(self, pin_id=None, interface_id=None):
          # setup GPIO controller if not done yet
          # use one provided by I2C as default
 -        if not Pin.ft232h_gpio:
 +        if not Pin.mpsse_gpio:
              # pylint: disable=import-outside-toplevel
              from pyftdi.i2c import I2cController
  
              # pylint: enable=import-outside-toplevel
  
              i2c = I2cController()
-             i2c.configure(url)
 -            i2c.configure(get_ftdi_url())
 -            Pin.ft232h_gpio = i2c.get_gpio()
++            if interface_id is None:
++                i2c.configure(get_ft232h_url())
++            else:
++                i2c.configure(get_ft2232h_url(interface_id))
 +            Pin.mpsse_gpio = i2c.get_gpio()
          # check if pin is valid
          if pin_id:
 -            if Pin.ft232h_gpio.all_pins & 1 << pin_id == 0:
 +            if Pin.mpsse_gpio.all_pins & 1 << pin_id == 0:
                  raise ValueError("Can not use pin {} as GPIO.".format(pin_id))
          # ID is just bit position
          self.id = pin_id
          """Initialize the Pin"""
          if not self.id:
              raise RuntimeError("Can not init a None type pin.")
 -        # FT232H does't have configurable internal pulls?
 +        # MPSSE does't have configurable internal pulls?
          if pull:
              raise NotImplementedError("Internal pull up/down not currently supported.")
 -        pin_mask = Pin.ft232h_gpio.pins | 1 << self.id
 -        current = Pin.ft232h_gpio.direction
 +        pin_mask = Pin.mpsse_gpio.pins | 1 << self.id
 +        current = Pin.mpsse_gpio.direction
          if mode == self.OUT:
              current |= 1 << self.id
          else:
              current &= ~(1 << self.id)
 -        Pin.ft232h_gpio.set_direction(pin_mask, current)
 +        Pin.mpsse_gpio.set_direction(pin_mask, current)
  
      def value(self, val=None):
          """Set or return the Pin Value"""
          if not self.id:
              raise RuntimeError("Can not access a None type pin.")
 -        current = Pin.ft232h_gpio.read(with_output=True)
 +        current = Pin.mpsse_gpio.read(with_output=True)
          # read
          if val is None:
              return 1 if current & 1 << self.id != 0 else 0
              else:
                  current &= ~(1 << self.id)
              # must mask out any input pins
 -            Pin.ft232h_gpio.write(current & Pin.ft232h_gpio.direction)
 +            Pin.mpsse_gpio.write(current & Pin.mpsse_gpio.direction)
              return None
          # release the kraken
          raise RuntimeError("Invalid value for pin")
 -
 -
 -# create pin instances for each pin
 -# D0 to D3 are used by I2C/SPI
 -D4 = Pin(4)
 -D5 = Pin(5)
 -D6 = Pin(6)
 -D7 = Pin(7)
 -C0 = Pin(8)
 -C1 = Pin(9)
 -C2 = Pin(10)
 -C3 = Pin(11)
 -C4 = Pin(12)
 -C5 = Pin(13)
 -C6 = Pin(14)
 -C7 = Pin(15)
 -# C8 and C9 are not GPIO
 -
 -# create None type pins for I2C and SPI since they are expected to be defined
 -SCL = Pin()
 -SDA = Pin()
 -SCK = SCLK = Pin()
 -MOSI = Pin()
 -MISO = Pin()
index 78dee58b1098a97e6ad154ce22cbae304a9bda1e,fd16b39348f71f5c23c063ea3434bcfebe194ef2..0b76c081ebb8d3ce4c99f05a8eed0a10a2e91402
@@@ -1,29 -1,27 +1,33 @@@
 -"""SPI Class for FT232H"""
 -from adafruit_blinka.microcontroller.ft232h.pin import Pin
 -from adafruit_blinka.microcontroller.ft232h.url import get_ftdi_url
 +"""SPI Class for FTDI MPSSE"""
 +from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.pin import Pin
++from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.url import (
++    get_ft232h_url,
++    get_ft2232h_url,
++)
  
  # pylint: disable=protected-access
  class SPI:
 -    """Custom SPI Class for FT232H"""
 +    """Custom SPI Class for FTDI MPSSE"""
  
      MSB = 0
  
 -    def __init__(self):
 +    def __init__(self, spi_id=None):
          # pylint: disable=import-outside-toplevel
          from pyftdi.spi import SpiController
  
          # pylint: enable=import-outside-toplevel
  
          self._spi = SpiController(cs_count=1)
 -        self._spi.configure(get_ftdi_url())
 +        if spi_id is None:
-             self._spi.configure("ftdi://ftdi:ft232h/1")
++            self._spi.configure(get_ft232h_url())
 +        else:
-             self._spi.configure("ftdi://ftdi:ft2232h/{}".format(spi_id + 1))
++            self._spi.configure(get_ft2232h_url(spi_id + 1))
          self._port = self._spi.get_port(0)
          self._port.set_frequency(100000)
          self._port._cpol = 0
          self._port._cpha = 0
          # Change GPIO controller to SPI
 -        Pin.ft232h_gpio = self._spi.get_gpio()
 +        Pin.mpsse_gpio = self._spi.get_gpio()
  
      # pylint: disable=too-many-arguments,unused-argument
      def init(
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..c2f2eaf00d92d53e924991160ea36b2f3d4f3ce5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,31 @@@
++"""Support for getting the URL from the BLINKA_FT232H variable."""
++
++import os
++
++
++def get_ft232h_url():
++    """
++    Return the FTDI url to use. If BLINKA_FT232H starts with ftdi:, returns
++    that. Otherwise, returns a default value.
++    """
++
++    url = os.environ.get("BLINKA_FT232H", "1")
++
++    if url.startswith("ftdi:"):
++        return url
++
++    return "ftdi://ftdi:ft232h/1"
++
++
++def get_ft2232h_url(interface_id):
++    """
++    Return the FTDI url to use. If BLINKA_FT2232H_{} starts with ftdi:, returns
++    that. Otherwise, returns a default value.
++    """
++
++    url = os.environ.get("BLINKA_FT2232H_{}".format(interface_id), "1")
++
++    if url.startswith("ftdi:"):
++        return url
++
++    return "ftdi://ftdi:ft2232h/{}".format(interface_id + 1)
diff --combined src/board.py
index a89d70daa8c7aca2c33297a5c1106509158aa53d,c2469cc279439a5bbe9ba046f5d869dbff69ab73..4390b28b3b5e635a73b24b3cb235af1ca8b6e35f
@@@ -44,6 -44,9 +44,9 @@@ elif board_id == ap_board.NODEMCU
  elif board_id == ap_board.PYBOARD:
      from adafruit_blinka.board.pyboard import *
  
+ elif board_id == ap_board.RASPBERRY_PI_PICO:
+     from adafruit_blinka.board.raspberrypi.pico import *
  elif detector.board.any_raspberry_pi_40_pin:
      from adafruit_blinka.board.raspberrypi.raspi_40pin import *
  
@@@ -56,6 -59,9 +59,9 @@@ elif detector.board.RASPBERRY_PI_B_REV1
  elif detector.board.RASPBERRY_PI_A or detector.board.RASPBERRY_PI_B_REV2:
      from adafruit_blinka.board.raspberrypi.raspi_1b_rev2 import *
  
+ elif board_id == ap_board.BEAGLEBONE:
+     from adafruit_blinka.board.beagleboard.beaglebone_black import *
  elif board_id == ap_board.BEAGLEBONE_BLACK:
      from adafruit_blinka.board.beagleboard.beaglebone_black import *
  
@@@ -161,9 -167,6 +167,9 @@@ elif board_id == ap_board.DRAGONBOARD_4
  elif board_id == ap_board.FTDI_FT232H:
      from adafruit_blinka.board.ftdi_ft232h import *
  
 +elif board_id == ap_board.FTDI_FT2232H:
 +    from adafruit_blinka.board.ftdi_ft2232h import *
 +
  elif board_id == ap_board.BINHO_NOVA:
      from adafruit_blinka.board.binho_nova import *
  
@@@ -197,6 -200,9 +203,9 @@@ elif board_id == ap_board.ROCK_PI_S
  elif board_id == ap_board.ROCK_PI_4:
      from adafruit_blinka.board.radxa.rockpi4 import *
  
+ elif board_id == ap_board.ROCK_PI_E:
+     from adafruit_blinka.board.radxa.rockpie import *
  elif board_id == ap_board.UDOO_X86:
      from adafruit_blinka.board.udoo_x86ultra import *
  
@@@ -206,28 -212,37 +215,37 @@@ elif board_id == ap_board.STM32MP157C_D
  elif board_id == ap_board.LUBANCAT_IMX6ULL:
      from adafruit_blinka.board.lubancat.lubancat_imx6ull import *
  
+ elif board_id == ap_board.LUBANCAT_STM32MP157:
+     from adafruit_blinka.board.lubancat.lubancat_stm32mp157 import *
  elif board_id == ap_board.NANOPI_NEO_AIR:
      from adafruit_blinka.board.nanopi.neoair import *
  
  elif board_id == ap_board.NANOPI_DUO2:
      from adafruit_blinka.board.nanopi.duo2 import *
  
+ elif board_id == ap_board.PICO_U2IF:
+     from adafruit_blinka.board.pico_u2if import *
  elif "sphinx" in sys.modules:
      pass
  
  else:
      raise NotImplementedError("Board not supported {}".format(board_id))
  
+ if "SCL" in locals() and "SDA" in locals():
+     def I2C():
+         """The singleton I2C interface"""
+         import busio
  
- def I2C():
-     """The singleton I2C interface"""
-     import busio
+         return busio.I2C(SCL, SDA)
  
-     return busio.I2C(SCL, SDA)
  
+ if "SCLK" in locals() and "MOSI" in locals() and "MISO" in locals():
  
- def SPI():
-     """The singleton SPI interface"""
-     import busio
    def SPI():
+         """The singleton SPI interface"""
+         import busio
  
-     return busio.SPI(SCLK, MOSI, MISO)
+         return busio.SPI(SCLK, MOSI, MISO)
diff --combined src/busio.py
index 199190083891adf01faaab5fd06387ac85dde9b8,c599afa449b656f9d8dc1c81fa9da595331a78a9..11c6341421ad002fe01ef4b29493590d2988c1d5
@@@ -18,7 -18,7 +18,7 @@@ from adafruit_blinka import Enum, Locka
  from adafruit_blinka.agnostic import board_id, detector
  
  # pylint: disable=import-outside-toplevel,too-many-branches,too-many-statements
- # pylint: disable=too-many-arguments,too-many-function-args
+ # pylint: disable=too-many-arguments,too-many-function-args,consider-using-with
  
  
  class I2C(Lockable):
@@@ -34,7 -34,7 +34,7 @@@
          """Initialization"""
          self.deinit()
          if detector.board.ftdi_ft232h:
 -            from adafruit_blinka.microcontroller.ft232h.i2c import I2C as _I2C
 +            from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.i2c import I2C as _I2C
  
              self._i2c = _I2C(frequency=frequency)
              return
  
              self._i2c = _I2C(frequency=frequency)
              return
+         if detector.board.pico_u2if:
+             from adafruit_blinka.microcontroller.pico_u2if.i2c import I2C as _I2C
+             self._i2c = _I2C(scl, sda, frequency=frequency)
+             return
+         if detector.chip.id == ap_chip.RP2040:
+             from adafruit_blinka.microcontroller.rp2040.i2c import I2C as _I2C
+             self._i2c = _I2C(scl, sda, frequency=frequency)
+             return
          if detector.board.any_embedded_linux:
              from adafruit_blinka.microcontroller.generic_linux.i2c import I2C as _I2C
 +        elif detector.board.ftdi_ft2232h:
 +            from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.i2c import I2C as _I2C
          else:
-             from machine import I2C as _I2C
+             from adafruit_blinka.microcontroller.generic_micropython.i2c import (
+                 I2C as _I2C,
+             )
          from microcontroller.pin import i2cPorts
  
          for portId, portScl, portSda in i2cPorts:
              try:
+                 # pylint: disable=unexpected-keyword-arg
                  if scl == portScl and sda == portSda:
                      self._i2c = _I2C(portId, mode=_I2C.MASTER, baudrate=frequency)
                      break
+                 # pylint: enable=unexpected-keyword-arg
              except RuntimeError:
                  pass
          else:
          out_end=None,
          in_start=0,
          in_end=None,
 -        stop=False
 +        stop=False,
      ):
          """ "Write to a device at specified address from a buffer then read
          from a device at specified address into a buffer
@@@ -153,12 -165,8 +167,12 @@@ class SPI(Lockable)
      def __init__(self, clock, MOSI=None, MISO=None):
          self.deinit()
          if detector.board.ftdi_ft232h:
 -            from adafruit_blinka.microcontroller.ft232h.spi import SPI as _SPI
 -            from adafruit_blinka.microcontroller.ft232h.pin import SCK, MOSI, MISO
 +            from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.spi import SPI as _SPI
 +            from adafruit_blinka.microcontroller.ftdi_mpsse.ft232h.pin import (
 +                SCK,
 +                MOSI,
 +                MISO,
 +            )
  
              self._spi = _SPI()
              self._pins = (SCK, MOSI, MISO)
              self._spi = _SPI()
              self._pins = (SCK, MOSI, MISO)
              return
+         if detector.board.pico_u2if:
+             from adafruit_blinka.microcontroller.pico_u2if.spi import SPI as _SPI
+             self._spi = _SPI(clock)  # this is really all that's needed
+             self._pins = (clock, clock, clock)  # will determine MOSI/MISO from clock
+             return
+         if detector.chip.id == ap_chip.RP2040:
+             from adafruit_blinka.microcontroller.rp2040.spi import SPI as _SPI
+             self._spi = _SPI(clock, MOSI, MISO)  # Pins configured on instantiation
+             self._pins = (clock, clock, clock)  # These don't matter, they're discarded
+             return
          if detector.board.any_embedded_linux:
              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
          else:
-             from machine import SPI as _SPI
+             from adafruit_blinka.microcontroller.generic_micropython.spi import (
+                 SPI as _SPI,
+             )
          from microcontroller.pin import spiPorts
  
          for portId, portSck, portMosi, portMiso in spiPorts:
      def configure(self, baudrate=100000, polarity=0, phase=0, bits=8):
          """Update the configuration"""
          if detector.board.any_raspberry_pi or detector.board.any_raspberry_pi_40_pin:
-             from adafruit_blinka.microcontroller.bcm283x.pin import Pin
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
          elif detector.board.BEAGLEBONE_AI:
-             from adafruit_blinka.microcontroller.dra74x.pin import Pin
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
          elif detector.board.any_beaglebone:
-             from adafruit_blinka.microcontroller.am335x.pin import Pin
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
          elif detector.board.any_orange_pi:
-             if detector.chip.id == ap_chip.SUN8I:
-                 from adafruit_blinka.microcontroller.allwinner.h3.pin import Pin
-             elif detector.chip.id == ap_chip.H5:
-                 from adafruit_blinka.microcontroller.allwinner.h5.pin import Pin
-             elif detector.chip.id == ap_chip.H616:
-                 from adafruit_blinka.microcontroller.allwinner.h616.pin import Pin
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
          elif detector.board.any_nanopi and detector.chip.id == ap_chip.SUN8I:
-             from adafruit_blinka.microcontroller.allwinner.h3.pin import Pin
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
          elif board_id == ap_board.GIANT_BOARD:
-             from adafruit_blinka.microcontroller.sama5.pin import Pin
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
          elif board_id == ap_board.CORAL_EDGE_TPU_DEV:
-             from adafruit_blinka.microcontroller.nxp_imx8m.pin import Pin
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
          elif board_id == ap_board.CORAL_EDGE_TPU_DEV_MINI:
-             from adafruit_blinka.microcontroller.mt8167.pin import Pin
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
          elif board_id == ap_board.ODROID_C2:
-             from adafruit_blinka.microcontroller.amlogic.s905.pin import Pin
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
          elif board_id == ap_board.ODROID_C4:
-             from adafruit_blinka.microcontroller.amlogic.s905x3.pin import Pin
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
          elif board_id == ap_board.ODROID_XU4:
-             from adafruit_blinka.microcontroller.samsung.exynos5422.pin import Pin
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
          elif board_id == ap_board.DRAGONBOARD_410C:
-             from adafruit_blinka.microcontroller.snapdragon.apq8016.pin import Pin
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
          elif board_id == ap_board.JETSON_NANO:
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
-             from adafruit_blinka.microcontroller.tegra.t210.pin import Pin
          elif board_id == ap_board.JETSON_TX1:
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
-             from adafruit_blinka.microcontroller.tegra.t210.pin import Pin
          elif board_id == ap_board.JETSON_TX2:
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
-             from adafruit_blinka.microcontroller.tegra.t186.pin import Pin
          elif board_id == ap_board.JETSON_XAVIER:
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
-             from adafruit_blinka.microcontroller.tegra.t194.pin import Pin
          elif board_id == ap_board.JETSON_NX:
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
-             from adafruit_blinka.microcontroller.tegra.t194.pin import Pin
          elif detector.board.ROCK_PI_S:
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
-             from adafruit_blinka.microcontroller.rockchip.rk3308.pin import Pin
          elif detector.board.ROCK_PI_4:
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
-             from adafruit_blinka.microcontroller.rockchip.rk3399.pin import Pin
+         elif detector.board.ROCK_PI_E:
+             from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
          elif detector.board.SIFIVE_UNLEASHED:
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
-             from adafruit_blinka.microcontroller.hfu540.pin import Pin
          elif detector.board.ftdi_ft232h:
 -            from adafruit_blinka.microcontroller.ft232h.spi import SPI as _SPI
 +            from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.spi import (
 +                SPI as _SPI,
 +            )
-             from adafruit_blinka.microcontroller.ftdi_mpsse.ft232h.pin import Pin
 +        elif detector.board.ftdi_ft2232h:
 +            from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.spi import (
 +                SPI as _SPI,
 +            )
-             from adafruit_blinka.microcontroller.ftdi_mpsse.ft2232h.pin import Pin
          elif detector.board.binho_nova:
              from adafruit_blinka.microcontroller.nova.spi import SPI as _SPI
-             from adafruit_blinka.microcontroller.nova.pin import Pin
          elif detector.board.greatfet_one:
              from adafruit_blinka.microcontroller.nxp_lpc4330.spi import SPI as _SPI
-             from adafruit_blinka.microcontroller.nxp_lpc4330.pin import Pin
          elif board_id in (
              ap_board.PINE64,
              ap_board.PINEBOOK,
              ap_board.PINEPHONE,
              ap_board.SOPINE,
          ):
-             from adafruit_blinka.microcontroller.allwinner.a64.pin import Pin
+             from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
+         elif board_id == ap_board.PINEH64:
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
          elif board_id == ap_board.CLOCKWORK_CPI3:
-             from adafruit_blinka.microcontroller.allwinner.a33.pin import Pin
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
          elif board_id == ap_board.ONION_OMEGA2:
-             from adafruit_blinka.microcontroller.mips24kec.pin import Pin
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
          elif detector.board.any_lubancat and detector.chip.id == ap_chip.IMX6ULL:
-             from adafruit_blinka.microcontroller.nxp_imx6ull.pin import Pin
              from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI
+         elif detector.board.pico_u2if:
+             from adafruit_blinka.microcontroller.pico_u2if.spi import SPI as _SPI
+         elif detector.chip.id == ap_chip.RP2040:
+             from adafruit_blinka.microcontroller.rp2040.spi import SPI as _SPI
          else:
-             from machine import SPI as _SPI
-             from machine import Pin
+             from adafruit_blinka.microcontroller.generic_micropython.spi import (
+                 SPI as _SPI,
+             )
  
          if self._locked:
              # TODO check if #init ignores MOSI=None rather than unsetting, to save _pinIds attribute
                  phase=phase,
                  bits=bits,
                  firstbit=_SPI.MSB,
-                 sck=Pin(self._pins[0].id),
-                 mosi=Pin(self._pins[1].id),
-                 miso=Pin(self._pins[2].id),
              )
          else:
              raise RuntimeError("First call try_lock()")
@@@ -386,13 -373,12 +387,12 @@@ class UART(Lockable)
              from adafruit_blinka.microcontroller.nova.uart import UART as _UART
          elif detector.board.greatfet_one:
              from adafruit_blinka.microcontroller.nxp_lpc4330.uart import UART as _UART
+         elif detector.chip.id == ap_chip.RP2040:
+             from adafruit_blinka.microcontroller.rp2040.uart import UART as _UART
          else:
              from machine import UART as _UART
  
-         if detector.board.binho_nova:
-             from adafruit_blinka.microcontroller.nova.pin import uartPorts
-         else:
-             from microcontroller.pin import uartPorts
+         from microcontroller.pin import uartPorts
  
          self.baudrate = baudrate
  
          else:
              raise ValueError("Invalid parity")
  
-         # check tx and rx have hardware support
-         for portId, portTx, portRx in uartPorts:  #
-             if portTx == tx and portRx == rx:
-                 self._uart = _UART(
-                     portId,
-                     baudrate,
-                     bits=bits,
-                     parity=parity,
-                     stop=stop,
-                     timeout=timeout,
-                     read_buf_len=receiver_buffer_size,
-                 )
-                 break
+         if detector.chip.id == ap_chip.RP2040:
+             self._uart = _UART(
+                 tx,
+                 rx,
+                 baudrate=baudrate,
+                 bits=bits,
+                 parity=parity,
+                 stop=stop,
+             )
          else:
-             raise ValueError(
-                 "No Hardware UART on (tx,rx)={}\nValid UART ports: {}".format(
-                     (tx, rx), uartPorts
+             # check tx and rx have hardware support
+             for portId, portTx, portRx in uartPorts:  #
+                 if portTx == tx and portRx == rx:
+                     self._uart = _UART(
+                         portId,
+                         baudrate,
+                         bits=bits,
+                         parity=parity,
+                         stop=stop,
+                         timeout=timeout,
+                         read_buf_len=receiver_buffer_size,
+                     )
+                     break
+             else:
+                 raise ValueError(
+                     "No Hardware UART on (tx,rx)={}\nValid UART ports: {}".format(
+                         (tx, rx), uartPorts
+                     )
                  )
-             )
  
      def deinit(self):
          """Deinitialization"""
diff --combined src/digitalio.py
index 8db83991968a91875a915dff3487a886f1cf5639,c08c6b4e84a828bd1fd26b976ce16f19b8c09b9f..eef0015f076bdaa420fa659f446fb344b4532b00
@@@ -53,16 -53,18 +53,20 @@@ elif detector.chip.RK3308
      from adafruit_blinka.microcontroller.rockchip.rk3308.pin import Pin
  elif detector.chip.RK3399:
      from adafruit_blinka.microcontroller.rockchip.rk3399.pin import Pin
+ elif detector.chip.RK3328:
+     from adafruit_blinka.microcontroller.rockchip.rk3328.pin import Pin
  elif detector.board.ftdi_ft232h:
 -    from adafruit_blinka.microcontroller.ft232h.pin import Pin
 +    from adafruit_blinka.microcontroller.ftdi_mpsse.ft232h.pin import Pin
 +elif detector.board.ftdi_ft2232h:
 +    from adafruit_blinka.microcontroller.ftdi_mpsse.ft2232h.pin import Pin
  elif detector.board.binho_nova:
      from adafruit_blinka.microcontroller.nova.pin import Pin
  elif detector.board.greatfet_one:
      from adafruit_blinka.microcontroller.nxp_lpc4330.pin import Pin
  elif detector.chip.STM32F405:
      from machine import Pin
+ elif detector.chip.RP2040:
+     from machine import Pin
  elif detector.board.microchip_mcp2221:
      from adafruit_blinka.microcontroller.mcp2221.pin import Pin
  elif detector.chip.PENTIUM_N3710:
@@@ -73,8 -75,12 +77,12 @@@ elif detector.chip.MT8167
      from adafruit_blinka.microcontroller.mt8167.pin import Pin
  elif detector.chip.H5:
      from adafruit_blinka.microcontroller.allwinner.h5.pin import Pin
+ elif detector.chip.H6:
+     from adafruit_blinka.microcontroller.allwinner.h6.pin import Pin
  elif detector.chip.H616:
      from adafruit_blinka.microcontroller.allwinner.h616.pin import Pin
+ elif detector.board.pico_u2if:
+     from adafruit_blinka.microcontroller.pico_u2if.pin import Pin
  
  from adafruit_blinka import Enum, ContextManaged
  
index 56396a00463b6186260250f552e326c38bed9129,254d50a5cc5501064a931382b4ad3a5eb35e2484..255e2b71f9258d6e763914b3ea10d03b9d5717a7
@@@ -17,7 -17,7 +17,7 @@@ class Pin(Enum)
  
      def __init__(self, pin_id):
          """Identifier for pin, referencing platform-specific pin id"""
-         self._id = pin_id
+         self.id = pin_id
  
      def __repr__(self):
          # pylint: disable=import-outside-toplevel, cyclic-import
@@@ -43,6 -43,8 +43,8 @@@ if chip_id == ap_chip.ESP8266
      from adafruit_blinka.microcontroller.esp8266 import *
  elif chip_id == ap_chip.STM32F405:
      from adafruit_blinka.microcontroller.stm32.stm32f405 import *
+ elif chip_id == ap_chip.RP2040:
+     from adafruit_blinka.microcontroller.rp2040 import *
  elif chip_id == ap_chip.BCM2XXX:
      from adafruit_blinka.microcontroller.bcm283x import *
  elif chip_id == ap_chip.DRA74X:
@@@ -53,6 -55,8 +55,8 @@@ elif chip_id == ap_chip.SUN8I
      from adafruit_blinka.microcontroller.allwinner.h3 import *
  elif chip_id == ap_chip.H5:
      from adafruit_blinka.microcontroller.allwinner.h5.pin import *
+ elif chip_id == ap_chip.H6:
+     from adafruit_blinka.microcontroller.allwinner.h6.pin import *
  elif chip_id == ap_chip.H616:
      from adafruit_blinka.microcontroller.allwinner.h616.pin import *
  elif chip_id == ap_chip.SAMA5:
@@@ -81,6 -85,8 +85,8 @@@ elif chip_id == ap_chip.RK3308
      from adafruit_blinka.microcontroller.rockchip.rk3308.pin import *
  elif chip_id == ap_chip.RK3399:
      from adafruit_blinka.microcontroller.rockchip.rk3399.pin import *
+ elif chip_id == ap_chip.RK3328:
+     from adafruit_blinka.microcontroller.rockchip.rk3328.pin import *
  elif chip_id == ap_chip.H5:
      from adafruit_blinka.microcontroller.allwinner.h5.pin import *
  elif chip_id == ap_chip.IMX8MX:
@@@ -97,10 -103,6 +103,10 @@@ elif chip_id == ap_chip.MIPS24KC
      from adafruit_blinka.microcontroller.atheros.ar9331.pin import *
  elif chip_id == ap_chip.MIPS24KEC:
      from adafruit_blinka.microcontroller.mips24kec.pin import *
 +elif chip_id == ap_chip.FT232H:
 +    from adafruit_blinka.microcontroller.ftdi_mpsse.ft232h.pin import *
 +elif chip_id == ap_chip.FT2232H:
 +    from adafruit_blinka.microcontroller.ftdi_mpsse.ft2232h.pin import *
  elif chip_id == ap_chip.PENTIUM_N3710:
      from adafruit_blinka.microcontroller.pentium.n3710.pin import *
  elif chip_id == ap_chip.STM32MP157:
index 8cdf89b3b3cfe4a7c0f79ba67fc1c88788a27bd9,3483624f3abe6fe8cc6013ca2ab42b3dc6e051f4..34f7b4a7641a1d51ce1b97f413184a7eaa192824
@@@ -10,6 -10,8 +10,8 @@@ if chip_id == ap_chip.ESP8266
      from adafruit_blinka.microcontroller.esp8266.pin import *
  elif chip_id == ap_chip.STM32F405:
      from adafruit_blinka.microcontroller.stm32.stm32f405.pin import *
+ elif chip_id == ap_chip.RP2040:
+     from adafruit_blinka.microcontroller.rp2040.pin import *
  elif chip_id == ap_chip.BCM2XXX:
      from adafruit_blinka.microcontroller.bcm283x.pin import *
  elif chip_id == ap_chip.DRA74X:
@@@ -20,6 -22,8 +22,8 @@@ elif chip_id == ap_chip.SUN8I
      from adafruit_blinka.microcontroller.allwinner.h3.pin import *
  elif chip_id == ap_chip.H5:
      from adafruit_blinka.microcontroller.allwinner.h5.pin import *
+ elif chip_id == ap_chip.H6:
+     from adafruit_blinka.microcontroller.allwinner.h6.pin import *
  elif chip_id == ap_chip.H616:
      from adafruit_blinka.microcontroller.allwinner.h616.pin import *
  elif chip_id == ap_chip.SAMA5:
@@@ -47,9 -51,7 +51,9 @@@ elif chip_id == ap_chip.IMX6ULL
  elif chip_id == ap_chip.HFU540:
      from adafruit_blinka.microcontroller.hfu540.pin import *
  elif chip_id == ap_chip.FT232H:
 -    from adafruit_blinka.microcontroller.ft232h.pin import *
 +    from adafruit_blinka.microcontroller.ftdi_mpsse.ft232h.pin import *
 +elif chip_id == ap_chip.FT2232H:
 +    from adafruit_blinka.microcontroller.ftdi_mpsse.ft2232h.pin import *
  elif chip_id == ap_chip.BINHO:
      from adafruit_blinka.microcontroller.nova.pin import *
  elif chip_id == ap_chip.LPC4330:
@@@ -64,6 -66,8 +68,8 @@@ elif chip_id == ap_chip.RK3308
      from adafruit_blinka.microcontroller.rockchip.rk3308.pin import *
  elif chip_id == ap_chip.RK3399:
      from adafruit_blinka.microcontroller.rockchip.rk3399.pin import *
+ elif chip_id == ap_chip.RK3328:
+     from adafruit_blinka.microcontroller.rockchip.rk3328.pin import *
  elif chip_id == ap_chip.MIPS24KC:
      from adafruit_blinka.microcontroller.atheros.ar9331.pin import *
  elif chip_id == ap_chip.MIPS24KEC:
@@@ -74,5 -78,7 +80,7 @@@ elif chip_id == ap_chip.STM32MP157
      from adafruit_blinka.microcontroller.stm32.stm32mp157.pin import *
  elif chip_id == ap_chip.MT8167:
      from adafruit_blinka.microcontroller.mt8167.pin import *
+ elif chip_id == ap_chip.PICO_U2IF:
+     from adafruit_blinka.microcontroller.pico_u2if.pin import *
  else:
      raise NotImplementedError("Microcontroller not supported: ", chip_id)