Compare commits

...

11 Commits

Author SHA1 Message Date
Ken Van Hoeylandt
7273b4069a Fix manifest 2026-07-16 22:17:07 +02:00
Ken Van Hoeylandt
ee0f45cd27 Set fixed version of esp_hosted 2026-07-16 22:11:27 +02:00
Ken Van Hoeylandt
d67d051268 Cleanup 2026-07-16 21:51:11 +02:00
Ken Van Hoeylandt
b9ac840db4 Fix for missing include 2026-07-16 20:45:29 +02:00
Ken Van Hoeylandt
722280379a Fix for channel collisions 2026-07-16 20:31:15 +02:00
Ken Van Hoeylandt
6772fd5059 Fix for build 2026-07-16 20:19:23 +02:00
Ken Van Hoeylandt
6986cbd1c5 Driver breakdown improvements 2026-07-16 20:14:10 +02:00
Ken Van Hoeylandt
822a7a2fd4 Bugfix 2026-07-16 20:14:03 +02:00
Ken Van Hoeylandt
387ed31087 Code quality 2026-07-16 20:09:19 +02:00
Ken Van Hoeylandt
3d125ccd87 Fix for channels 2026-07-16 20:04:12 +02:00
Ken Van Hoeylandt
14251f3b90 Fix for build 2026-07-16 19:58:32 +02:00
30 changed files with 243 additions and 156 deletions

View File

