Skip to content

usb.host.find() OK for MIDI keyboards in 9.2.4, but fails for some in CP>=9.2.5 on Feather RP2040 USB Host #10494

Description

@RobCranfill

CircuitPython version and board name

Adafruit CircuitPython 9.2.5 on 2025-03-19; Adafruit Feather RP2040 USB Host with rp2040

Code/REPL

import usb.core
import time

time.sleep(5) # needed for USB to settle? I don't think so, but whatev.

print("Looking for midi devices")
while True:
    i = 0
    for device in usb.core.find(find_all=True):
	print("Found a device")
	i += 1
    print(f"Found {i} devices; going around again...")
    time.sleep(1)

Behavior

Adafruit CircuitPython 9.2.5 on 2025-03-19; Adafruit Feather RP2040 USB Host with rp2040
>>> 
soft reboot

Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.
code.py output:
Looking for midi devices
Found 0 devices; going around again...
Found 0 devices; going around again...
Found 0 devices; going around again...
Traceback (most recent call last):
  File "code.py", line 2, in <module>
  File "super_simple_test.py", line 14, in <module>
KeyboardInterrupt: 

Description

usb.core.find() does not see the device under CP>=9.2.5, but did under <=9.2.4.

Additional information

The following test code runs correctly with all MIDI keyboards I have tried it on under CP 9.2.4 and earlier, but fails on some MIDI keyboards under CP 9.2.5 and later.

Test code


import usb.core
import time

time.sleep(5) # needed for USB to settle? I don't think so, but whatev.

print("Looking for midi devices")
while True:
    i = 0
    for device in usb.core.find(find_all=True):
	print("Found a device")
	i += 1
    print(f"Found {i} devices; going around again...")
    time.sleep(1)

Testing with Akai MPKMini2 MIDI keyboard

Test run 1 (success)

Adafruit CircuitPython 9.2.4 on 2025-01-28; Adafruit Feather RP2040 USB Host with rp2040
>>> 
>>> 
soft reboot

Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.
code.py output:
Looking for midi devices
Found a device
Found 1 devices; going around again...
Found a device
Found 1 devices; going around again...
Traceback (most recent call last):
  File "code.py", line 2, in <module>
  File "super_simple_test.py", line 14, in <module>
KeyboardInterrupt: 
...

Test run 2 (failure)

	Adafruit CircuitPython 9.2.5 on 2025-03-19; Adafruit Feather RP2040 USB Host with rp2040
	>>> 
	soft reboot

	Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.
	code.py output:
	Looking for midi devices
	Found 0 devices; going around again...
	Found 0 devices; going around again...
	Found 0 devices; going around again...

Test run 3 (failure)

	Adafruit CircuitPython 10.0.0-alpha.8 on 2025-07-08; Adafruit Feather RP2040 USB Host with rp2040
	>>> 
	>>> 
	soft reboot

	Auto-reload is off.
	code.py output:
	Looking for midi device
	Found 0 devices; going around again...
	Found 0 devices; going around again...
	...

Output from lsusb --vvv for Akai MPKMini2

As per suggestion/request of @tannewt here is some info on the device from a Linux box:

rob@ScreamerIVU:~$ sudo lsusb -vvv >mpkmini.lsusb.text
 (and then edited to show only the pertinent device)

