Skip to content

Commit 6967d8f

Browse files
committed
Initial implementation of RGB driver via digitalWrite
1 parent 1a7962e commit 6967d8f

File tree

2 files changed

+64
-0
lines changed

2 files changed

+64
-0
lines changed

Diff for: cores/esp32/esp32-hal-gpio.c

+46
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,54 @@ extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode)
125125
}
126126
}
127127

128+
void RGBLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val){
129+
static bool initialized = false;
130+
rmt_data_t led_data[24];
131+
static rmt_obj_t* rmt_send = NULL;
132+
133+
if(!initialized){
134+
if ((rmt_send = rmtInit(pin, RMT_TX_MODE, RMT_MEM_64)) == NULL){
135+
log_e("RGB LED driver initialization failed!");
136+
rmt_send = NULL;
137+
return;
138+
}
139+
rmtSetTick(rmt_send, 100);
140+
initialized = true;
141+
}
142+
143+
int color[] = {green_val, red_val, blue_val}; // Color coding is in order GREEN, RED, BLUE
144+
int i = 0;
145+
for(int col=0; col<3; col++ ){
146+
for(int bit=0; bit<8; bit++){
147+
if((color[col] & (1<<(7-bit)))){
148+
// HIGH bit
149+
led_data[i].level0 = 1; // T1H
150+
led_data[i].duration0 = 8; // 0.8us
151+
led_data[i].level1 = 0; // T1L
152+
led_data[i].duration1 = 4; // 0.4us
153+
}else{
154+
// LOW bit
155+
led_data[i].level0 = 1; // T0H
156+
led_data[i].duration0 = 4; // 0.4us
157+
led_data[i].level1 = 0; // T0L
158+
led_data[i].duration1 = 8; // 0.8us
159+
}
160+
i++;
161+
}
162+
}
163+
rmtWrite(rmt_send, led_data, 24);
164+
}
165+
128166
extern void ARDUINO_ISR_ATTR __digitalWrite(uint8_t pin, uint8_t val)
129167
{
168+
#ifdef BOARD_HAS_RGB_LED
169+
if(pin == LED_BUILTIN){
170+
//use RMT to set all channels on/off
171+
const uint8_t comm_val = val != 0 ? 255 : 0;
172+
RGBLedWrite(pin, comm_val, comm_val, comm_val);
173+
return;
174+
}
175+
#endif
130176
gpio_set_level((gpio_num_t)pin, val);
131177
}
132178

Diff for: cores/esp32/esp32-hal-gpio.h

+18
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,31 @@ extern "C" {
6363
#define ONLOW_WE 0x0C
6464
#define ONHIGH_WE 0x0D
6565

66+
#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3
67+
#define BOARD_HAS_RGB_LED
68+
#endif
69+
70+
#if CONFIG_IDF_TARGET_ESP32S2
71+
#define LED_BUILTIN 18 // Saola-1 & DevKitM-1
72+
//#define LED_BUILTIN 45 // Kaluga
73+
#elif CONFIG_IDF_TARGET_ESP32S3
74+
// Some boards have too low voltage on this pin (board design bug)
75+
// Use different pin with 3V and connect with 48
76+
#define LED_BUILTIN 48
77+
#elif CONFIG_IDF_TARGET_ESP32C3
78+
#define LED_BUILTIN 8
79+
#else
80+
#define LED_BUILTIN 21 // ESP32 has no builtin RGB LED
81+
#endif
82+
6683
#define digitalPinIsValid(pin) GPIO_IS_VALID_GPIO(pin)
6784
#define digitalPinCanOutput(pin) GPIO_IS_VALID_OUTPUT_GPIO(pin)
6885

6986
#define digitalPinToRtcPin(pin) ((RTC_GPIO_IS_VALID_GPIO(pin))?rtc_io_number_get(pin):-1)
7087
#define digitalPinToDacChannel(pin) (((pin) == DAC_CHANNEL_1_GPIO_NUM)?0:((pin) == DAC_CHANNEL_2_GPIO_NUM)?1:-1)
7188

7289
void pinMode(uint8_t pin, uint8_t mode);
90+
void RGBLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val);
7391
void digitalWrite(uint8_t pin, uint8_t val);
7492
int digitalRead(uint8_t pin);
7593

0 commit comments

Comments
 (0)