// This sketch is based on the SDK example here: // https://github.com/raspberrypi/pico-examples/tree/master/pio/ws2812 /** Copyright (c) 2020 Raspberry Pi (Trading) Ltd. SPDX-License-Identifier: BSD-3-Clause */ #if defined(ARDUINO_ARCH_RP2040) #include #include "hardware/pio.h" #include "hardware/clocks.h" #include "rp2040_pio.h" void rp2040Init(uint8_t pin, bool is800KHz) { // todo get free sm PIO pio = pio0; int sm = 0; uint offset = pio_add_program(pio, &ws2812_program); if (is800KHz) { // 800kHz, 8 bit transfers ws2812_program_init(pio, sm, offset, pin, 800000, 8); } else { // 400kHz, 8 bit transfers ws2812_program_init(pio, sm, offset, pin, 400000, 8); } } void rp2040Show(uint8_t pin, uint8_t *pixels, uint32_t numBytes, bool is800KHz) { static bool init = true; if (init) { // On first pass through initialise the PIO rp2040Init(pin, is800KHz); init = false; } while(numBytes--) // Bits for transmission must be shifted to top 8 bits pio_sm_put_blocking(pio0, 0, ((uint32_t)*pixels++)<< 24); } #endif // KENDRYTE_K210