← index #14339PR #14345
Duplicate · high · value 2.160
QUERY · ISSUE

[RP2] machine.soft_reset() hangs when i2s is not deinitialized

openby mareclopened 2024-04-20updated 2024-08-07
bug

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

  1. 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)
  1. Call machine.soft_reset()
  2. Repeat 1, call audio_out.deinit() and no. 2 again

Expected behaviour

machine.soft_reset() resets machine
obraz

Observed behaviour

device hangs, requiring hardware reset or reconnecting USB
obraz

Additional Information

Verified on latest git commit and official release 1.22.2. This issue is pin-independent.

CANDIDATE · PULL REQUEST

ports/rp2/machine_i2s.c: Detect and deinitialize I2S instances on boot.

closedby mareclopened 2024-04-21updated 2024-08-07
port-rp2

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.

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