From 4a3a2f2dbfa970f34dbe26bfeac9b7c29de18d61 Mon Sep 17 00:00:00 2001 From: deadprogram Date: Fri, 12 Jun 2026 19:00:09 +0200 Subject: [PATCH] ws2812: fix PIO TX FIFO overflow on rp2040/rp2350 dropping LEDs PutRGB calls TxPut which is non-blocking and silently discards data when the TX FIFO is full. Wait for FIFO space before each PutRGB using runtime.Gosched() to yield cooperatively, matching the pattern used by piolib.WriteRaw. Signed-off-by: deadprogram --- ws2812/ws2812_rp2_pio.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ws2812/ws2812_rp2_pio.go b/ws2812/ws2812_rp2_pio.go index 2cc29e189..ac142bd14 100644 --- a/ws2812/ws2812_rp2_pio.go +++ b/ws2812/ws2812_rp2_pio.go @@ -5,6 +5,7 @@ package ws2812 import ( "image/color" "machine" + "runtime" pio "github.com/tinygo-org/pio/rp2-pio" "github.com/tinygo-org/pio/rp2-pio/piolib" @@ -27,6 +28,9 @@ func newWS2812Device(pin machine.Pin) Device { writeColorFunc: func(_ Device, buf []color.RGBA, brightness uint8) error { for _, c := range buf { r, g, b := applyBrightness(c, brightness) + for ws.IsQueueFull() { + runtime.Gosched() + } ws.PutRGB(r, g, b) } return nil