From 28871736819abf3d073c14b35847c54040717c61 Mon Sep 17 00:00:00 2001 From: FReenen Date: Fri, 12 Jul 2024 10:09:04 +0200 Subject: [PATCH] udpate led driver --- rx_esp32/CMakeLists.txt | 1 - rx_esp32/src/led.c | 91 ++++++++++++++++++++++++++++++++++------- rx_esp32/src/led.h | 2 +- 3 files changed, 77 insertions(+), 17 deletions(-) diff --git a/rx_esp32/CMakeLists.txt b/rx_esp32/CMakeLists.txt index bc6030d..15c4ae3 100644 --- a/rx_esp32/CMakeLists.txt +++ b/rx_esp32/CMakeLists.txt @@ -1,4 +1,3 @@ cmake_minimum_required(VERSION 3.16.0) include($ENV{IDF_PATH}/tools/cmake/project.cmake) -list(APPEND EXTRA_COMPONENT_DIRS led_strip) project(rx_esp32) diff --git a/rx_esp32/src/led.c b/rx_esp32/src/led.c index 7525eec..3f492d2 100644 --- a/rx_esp32/src/led.c +++ b/rx_esp32/src/led.c @@ -1,33 +1,94 @@ #include "led.h" +#include +#include "driver/rmt_tx.h" +#include "driver/rmt_types.h" +#include "driver/rmt_encoder.h" #include "driver/gpio.h" -#include "led_strip.h" -static led_strip_handle_t led_strip; +typedef struct { + rmt_encoder_t base; + rmt_encoder_t *bytes_encoder; + rmt_encoder_t *copy_encoder; + int state; + rmt_symbol_word_t reset_code; +} rmt_led_strip_encoder_t; + +rmt_channel_handle_t* led_rmt_channel; +rmt_led_strip_encoder_t* led_enc; + +rmt_led_strip_encoder_t* led_init_encoder() +{ + rmt_led_strip_encoder_t* led_encoder; + led_encoder = calloc(1, sizeof(rmt_led_strip_encoder_t)); + + rmt_bytes_encoder_config_t bytes_encoder_config; + // different led strip might have its own timing requirements, following parameter is for WS2812 + bytes_encoder_config = (rmt_bytes_encoder_config_t) { + .bit0 = { + .level0 = 1, + .duration0 = 0.3, // T0H=0.3us + .level1 = 0, + .duration1 = 0.9, // T0L=0.9us + }, + .bit1 = { + .level0 = 1, + .duration0 = 0.9, // T1H=0.9us + .level1 = 0, + .duration1 = 0.3, // T1L=0.3us + }, + .flags.msb_first = 1 // WS2812 transfer bit order: G7...G0R7...R0B7...B0 + }; + + rmt_new_bytes_encoder(&bytes_encoder_config, &led_encoder->bytes_encoder); + // rmt_copy_encoder_config_t copy_encoder_config = {}; + // rmt_new_copy_encoder(©_encoder_config, &led_encoder->copy_encoder); + + uint32_t reset_ticks = 10 /*MHz*/ * 280 / 2; // reset code duration defaults to 280us to accomodate WS2812B-V5 + led_encoder->reset_code = (rmt_symbol_word_t) { + .level0 = 0, + .duration0 = reset_ticks, + .level1 = 0, + .duration1 = reset_ticks, + }; + return led_encoder; +} void led_init(void) { - /* LED strip initialization with the GPIO and pixels number*/ - led_strip_config_t strip_config = { - .strip_gpio_num = 8, - .max_leds = 1, - }; - led_strip_rmt_config_t rmt_config = { - .resolution_hz = 10 * 1000 * 1000, // 10MHz + /* LED strip initialization with the GPIO and pixels number */ + rmt_tx_channel_config_t rmt_chan_config = { + .clk_src = RMT_CLK_SRC_DEFAULT, + .gpio_num = 8, + .mem_block_symbols = 48, + .resolution_hz = 10 * 1000 * 1000, // 10 MHz + .trans_queue_depth = 4, .flags.with_dma = false, + .flags.invert_out = false, // ?? }; - led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip); + rmt_new_tx_channel(&rmt_chan_config, &led_rmt_channel); + led_enc = led_init_encoder(); /* Set all LED off to clear all pixels */ - led_strip_clear(led_strip); + // led_strip_clear(led_strip); + + led_setRGB(0, 0, 0); } void led_deinit(void) { - //TODO + rmt_del_channel(led_rmt_channel); + rmt_del_encoder(led_enc); } -void led_setColor(uint8_t r, uint8_t g, uint8_t b) +void led_setRGB(uint8_t r, uint8_t g, uint8_t b) { - led_strip_set_pixel(led_strip, 0, 16, 16, 16); - led_strip_refresh(led_strip); + rmt_transmit_config_t tx_conf = { + .loop_count = 0, + }; + uint8_t pixel = {g, r, b}; + + rmt_enable(led_rmt_channel); + rmt_transmit(led_rmt_channel, led_enc, pixel, 3, &tx_conf); + rmt_tx_wait_all_done(led_rmt_channel, -1); + rmt_disable(led_rmt_channel); } diff --git a/rx_esp32/src/led.h b/rx_esp32/src/led.h index d840649..d42241d 100644 --- a/rx_esp32/src/led.h +++ b/rx_esp32/src/led.h @@ -5,6 +5,6 @@ void led_init(void); void led_deinit(void); -void led_setColor(uint8_t r, uint8_t g, uint8_t b); +void led_setRGB(uint8_t r, uint8_t g, uint8_t b); #endif \ No newline at end of file