@ -46,7 +46,7 @@
pin = <&gpio0 4 GPIO_FLAG_NONE>; pin = <&gpio0 4 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <1>; ledc-channel = <0>;
inverted; inverted;
}; };
@ -55,7 +55,7 @@
pin = <&gpio0 16 GPIO_FLAG_NONE>; pin = <&gpio0 16 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <2>; ledc-channel = <1>;
inverted; inverted;
}; };
@ -64,7 +64,7 @@
pin = <&gpio0 17 GPIO_FLAG_NONE>; pin = <&gpio0 17 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <3>; ledc-channel = <2>;
inverted; inverted;
}; };
@ -82,8 +82,8 @@
compatible = "espressif,esp32-pwm-ledc"; compatible = "espressif,esp32-pwm-ledc";
pin = <&gpio0 27 GPIO_FLAG_NONE>; pin = <&gpio0 27 GPIO_FLAG_NONE>;
period-ns = <1953125>; period-ns = <1953125>;
ledc-timer = <0>; ledc-timer = <1>;
ledc-channel = <0>; ledc-channel = <3>;
}; };
display_backlight { display_backlight {

View File

@ -31,7 +31,7 @@
pin = <&gpio0 4 GPIO_FLAG_NONE>; pin = <&gpio0 4 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <1>; ledc-channel = <0>;
inverted; inverted;
}; };
@ -40,7 +40,7 @@
pin = <&gpio0 16 GPIO_FLAG_NONE>; pin = <&gpio0 16 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <2>; ledc-channel = <1>;
inverted; inverted;
}; };
@ -49,7 +49,7 @@
pin = <&gpio0 17 GPIO_FLAG_NONE>; pin = <&gpio0 17 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <3>; ledc-channel = <2>;
inverted; inverted;
}; };
@ -67,8 +67,8 @@
compatible = "espressif,esp32-pwm-ledc"; compatible = "espressif,esp32-pwm-ledc";
pin = <&gpio0 27 GPIO_FLAG_NONE>; pin = <&gpio0 27 GPIO_FLAG_NONE>;
period-ns = <1953125>; period-ns = <1953125>;
ledc-timer = <0>; ledc-timer = <1>;
ledc-channel = <0>; ledc-channel = <3>;
}; };
display_backlight { display_backlight {

View File

@ -40,7 +40,7 @@
pin = <&gpio0 4 GPIO_FLAG_NONE>; pin = <&gpio0 4 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <1>; ledc-channel = <0>;
inverted; inverted;
}; };
@ -49,7 +49,7 @@
pin = <&gpio0 16 GPIO_FLAG_NONE>; pin = <&gpio0 16 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <2>; ledc-channel = <1>;
inverted; inverted;
}; };
@ -58,7 +58,7 @@
pin = <&gpio0 17 GPIO_FLAG_NONE>; pin = <&gpio0 17 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <3>; ledc-channel = <2>;
inverted; inverted;
}; };
@ -66,8 +66,8 @@
compatible = "espressif,esp32-pwm-ledc"; compatible = "espressif,esp32-pwm-ledc";
pin = <&gpio0 21 GPIO_FLAG_NONE>; pin = <&gpio0 21 GPIO_FLAG_NONE>;
period-ns = <1953125>; period-ns = <1953125>;
ledc-timer = <0>; ledc-timer = <1>;
ledc-channel = <0>; ledc-channel = <3>;
}; };
rgb_led_pwm { rgb_led_pwm {

View File

@ -40,7 +40,7 @@
pin = <&gpio0 4 GPIO_FLAG_NONE>; pin = <&gpio0 4 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <1>; ledc-channel = <0>;
inverted; inverted;
}; };
@ -49,7 +49,7 @@
pin = <&gpio0 16 GPIO_FLAG_NONE>; pin = <&gpio0 16 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <2>; ledc-channel = <1>;
inverted; inverted;
}; };
@ -58,7 +58,7 @@
pin = <&gpio0 17 GPIO_FLAG_NONE>; pin = <&gpio0 17 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <3>; ledc-channel = <2>;
inverted; inverted;
}; };
@ -76,8 +76,8 @@
compatible = "espressif,esp32-pwm-ledc"; compatible = "espressif,esp32-pwm-ledc";
pin = <&gpio0 21 GPIO_FLAG_NONE>; pin = <&gpio0 21 GPIO_FLAG_NONE>;
period-ns = <1953125>; period-ns = <1953125>;
ledc-timer = <0>; ledc-timer = <1>;
ledc-channel = <0>; ledc-channel = <3>;
}; };
display_backlight { display_backlight {

View File

@ -46,7 +46,7 @@
pin = <&gpio0 4 GPIO_FLAG_NONE>; pin = <&gpio0 4 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <1>; ledc-channel = <0>;
inverted; inverted;
}; };
@ -55,7 +55,7 @@
pin = <&gpio0 16 GPIO_FLAG_NONE>; pin = <&gpio0 16 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <2>; ledc-channel = <1>;
inverted; inverted;
}; };
@ -64,7 +64,7 @@
pin = <&gpio0 17 GPIO_FLAG_NONE>; pin = <&gpio0 17 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <3>; ledc-channel = <2>;
inverted; inverted;
}; };
@ -82,8 +82,8 @@
compatible = "espressif,esp32-pwm-ledc"; compatible = "espressif,esp32-pwm-ledc";
pin = <&gpio0 27 GPIO_FLAG_NONE>; pin = <&gpio0 27 GPIO_FLAG_NONE>;
period-ns = <33333>; period-ns = <33333>;
ledc-timer = <0>; ledc-timer = <1>;
ledc-channel = <0>; ledc-channel = <3>;
}; };
display_backlight { display_backlight {

View File

@ -56,7 +56,7 @@
pin = <&gpio0 4 GPIO_FLAG_NONE>; pin = <&gpio0 4 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <1>; ledc-channel = <0>;
inverted; inverted;
}; };
@ -65,7 +65,7 @@
pin = <&gpio0 16 GPIO_FLAG_NONE>; pin = <&gpio0 16 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <2>; ledc-channel = <1>;
inverted; inverted;
}; };
@ -74,7 +74,7 @@
pin = <&gpio0 17 GPIO_FLAG_NONE>; pin = <&gpio0 17 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <3>; ledc-channel = <2>;
inverted; inverted;
}; };
@ -92,8 +92,8 @@
compatible = "espressif,esp32-pwm-ledc"; compatible = "espressif,esp32-pwm-ledc";
pin = <&gpio0 27 GPIO_FLAG_NONE>; pin = <&gpio0 27 GPIO_FLAG_NONE>;
period-ns = <33333>; period-ns = <33333>;
ledc-timer = <0>; ledc-timer = <1>;
ledc-channel = <0>; ledc-channel = <3>;
}; };
display_backlight { display_backlight {

View File

@ -31,7 +31,7 @@
pin = <&gpio0 22 GPIO_FLAG_NONE>; pin = <&gpio0 22 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <1>; ledc-channel = <0>;
inverted; inverted;
}; };
@ -40,7 +40,7 @@
pin = <&gpio0 16 GPIO_FLAG_NONE>; pin = <&gpio0 16 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <2>; ledc-channel = <1>;
inverted; inverted;
}; };
@ -49,7 +49,7 @@
pin = <&gpio0 17 GPIO_FLAG_NONE>; pin = <&gpio0 17 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <3>; ledc-channel = <2>;
inverted; inverted;
}; };
@ -67,8 +67,8 @@
compatible = "espressif,esp32-pwm-ledc"; compatible = "espressif,esp32-pwm-ledc";
pin = <&gpio0 21 GPIO_FLAG_NONE>; pin = <&gpio0 21 GPIO_FLAG_NONE>;
period-ns = <1953125>; period-ns = <1953125>;
ledc-timer = <0>; ledc-timer = <1>;
ledc-channel = <0>; ledc-channel = <3>;
}; };
display_backlight { display_backlight {

View File

@ -47,7 +47,7 @@
pin = <&gpio0 22 GPIO_FLAG_NONE>; pin = <&gpio0 22 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <1>; ledc-channel = <0>;
inverted; inverted;
}; };
@ -56,7 +56,7 @@
pin = <&gpio0 16 GPIO_FLAG_NONE>; pin = <&gpio0 16 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <2>; ledc-channel = <1>;
inverted; inverted;
}; };
@ -65,7 +65,7 @@
pin = <&gpio0 17 GPIO_FLAG_NONE>; pin = <&gpio0 17 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <3>; ledc-channel = <2>;
inverted; inverted;
}; };
@ -93,8 +93,8 @@
compatible = "espressif,esp32-pwm-ledc"; compatible = "espressif,esp32-pwm-ledc";
pin = <&gpio0 27 GPIO_FLAG_NONE>; pin = <&gpio0 27 GPIO_FLAG_NONE>;
period-ns = <25000>; period-ns = <25000>;
ledc-timer = <0>; ledc-timer = <1>;
ledc-channel = <0>; ledc-channel = <3>;
}; };
display_backlight { display_backlight {

View File

@ -2,5 +2,5 @@ file(GLOB_RECURSE SOURCE_FILES source/*.c*)
idf_component_register( idf_component_register(
SRCS ${SOURCE_FILES} SRCS ${SOURCE_FILES}
REQUIRES TactilityKernel driver REQUIRES TactilityKernel
) )

View File

@ -2,5 +2,5 @@ file(GLOB_RECURSE SOURCE_FILES source/*.c*)
idf_component_register( idf_component_register(
SRCS ${SOURCE_FILES} SRCS ${SOURCE_FILES}
REQUIRES TactilityKernel driver REQUIRES TactilityKernel
) )

View File

@ -2,5 +2,5 @@ file(GLOB_RECURSE SOURCE_FILES source/*.c*)
idf_component_register( idf_component_register(
SRCS ${SOURCE_FILES} SRCS ${SOURCE_FILES}
REQUIRES TactilityKernel driver REQUIRES TactilityKernel
) )

View File

@ -2,5 +2,5 @@ file(GLOB_RECURSE SOURCE_FILES source/*.c*)
idf_component_register( idf_component_register(
SRCS ${SOURCE_FILES} SRCS ${SOURCE_FILES}
REQUIRES TactilityKernel driver REQUIRES TactilityKernel
) )

View File

@ -1,12 +1,13 @@
/dts-v1/; /dts-v1/;
#include <tactility/bindings/root.h> #include <tactility/bindings/root.h>
#include <tactility/bindings/esp32_wifi_pinned.h>
#include <tactility/bindings/esp32_gpio.h> #include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h> #include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_pwm_ledc.h>
#include <tactility/bindings/esp32_spi.h> #include <tactility/bindings/esp32_spi.h>
#include <tactility/bindings/esp32_uart.h> #include <tactility/bindings/esp32_uart.h>
#include <tactility/bindings/esp32_sdspi.h> #include <tactility/bindings/esp32_sdspi.h>
#include <tactility/bindings/esp32_wifi_pinned.h>
#include <tactility/bindings/display_placeholder.h> #include <tactility/bindings/display_placeholder.h>
#include <tactility/bindings/rgb_led_pwm.h> #include <tactility/bindings/rgb_led_pwm.h>
@ -76,13 +77,12 @@
pin-rx = <&gpio0 21 GPIO_FLAG_NONE>; pin-rx = <&gpio0 21 GPIO_FLAG_NONE>;
}; };
rgb_led_channel_red { rgb_led_channel_red {
compatible = "espressif,esp32-pwm-ledc"; compatible = "espressif,esp32-pwm-ledc";
pin = <&gpio0 4 GPIO_FLAG_NONE>; pin = <&gpio0 4 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <1>; ledc-channel = <0>;
inverted; inverted;
}; };
@ -91,7 +91,7 @@
pin = <&gpio0 16 GPIO_FLAG_NONE>; pin = <&gpio0 16 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <2>; ledc-channel = <1>;
inverted; inverted;
}; };
@ -100,11 +100,8 @@
pin = <&gpio0 17 GPIO_FLAG_NONE>; pin = <&gpio0 17 GPIO_FLAG_NONE>;
period-ns = <500000>; period-ns = <500000>;
ledc-timer = <0>; ledc-timer = <0>;
ledc-channel = <3>; ledc-channel = <2>;
inverted; inverted;
// Default is red, and we want to reset it to off by default
default-color = <0 0 0>;
enabled;
}; };
rgb_led_pwm { rgb_led_pwm {
@ -112,5 +109,8 @@
pwm-red = <&rgb_led_channel_red>; pwm-red = <&rgb_led_channel_red>;
pwm-green = <&rgb_led_channel_green>; pwm-green = <&rgb_led_channel_green>;
pwm-blue = <&rgb_led_channel_blue>; pwm-blue = <&rgb_led_channel_blue>;
// Default is red, and we want to reset it to off by default
default-color = <0 0 0>;
enabled;
}; };
}; };

View File

@ -105,22 +105,27 @@ static error_t start(Device* device) {
static error_t stop(Device* device) { static error_t stop(Device* device) {
auto* internal = static_cast<Cst816sInternal*>(device_get_driver_data(device)); auto* internal = static_cast<Cst816sInternal*>(device_get_driver_data(device));
bool ok = true;
// esp_lcd_touch_del() only releases the touch-side resources; the panel IO handle is owned // esp_lcd_touch_del() only releases the touch-side resources; the panel IO handle is owned
// separately and needs its own deletion. // separately and needs its own deletion.
if (internal->touch_handle != nullptr) {
if (esp_lcd_touch_del(internal->touch_handle) != ESP_OK) { if (esp_lcd_touch_del(internal->touch_handle) != ESP_OK) {
LOG_E(TAG, "Failed to delete touch handle"); LOG_E(TAG, "Failed to delete touch handle");
ok = false; return ERROR_RESOURCE;
}
internal->touch_handle = nullptr;
} }
if (internal->io_handle != nullptr) {
if (esp_lcd_panel_io_del(internal->io_handle) != ESP_OK) { if (esp_lcd_panel_io_del(internal->io_handle) != ESP_OK) {
LOG_E(TAG, "Failed to delete panel IO handle"); LOG_E(TAG, "Failed to delete panel IO handle");
ok = false; return ERROR_RESOURCE;
}
internal->io_handle = nullptr;
} }
free(internal); free(internal);
return ok ? ERROR_NONE : ERROR_RESOURCE; device_set_driver_data(device, nullptr);
return ERROR_NONE;
} }
// endregion // endregion

View File

@ -105,22 +105,27 @@ static error_t start(Device* device) {
static error_t stop(Device* device) { static error_t stop(Device* device) {
auto* internal = static_cast<Ft5x06Internal*>(device_get_driver_data(device)); auto* internal = static_cast<Ft5x06Internal*>(device_get_driver_data(device));
bool ok = true;
// esp_lcd_touch_del() only releases the touch-side resources; the panel IO handle is owned // esp_lcd_touch_del() only releases the touch-side resources; the panel IO handle is owned
// separately and needs its own deletion. // separately and needs its own deletion.
if (internal->touch_handle != nullptr) {
if (esp_lcd_touch_del(internal->touch_handle) != ESP_OK) { if (esp_lcd_touch_del(internal->touch_handle) != ESP_OK) {
LOG_E(TAG, "Failed to delete touch handle"); LOG_E(TAG, "Failed to delete touch handle");
ok = false; return ERROR_RESOURCE;
}
internal->touch_handle = nullptr;
} }
if (internal->io_handle != nullptr) {
if (esp_lcd_panel_io_del(internal->io_handle) != ESP_OK) { if (esp_lcd_panel_io_del(internal->io_handle) != ESP_OK) {
LOG_E(TAG, "Failed to delete panel IO handle"); LOG_E(TAG, "Failed to delete panel IO handle");
ok = false; return ERROR_RESOURCE;
}
internal->io_handle = nullptr;
} }
free(internal); free(internal);
return ok ? ERROR_NONE : ERROR_RESOURCE; device_set_driver_data(device, nullptr);
return ERROR_NONE;
} }
// endregion // endregion

View File

@ -105,22 +105,27 @@ static error_t start(Device* device) {
static error_t stop(Device* device) { static error_t stop(Device* device) {
auto* internal = static_cast<Ft6x36Internal*>(device_get_driver_data(device)); auto* internal = static_cast<Ft6x36Internal*>(device_get_driver_data(device));
bool ok = true;
// esp_lcd_touch_del() only releases the touch-side resources; the panel IO handle is owned // esp_lcd_touch_del() only releases the touch-side resources; the panel IO handle is owned
// separately and needs its own deletion. // separately and needs its own deletion.
if (internal->touch_handle != nullptr) {
if (esp_lcd_touch_del(internal->touch_handle) != ESP_OK) { if (esp_lcd_touch_del(internal->touch_handle) != ESP_OK) {
LOG_E(TAG, "Failed to delete touch handle"); LOG_E(TAG, "Failed to delete touch handle");
ok = false; return ERROR_RESOURCE;
}
internal->touch_handle = nullptr;
} }
if (internal->io_handle != nullptr) {
if (esp_lcd_panel_io_del(internal->io_handle) != ESP_OK) { if (esp_lcd_panel_io_del(internal->io_handle) != ESP_OK) {
LOG_E(TAG, "Failed to delete panel IO handle"); LOG_E(TAG, "Failed to delete panel IO handle");
ok = false; return ERROR_RESOURCE;
}
internal->io_handle = nullptr;
} }
free(internal); free(internal);
return ok ? ERROR_NONE : ERROR_RESOURCE; device_set_driver_data(device, nullptr);
return ERROR_NONE;
} }
// endregion // endregion

View File

@ -114,22 +114,27 @@ static error_t start(Device* device) {
static error_t stop(Device* device) { static error_t stop(Device* device) {
auto* internal = static_cast<Gt911Internal*>(device_get_driver_data(device)); auto* internal = static_cast<Gt911Internal*>(device_get_driver_data(device));
bool ok = true;
// esp_lcd_touch_del() only releases the touch-side resources; the panel IO handle is owned // esp_lcd_touch_del() only releases the touch-side resources; the panel IO handle is owned
// separately and needs its own deletion. // separately and needs its own deletion.
if (internal->touch_handle != nullptr) {
if (esp_lcd_touch_del(internal->touch_handle) != ESP_OK) { if (esp_lcd_touch_del(internal->touch_handle) != ESP_OK) {
LOG_E(TAG, "Failed to delete touch handle"); LOG_E(TAG, "Failed to delete touch handle");
ok = false; return ERROR_RESOURCE;
}
internal->touch_handle = nullptr;
} }
if (internal->io_handle != nullptr) {
if (esp_lcd_panel_io_del(internal->io_handle) != ESP_OK) { if (esp_lcd_panel_io_del(internal->io_handle) != ESP_OK) {
LOG_E(TAG, "Failed to delete panel IO handle"); LOG_E(TAG, "Failed to delete panel IO handle");
ok = false; return ERROR_RESOURCE;
}
internal->io_handle = nullptr;
} }
free(internal); free(internal);
return ok ? ERROR_NONE : ERROR_RESOURCE; device_set_driver_data(device, nullptr);
return ERROR_NONE;
} }
// endregion // endregion

View File

@ -165,20 +165,26 @@ static error_t start(Device* device) {
static error_t stop(Device* device) { static error_t stop(Device* device) {
auto* internal = static_cast<Ili9341Internal*>(device_get_driver_data(device)); auto* internal = static_cast<Ili9341Internal*>(device_get_driver_data(device));
error_t result = ERROR_NONE; if (internal->panel_handle != nullptr) {
if (esp_lcd_panel_del(internal->panel_handle) != ESP_OK) { if (esp_lcd_panel_del(internal->panel_handle) != ESP_OK) {
LOG_E(TAG, "Failed to delete panel"); LOG_E(TAG, "Failed to delete panel");
result = ERROR_RESOURCE; return ERROR_RESOURCE;
} }
internal->panel_handle = nullptr;
}
if (internal->io_handle != nullptr) {
if (esp_lcd_panel_io_del(internal->io_handle) != ESP_OK) { if (esp_lcd_panel_io_del(internal->io_handle) != ESP_OK) {
LOG_E(TAG, "Failed to delete panel IO"); LOG_E(TAG, "Failed to delete panel IO");
result = ERROR_RESOURCE; return ERROR_RESOURCE;
}
internal->io_handle = nullptr;
} }
vSemaphoreDelete(internal->draw_done_semaphore); vSemaphoreDelete(internal->draw_done_semaphore);
free(internal); free(internal);
return result; device_set_driver_data(device, nullptr);
return ERROR_NONE;
} }
// endregion // endregion

View File

@ -161,17 +161,25 @@ static error_t start(Device* device) {
static error_t stop(Device* device) { static error_t stop(Device* device) {
auto* internal = static_cast<Ili9488Internal*>(device_get_driver_data(device)); auto* internal = static_cast<Ili9488Internal*>(device_get_driver_data(device));
if (internal->panel_handle != nullptr) {
if (esp_lcd_panel_del(internal->panel_handle) != ESP_OK) { if (esp_lcd_panel_del(internal->panel_handle) != ESP_OK) {
LOG_E(TAG, "Failed to delete panel"); LOG_E(TAG, "Failed to delete panel");
return ERROR_RESOURCE; return ERROR_RESOURCE;
} }
internal->panel_handle = nullptr;
}
if (internal->io_handle != nullptr) {
if (esp_lcd_panel_io_del(internal->io_handle) != ESP_OK) { if (esp_lcd_panel_io_del(internal->io_handle) != ESP_OK) {
LOG_E(TAG, "Failed to delete panel IO"); LOG_E(TAG, "Failed to delete panel IO");
return ERROR_RESOURCE; return ERROR_RESOURCE;
} }
internal->io_handle = nullptr;
}
vSemaphoreDelete(internal->draw_done_semaphore); vSemaphoreDelete(internal->draw_done_semaphore);
free(internal); free(internal);
device_set_driver_data(device, nullptr);
return ERROR_NONE; return ERROR_NONE;
} }

View File

@ -256,15 +256,17 @@ static error_t start(Device* device) {
static error_t stop(Device* device) { static error_t stop(Device* device) {
auto* internal = static_cast<RgbDisplayInternal*>(device_get_driver_data(device)); auto* internal = static_cast<RgbDisplayInternal*>(device_get_driver_data(device));
if (internal->panel_handle != nullptr) {
if (esp_lcd_panel_del(internal->panel_handle) != ESP_OK) { if (esp_lcd_panel_del(internal->panel_handle) != ESP_OK) {
LOG_E(TAG, "Failed to delete panel"); LOG_E(TAG, "Failed to delete panel");
vSemaphoreDelete(internal->frame_complete_semaphore);
free(internal);
return ERROR_RESOURCE; return ERROR_RESOURCE;
} }
internal->panel_handle = nullptr;
}
vSemaphoreDelete(internal->frame_complete_semaphore); vSemaphoreDelete(internal->frame_complete_semaphore);
free(internal); free(internal);
device_set_driver_data(device, nullptr);
return ERROR_NONE; return ERROR_NONE;
} }

View File

@ -204,20 +204,26 @@ static error_t start(Device* device) {
static error_t stop(Device* device) { static error_t stop(Device* device) {
auto* internal = static_cast<St7789I8080Internal*>(device_get_driver_data(device)); auto* internal = static_cast<St7789I8080Internal*>(device_get_driver_data(device));
error_t result = ERROR_NONE; if (internal->panel_handle != nullptr) {
if (esp_lcd_panel_del(internal->panel_handle) != ESP_OK) { if (esp_lcd_panel_del(internal->panel_handle) != ESP_OK) {
LOG_E(TAG, "Failed to delete panel"); LOG_E(TAG, "Failed to delete panel");
result = ERROR_RESOURCE; return ERROR_RESOURCE;
} }
internal->panel_handle = nullptr;
}
if (internal->io_handle != nullptr) {
if (esp_lcd_panel_io_del(internal->io_handle) != ESP_OK) { if (esp_lcd_panel_io_del(internal->io_handle) != ESP_OK) {
LOG_E(TAG, "Failed to delete panel IO"); LOG_E(TAG, "Failed to delete panel IO");
result = ERROR_RESOURCE; return ERROR_RESOURCE;
}
internal->io_handle = nullptr;
} }
vSemaphoreDelete(internal->draw_done_semaphore); vSemaphoreDelete(internal->draw_done_semaphore);
free(internal); free(internal);
return result; device_set_driver_data(device, nullptr);
return ERROR_NONE;
} }
// endregion // endregion

View File

@ -165,17 +165,25 @@ static error_t start(Device* device) {
static error_t stop(Device* device) { static error_t stop(Device* device) {
auto* internal = static_cast<St7789Internal*>(device_get_driver_data(device)); auto* internal = static_cast<St7789Internal*>(device_get_driver_data(device));
if (internal->panel_handle != nullptr) {
if (esp_lcd_panel_del(internal->panel_handle) != ESP_OK) { if (esp_lcd_panel_del(internal->panel_handle) != ESP_OK) {
LOG_E(TAG, "Failed to delete panel"); LOG_E(TAG, "Failed to delete panel");
return ERROR_RESOURCE; return ERROR_RESOURCE;
} }
internal->panel_handle = nullptr;
}
if (internal->io_handle != nullptr) {
if (esp_lcd_panel_io_del(internal->io_handle) != ESP_OK) { if (esp_lcd_panel_io_del(internal->io_handle) != ESP_OK) {
LOG_E(TAG, "Failed to delete panel IO"); LOG_E(TAG, "Failed to delete panel IO");
return ERROR_RESOURCE; return ERROR_RESOURCE;
} }
internal->io_handle = nullptr;
}
vSemaphoreDelete(internal->draw_done_semaphore); vSemaphoreDelete(internal->draw_done_semaphore);
free(internal); free(internal);
device_set_driver_data(device, nullptr);
return ERROR_NONE; return ERROR_NONE;
} }

View File

@ -165,20 +165,26 @@ static error_t start(Device* device) {
static error_t stop(Device* device) { static error_t stop(Device* device) {
auto* internal = static_cast<St7796Internal*>(device_get_driver_data(device)); auto* internal = static_cast<St7796Internal*>(device_get_driver_data(device));
error_t result = ERROR_NONE; if (internal->panel_handle != nullptr) {
if (esp_lcd_panel_del(internal->panel_handle) != ESP_OK) { if (esp_lcd_panel_del(internal->panel_handle) != ESP_OK) {
LOG_E(TAG, "Failed to delete panel"); LOG_E(TAG, "Failed to delete panel");
result = ERROR_RESOURCE; return ERROR_RESOURCE;
} }
internal->panel_handle = nullptr;
}
if (internal->io_handle != nullptr) {
if (esp_lcd_panel_io_del(internal->io_handle) != ESP_OK) { if (esp_lcd_panel_io_del(internal->io_handle) != ESP_OK) {
LOG_E(TAG, "Failed to delete panel IO"); LOG_E(TAG, "Failed to delete panel IO");
result = ERROR_RESOURCE; return ERROR_RESOURCE;
}
internal->io_handle = nullptr;
} }
vSemaphoreDelete(internal->draw_done_semaphore); vSemaphoreDelete(internal->draw_done_semaphore);
free(internal); free(internal);
return result; device_set_driver_data(device, nullptr);
return ERROR_NONE;
} }
// endregion // endregion

View File

@ -239,24 +239,30 @@ static error_t stop(Device* device) {
if (internal->power_supply_device != nullptr) { if (internal->power_supply_device != nullptr) {
destroy_power_supply_child(internal->power_supply_device); destroy_power_supply_child(internal->power_supply_device);
internal->power_supply_device = nullptr;
} }
bool ok = true;
// esp_lcd_touch_del() only releases the touch-side resources; the panel IO handle is owned // esp_lcd_touch_del() only releases the touch-side resources; the panel IO handle is owned
// separately and needs its own deletion. // separately and needs its own deletion.
if (internal->touch_handle != nullptr) {
if (esp_lcd_touch_del(internal->touch_handle) != ESP_OK) { if (esp_lcd_touch_del(internal->touch_handle) != ESP_OK) {
LOG_E(TAG, "Failed to delete touch handle"); LOG_E(TAG, "Failed to delete touch handle");
ok = false; return ERROR_RESOURCE;
}
internal->touch_handle = nullptr;
} }
if (internal->io_handle != nullptr) {
if (esp_lcd_panel_io_del(internal->io_handle) != ESP_OK) { if (esp_lcd_panel_io_del(internal->io_handle) != ESP_OK) {
LOG_E(TAG, "Failed to delete panel IO handle"); LOG_E(TAG, "Failed to delete panel IO handle");
ok = false; return ERROR_RESOURCE;
}
internal->io_handle = nullptr;
} }
free(internal); free(internal);
return ok ? ERROR_NONE : ERROR_RESOURCE; device_set_driver_data(device, nullptr);
return ERROR_NONE;
} }
// endregion // endregion

View File

@ -5,7 +5,7 @@ dependencies:
rules: rules:
- if: "target in [esp32s3, esp32c6, esp32p4]" - if: "target in [esp32s3, esp32c6, esp32p4]"
espressif/esp_hosted: espressif/esp_hosted:
version: "*" version: "2.12.11"
rules: rules:
- if: "target == esp32p4" - if: "target == esp32p4"
espressif/esp_wifi_remote: espressif/esp_wifi_remote:

View File

@ -25,10 +25,11 @@ struct Esp32PwmLedcInternal {
// region Helpers // region Helpers
static uint32_t compute_freq_hz(uint32_t period_ns) { static uint32_t compute_freq_hz(uint32_t period_ns) {
return (uint32_t)(1000000000ULL / period_ns); return period_ns > 0 ? (uint32_t)(1000000000ULL / period_ns) : 0;
} }
static uint32_t compute_raw_duty(uint32_t duty_ns, uint32_t period_ns, ledc_timer_bit_t duty_resolution) { static uint32_t compute_raw_duty(uint32_t duty_ns, uint32_t period_ns, ledc_timer_bit_t duty_resolution) {
if (period_ns == 0) return 0;
uint64_t max_duty = 1ULL << duty_resolution; uint64_t max_duty = 1ULL << duty_resolution;
uint64_t raw_duty = ((uint64_t)duty_ns * max_duty) / period_ns; uint64_t raw_duty = ((uint64_t)duty_ns * max_duty) / period_ns;
return (uint32_t)(raw_duty > max_duty ? max_duty : raw_duty); return (uint32_t)(raw_duty > max_duty ? max_duty : raw_duty);

View File

@ -110,7 +110,10 @@ static error_t start(Device* device) {
device_set_driver_data(device, internal); device_set_driver_data(device, internal);
gpio_backlight_set_brightness_default(device); // Allowed to fail, we don't care about the result if (gpio_backlight_set_brightness_default(device) != ERROR_NONE) {
// Allowed to fail, we don't care about the result
LOG_W(TAG, "gpio_backlight_set_brightness_default(%s) failed", device->name);
}
return ERROR_NONE; return ERROR_NONE;
} }

View File

@ -34,6 +34,10 @@ static error_t apply_brightness(Device* device, uint8_t brightness) {
return ERROR_NONE; return ERROR_NONE;
} }
if (brightness > config->brightness_range.max) {
brightness = config->brightness_range.max;
}
uint32_t period_ns; uint32_t period_ns;
error_t error = pwm_get_period(config->pwm, &period_ns); error_t error = pwm_get_period(config->pwm, &period_ns);
if (error != ERROR_NONE) { if (error != ERROR_NONE) {
@ -93,10 +97,16 @@ static constexpr BacklightApi PWM_BACKLIGHT_API = {
// region Driver lifecycle // region Driver lifecycle
static error_t start(Device* device) { static error_t start(Device* device) {
const auto* config = GET_CONFIG(device);
if (config->brightness_range.max <= config->brightness_range.min) {
return ERROR_INVALID_ARGUMENT;
}
auto* internal = new(std::nothrow) PwmBacklightInternal { .brightness = GET_CONFIG(device)->brightness_range.min }; auto* internal = new(std::nothrow) PwmBacklightInternal { .brightness = GET_CONFIG(device)->brightness_range.min };
if (internal == nullptr) { if (internal == nullptr) {
return ERROR_OUT_OF_MEMORY; return ERROR_OUT_OF_MEMORY;
} }
device_set_driver_data(device, internal); device_set_driver_data(device, internal);
pwm_backlight_set_brightness_default(device); // Allowed to fail, we don't care about the result pwm_backlight_set_brightness_default(device); // Allowed to fail, we don't care about the result

View File

@ -126,9 +126,15 @@ static error_t start(Device* device) {
device_set_driver_data(device, internal); device_set_driver_data(device, internal);
if (config->enabled) { if (config->enabled) {
rgb_led_gpio_enable(device); // Allowed to fail, we don't care about the result if (rgb_led_gpio_enable(device) != ERROR_NONE) {
// Allowed to fail, we don't care about the result
LOG_W(TAG, "led_gpio_enable(%s) failed", device->name);
}
} else { } else {
apply_levels(device); // Allowed to fail, we don't care about the result if (apply_levels(device) != ERROR_NONE) {
// Allowed to fail, we don't care about the result
LOG_W(TAG, "led_gpio_apply_levels(%s) failed", device->name);
}
} }
return ERROR_NONE; return ERROR_NONE;

View File

@ -62,19 +62,24 @@ static error_t rgb_led_pwm_get_color(Device* device, RgbLedColor* out_color) {
static error_t rgb_led_pwm_enable(Device* device) { static error_t rgb_led_pwm_enable(Device* device) {
const auto* config = GET_CONFIG(device); const auto* config = GET_CONFIG(device);
GET_INTERNAL(device)->enabled = true;
error_t error = pwm_enable(config->pwm_red); error_t error = pwm_enable(config->pwm_red);
if (error == ERROR_NONE) {
error = pwm_enable(config->pwm_green);
}
if (error == ERROR_NONE) {
error = pwm_enable(config->pwm_blue);
}
if (error != ERROR_NONE) { if (error != ERROR_NONE) {
LOG_E(TAG, "Failed to enable LED");
}
return error; return error;
}
error = pwm_enable(config->pwm_green);
if (error != ERROR_NONE) {
pwm_disable(config->pwm_red);
return error;
}
error = pwm_enable(config->pwm_blue);
if (error != ERROR_NONE) {
pwm_disable(config->pwm_green);
pwm_disable(config->pwm_red);
LOG_E(TAG, "Failed to enable LED");
return error;
}
GET_INTERNAL(device)->enabled = true;
return ERROR_NONE;
} }
static void rgb_led_pwm_disable(Device* device) { static void rgb_led_pwm_disable(Device* device) {