]> Repositories - Adafruit_Blinka-hackapet.git/commitdiff
initial working feather
authorcaternuson <caternuson@gmail.com>
Fri, 14 May 2021 17:51:28 +0000 (10:51 -0700)
committercaternuson <caternuson@gmail.com>
Fri, 14 May 2021 17:51:28 +0000 (10:51 -0700)
16 files changed:
src/adafruit_blinka/board/feather_u2if.py [new file with mode: 0644]
src/adafruit_blinka/board/pico_u2if.py
src/adafruit_blinka/microcontroller/rp2040_u2if/__init__.py [moved from src/adafruit_blinka/microcontroller/pico_u2if/__init__.py with 100% similarity]
src/adafruit_blinka/microcontroller/rp2040_u2if/analogio.py [moved from src/adafruit_blinka/microcontroller/pico_u2if/analogio.py with 59% similarity]
src/adafruit_blinka/microcontroller/rp2040_u2if/i2c.py [moved from src/adafruit_blinka/microcontroller/pico_u2if/i2c.py with 51% similarity]
src/adafruit_blinka/microcontroller/rp2040_u2if/neopixel.py [moved from src/adafruit_blinka/microcontroller/pico_u2if/neopixel.py with 79% similarity]
src/adafruit_blinka/microcontroller/rp2040_u2if/pin.py [moved from src/adafruit_blinka/microcontroller/pico_u2if/pin.py with 79% similarity]
src/adafruit_blinka/microcontroller/rp2040_u2if/pwmio.py [moved from src/adafruit_blinka/microcontroller/pico_u2if/pwmio.py with 64% similarity]
src/adafruit_blinka/microcontroller/rp2040_u2if/rp2040_u2if.py [moved from src/adafruit_blinka/microcontroller/pico_u2if/pico_u2if.py with 91% similarity]
src/adafruit_blinka/microcontroller/rp2040_u2if/spi.py [moved from src/adafruit_blinka/microcontroller/pico_u2if/spi.py with 63% similarity]
src/analogio.py
src/board.py
src/busio.py
src/digitalio.py
src/neopixel_write.py
src/pwmio.py

diff --git a/src/adafruit_blinka/board/feather_u2if.py b/src/adafruit_blinka/board/feather_u2if.py
new file mode 100644 (file)
index 0000000..caf2a19
--- /dev/null
@@ -0,0 +1,44 @@
+"""Pin definitions for the Feather RP2040 with u2if firmware."""
+
+"""
+Adafruit CircuitPython 6.2.0 on 2021-04-05; Adafruit Feather RP2040 with rp2040
+>>> import board
+>>> board.
+A0              A1              A2              A3
+D0              D1              D10             D11
+D12             D13             D24             D25
+D4              D5              D6              D9
+I2C             LED             MISO            MOSI
+NEOPIXEL        RX              SCK             SCL
+SDA             SPI             TX              UART
+"""
+
+from adafruit_blinka.microcontroller.rp2040_u2if import pin
+
+D0 = pin.GP0
+D1 = pin.GP1
+D4 = pin.GP6
+D5 = pin.GP7
+D6 = pin.GP8
+D9 = pin.GP9
+D10 = pin.GP10
+D11 = pin.GP11
+D12 = pin.GP12
+D13 = pin.GP13
+D24 = pin.GP24
+D25 = pin.GP25
+
+A0 = pin.GP26
+A1 = pin.GP27
+A2 = pin.GP28
+#A3 = pin.GP29 # not currently supported in firmware
+
+SCL = pin.GP3
+SDA = pin.GP2
+
+SCLK = SCK = pin.GP18
+MOSI = pin.GP19
+MISO = pin.GP20
+
+# access u2if via pin instance to open for specifc VID/PID
+pin.GP0._u2if_open_hid(0x239A, 0x80F2)
index bcdfe47c34557e25bc97559b0d98d62c084cf0ea..2b69b704b2deb1780469984e44f77266e5cc6b90 100644 (file)
@@ -1,5 +1,5 @@
-"""Pin definitions for the MicroChip MCP2221"""
-from adafruit_blinka.microcontroller.pico_u2if import pin
+"""Pin definitions for the Raspberry Pi Pico running u2if firmware"""
+from adafruit_blinka.microcontroller.rp2040_u2if import pin
 
 GP0 = pin.GP0
 GP1 = pin.GP1
