[RP2] machine.soft_reset() hangs when i2s is not deinitialized
Checks
-
I agree to follow the MicroPython Code of Conduct to ensure a safe and respectful space for everyone.
-
I've searched for existing issues matching this bug, and didn't find any.
Port, board and/or hardware
RPI_PICO
MicroPython version
MicroPython v1.22.2 on 2024-02-22; Raspberry Pi Pico with RP2040
Reproduction
- Initialize I2S device:
from machine import I2S
from machine import Pin
audio_out = I2S(0,
sck=Pin(0), ws=Pin(1), sd=(2),
mode=I2S.TX,
bits=16,
format=I2S.MONO,
rate=44100,
ibuf=20000)
- Call
machine.soft_reset() - Repeat 1, call
audio_out.deinit()and no. 2 again
Expected behaviour
machine.soft_reset() resets machine
Observed behaviour
device hangs, requiring hardware reset or reconnecting USB
Additional Information
Verified on latest git commit and official release 1.22.2. This issue is pin-independent.
ports/rp2/machine_i2s.c: Detect and deinitialize I2S instances on boot.
In reference to #14339
machine_i2s_init0 makes all of these pointers NULL without checking if there was a pointer already. Furthermore, garbage collector doesn't care enough to call I2S.deinit().
This created an issue, where invoking machine.soft_reset() would hard crash an entire board.
Fix is a check if machine_i2s_obj contains an object (assumed to be a valid machine_i2s_obj_t). If memory address is not NULL - object gets deinitialized. No further crashes are observed.