...
Bus 001 Device 009: ID 2011:0715 AKAI MPKmini2
Negotiated speed: Full Speed (12Mbps)
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 [unknown]
  bDeviceSubClass         0 [unknown]
  bDeviceProtocol         0 
  bMaxPacketSize0        32
  idVendor           0x2011 AKAI
  idProduct          0x0715 MPKmini2
  bcdDevice            0.00
  iManufacturer           1 AKAI
  iProduct                2 MPKmini2
  iSerial                 3 0001
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0085
    bNumInterfaces          3
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0x00
      (Missing must-be-set bit!)
      (Bus Powered)
    MaxPower              500mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 [unknown]
      bInterfaceProtocol      0 
      iInterface              0 
	HID Device Descriptor:
	  bLength                 9
	  bDescriptorType        33
	  bcdHID               1.11
	  bCountryCode            0 Not supported
	  bNumDescriptors         1
	  bDescriptorType        34 (null)
	  wDescriptorLength      52
	  Report Descriptors: 
	    ** UNAVAILABLE **
      Endpoint Descriptor:
	bLength                 7
	bDescriptorType         5
	bEndpointAddress     0x81  EP 1 IN
	bmAttributes            3
	  Transfer Type            Interrupt
	  Synch Type               None
	  Usage Type               Data
	wMaxPacketSize     0x0020  1x 32 bytes
	bInterval               1
      Endpoint Descriptor:
	bLength                 7
	bDescriptorType         5
	bEndpointAddress     0x02  EP 2 OUT
	bmAttributes            3
	  Transfer Type            Interrupt
	  Synch Type               None
	  Usage Type               Data
	wMaxPacketSize     0x0020  1x 32 bytes
	bInterval               1
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      1 Control Device
      bInterfaceProtocol      0 
      iInterface              0 
      AudioControl Interface Descriptor:
	bLength                 9
	bDescriptorType        36
	bDescriptorSubtype      1 (HEADER)
	bcdADC               1.00
	wTotalLength       0x0009
	bInCollection           1
	baInterfaceNr(0)        2
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         1 Audio
      bInterfaceSubClass      3 MIDI Streaming
      bInterfaceProtocol      0 
      iInterface              0 
      MIDIStreaming Interface Descriptor:
	bLength                 7
	bDescriptorType        36
	bDescriptorSubtype      1 (HEADER)
	bcdADC               1.00
	wTotalLength       0x0041
      MIDIStreaming Interface Descriptor:
	bLength                 6
	bDescriptorType        36
	bDescriptorSubtype      2 (MIDI_IN_JACK)
	bJackType               1 Embedded
	bJackID                 1
	iJack                   0 
      MIDIStreaming Interface Descriptor:
	bLength                 6
	bDescriptorType        36
	bDescriptorSubtype      2 (MIDI_IN_JACK)
	bJackType               2 External
	bJackID                 2
	iJack                   0 
      MIDIStreaming Interface Descriptor:
	bLength                 9
	bDescriptorType        36
	bDescriptorSubtype      3 (MIDI_OUT_JACK)
	bJackType               1 Embedded
	bJackID                 3
	bNrInputPins            1
	baSourceID( 0)          2
	BaSourcePin( 0)         1
	iJack                   0 
      MIDIStreaming Interface Descriptor:
	bLength                 9
	bDescriptorType        36
	bDescriptorSubtype      3 (MIDI_OUT_JACK)
	bJackType               2 External
	bJackID                 4
	bNrInputPins            1
	baSourceID( 0)          1
	BaSourcePin( 0)         1
	iJack                   0 
      Endpoint Descriptor:
	bLength                 9
	bDescriptorType         5
	bEndpointAddress     0x03  EP 3 OUT
	bmAttributes            2
	  Transfer Type            Bulk
	  Synch Type               None
	  Usage Type               Data
	wMaxPacketSize     0x0040  1x 64 bytes
	bInterval               0
	bRefresh                0
	bSynchAddress           0
	MIDIStreaming Endpoint Descriptor:
	  bLength                 5
	  bDescriptorType        37
	  bDescriptorSubtype      1 (Invalid)
	  bNumEmbMIDIJack         1
	  baAssocJackID( 0)       1
      Endpoint Descriptor:
	bLength                 9
	bDescriptorType         5
	bEndpointAddress     0x84  EP 4 IN
	bmAttributes            2
	  Transfer Type            Bulk
	  Synch Type               None
	  Usage Type               Data
	wMaxPacketSize     0x0040  1x 64 bytes
	bInterval               0
	bRefresh                0
	bSynchAddress           0
	MIDIStreaming Endpoint Descriptor:
	  bLength                 5
	  bDescriptorType        37
	  bDescriptorSubtype      1 (Invalid)
	  bNumEmbMIDIJack         1
	  baAssocJackID( 0)       3
...

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions