From 6967d8fc46a8fe04e5609cecaab5038e4bb38a1c Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Wed, 25 May 2022 10:41:58 +0200 Subject: [PATCH 1/9] Initial implementation of RGB driver via digitalWrite --- cores/esp32/esp32-hal-gpio.c | 46 ++++++++++++++++++++++++++++++++++++ cores/esp32/esp32-hal-gpio.h | 18 ++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/cores/esp32/esp32-hal-gpio.c b/cores/esp32/esp32-hal-gpio.c index 359682c3433..58258d75776 100644 --- a/cores/esp32/esp32-hal-gpio.c +++ b/cores/esp32/esp32-hal-gpio.c @@ -125,8 +125,54 @@ extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode) } } +void RGBLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val){ + static bool initialized = false; + rmt_data_t led_data[24]; + static rmt_obj_t* rmt_send = NULL; + + if(!initialized){ + if ((rmt_send = rmtInit(pin, RMT_TX_MODE, RMT_MEM_64)) == NULL){ + log_e("RGB LED driver initialization failed!"); + rmt_send = NULL; + return; + } + rmtSetTick(rmt_send, 100); + initialized = true; + } + + int color[] = {green_val, red_val, blue_val}; // Color coding is in order GREEN, RED, BLUE + int i = 0; + for(int col=0; col<3; col++ ){ + for(int bit=0; bit<8; bit++){ + if((color[col] & (1<<(7-bit)))){ + // HIGH bit + led_data[i].level0 = 1; // T1H + led_data[i].duration0 = 8; // 0.8us + led_data[i].level1 = 0; // T1L + led_data[i].duration1 = 4; // 0.4us + }else{ + // LOW bit + led_data[i].level0 = 1; // T0H + led_data[i].duration0 = 4; // 0.4us + led_data[i].level1 = 0; // T0L + led_data[i].duration1 = 8; // 0.8us + } + i++; + } + } + rmtWrite(rmt_send, led_data, 24); +} + extern void ARDUINO_ISR_ATTR __digitalWrite(uint8_t pin, uint8_t val) { + #ifdef BOARD_HAS_RGB_LED + if(pin == LED_BUILTIN){ + //use RMT to set all channels on/off + const uint8_t comm_val = val != 0 ? 255 : 0; + RGBLedWrite(pin, comm_val, comm_val, comm_val); + return; + } + #endif gpio_set_level((gpio_num_t)pin, val); } diff --git a/cores/esp32/esp32-hal-gpio.h b/cores/esp32/esp32-hal-gpio.h index ff3808e9856..8a08129c8ee 100644 --- a/cores/esp32/esp32-hal-gpio.h +++ b/cores/esp32/esp32-hal-gpio.h @@ -63,6 +63,23 @@ extern "C" { #define ONLOW_WE 0x0C #define ONHIGH_WE 0x0D +#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3 + #define BOARD_HAS_RGB_LED +#endif + +#if CONFIG_IDF_TARGET_ESP32S2 + #define LED_BUILTIN 18 // Saola-1 & DevKitM-1 + //#define LED_BUILTIN 45 // Kaluga +#elif CONFIG_IDF_TARGET_ESP32S3 + // Some boards have too low voltage on this pin (board design bug) + // Use different pin with 3V and connect with 48 + #define LED_BUILTIN 48 +#elif CONFIG_IDF_TARGET_ESP32C3 + #define LED_BUILTIN 8 +#else + #define LED_BUILTIN 21 // ESP32 has no builtin RGB LED +#endif + #define digitalPinIsValid(pin) GPIO_IS_VALID_GPIO(pin) #define digitalPinCanOutput(pin) GPIO_IS_VALID_OUTPUT_GPIO(pin) @@ -70,6 +87,7 @@ extern "C" { #define digitalPinToDacChannel(pin) (((pin) == DAC_CHANNEL_1_GPIO_NUM)?0:((pin) == DAC_CHANNEL_2_GPIO_NUM)?1:-1) void pinMode(uint8_t pin, uint8_t mode); +void RGBLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val); void digitalWrite(uint8_t pin, uint8_t val); int digitalRead(uint8_t pin); From cd31356462e875e32aeaff381a5b6bfe0421520b Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Wed, 25 May 2022 14:08:58 +0200 Subject: [PATCH 2/9] Moved constants to pins_arduino.h --- cores/esp32/esp32-hal-gpio.c | 35 +++++++++++++++++++++++++-------- cores/esp32/esp32-hal-gpio.h | 16 --------------- variants/esp32c3/pins_arduino.h | 8 ++++++++ variants/esp32s2/pins_arduino.h | 9 +++++++++ variants/esp32s3/pins_arduino.h | 10 ++++++++++ 5 files changed, 54 insertions(+), 24 deletions(-) diff --git a/cores/esp32/esp32-hal-gpio.c b/cores/esp32/esp32-hal-gpio.c index 58258d75776..d94d48b565d 100644 --- a/cores/esp32/esp32-hal-gpio.c +++ b/cores/esp32/esp32-hal-gpio.c @@ -15,6 +15,7 @@ #include "esp32-hal-gpio.h" #include "hal/gpio_hal.h" #include "soc/soc_caps.h" +#include "pins_arduino.h" // It fixes lack of pin definition for S3 and for any future SoC // this function works for ESP32, ESP32-S2 and ESP32-S3 - including the C3, it will return -1 for any pin @@ -91,6 +92,17 @@ static InterruptHandle_t __pinInterruptHandlers[SOC_GPIO_PIN_COUNT] = {0,}; extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode) { + log_d("pin %d", pin); +#ifdef BOARD_HAS_NEOPIXEL + log_d("BOARD_HAS_NEOPIXEL"); + if (pin == LED_BUILTIN){ + log_d("pin == LED_BUILTIN; call __pinMode(%d)", NEOPIXEL_PIN); + __pinMode(NEOPIXEL_PIN, mode); + return; + } +#endif + + log_d("Normal operation"); if (!GPIO_IS_VALID_GPIO(pin)) { log_e("Invalid pin selected"); return; @@ -126,18 +138,25 @@ extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode) } void RGBLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val){ - static bool initialized = false; rmt_data_t led_data[24]; static rmt_obj_t* rmt_send = NULL; + static bool initialized = false; + + uint8_t _pin; + if(pin == LED_BUILTIN){ + _pin = NEOPIXEL_PIN; + }else{ + _pin = pin; + } if(!initialized){ - if ((rmt_send = rmtInit(pin, RMT_TX_MODE, RMT_MEM_64)) == NULL){ + if((rmt_send = rmtInit(_pin, RMT_TX_MODE, RMT_MEM_64)) == NULL){ log_e("RGB LED driver initialization failed!"); rmt_send = NULL; return; - } - rmtSetTick(rmt_send, 100); - initialized = true; + } + rmtSetTick(rmt_send, 100); + initialized = true; } int color[] = {green_val, red_val, blue_val}; // Color coding is in order GREEN, RED, BLUE @@ -165,11 +184,11 @@ void RGBLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_v extern void ARDUINO_ISR_ATTR __digitalWrite(uint8_t pin, uint8_t val) { - #ifdef BOARD_HAS_RGB_LED + #ifdef BOARD_HAS_NEOPIXEL if(pin == LED_BUILTIN){ //use RMT to set all channels on/off - const uint8_t comm_val = val != 0 ? 255 : 0; - RGBLedWrite(pin, comm_val, comm_val, comm_val); + const uint8_t comm_val = val != 0 ? LED_BRIGHTNESS : 0; + RGBLedWrite(LED_BUILTIN, comm_val, comm_val, comm_val); return; } #endif diff --git a/cores/esp32/esp32-hal-gpio.h b/cores/esp32/esp32-hal-gpio.h index 8a08129c8ee..44dd113a502 100644 --- a/cores/esp32/esp32-hal-gpio.h +++ b/cores/esp32/esp32-hal-gpio.h @@ -63,22 +63,6 @@ extern "C" { #define ONLOW_WE 0x0C #define ONHIGH_WE 0x0D -#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3 - #define BOARD_HAS_RGB_LED -#endif - -#if CONFIG_IDF_TARGET_ESP32S2 - #define LED_BUILTIN 18 // Saola-1 & DevKitM-1 - //#define LED_BUILTIN 45 // Kaluga -#elif CONFIG_IDF_TARGET_ESP32S3 - // Some boards have too low voltage on this pin (board design bug) - // Use different pin with 3V and connect with 48 - #define LED_BUILTIN 48 -#elif CONFIG_IDF_TARGET_ESP32C3 - #define LED_BUILTIN 8 -#else - #define LED_BUILTIN 21 // ESP32 has no builtin RGB LED -#endif #define digitalPinIsValid(pin) GPIO_IS_VALID_GPIO(pin) #define digitalPinCanOutput(pin) GPIO_IS_VALID_OUTPUT_GPIO(pin) diff --git a/variants/esp32c3/pins_arduino.h b/variants/esp32c3/pins_arduino.h index 8ce191ad23a..5dc01454c6b 100644 --- a/variants/esp32c3/pins_arduino.h +++ b/variants/esp32c3/pins_arduino.h @@ -2,11 +2,19 @@ #define Pins_Arduino_h #include +#include "soc/soc_caps.h" #define EXTERNAL_NUM_INTERRUPTS 22 #define NUM_DIGITAL_PINS 22 #define NUM_ANALOG_INPUTS 6 +static const uint8_t LED_BUILTIN = SOC_GPIO_PIN_COUNT+1; // non-existing pin +#define BUILTIN_LED LED_BUILTIN // backward compatibility +#define LED_BUILTIN LED_BUILTIN +#define BOARD_HAS_NEOPIXEL +#define NEOPIXEL_PIN 8 // Actual NeoPixel GPIO pin +#define LED_BRIGHTNESS 64 + #define analogInputToDigitalPin(p) (((p) +#include "soc/soc_caps.h" #define EXTERNAL_NUM_INTERRUPTS 46 #define NUM_DIGITAL_PINS 48 #define NUM_ANALOG_INPUTS 20 +static const uint8_t LED_BUILTIN = SOC_GPIO_PIN_COUNT+1; // non-existing pin +#define BUILTIN_LED LED_BUILTIN // backward compatibility +#define LED_BUILTIN LED_BUILTIN +#define BOARD_HAS_NEOPIXEL +#define NEOPIXEL_PIN 18 // Actual NeoPixel GPIO pin for Saola-1 & DevKitM-1 +//#define NEOPIXEL_PIN 45 // Actual NeoPixel GPIO pin for Kaluga +#define LED_BRIGHTNESS 64 + #define analogInputToDigitalPin(p) (((p)<20)?(analogChannelToDigitalPin(p)):-1) #define digitalPinToInterrupt(p) (((p)<48)?(p):-1) #define digitalPinHasPWM(p) (p < 46) diff --git a/variants/esp32s3/pins_arduino.h b/variants/esp32s3/pins_arduino.h index 59f298e4965..4ba753e6dca 100644 --- a/variants/esp32s3/pins_arduino.h +++ b/variants/esp32s3/pins_arduino.h @@ -2,6 +2,7 @@ #define Pins_Arduino_h #include +#include "soc/soc_caps.h" #define USB_VID 0x303a #define USB_PID 0x1001 @@ -10,6 +11,15 @@ #define NUM_DIGITAL_PINS 48 #define NUM_ANALOG_INPUTS 20 +// Some boards have too low voltage on this pin (board design bug) +// Use different pin with 3V and connect with 48 +static const uint8_t LED_BUILTIN = SOC_GPIO_PIN_COUNT+1; // non-existing pin +#define BUILTIN_LED LED_BUILTIN // backward compatibility +#define LED_BUILTIN LED_BUILTIN +#define BOARD_HAS_NEOPIXEL +#define NEOPIXEL_PIN 48 // Actual NeoPixel GPIO pin +#define LED_BRIGHTNESS 64 + #define analogInputToDigitalPin(p) (((p)<20)?(analogChannelToDigitalPin(p)):-1) #define digitalPinToInterrupt(p) (((p)<48)?(p):-1) #define digitalPinHasPWM(p) (p < 46) From 51ce37d57735f47428e4577b01118261b62e78b1 Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Thu, 26 May 2022 12:09:45 +0200 Subject: [PATCH 3/9] Changed pin definition + added example --- cores/esp32/esp32-hal-gpio.c | 19 ++++------ cores/esp32/esp32-hal-gpio.h | 5 ++- .../ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino | 38 +++++++++++++++++++ variants/esp32c3/pins_arduino.h | 3 +- variants/esp32s2/pins_arduino.h | 5 +-- variants/esp32s3/pins_arduino.h | 3 +- 6 files changed, 54 insertions(+), 19 deletions(-) create mode 100644 libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino diff --git a/cores/esp32/esp32-hal-gpio.c b/cores/esp32/esp32-hal-gpio.c index d94d48b565d..30ff622ca19 100644 --- a/cores/esp32/esp32-hal-gpio.c +++ b/cores/esp32/esp32-hal-gpio.c @@ -15,7 +15,6 @@ #include "esp32-hal-gpio.h" #include "hal/gpio_hal.h" #include "soc/soc_caps.h" -#include "pins_arduino.h" // It fixes lack of pin definition for S3 and for any future SoC // this function works for ESP32, ESP32-S2 and ESP32-S3 - including the C3, it will return -1 for any pin @@ -92,17 +91,13 @@ static InterruptHandle_t __pinInterruptHandlers[SOC_GPIO_PIN_COUNT] = {0,}; extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode) { - log_d("pin %d", pin); #ifdef BOARD_HAS_NEOPIXEL - log_d("BOARD_HAS_NEOPIXEL"); if (pin == LED_BUILTIN){ - log_d("pin == LED_BUILTIN; call __pinMode(%d)", NEOPIXEL_PIN); - __pinMode(NEOPIXEL_PIN, mode); + __pinMode(LED_BUILTIN-SOC_GPIO_PIN_COUNT, mode); return; } #endif - log_d("Normal operation"); if (!GPIO_IS_VALID_GPIO(pin)) { log_e("Invalid pin selected"); return; @@ -137,6 +132,7 @@ extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode) } } +#ifdef BOARD_HAS_NEOPIXEL void RGBLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val){ rmt_data_t led_data[24]; static rmt_obj_t* rmt_send = NULL; @@ -144,19 +140,19 @@ void RGBLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_v uint8_t _pin; if(pin == LED_BUILTIN){ - _pin = NEOPIXEL_PIN; + _pin = LED_BUILTIN-SOC_GPIO_PIN_COUNT; }else{ _pin = pin; } if(!initialized){ - if((rmt_send = rmtInit(_pin, RMT_TX_MODE, RMT_MEM_64)) == NULL){ + if((rmt_send = rmtInit(_pin, RMT_TX_MODE, RMT_MEM_64)) == NULL){ log_e("RGB LED driver initialization failed!"); rmt_send = NULL; return; - } - rmtSetTick(rmt_send, 100); - initialized = true; + } + rmtSetTick(rmt_send, 100); + initialized = true; } int color[] = {green_val, red_val, blue_val}; // Color coding is in order GREEN, RED, BLUE @@ -181,6 +177,7 @@ void RGBLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_v } rmtWrite(rmt_send, led_data, 24); } +#endif extern void ARDUINO_ISR_ATTR __digitalWrite(uint8_t pin, uint8_t val) { diff --git a/cores/esp32/esp32-hal-gpio.h b/cores/esp32/esp32-hal-gpio.h index 44dd113a502..2ba69a67083 100644 --- a/cores/esp32/esp32-hal-gpio.h +++ b/cores/esp32/esp32-hal-gpio.h @@ -26,6 +26,7 @@ extern "C" { #include "esp32-hal.h" #include "soc/soc_caps.h" +#include "pins_arduino.h" #if (CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3) #define NUM_OUPUT_PINS 46 @@ -71,7 +72,9 @@ extern "C" { #define digitalPinToDacChannel(pin) (((pin) == DAC_CHANNEL_1_GPIO_NUM)?0:((pin) == DAC_CHANNEL_2_GPIO_NUM)?1:-1) void pinMode(uint8_t pin, uint8_t mode); -void RGBLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val); +#ifdef BOARD_HAS_NEOPIXEL + void RGBLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val); +#endif void digitalWrite(uint8_t pin, uint8_t val); int digitalRead(uint8_t pin); diff --git a/libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino b/libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino new file mode 100644 index 00000000000..8c81de0a08e --- /dev/null +++ b/libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino @@ -0,0 +1,38 @@ +/* + BlinkRGB + + Demonstrates usage of onboard RGB LED on some ESP dev boards. + + Calling digitalWrite(LED_BUILTIN, HIGH) will use hidden RGB driver. + + RGBLedWrite demonstrates controll of each channel: + void RGBLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val) + + WARNING: After using digitalWrite to drive RGB LED it will be impossible to drive the same pin + with normal HIGH/LOW level +*/ +//#define LED_BRIGHTNESS 64 // Change white brightness (max 255) + +// the setup function runs once when you press reset or power the board + +void setup() { + // No need to initialize the RGB LED +} + +// the loop function runs over and over again forever +void loop() { + digitalWrite(LED_BUILTIN, HIGH); // Turn the RGB LED white + delay(1000); + log_w("LED LOW"); + digitalWrite(LED_BUILTIN, LOW); // Turn the RGB LED off + delay(1000); + + RGBLedWrite(LED_BUILTIN,255,0,0); // Red + delay(1000); + RGBLedWrite(LED_BUILTIN,0,255,0); // Green + delay(1000); + RGBLedWrite(LED_BUILTIN,0,0,255); // Blue + delay(1000); + RGBLedWrite(LED_BUILTIN,0,0,0); // Off / black + delay(1000); +} diff --git a/variants/esp32c3/pins_arduino.h b/variants/esp32c3/pins_arduino.h index 5dc01454c6b..0fce6340e08 100644 --- a/variants/esp32c3/pins_arduino.h +++ b/variants/esp32c3/pins_arduino.h @@ -8,11 +8,10 @@ #define NUM_DIGITAL_PINS 22 #define NUM_ANALOG_INPUTS 6 -static const uint8_t LED_BUILTIN = SOC_GPIO_PIN_COUNT+1; // non-existing pin +static const uint8_t LED_BUILTIN = SOC_GPIO_PIN_COUNT+8; #define BUILTIN_LED LED_BUILTIN // backward compatibility #define LED_BUILTIN LED_BUILTIN #define BOARD_HAS_NEOPIXEL -#define NEOPIXEL_PIN 8 // Actual NeoPixel GPIO pin #define LED_BRIGHTNESS 64 #define analogInputToDigitalPin(p) (((p) Date: Thu, 26 May 2022 14:20:17 +0200 Subject: [PATCH 4/9] Wrapped BlinkRGB in #ifdef BOARD_HAS_NEOPIXEL --- libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino b/libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino index 8c81de0a08e..76d75602ebc 100644 --- a/libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino +++ b/libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino @@ -20,7 +20,8 @@ void setup() { } // the loop function runs over and over again forever -void loop() { +void loop() { +#ifdef BOARD_HAS_NEOPIXEL digitalWrite(LED_BUILTIN, HIGH); // Turn the RGB LED white delay(1000); log_w("LED LOW"); @@ -35,4 +36,5 @@ void loop() { delay(1000); RGBLedWrite(LED_BUILTIN,0,0,0); // Off / black delay(1000); +#endif } From 50b63561264b0c395e9071546d10746780ac2899 Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Thu, 26 May 2022 17:15:05 +0200 Subject: [PATCH 5/9] Removed forgotten log from example --- libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino b/libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino index 76d75602ebc..cd88e631ad3 100644 --- a/libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino +++ b/libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino @@ -24,7 +24,6 @@ void loop() { #ifdef BOARD_HAS_NEOPIXEL digitalWrite(LED_BUILTIN, HIGH); // Turn the RGB LED white delay(1000); - log_w("LED LOW"); digitalWrite(LED_BUILTIN, LOW); // Turn the RGB LED off delay(1000); From 583e0301427b6e98a87c3fa94fa100d2fc19cb7f Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Thu, 26 May 2022 17:31:33 +0200 Subject: [PATCH 6/9] Moved RGBLedWrite to new file esp32-hal-rgb-led and created pinMode in variatn.cpp --- CMakeLists.txt | 1 + cores/esp32/esp32-hal-gpio.c | 54 --------------------------------- cores/esp32/esp32-hal-gpio.h | 3 -- cores/esp32/esp32-hal-rgb-led.c | 51 +++++++++++++++++++++++++++++++ cores/esp32/esp32-hal-rgb-led.h | 22 ++++++++++++++ cores/esp32/esp32-hal.h | 1 + variants/esp32c3/variant.cpp | 13 ++++++++ variants/esp32s2/variant.cpp | 13 ++++++++ variants/esp32s3/variant.cpp | 13 ++++++++ 9 files changed, 114 insertions(+), 57 deletions(-) create mode 100644 cores/esp32/esp32-hal-rgb-led.c create mode 100644 cores/esp32/esp32-hal-rgb-led.h create mode 100644 variants/esp32c3/variant.cpp create mode 100644 variants/esp32s2/variant.cpp create mode 100644 variants/esp32s3/variant.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 8eb8f4e45ef..53da85a4502 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,6 +36,7 @@ set(CORE_SRCS cores/esp32/esp32-hal-matrix.c cores/esp32/esp32-hal-misc.c cores/esp32/esp32-hal-psram.c + cores/esp32/esp32-hal-rgb-led.c cores/esp32/esp32-hal-sigmadelta.c cores/esp32/esp32-hal-spi.c cores/esp32/esp32-hal-time.c diff --git a/cores/esp32/esp32-hal-gpio.c b/cores/esp32/esp32-hal-gpio.c index 30ff622ca19..b9653978fc9 100644 --- a/cores/esp32/esp32-hal-gpio.c +++ b/cores/esp32/esp32-hal-gpio.c @@ -91,13 +91,6 @@ static InterruptHandle_t __pinInterruptHandlers[SOC_GPIO_PIN_COUNT] = {0,}; extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode) { -#ifdef BOARD_HAS_NEOPIXEL - if (pin == LED_BUILTIN){ - __pinMode(LED_BUILTIN-SOC_GPIO_PIN_COUNT, mode); - return; - } -#endif - if (!GPIO_IS_VALID_GPIO(pin)) { log_e("Invalid pin selected"); return; @@ -132,53 +125,6 @@ extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode) } } -#ifdef BOARD_HAS_NEOPIXEL -void RGBLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val){ - rmt_data_t led_data[24]; - static rmt_obj_t* rmt_send = NULL; - static bool initialized = false; - - uint8_t _pin; - if(pin == LED_BUILTIN){ - _pin = LED_BUILTIN-SOC_GPIO_PIN_COUNT; - }else{ - _pin = pin; - } - - if(!initialized){ - if((rmt_send = rmtInit(_pin, RMT_TX_MODE, RMT_MEM_64)) == NULL){ - log_e("RGB LED driver initialization failed!"); - rmt_send = NULL; - return; - } - rmtSetTick(rmt_send, 100); - initialized = true; - } - - int color[] = {green_val, red_val, blue_val}; // Color coding is in order GREEN, RED, BLUE - int i = 0; - for(int col=0; col<3; col++ ){ - for(int bit=0; bit<8; bit++){ - if((color[col] & (1<<(7-bit)))){ - // HIGH bit - led_data[i].level0 = 1; // T1H - led_data[i].duration0 = 8; // 0.8us - led_data[i].level1 = 0; // T1L - led_data[i].duration1 = 4; // 0.4us - }else{ - // LOW bit - led_data[i].level0 = 1; // T0H - led_data[i].duration0 = 4; // 0.4us - led_data[i].level1 = 0; // T0L - led_data[i].duration1 = 8; // 0.8us - } - i++; - } - } - rmtWrite(rmt_send, led_data, 24); -} -#endif - extern void ARDUINO_ISR_ATTR __digitalWrite(uint8_t pin, uint8_t val) { #ifdef BOARD_HAS_NEOPIXEL diff --git a/cores/esp32/esp32-hal-gpio.h b/cores/esp32/esp32-hal-gpio.h index 2ba69a67083..9f143811685 100644 --- a/cores/esp32/esp32-hal-gpio.h +++ b/cores/esp32/esp32-hal-gpio.h @@ -72,9 +72,6 @@ extern "C" { #define digitalPinToDacChannel(pin) (((pin) == DAC_CHANNEL_1_GPIO_NUM)?0:((pin) == DAC_CHANNEL_2_GPIO_NUM)?1:-1) void pinMode(uint8_t pin, uint8_t mode); -#ifdef BOARD_HAS_NEOPIXEL - void RGBLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val); -#endif void digitalWrite(uint8_t pin, uint8_t val); int digitalRead(uint8_t pin); diff --git a/cores/esp32/esp32-hal-rgb-led.c b/cores/esp32/esp32-hal-rgb-led.c new file mode 100644 index 00000000000..7bb0e70b9e7 --- /dev/null +++ b/cores/esp32/esp32-hal-rgb-led.c @@ -0,0 +1,51 @@ +#include "esp32-hal-rgb-led.h" + +#ifdef BOARD_HAS_NEOPIXEL + +void RGBLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val){ + log_d("RGB: %d %d %d", red_val, green_val, blue_val); + rmt_data_t led_data[24]; + static rmt_obj_t* rmt_send = NULL; + static bool initialized = false; + + uint8_t _pin; + if(pin == LED_BUILTIN){ + _pin = LED_BUILTIN-SOC_GPIO_PIN_COUNT; + }else{ + _pin = pin; + } + + if(!initialized){ + if((rmt_send = rmtInit(_pin, RMT_TX_MODE, RMT_MEM_64)) == NULL){ + log_e("RGB LED driver initialization failed!"); + rmt_send = NULL; + return; + } + rmtSetTick(rmt_send, 100); + initialized = true; + } + + int color[] = {green_val, red_val, blue_val}; // Color coding is in order GREEN, RED, BLUE + int i = 0; + for(int col=0; col<3; col++ ){ + for(int bit=0; bit<8; bit++){ + if((color[col] & (1<<(7-bit)))){ + // HIGH bit + led_data[i].level0 = 1; // T1H + led_data[i].duration0 = 8; // 0.8us + led_data[i].level1 = 0; // T1L + led_data[i].duration1 = 4; // 0.4us + }else{ + // LOW bit + led_data[i].level0 = 1; // T0H + led_data[i].duration0 = 4; // 0.4us + led_data[i].level1 = 0; // T0L + led_data[i].duration1 = 8; // 0.8us + } + i++; + } + } + rmtWrite(rmt_send, led_data, 24); +} + +#endif \ No newline at end of file diff --git a/cores/esp32/esp32-hal-rgb-led.h b/cores/esp32/esp32-hal-rgb-led.h new file mode 100644 index 00000000000..0e590bc2b65 --- /dev/null +++ b/cores/esp32/esp32-hal-rgb-led.h @@ -0,0 +1,22 @@ +#ifndef MAIN_ESP32_HAL_RGB_LED_H_ +#define MAIN_ESP32_HAL_RGB_LED_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "esp32-hal.h" +/* +#include "soc/soc_caps.h" +#include "pins_arduino.h" +*/ + +//#ifdef BOARD_HAS_NEOPIXEL + void RGBLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val); +//#endif + +#ifdef __cplusplus +} +#endif + +#endif /* MAIN_ESP32_HAL_RGB_LED_H_ */ \ No newline at end of file diff --git a/cores/esp32/esp32-hal.h b/cores/esp32/esp32-hal.h index 55e9f95769b..9039d3544c8 100644 --- a/cores/esp32/esp32-hal.h +++ b/cores/esp32/esp32-hal.h @@ -88,6 +88,7 @@ void yield(void); #include "esp32-hal-timer.h" #include "esp32-hal-bt.h" #include "esp32-hal-psram.h" +#include "esp32-hal-rgb-led.h" #include "esp32-hal-cpu.h" void analogWrite(uint8_t pin, int value); diff --git a/variants/esp32c3/variant.cpp b/variants/esp32c3/variant.cpp new file mode 100644 index 00000000000..244ab392d04 --- /dev/null +++ b/variants/esp32c3/variant.cpp @@ -0,0 +1,13 @@ +#include "esp32-hal-rgb-led.h" + +extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode) +{ + log_d("foo"); +#ifdef BOARD_HAS_NEOPIXEL + if (pin == LED_BUILTIN){ + __pinMode(LED_BUILTIN-SOC_GPIO_PIN_COUNT, mode); + return; + } +#endif + __pinMode(pin, mode); +} \ No newline at end of file diff --git a/variants/esp32s2/variant.cpp b/variants/esp32s2/variant.cpp new file mode 100644 index 00000000000..244ab392d04 --- /dev/null +++ b/variants/esp32s2/variant.cpp @@ -0,0 +1,13 @@ +#include "esp32-hal-rgb-led.h" + +extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode) +{ + log_d("foo"); +#ifdef BOARD_HAS_NEOPIXEL + if (pin == LED_BUILTIN){ + __pinMode(LED_BUILTIN-SOC_GPIO_PIN_COUNT, mode); + return; + } +#endif + __pinMode(pin, mode); +} \ No newline at end of file diff --git a/variants/esp32s3/variant.cpp b/variants/esp32s3/variant.cpp new file mode 100644 index 00000000000..244ab392d04 --- /dev/null +++ b/variants/esp32s3/variant.cpp @@ -0,0 +1,13 @@ +#include "esp32-hal-rgb-led.h" + +extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode) +{ + log_d("foo"); +#ifdef BOARD_HAS_NEOPIXEL + if (pin == LED_BUILTIN){ + __pinMode(LED_BUILTIN-SOC_GPIO_PIN_COUNT, mode); + return; + } +#endif + __pinMode(pin, mode); +} \ No newline at end of file From 8786e83e23c1df196d5cb6f57f646d0b8787772c Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Fri, 27 May 2022 10:23:51 +0200 Subject: [PATCH 7/9] Updated example - lowered single channel brightness to LED_BRIGHTNESS --- libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino b/libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino index cd88e631ad3..0c2cc7f0f67 100644 --- a/libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino +++ b/libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino @@ -27,13 +27,13 @@ void loop() { digitalWrite(LED_BUILTIN, LOW); // Turn the RGB LED off delay(1000); - RGBLedWrite(LED_BUILTIN,255,0,0); // Red + RGBLedWrite(LED_BUILTIN,LED_BRIGHTNESS,0,0); // Red delay(1000); - RGBLedWrite(LED_BUILTIN,0,255,0); // Green + RGBLedWrite(LED_BUILTIN,0,LED_BRIGHTNESS,0); // Green delay(1000); - RGBLedWrite(LED_BUILTIN,0,0,255); // Blue + RGBLedWrite(LED_BUILTIN,0,0,LED_BRIGHTNESS); // Blue delay(1000); RGBLedWrite(LED_BUILTIN,0,0,0); // Off / black - delay(1000); + delay(1000); #endif } From 10205b0ab84113b6db47e38b36013f7cb3d59552 Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Fri, 27 May 2022 12:39:48 +0200 Subject: [PATCH 8/9] Changed function name from RGBLedWrite to neopixelWrite + code polishing --- cores/esp32/esp32-hal-gpio.c | 2 +- cores/esp32/esp32-hal-rgb-led.c | 12 ++++------ cores/esp32/esp32-hal-rgb-led.h | 12 ++++------ .../ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino | 24 +++++++++---------- variants/esp32c3/variant.cpp | 1 - variants/esp32s2/variant.cpp | 1 - variants/esp32s3/variant.cpp | 1 - 7 files changed, 22 insertions(+), 31 deletions(-) diff --git a/cores/esp32/esp32-hal-gpio.c b/cores/esp32/esp32-hal-gpio.c index b9653978fc9..f74d71db8df 100644 --- a/cores/esp32/esp32-hal-gpio.c +++ b/cores/esp32/esp32-hal-gpio.c @@ -131,7 +131,7 @@ extern void ARDUINO_ISR_ATTR __digitalWrite(uint8_t pin, uint8_t val) if(pin == LED_BUILTIN){ //use RMT to set all channels on/off const uint8_t comm_val = val != 0 ? LED_BRIGHTNESS : 0; - RGBLedWrite(LED_BUILTIN, comm_val, comm_val, comm_val); + neopixelWrite(LED_BUILTIN, comm_val, comm_val, comm_val); return; } #endif diff --git a/cores/esp32/esp32-hal-rgb-led.c b/cores/esp32/esp32-hal-rgb-led.c index 7bb0e70b9e7..6776d324d99 100644 --- a/cores/esp32/esp32-hal-rgb-led.c +++ b/cores/esp32/esp32-hal-rgb-led.c @@ -1,19 +1,17 @@ #include "esp32-hal-rgb-led.h" -#ifdef BOARD_HAS_NEOPIXEL -void RGBLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val){ - log_d("RGB: %d %d %d", red_val, green_val, blue_val); +void neopixelWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val){ rmt_data_t led_data[24]; static rmt_obj_t* rmt_send = NULL; static bool initialized = false; - uint8_t _pin; + uint8_t _pin = pin; +#ifdef BOARD_HAS_NEOPIXEL if(pin == LED_BUILTIN){ _pin = LED_BUILTIN-SOC_GPIO_PIN_COUNT; - }else{ - _pin = pin; } +#endif if(!initialized){ if((rmt_send = rmtInit(_pin, RMT_TX_MODE, RMT_MEM_64)) == NULL){ @@ -47,5 +45,3 @@ void RGBLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_v } rmtWrite(rmt_send, led_data, 24); } - -#endif \ No newline at end of file diff --git a/cores/esp32/esp32-hal-rgb-led.h b/cores/esp32/esp32-hal-rgb-led.h index 0e590bc2b65..e2db0e91046 100644 --- a/cores/esp32/esp32-hal-rgb-led.h +++ b/cores/esp32/esp32-hal-rgb-led.h @@ -6,14 +6,12 @@ extern "C" { #endif #include "esp32-hal.h" -/* -#include "soc/soc_caps.h" -#include "pins_arduino.h" -*/ -//#ifdef BOARD_HAS_NEOPIXEL - void RGBLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val); -//#endif +#ifndef LED_BRIGHTNESS + #define LED_BRIGHTNESS 64 +#endif + +void neopixelWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val); #ifdef __cplusplus } diff --git a/libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino b/libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino index 0c2cc7f0f67..3c2ed4864c1 100644 --- a/libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino +++ b/libraries/ESP32/examples/GPIO/BlinkRGB/BlinkRGB.ino @@ -6,9 +6,9 @@ Calling digitalWrite(LED_BUILTIN, HIGH) will use hidden RGB driver. RGBLedWrite demonstrates controll of each channel: - void RGBLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val) + void neopixelWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val) - WARNING: After using digitalWrite to drive RGB LED it will be impossible to drive the same pin + WARNING: After using digitalWrite to drive RGB LED it will be impossible to drive the same pin with normal HIGH/LOW level */ //#define LED_BRIGHTNESS 64 // Change white brightness (max 255) @@ -23,17 +23,17 @@ void setup() { void loop() { #ifdef BOARD_HAS_NEOPIXEL digitalWrite(LED_BUILTIN, HIGH); // Turn the RGB LED white - delay(1000); + delay(1000); digitalWrite(LED_BUILTIN, LOW); // Turn the RGB LED off - delay(1000); - - RGBLedWrite(LED_BUILTIN,LED_BRIGHTNESS,0,0); // Red - delay(1000); - RGBLedWrite(LED_BUILTIN,0,LED_BRIGHTNESS,0); // Green - delay(1000); - RGBLedWrite(LED_BUILTIN,0,0,LED_BRIGHTNESS); // Blue - delay(1000); - RGBLedWrite(LED_BUILTIN,0,0,0); // Off / black + delay(1000); + + neopixelWrite(LED_BUILTIN,LED_BRIGHTNESS,0,0); // Red + delay(1000); + neopixelWrite(LED_BUILTIN,0,LED_BRIGHTNESS,0); // Green + delay(1000); + neopixelWrite(LED_BUILTIN,0,0,LED_BRIGHTNESS); // Blue + delay(1000); + neopixelWrite(LED_BUILTIN,0,0,0); // Off / black delay(1000); #endif } diff --git a/variants/esp32c3/variant.cpp b/variants/esp32c3/variant.cpp index 244ab392d04..937c6128dbf 100644 --- a/variants/esp32c3/variant.cpp +++ b/variants/esp32c3/variant.cpp @@ -2,7 +2,6 @@ extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode) { - log_d("foo"); #ifdef BOARD_HAS_NEOPIXEL if (pin == LED_BUILTIN){ __pinMode(LED_BUILTIN-SOC_GPIO_PIN_COUNT, mode); diff --git a/variants/esp32s2/variant.cpp b/variants/esp32s2/variant.cpp index 244ab392d04..937c6128dbf 100644 --- a/variants/esp32s2/variant.cpp +++ b/variants/esp32s2/variant.cpp @@ -2,7 +2,6 @@ extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode) { - log_d("foo"); #ifdef BOARD_HAS_NEOPIXEL if (pin == LED_BUILTIN){ __pinMode(LED_BUILTIN-SOC_GPIO_PIN_COUNT, mode); diff --git a/variants/esp32s3/variant.cpp b/variants/esp32s3/variant.cpp index 244ab392d04..937c6128dbf 100644 --- a/variants/esp32s3/variant.cpp +++ b/variants/esp32s3/variant.cpp @@ -2,7 +2,6 @@ extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode) { - log_d("foo"); #ifdef BOARD_HAS_NEOPIXEL if (pin == LED_BUILTIN){ __pinMode(LED_BUILTIN-SOC_GPIO_PIN_COUNT, mode); From c0aa3b8d16c91dacae610bed19d6111a51444df1 Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Fri, 17 Jun 2022 12:34:25 +0200 Subject: [PATCH 9/9] Moved pinSetup portion related to RGB back to common file --- cores/esp32/esp32-hal-gpio.c | 7 +++++++ variants/esp32c3/variant.cpp | 12 ------------ variants/esp32s2/variant.cpp | 12 ------------ variants/esp32s3/pins_arduino.h | 1 + variants/esp32s3/variant.cpp | 12 ------------ 5 files changed, 8 insertions(+), 36 deletions(-) delete mode 100644 variants/esp32c3/variant.cpp delete mode 100644 variants/esp32s2/variant.cpp delete mode 100644 variants/esp32s3/variant.cpp diff --git a/cores/esp32/esp32-hal-gpio.c b/cores/esp32/esp32-hal-gpio.c index f74d71db8df..ceef3bdfa5c 100644 --- a/cores/esp32/esp32-hal-gpio.c +++ b/cores/esp32/esp32-hal-gpio.c @@ -91,6 +91,13 @@ static InterruptHandle_t __pinInterruptHandlers[SOC_GPIO_PIN_COUNT] = {0,}; extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode) { +#ifdef BOARD_HAS_NEOPIXEL + if (pin == LED_BUILTIN){ + __pinMode(LED_BUILTIN-SOC_GPIO_PIN_COUNT, mode); + return; + } +#endif + if (!GPIO_IS_VALID_GPIO(pin)) { log_e("Invalid pin selected"); return; diff --git a/variants/esp32c3/variant.cpp b/variants/esp32c3/variant.cpp deleted file mode 100644 index 937c6128dbf..00000000000 --- a/variants/esp32c3/variant.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "esp32-hal-rgb-led.h" - -extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode) -{ -#ifdef BOARD_HAS_NEOPIXEL - if (pin == LED_BUILTIN){ - __pinMode(LED_BUILTIN-SOC_GPIO_PIN_COUNT, mode); - return; - } -#endif - __pinMode(pin, mode); -} \ No newline at end of file diff --git a/variants/esp32s2/variant.cpp b/variants/esp32s2/variant.cpp deleted file mode 100644 index 937c6128dbf..00000000000 --- a/variants/esp32s2/variant.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "esp32-hal-rgb-led.h" - -extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode) -{ -#ifdef BOARD_HAS_NEOPIXEL - if (pin == LED_BUILTIN){ - __pinMode(LED_BUILTIN-SOC_GPIO_PIN_COUNT, mode); - return; - } -#endif - __pinMode(pin, mode); -} \ No newline at end of file diff --git a/variants/esp32s3/pins_arduino.h b/variants/esp32s3/pins_arduino.h index 28ad710e813..fc48ac691d5 100644 --- a/variants/esp32s3/pins_arduino.h +++ b/variants/esp32s3/pins_arduino.h @@ -13,6 +13,7 @@ // Some boards have too low voltage on this pin (board design bug) // Use different pin with 3V and connect with 48 +// and change this setup for the chosen pin (for example 38) static const uint8_t LED_BUILTIN = SOC_GPIO_PIN_COUNT+48; #define BUILTIN_LED LED_BUILTIN // backward compatibility #define LED_BUILTIN LED_BUILTIN diff --git a/variants/esp32s3/variant.cpp b/variants/esp32s3/variant.cpp deleted file mode 100644 index 937c6128dbf..00000000000 --- a/variants/esp32s3/variant.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "esp32-hal-rgb-led.h" - -extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode) -{ -#ifdef BOARD_HAS_NEOPIXEL - if (pin == LED_BUILTIN){ - __pinMode(LED_BUILTIN-SOC_GPIO_PIN_COUNT, mode); - return; - } -#endif - __pinMode(pin, mode); -} \ No newline at end of file