+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
"""Helper class for use with RP2040 running u2if firmware"""
# https://github.com/execuc/u2if
PWM_GET_DUTY_NS = 0x37
def __init__(self):
+ self._vid = None
+ self._pid = None
+ self._hid = None
self._opened = False
self._i2c_index = None
self._spi_index = None
self._serial = None
self._neopixel_initialized = False
- # 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
+ self._uart_rx_buffer = None
def _hid_xfer(self, report, response=True):
"""Perform HID Transfer"""
def _reset(self):
self._hid_xfer(bytes([self.SYS_RESET]), False)
+ self._hid.close()
time.sleep(RP2040_U2IF_RESET_DELAY)
start = time.monotonic()
while time.monotonic() - start < 5:
# MISC
# ----------------------------------------------------------------
def open(self, vid, pid):
+ """Open HID interface for given USB VID and PID."""
+
if self._opened:
return
self._vid = vid
out_start=0,
out_end=None,
in_start=0,
- in_end=None
+ in_end=None,
):
"""Write data from buffer_out to an address and then
read data from an address and into buffer_in
out_start=0,
out_end=None,
in_start=0,
- in_end=None
+ in_end=None,
):
"""SPI write and readinto."""
raise NotImplementedError("SPI write_readinto Not implemented")
# ----------------------------------------------------------------
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
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
self._serial.reset_output_buffer()
- print("write")
# write
# command is done over HID
remain_bytes = len(buf)
"Neopixel write error : too many pixel for the firmware."
)
elif resp[2] == 0x02:
- print(resp[0:10])
raise RuntimeError(
"Neopixel write error : transfer already in progress."
)
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.")
if resp[1] != self.RESP_OK:
raise RuntimeError("PWM set duty cycle error.")
+
rp2040_u2if = RP2040_u2if()