| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- // 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 <stdlib.h>
- #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
|