diff --git a/platforms/pico/drivers/ws2812.c b/platforms/pico/drivers/ws2812.c index 91eb8eadc5..d35107f9e3 100644 --- a/platforms/pico/drivers/ws2812.c +++ b/platforms/pico/drivers/ws2812.c @@ -11,11 +11,9 @@ #include "boards/pico_boards.h" #include "pico/stdlib.h" -#include "hardware/dma.h" -static PIO pio = pio0; -static int sm = 0; -static int dma_ch = 1; +static PIO pio = pio0; +static int sm = 0; static int ws2812_init(void) { sm = pio_manager_get_empty_sm(pio); @@ -32,15 +30,6 @@ static int ws2812_init(void) { ws2812_program_init(pio, sm, offset, RGB_DI_PIN, 800000, false); - dma_channel_config conf = dma_channel_get_default_config(dma_ch); - - channel_config_set_read_increment(&conf, true); - channel_config_set_write_increment(&conf, false); - channel_config_set_transfer_data_size(&conf, DMA_SIZE_32); - channel_config_set_dreq(&conf, pio_get_dreq(pio, sm, true)); - - dma_channel_set_config(dma_ch, &conf, false); - dma_channel_set_write_addr(dma_ch, &pio->txf[sm], false); return 0; } @@ -54,13 +43,14 @@ void ws2812_setleds(LED_TYPE *ledarray, uint16_t number_of_leds) { } } - uint32_t leddata[RGBLED_NUM]; + __interrupt_disable__(); + for (int i = 0; i < number_of_leds; i++) { - leddata[i] = (((uint32_t)ledarray[i].g) << 24) | - (((uint32_t)ledarray[i].r) << 16) | - ((uint32_t)ledarray[i].b << 8); + pio_sm_put_blocking(pio, sm, + (((uint32_t)ledarray[i].r) << 16) | + (((uint32_t)ledarray[i].g) << 24) | + ((uint32_t)ledarray[i].b << 8)); } - dma_channel_transfer_from_buffer_now(dma_ch, leddata, number_of_leds); - dma_channel_wait_for_finish_blocking(dma_ch); + __interrupt_enable__(NULL); }