ws2812: add PIO support for RP2040/RP2350

Integrate PIO support directly into the existing Device.
NewWS2812() now uses PIO for hardware-timed control
on RP2040/RP2350 and falls back to bit-banging on other platforms.

No changes to the exported API surface.
This commit is contained in:
Carlos Henrique Guardão Gandarez
2026-03-31 19:26:58 -03:00
committed by Ron Evans
parent a514169c37
commit 4071028e85
5 changed files with 53 additions and 9 deletions
+33
View File
@@ -0,0 +1,33 @@
//go:build rp2040 || rp2350
package ws2812
import (
"image/color"
"machine"
pio "github.com/tinygo-org/pio/rp2-pio"
"github.com/tinygo-org/pio/rp2-pio/piolib"
)
// newWS2812Device creates a WS2812 device using PIO for hardware-timed control.
// If PIO initialization fails, it falls back to the bit-bang driver.
func newWS2812Device(pin machine.Pin) Device {
sm, err := pio.PIO0.ClaimStateMachine()
if err != nil {
return Device{Pin: pin, writeColorFunc: writeColorsRGB}
}
ws, err := piolib.NewWS2812B(sm, pin)
if err != nil {
return Device{Pin: pin, writeColorFunc: writeColorsRGB}
}
return Device{
Pin: pin,
writeColorFunc: func(_ Device, buf []color.RGBA) error {
for _, c := range buf {
ws.PutRGB(c.R, c.G, c.B)
}
return nil
},
}
}