@@ -44,3 +44,6 @@ MISO = MISO0 = GP12
 SCLK1 = SCK1 = GP10
 MOSI1 = GP11
 MISO1 = GP12
+
+# access u2if via pin instance to open for specifc VID/PID
+pin.GP0._u2if_open_hid(0xCAFE, 0x4005)
similarity index 59%
rename from src/adafruit_blinka/microcontroller/pico_u2if/analogio.py
rename to src/adafruit_blinka/microcontroller/rp2040_u2if/analogio.py
index 2ae480f002f4c4ef9c441e76d3f8598d59ae5b01..bd1cfbb0de1450388b383e36bf2ba36615cb5db5 100644 (file)
@@ -5,23 +5,20 @@ See `CircuitPython:analogio` in CircuitPython for more details.
 * Author(s): Carter Nelson
 """
 from adafruit_blinka import ContextManaged
-from .pico_u2if import pico_u2if
+from .rp2040_u2if import rp2040_u2if
 
 
 class AnalogIn(ContextManaged):
-    """Analog Input Class"""
+    """AnalogIn Base Class for RP2040 u2if"""
 
     def __init__(self, pin):
-        # per their pinout, why only two?
-        if pin.id not in (26, 27):
-            raise ValueError("Pin does not support ADC.")
         self.pin_id = pin.id
-        pico_u2if.adc_init_pin(self.pin_id)
+        rp2040_u2if.adc_init_pin(self.pin_id)
 
     @property
     def value(self):
         """Read the ADC and return the value"""
-        return pico_u2if.adc_get_value(self.pin_id) << 4
+        return rp2040_u2if.adc_get_value(self.pin_id) << 4
 
     # pylint: disable=no-self-use
     @value.setter
@@ -33,3 +30,20 @@ class AnalogIn(ContextManaged):
 
     def deinit(self):
         pass
+
+class AnalogIn_Pico(AnalogIn):
+    """AnalogIn Base Class for Pico u2if"""
+
+    def __init__(self, pin):
+        # per their pinout, why only two?
+        if pin.id not in (26, 27):
+            raise ValueError("Pin does not support ADC.")
+        super().__init__(pin)
+
+class AnalogIn_Feather(AnalogIn):
+    """AnalogIn Base Class for Feather u2if"""
+
+    def __init__(self, pin):
+        if pin.id not in (26, 27, 28):
+            raise ValueError("Pin does not support ADC.")
+        super().__init__(pin)
similarity index 51%
rename from src/adafruit_blinka/microcontroller/pico_u2if/i2c.py
rename to src/adafruit_blinka/microcontroller/rp2040_u2if/i2c.py
index ee393bb19e84042dde473932678b17f7b78e0c11..bf8d0ed61c2778ec5541b1f546c337063301586b 100644 (file)
@@ -1,37 +1,30 @@
-"""I2C Class for Pico u2if"""
-from .pico_u2if import pico_u2if
+"""I2C Classes for RP2040s with u2if firmware"""
+from .rp2040_u2if import rp2040_u2if
 
 
 class I2C:
-    """Custom I2C Class for Pico u2if"""
+    """I2C Base Class for RP2040 u2if"""
 
-    def __init__(self, scl, sda, *, frequency=100000):
-        index = None
-        if scl.id == 5 and sda.id == 4:
-            index = 0
-        if scl.id == 15 and sda.id == 14:
-            index = 1
-        if index is None:
-            raise ValueError("I2C not found on specified pins.")
+    def __init__(self, index, *, frequency=100000):
         self._index = index
-        pico_u2if.i2c_set_port(self._index)
-        pico_u2if.i2c_configure(frequency)
+        rp2040_u2if.i2c_set_port(self._index)
+        rp2040_u2if.i2c_configure(frequency)
 
     def scan(self):
         """Perform an I2C Device Scan"""
-        pico_u2if.i2c_set_port(self._index)
-        return pico_u2if.i2c_scan()
+        rp2040_u2if.i2c_set_port(self._index)
+        return rp2040_u2if.i2c_scan()
 
     # pylint: disable=unused-argument
     def writeto(self, address, buffer, *, start=0, end=None, stop=True):
         """Write data from the buffer to an address"""
-        pico_u2if.i2c_set_port(self._index)
-        pico_u2if.i2c_writeto(address, buffer, start=start, end=end)
+        rp2040_u2if.i2c_set_port(self._index)
+        rp2040_u2if.i2c_writeto(address, buffer, start=start, end=end)
 
     def readfrom_into(self, address, buffer, *, start=0, end=None, stop=True):
         """Read data from an address and into the buffer"""
-        pico_u2if.i2c_set_port(self._index)
-        pico_u2if.i2c_readfrom_into(address, buffer, start=start, end=end)
+        rp2040_u2if.i2c_set_port(self._index)
+        rp2040_u2if.i2c_readfrom_into(address, buffer, start=start, end=end)
 
     def writeto_then_readfrom(
         self,
@@ -48,8 +41,8 @@ class I2C:
         """Write data from buffer_out to an address and then
         read data from an address and into buffer_in
         """
-        pico_u2if.i2c_set_port(self._index)
-        pico_u2if.i2c_writeto_then_readfrom(
+        rp2040_u2if.i2c_set_port(self._index)
+        rp2040_u2if.i2c_writeto_then_readfrom(
             address,
             buffer_out,
             buffer_in,
@@ -60,3 +53,32 @@ class I2C:
         )
 
     # pylint: enable=unused-argument
+
+class I2C_Pico(I2C):
+    """I2C Class for Pico u2if"""
+
+    def __init__(self, scl, sda, *, frequency=100000):
+        index = None
+        if scl.id == 5 and sda.id == 4:
+            index = 0
+        if scl.id == 15 and sda.id == 14:
+            index = 1
+        if index is None:
+            raise ValueError("I2C not found on specified pins.")
+        self._index = index
+
+        super().__init__(index, frequency=frequency)
+
+class I2C_Feather(I2C):
+    """I2C Class for Feather u2if"""
+
+    def __init__(self, scl, sda, *, frequency=100000):
+        index = None
+        if scl.id == 3 and sda.id == 2:
+            index = 1
+        if index is None:
+            raise ValueError("I2C not found on specified pins.")
+        self._index = index
+
+        super().__init__(index, frequency=frequency)
+
similarity index 79%
rename from src/adafruit_blinka/microcontroller/pico_u2if/neopixel.py
rename to src/adafruit_blinka/microcontroller/rp2040_u2if/neopixel.py
index 4953c2d5ea2bda15d2cb72a296b37dcfe7744630..90613341949c024d9c7df2304090bb093d012578 100644 (file)
@@ -1,6 +1,6 @@
 """NeoPixel write for Pico u2if."""
 
-from .pico_u2if import pico_u2if
+from .rp2040_u2if import rp2040_u2if
 
 
 def neopixel_write(gpio, buf):
@@ -14,4 +14,5 @@ def neopixel_write(gpio, buf):
         buffer.append(buf[i + 1])
         buffer.append(buf[i])
 
-    pico_u2if.neopixel_write(gpio, buffer)
+    rp2040_u2if.neopixel_write(gpio, buffer)
+
similarity index 79%
rename from src/adafruit_blinka/microcontroller/pico_u2if/pin.py
rename to src/adafruit_blinka/microcontroller/rp2040_u2if/pin.py
index ef225872b9df7ef0c93edf51f57c0184a9685d2b..c7ef7819076aefe5a7afe09fa48b02dd6633130e 100644 (file)
@@ -1,9 +1,9 @@
-"""PICO pin names"""
-from .pico_u2if import pico_u2if
+"""Generic RP2040 pin names"""
+from .rp2040_u2if import rp2040_u2if
 
 
 class Pin:
-    """A basic Pin class for use with MCP2221."""
+    """A basic Pin class for use with RP2040 with u2if firmware."""
 
     # pin modes
     IN = 0
@@ -21,6 +21,9 @@ class Pin:
         self._mode = None
         self._pull = None
 
+    def _u2if_open_hid(self, vid, pid):
+        rp2040_u2if.open(vid, pid)
+
     def init(self, mode=IN, pull=PULL_NONE):
         """Initialize the Pin"""
         pull = Pin.PULL_NONE if pull is None else pull
@@ -31,7 +34,7 @@ class Pin:
         if pull not in (Pin.PULL_NONE, Pin.PULL_UP, Pin.PULL_DOWN):
             raise ValueError("Incorrect pull value.")
 
-        pico_u2if.gpio_init_pin(self.id, mode, pull)
+        rp2040_u2if.gpio_init_pin(self.id, mode,pull)
 
         self._mode = mode
         self._pull = pull
@@ -42,10 +45,10 @@ class Pin:
         if self._mode in (Pin.IN, Pin.OUT):
             # digital read
             if val is None:
-                return pico_u2if.gpio_get_pin(self.id)
+                return rp2040_u2if.gpio_get_pin(self.id)
             # digital write
             if val in (Pin.LOW, Pin.HIGH):
-                pico_u2if.gpio_set_pin(self.id, val)
+                rp2040_u2if.gpio_set_pin(self.id, val)
                 return None
             # nope
             raise ValueError("Invalid value for pin.")
@@ -79,6 +82,9 @@ GP19 = Pin(19)
 GP20 = Pin(20)
 GP21 = Pin(21)
 GP22 = Pin(22)
+GP24 = Pin(24)
+GP25 = Pin(25)
 GP26 = Pin(26)
 GP27 = Pin(27)
 GP28 = Pin(28)
+GP29 = Pin(29)
similarity index 64%
rename from src/adafruit_blinka/microcontroller/pico_u2if/pwmio.py
rename to src/adafruit_blinka/microcontroller/rp2040_u2if/pwmio.py
index f69d28eaa7f60e06261dd1c38ffa922c8a8ba47f..3cbf5e476003dae806095b8749483ee18c80516f 100644 (file)
@@ -1,12 +1,12 @@
-"""PWMOut Class for Pico u2if"""
-from .pico_u2if import pico_u2if
+"""PWMOut Class for RP2040s with u2if"""
+from .rp2040_u2if import rp2040_u2if
 
 
 class PWMOut:
-    """Pulse Width Modulation Output Class"""
+    """Base Pulse Width Modulation Output Class"""
 
     def __init__(self, pin, *, frequency=500, duty_cycle=0, variable_frequency=False):
-        pico_u2if.pwm_configure(
+        rp2040_u2if.pwm_configure(
             pin,
             frequency=frequency,
             duty_cycle=duty_cycle,
@@ -26,22 +26,22 @@ class PWMOut:
 
     def deinit(self):
         """Deinit PWM."""
-        pico_u2if.pwm_deinit(self._pin)
+        rp2040_u2if.pwm_deinit(self._pin)
 
     @property
     def duty_cycle(self):
         """The PWM's output duty cycle, 16-bit."""
