Skip to content

Commit dfa3379

Browse files
committed
Add heartbeat LED
Surprisingly involve TBH, but it works! Tested on ESP32-C6 only for now.
1 parent 8f9293b commit dfa3379

11 files changed

Lines changed: 315 additions & 0 deletions

Kconfig

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,28 @@ config WIFI_WATCHDOG_CHECK_INTERVAL_SECONDS
3535
help
3636
Interval in seconds between WiFi watchdog checks.
3737

38+
choice HEARTBEAT_LED_TYPE
39+
prompt "Select heartbeat LED variant"
40+
default HEARTBEAT_LED_STRIP if $(dt_alias_enabled,led-strip)
41+
default HEARTBEAT_LED_GPIO if $(dt_alias_enabled,heartbeat-led)
42+
43+
config HEARTBEAT_LED_STRIP
44+
bool "WS2812 RGB LED strip"
45+
depends on LED_STRIP
46+
help
47+
Enable heartbeat LED using a WS2812 RGB LED strip.
48+
GREEN when WiFi is connected, RED otherwise.
49+
Blinks at a 1-second interval.
50+
51+
config HEARTBEAT_LED_GPIO
52+
bool "GPIO LED"
53+
depends on GPIO
54+
help
55+
Enable heartbeat LED using a simple GPIO-driven LED.
56+
Blinks at a 1-second interval unconditionally.
57+
58+
endchoice
59+
3860
endmenu
3961

4062
config MEMFAULT_BUILTIN_DEVICE_INFO_SOFTWARE_VERSION

boards/esp32c3_devkitm.overlay

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,48 @@
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

7+
#include <zephyr/dt-bindings/led/led.h>
8+
79
&wifi {
810
status = "okay";
911
};
1012

1113
&coretemp {
1214
status = "okay";
1315
};
16+
17+
/ {
18+
aliases {
19+
led-strip = &led_strip;
20+
};
21+
};
22+
23+
/* WS2812 RGB LED on GPIO8 via SPI2 */
24+
&spi2 {
25+
/* Workaround to support WS2812 driver */
26+
line-idle-low;
27+
28+
led_strip: ws2812@0 {
29+
compatible = "worldsemi,ws2812-spi";
30+
31+
/* SPI */
32+
reg = <0>;
33+
spi-max-frequency = <6400000>;
34+
35+
/* WS2812 */
36+
chain-length = <1>;
37+
spi-cpha;
38+
spi-one-frame = <0xf0>;
39+
spi-zero-frame = <0xc0>;
40+
color-mapping = <LED_COLOR_ID_GREEN LED_COLOR_ID_RED LED_COLOR_ID_BLUE>;
41+
};
42+
};
43+
44+
&pinctrl {
45+
spim2_default: spim2_default {
46+
group2 {
47+
/* WS2812 data on GPIO8 */
48+
pinmux = <SPIM2_MOSI_GPIO8>;
49+
};
50+
};
51+
};
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Enable DMA for heartbeat LED
2+
CONFIG_DMA=y
3+
CONFIG_LED_STRIP=y

boards/esp32c6_devkitc_esp32c6_hpcore.overlay

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,45 @@
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

7+
#include <zephyr/dt-bindings/led/led.h>
8+
79
&wifi {
810
status = "okay";
911
};
1012

1113
&coretemp {
1214
status = "okay";
1315
};
16+
17+
/ {
18+
aliases {
19+
led-strip = &led_strip;
20+
};
21+
};
22+
23+
/* WS2812 RGB LED on GPIO8 via I2S */
24+
&i2s_default {
25+
group1 {
26+
pinmux = <I2S_O_SD_GPIO8>;
27+
};
28+
};
29+
30+
i2s_led: &i2s {
31+
status = "okay";
32+
33+
dmas = <&dma 3>;
34+
dma-names = "tx";
35+
36+
led_strip: ws2812@0 {
37+
compatible = "worldsemi,ws2812-i2s";
38+
39+
reg = <0>;
40+
chain-length = <1>;
41+
color-mapping = <LED_COLOR_ID_GREEN LED_COLOR_ID_RED LED_COLOR_ID_BLUE>;
42+
reset-delay = <500>;
43+
};
44+
};
45+
46+
&dma {
47+
status = "okay";
48+
};
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
# Enable external SPI RAM
22
CONFIG_SPI=y
33
CONFIG_ESP_SPIRAM=y
4+
5+
# Enable DMA for heartbeat LED
6+
CONFIG_DMA=y
7+
CONFIG_LED_STRIP=y

boards/esp32s3_devkitc_esp32s3_procpu.overlay

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

7+
#include <zephyr/dt-bindings/led/led.h>
8+
79
&wifi {
810
status = "okay";
911
};
@@ -16,3 +18,36 @@
1618
&psram0 {
1719
size = <DT_SIZE_M(2)>;
1820
};
21+
22+
/ {
23+
aliases {
24+
led-strip = &led_strip;
25+
};
26+
};
27+
28+
/* WS2812 RGB LED on GPIO38 via I2S0 */
29+
&i2s0_default {
30+
group1 {
31+
pinmux = <I2S0_O_SD_GPIO38>;
32+
};
33+
};
34+
35+
i2s_led: &i2s0 {
36+
status = "okay";
37+
38+
dmas = <&dma 3>;
39+
dma-names = "tx";
40+
41+
led_strip: ws2812@0 {
42+
compatible = "worldsemi,ws2812-i2s";
43+
44+
reg = <0>;
45+
chain-length = <1>;
46+
color-mapping = <LED_COLOR_ID_GREEN LED_COLOR_ID_RED LED_COLOR_ID_BLUE>;
47+
reset-delay = <500>;
48+
};
49+
};
50+
51+
&dma {
52+
status = "okay";
53+
};
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Enable DMA + LED_STRIP for heartbeat LED
2+
CONFIG_DMA=y
3+
CONFIG_LED_STRIP=y

boards/esp32s3_devkitm_esp32s3_procpu.overlay

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,48 @@
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

7+
#include <zephyr/dt-bindings/led/led.h>
8+
79
&wifi {
810
status = "okay";
911
};
1012

1113
&coretemp {
1214
status = "okay";
1315
};
16+
17+
/ {
18+
aliases {
19+
led-strip = &led_strip;
20+
};
21+
};
22+
23+
/* WS2812 RGB LED on GPIO48 via SPI3 */
24+
&spi3 {
25+
/* Workaround to support WS2812 driver */
26+
line-idle-low;
27+
28+
led_strip: ws2812@0 {
29+
compatible = "worldsemi,ws2812-spi";
30+
31+
/* SPI */
32+
reg = <0>;
33+
spi-max-frequency = <6400000>;
34+
35+
/* WS2812 */
36+
chain-length = <1>;
37+
spi-cpha;
38+
spi-one-frame = <0xf0>;
39+
spi-zero-frame = <0xc0>;
40+
color-mapping = <LED_COLOR_ID_GREEN LED_COLOR_ID_RED LED_COLOR_ID_BLUE>;
41+
};
42+
};
43+
44+
&pinctrl {
45+
spim3_default: spim3_default {
46+
group2 {
47+
/* WS2812 data on GPIO48 */
48+
pinmux = <SPIM3_MOSI_GPIO48>;
49+
};
50+
};
51+
};

boards/esp_wrover_kit_procpu.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
CONFIG_HEARTBEAT_LED_GPIO=y
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
11
&wifi {
22
status = "okay";
33
};
4+
5+
/ {
6+
aliases {
7+
heartbeat-led = &red_led;
8+
};
9+
};

0 commit comments

Comments
 (0)