← index #16248Issue #15778
Related · medium · value 1.188
QUERY · ISSUE

USB (tested with midi) not working on pico 2 (rp2350 in ARM mode only)

openby ghostopened 2024-11-15updated 2024-11-15
bug

Port, board and/or hardware

rp2 port, pico 2 board

MicroPython version

MicroPython v1.24.0 on 2024-10-25; Raspberry Pi Pico2 with RP2350

Reproduction

This is the script I used:

# MicroPython USB MIDI example
#
# This example demonstrates creating a custom MIDI device.
#
# To run this example:
#
# 1. Make sure `usb-device-midi` is installed via: mpremote mip install usb-device-midi
#
# 2. Run the example via: mpremote run midi_example.py
#
# 3. mpremote will exit with an error after the previous step, because when the
#    example runs the existing USB device disconnects and then re-enumerates with
#    the MIDI interface present. At this point, the example is running.
#
# 4. To see output from the example, re-connect: mpremote connect PORTNAME
#
#
# MIT license; Copyright (c) 2023-2024 Angus Gratton
import usb.device
from usb.device.midi import MIDIInterface
import time


class MIDIExample(MIDIInterface):
    # Very simple example event handler functions, showing how to receive note
    # and control change messages sent from the host to the device.
    #
    # If you need to send MIDI data to the host, then it's fine to instantiate
    # MIDIInterface class directly.

    def on_open(self):
        super().on_open()
        print("Device opened by host")

    def on_note_on(self, channel, pitch, vel):
        print(f"RX Note On channel {channel} pitch {pitch} velocity {vel}")

    def on_note_off(self, channel, pitch, vel):
        print(f"RX Note Off channel {channel} pitch {pitch} velocity {vel}")

    def on_control_change(self, channel, controller, value):
        print(f"RX Control channel {channel} controller {controller} value {value}")


m = MIDIExample()
# Remove builtin_driver=True if you don't want the MicroPython serial REPL available.
usb.device.get().init(m, builtin_driver=True)

print("Waiting for USB host to configure the interface...")

while not m.is_open():
    time.sleep_ms(100)

print("Starting MIDI loop...")

# TX constants
CHANNEL = 0
PITCH = 60
CONTROLLER = 64

control_val = 0

while m.is_open():
    time.sleep(1)
    print(f"TX Note On channel {CHANNEL} pitch {PITCH}")
    m.note_on(CHANNEL, PITCH)  # Velocity is an optional third argument
    time.sleep(0.5)
    print(f"TX Note Off channel {CHANNEL} pitch {PITCH}")
    m.note_off(CHANNEL, PITCH)
    time.sleep(1)
    print(f"TX Control channel {CHANNEL} controller {CONTROLLER} value {control_val}")
    m.control_change(CHANNEL, CONTROLLER, control_val)
    control_val += 1
    if control_val == 0x7F:
        control_val = 0
    time.sleep(1)

print("USB host has reset device, example done.")

Expected behaviour

This example code works on a pico 1, here is the output:

MicroPython v1.24.0 on 2024-10-25; Raspberry Pi Pico with RP2040
Type "help()" for more information.
>>> import midi_example
Waiting for USB host to configure the interface...
device disconnected

then mpremote disconnects. I can reconnect and it displays the log output from the example.

kernel log display:

 6041.587646] usb 7-1.1: new full-speed USB device number 9 using xhci_hcd
[ 6041.722135] usb 7-1.1: New USB device found, idVendor=2e8a, idProduct=0005, bcdDevice= 1.00
[ 6041.722144] usb 7-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 6041.722149] usb 7-1.1: Product: Board in FS mode
[ 6041.722153] usb 7-1.1: Manufacturer: MicroPython
[ 6041.722156] usb 7-1.1: SerialNumber: e6613008e343372e
[ 6041.787350] cdc_acm 7-1.1:1.0: ttyACM0: USB ACM device
[ 6259.833061] usb 7-1.1: USB disconnect, device number 9
[ 6260.104404] usb 7-1.1: new full-speed USB device number 10 using xhci_hcd
[ 6260.239359] usb 7-1.1: New USB device found, idVendor=2e8a, idProduct=0005, bcdDevice= 1.00
[ 6260.239362] usb 7-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 6260.239364] usb 7-1.1: Product: Board in FS mode
[ 6260.239365] usb 7-1.1: Manufacturer: MicroPython
[ 6260.239366] usb 7-1.1: SerialNumber: e6613008e343372e
[ 6260.285551] cdc_acm 7-1.1:1.0: ttyACM0: USB ACM device
[ 6260.334768] mc: Linux media interface: v0.10
[ 6260.411764] usbcore: registered new interface driver snd-usb-audio