-        return pico_u2if.pwm_get_duty_cycle(self._pin)
+        return rp2040_u2if.pwm_get_duty_cycle(self._pin)
 
     @duty_cycle.setter
     def duty_cycle(self, duty_cycle):
-        pico_u2if.pwm_set_duty_cycle(self._pin, duty_cycle)
+        rp2040_u2if.pwm_set_duty_cycle(self._pin, duty_cycle)
 
     @property
     def frequency(self):
         """The PWM's output frequency in Hertz."""
-        return pico_u2if.pwm_get_frequency(self._pin)
+        return rp2040_u2if.pwm_get_frequency(self._pin)
 
     @frequency.setter
     def frequency(self, frequency):
-        pico_u2if.pwm_set_frequency(self._pin, frequency)
+        rp2040_u2if.pwm_set_frequency(self._pin, frequency)
similarity index 91%
rename from src/adafruit_blinka/microcontroller/pico_u2if/pico_u2if.py
rename to src/adafruit_blinka/microcontroller/rp2040_u2if/rp2040_u2if.py
index 687bfc033585b4212b5bd44945fee65c4140461f..995d14c89bafc644bec00fc949c0106ebd99822d 100644 (file)
@@ -1,4 +1,4 @@
-"""Chip Definition for Pico with u2if firmware"""
+"""Helper class for use with RP2040 running u2if firmware"""
 # https://github.com/execuc/u2if
 
 import os
@@ -6,17 +6,14 @@ import time
 import hid
 
 # Use to set delay between reset and device reopen. if negative, don't reset at all
-PICO_U2IF_RESET_DELAY = float(os.environ.get("PICO_U2IF_RESET_DELAY", 1))
+RP2040_U2IF_RESET_DELAY = float(os.environ.get("RP2040_U2IF_RESET_DELAY", 1))
 
 # pylint: disable=import-outside-toplevel,too-many-branches,too-many-statements
 # pylint: disable=too-many-arguments,too-many-function-args, too-many-public-methods
 
 
-class Pico_u2if:
-    """MCP2221 Device Class Definition"""
-
-    VID = 0xCAFE
-    PID = 0x4005
+class RP2040_u2if:
+    """Helper class for use with RP2040 running u2if firmware"""
 
     # MISC
     RESP_OK = 0x01
@@ -71,15 +68,22 @@ class Pico_u2if:
     PWM_GET_DUTY_NS = 0x37
 
     def __init__(self):
-        self._hid = hid.device()
-        self._hid.open(Pico_u2if.VID, Pico_u2if.PID)
-        if PICO_U2IF_RESET_DELAY >= 0:
-            self._reset()
+        self._opened = False
         self._i2c_index = None
         self._spi_index = None
         self._serial = None
         self._neopixel_initialized = False
-        self._uart_rx_buffer = None
+        # self._vid = vid
+        # self._pid = pid
+        # self._hid = hid.device()
+        # self._hid.open(self._vid, self._pid)
+        # if RP2040_U2IF_RESET_DELAY >= 0:
+        #     self._reset()
+        # self._i2c_index = None
+        # self._spi_index = None
+        # self._serial = None
+        # self._neopixel_initialized = False
+        # self._uart_rx_buffer = None
 
     def _hid_xfer(self, report, response=True):
         """Perform HID Transfer"""
@@ -94,16 +98,30 @@ class Pico_u2if:
 
     def _reset(self):
         self._hid_xfer(bytes([self.SYS_RESET]), False)
-        time.sleep(PICO_U2IF_RESET_DELAY)
+        time.sleep(RP2040_U2IF_RESET_DELAY)
         start = time.monotonic()
         while time.monotonic() - start < 5:
             try:
-                self._hid.open(Pico_u2if.VID, Pico_u2if.PID)
+                self._hid.open(self._vid, self._pid)
             except OSError:
                 time.sleep(0.1)
                 continue
             return
-        raise OSError("Pico open error.")
+        raise OSError("RP2040 u2if open error.")
+
+    # ----------------------------------------------------------------
+    # MISC
+    # ----------------------------------------------------------------
+    def open(self, vid, pid):
+        if self._opened:
+            return
+        self._vid = vid
+        self._pid = pid
+        self._hid = hid.device()
+        self._hid.open(self._vid, self._pid)
+        if RP2040_U2IF_RESET_DELAY >= 0:
+            self._reset()
+        self._opened = True
 
     # ----------------------------------------------------------------
     # GPIO
@@ -362,6 +380,7 @@ class Pico_u2if:
     # ----------------------------------------------------------------
     def neopixel_write(self, gpio, buf):
         """NeoPixel write."""
+        print("open serial")
         # open serial (data is sent over this)
         if self._serial is None:
             import serial
@@ -369,12 +388,13 @@ class Pico_u2if:
 
             ports = serial.tools.list_ports.comports()
             for port in ports:
-                if port.vid == self.VID and port.pid == self.PID:
+                if port.vid == self._vid and port.pid == self._pid:
                     self._serial = serial.Serial(port.device)
                     break
         if self._serial is None:
             raise RuntimeError("Could not find Pico com port.")
 
+        print("init")
         # init
         if not self._neopixel_initialized:
             # deinit any current setup
@@ -395,6 +415,7 @@ class Pico_u2if:
 
         self._serial.reset_output_buffer()
 
+        print("write")
         # write
         # command is done over HID
         remain_bytes = len(buf)
@@ -415,16 +436,22 @@ class Pico_u2if:
                 )
             else:
                 raise RuntimeError("Neopixel write error.")
+        print("write 1")
         # buffer is sent over serial
         self._serial.write(buf)
         # hack (see u2if)
+        print("write 2")
         if len(buf) % 64 == 0:
             self._serial.write([0])
         self._serial.flush()
         # polling loop to wait for write complete?
+        print("write 3")
+        time.sleep(0.1)
         resp = self._hid.read(64)
+        print("write 4")
         while resp[0] != self.WS2812B_WRITE:
             resp = self._hid.read(64)
+        print("write 5")
         if resp[1] != self.RESP_OK:
             raise RuntimeError("Neopixel write (flush) error.")
 
@@ -488,5 +515,4 @@ class Pico_u2if:
         if resp[1] != self.RESP_OK:
             raise RuntimeError("PWM set duty cycle error.")
 