Observed behaviour

This is the output on the rp2 REPL:

>>> import midi_example
Waiting for USB host to configure the interface...

and it hangs, control characters have no effect.

Meanwhile here is the kernel log:

[ 5138.193121] usb 7-1.1: new full-speed USB device number 4 using xhci_hcd
[ 5138.327835] usb 7-1.1: New USB device found, idVendor=2e8a, idProduct=0005, bcdDevice= 1.00
[ 5138.327845] usb 7-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 5138.327850] usb 7-1.1: Product: Board in FS mode
[ 5138.327855] usb 7-1.1: Manufacturer: MicroPython
[ 5138.327858] usb 7-1.1: SerialNumber: 1c59c033388f3e4e
[ 5138.437887] cdc_acm 7-1.1:1.0: ttyACM0: USB ACM device
[ 5138.437924] usbcore: registered new interface driver cdc_acm
[ 5138.437927] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters

Nothing else is printed.

Additional Information

This is probably a core issue with customizable USB on this new port.

Thank you very much for your work on micropython and also for providing this template.

Code of Conduct

Yes, I agree

CANDIDATE · ISSUE

RP2350 bricked with micropython

closedby TRadigkopened 2024-09-03updated 2024-09-04
bug

Port, board and/or hardware

RP2350

MicroPython version

Hello dear micropython developers,

today I got my hands on a brand new Pico 2 board. Since there is currently only one firmware release available, I flashed RPI_PICO2-20240809-v1.24.0-preview.201.g269a0e0e1.uf2.
Secondly since this would be a successor to my self made FanController project, I copied over the source files as well. After the Pico restarted it started flashing the onboard LED as intended. But it does not enumerate to USB any more.
When I hold down the BOOT button while plugging it in, I get the RP2350 memory exposed in file explorer and can copy over the same RPI_PICO2-20240809-v1.24.0-preview.201.g269a0e0e1.uf2 again. The controller disconnects form my computer, does not enumerate to USB and starts flashing again.
For RP2040 there is a "flash_nuke.uf2" file which the controller (RP2350) does not respond to.

I've reported the issue of easily brickable RP2040 some weeks ago and hope any fix is coming soon?
See: https://github.com/micropython/micropython/issues/15230#issuecomment-2277896658

content of my boot.py without imports:

if __name__ == "__main__":
    logger = DebugLogger(0)
    try:
        loop = asyncio.get_event_loop()
        
        program = FanController(logger)
        program._setcpuspeed(Constants.CPU_SPEED_HZ)
        program.startup(False)

        programThread = _thread.start_new_thread(program.startProgram, ())
        program.serialTransport.flushinput()
        comms = loop.create_task(program.serialTransport.receive(
            program.commandprocessor.handlecommand))
        fanramp = loop.create_task(program.rampupfans())
        temps = loop.create_task(program.readtemperaturestodatamodel())
        autocontrol = loop.create_task(program.controller.runAutomaticControl())
        program._cleangarbage()

        loop.run_forever()
    except KeyboardInterrupt:
        program.onboardled.signalInterrupted()
        program.stopProgram()
        loop.stop()
        logger.log(logger.DEBUG, "INTERRUPTED - STOPPING EVERYTHING")
        program.serialTransport.stopreading()

One note: my serialTransport.receive() method is constantly reading asynchronously on sys.stdin. But this code still works in "older" micropython version flawlessly.

Edit: intermediate help: https://datasheets.raspberrypi.com/soft/flash_nuke.uf2 - clears the flash and brings the device back to life, except I can't run my micropython code on it.

Reproduction

Since I can't get any communication with the device and can not flash any other firmware for RP2350 I can't provide steps to reproduce, since I "know" that my python code works on Rp2040 and micropython 1.21.

Expected behaviour

When the device is connected to USB it enumerates an serial com device.

Observed behaviour

No device is enumerated. Device can only enumerate when in BOOTSEL mode.

Additional Information

No, I've provided everything above.

Code of Conduct

Yes, I agree

Keyboard

j / / n
next pair
k / / p
previous pair
1 / / h
show query pane
2 / / l
show candidate pane
c
copy suggested comment
r
toggle reasoning
g i
go to index
?
show this help
esc
close overlays

press ? or esc to close

copied