-
-pico_u2if = Pico_u2if()
+rp2040_u2if = RP2040_u2if()
similarity index 63%
rename from src/adafruit_blinka/microcontroller/pico_u2if/spi.py
rename to src/adafruit_blinka/microcontroller/rp2040_u2if/spi.py
index e4d720272f8082b0bd288a765d075d58ff079b04..4d0bf86d46076a72244771e8e969b62a87085c2f 100644 (file)
@@ -1,24 +1,17 @@
-"""SPI Class for Pico u2if"""
-from .pico_u2if import pico_u2if
+"""SPI Classes for RP2040s with u2if firmware"""
+from .rp2040_u2if import rp2040_u2if
 
 # pylint: disable=protected-access, no-self-use
 class SPI:
-    """Custom SPI Class for Pico u2if"""
+    """SPI Base Class for RP2040 u2if"""
 
     MSB = 0
 
-    def __init__(self, clock, *, baudrate=100000):
-        index = None
-        if clock.id == 18:
-            index = 0
-        if clock.id == 10:
-            index = 1
-        if index is None:
-            raise ValueError("No SPI port on specified pin.")
+    def __init__(self, index, *, baudrate=100000):
         self._index = index
         self._frequency = baudrate
-        pico_u2if.spi_set_port(self._index)
-        pico_u2if.spi_configure(self._frequency)
+        rp2040_u2if.spi_set_port(self._index)
+        rp2040_u2if.spi_configure(self._frequency)
 
     # pylint: disable=too-many-arguments,unused-argument
     def init(
@@ -34,8 +27,8 @@ class SPI:
     ):
         """Initialize the Port"""
         self._frequency = baudrate
-        pico_u2if.spi_set_port(self._index)
-        pico_u2if.spi_configure(self._frequency)
+        rp2040_u2if.spi_set_port(self._index)
+        rp2040_u2if.spi_configure(self._frequency)
 
     # pylint: enable=too-many-arguments
 
@@ -46,11 +39,11 @@ class SPI:
 
     def write(self, buf, start=0, end=None):
         """Write data from the buffer to SPI"""
-        pico_u2if.spi_write(buf, start=start, end=end)
+        rp2040_u2if.spi_write(buf, start=start, end=end)
 
     def readinto(self, buf, start=0, end=None, write_value=0):
         """Read data from SPI and into the buffer"""
-        pico_u2if.spi_readinto(buf, start=start, end=end, write_value=write_value)
+        rp2040_u2if.spi_readinto(buf, start=start, end=end, write_value=write_value)
 
     # pylint: disable=too-many-arguments
     def write_readinto(
@@ -59,7 +52,7 @@ class SPI:
         """Perform a half-duplex write from buffer_out and then
         read data into buffer_in
         """
-        pico_u2if.spi_write_readinto(
+        rp2040_u2if.spi_write_readinto(
             buffer_out,
             buffer_in,
             out_start=out_start,
@@ -69,3 +62,25 @@ class SPI:
         )
 
     # pylint: enable=too-many-arguments
+
+class SPI_Pico(SPI):
+
+    def __init__(self, clock, *, baudrate=100000):
+        index = None
+        if clock.id == 18:
+            index = 0
+        if clock.id == 10:
+            index = 1
+        if index is None:
+            raise ValueError("No SPI port on specified pin.")
+        super().__init__(index, baudrate=baudrate)
+
+class SPI_Feather(SPI):
+
+    def __init__(self, clock, *, baudrate=100000):
+        index = None
+        if clock.id == 18:
+            index = 0
+        if index is None:
+            raise ValueError("No SPI port on specified pin.")
+        super().__init__(index, baudrate=baudrate)
\ No newline at end of file
index 04d3afce8494afb0b38f47a45a54cfc964acb8d1..c506448124fbf4eae60c8c33bea1ccff8a535238 100644 (file)
@@ -30,6 +30,8 @@ elif detector.chip.STM32MP157:
 elif "sphinx" in sys.modules:
     pass
 elif detector.board.pico_u2if:
-    from adafruit_blinka.microcontroller.pico_u2if.analogio import AnalogIn
+    from adafruit_blinka.microcontroller.rp2040_u2if.analogio import AnalogIn_Pico as AnalogIn
+elif detector.board.feather_u2if:
+    from adafruit_blinka.microcontroller.rp2040_u2if.analogio import AnalogIn_Feather as AnalogIn
 else:
     raise NotImplementedError("analogio not supported for this board.")
index 0c8a6455ff962d4badde8034420e90698fa72b6e..a34ef4e25386690222aff4a66f2dcb0f5d82423c 100755 (executable)
@@ -227,6 +227,9 @@ elif board_id == ap_board.NANOPI_DUO2:
 elif board_id == ap_board.PICO_U2IF:
     from adafruit_blinka.board.pico_u2if import *
 
+elif board_id == ap_board.FEATHER_U2IF:
+    from adafruit_blinka.board.feather_u2if import *
+
 elif "sphinx" in sys.modules:
     pass
 
index 11c6341421ad002fe01ef4b29493590d2988c1d5..cfdfa636f35699385c5b31b1de232e4597422e1a 100755 (executable)
@@ -54,7 +54,12 @@ class I2C(Lockable):
             self._i2c = _I2C(frequency=frequency)
             return
         if detector.board.pico_u2if:
-            from adafruit_blinka.microcontroller.pico_u2if.i2c import I2C as _I2C
+            from adafruit_blinka.microcontroller.rp2040_u2if.i2c import I2C_Pico as _I2C
+
+            self._i2c = _I2C(scl, sda, frequency=frequency)
+            return
+        if detector.board.feather_u2if:
+            from adafruit_blinka.microcontroller.rp2040_u2if.i2c import I2C_Feather as _I2C
 
             self._i2c = _I2C(scl, sda, frequency=frequency)
             return
@@ -192,7 +197,13 @@ class SPI(Lockable):
             self._pins = (SCK, MOSI, MISO)
             return
         if detector.board.pico_u2if:
-            from adafruit_blinka.microcontroller.pico_u2if.spi import SPI as _SPI
+            from adafruit_blinka.microcontroller.rp2040_u2if.spi import SPI_Pico 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.board.feather_u2if:
+            from adafruit_blinka.microcontroller.rp2040_u2if.spi import SPI_Feather as _SPI
 
             self._spi = _SPI(clock)  # this is really all that's needed
             self._pins = (clock, clock, clock)  # will determine MOSI/MISO from clock
@@ -301,7 +312,9 @@ class SPI(Lockable):
         elif detector.board.any_lubancat and detector.chip.id == ap_chip.IMX6ULL:
             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
+            from adafruit_blinka.microcontroller.rp2040_u2if.spi import SPI_Pico as _SPI
+        elif detector.board.feather_u2if:
+            from adafruit_blinka.microcontroller.rp2040_u2if.spi import SPI_Feather as _SPI
         elif detector.chip.id == ap_chip.RP2040:
             from adafruit_blinka.microcontroller.rp2040.spi import SPI as _SPI
         else:
index eef0015f076bdaa420fa659f446fb344b4532b00..9b44c56e3267804b5b51e2362fd392ba6c8d085e 100755 (executable)
@@ -82,7 +82,9 @@ elif detector.chip.H6:
 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.microcontroller.rp2040_u2if.pin import Pin
+elif detector.board.feather_u2if:
+    from adafruit_blinka.microcontroller.rp2040_u2if.pin import Pin
 
 from adafruit_blinka import Enum, ContextManaged
 
index 00ffa0b8df09026c32605ddf4f78d2a089832ba1..5852b254335175894b7b35d81edc28958f94eb57 100644 (file)
@@ -14,8 +14,8 @@ from adafruit_blinka.agnostic import detector
 
 if detector.board.any_raspberry_pi:
     from adafruit_blinka.microcontroller.bcm283x import neopixel as _neopixel
-elif detector.board.pico_u2if:
-    from adafruit_blinka.microcontroller.pico_u2if import neopixel as _neopixel
+elif detector.board.pico_u2if or detector.board.feather_u2if:
+    from adafruit_blinka.microcontroller.rp2040_u2if import neopixel as _neopixel
 elif "sphinx" in sys.modules:
     pass
 else:
index dbb8bb79777c6ff3a4602c2fd2bd0bb1fffb2037..5b5fb395bbea10c7ceadbc43eafc0b0ac9ba6715 100644 (file)
@@ -30,7 +30,9 @@ elif detector.board.greatfet_one:
 elif detector.board.any_lubancat:
     from adafruit_blinka.microcontroller.generic_linux.sysfs_pwmout import PWMOut
 elif detector.board.pico_u2if:
-    from adafruit_blinka.microcontroller.pico_u2if.pwmio import PWMOut
+    from adafruit_blinka.microcontroller.rp2040_u2if.pwmio import PWMOut
+elif detector.board.feather_u2if:
+    from adafruit_blinka.microcontroller.rp2040_u2if.pwmio import PWMOut
 elif "sphinx" in sys.modules:
     pass
 else: