CYD 4848S040C improvements and more (#245)

4848S040C:
- Fix SD card CS pin setting for 
- Fixes for colour
- Implement PwmBacklight driver 

Other:
- Fix for TouchDevice type
- Show landscape launcher for square displays
This commit is contained in:
Ken Van Hoeylandt 2025-03-12 23:45:49 +01:00 committed by GitHub
parent ef410086d9
commit 19521791c5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 34 additions and 84 deletions

View File

@ -3,5 +3,5 @@ file(GLOB_RECURSE SOURCE_FILES Source/*.c*)
idf_component_register( idf_component_register(
SRCS ${SOURCE_FILES} SRCS ${SOURCE_FILES}
INCLUDE_DIRS "Source" INCLUDE_DIRS "Source"
REQUIRES Tactility esp_lvgl_port esp_lcd esp_lcd_st7701 esp_lcd_panel_io_additions GT911 driver vfs fatfs REQUIRES Tactility esp_lvgl_port esp_lcd esp_lcd_st7701 esp_lcd_panel_io_additions GT911 PwmBacklight driver vfs fatfs
) )

View File

@ -1,13 +1,17 @@
#include "CYD4848S040C.h" #include "CYD4848S040C.h"
#include "Tactility/lvgl/LvglSync.h"
#include "hal/CydDisplay.h" #include "hal/CydDisplay.h"
#include "hal/CydSdCard.h" #include "hal/CydSdCard.h"
#include <Tactility/hal/Configuration.h> #include <PwmBacklight.h>
using namespace tt::hal; using namespace tt::hal;
bool initBoot() {
return driver::pwmbacklight::init(GPIO_NUM_38, 1000);
}
const Configuration cyd_4848s040c_config = { const Configuration cyd_4848s040c_config = {
.initBoot = initBoot,
.createDisplay = createDisplay, .createDisplay = createDisplay,
.sdcard = createSdCard(), .sdcard = createSdCard(),
.power = nullptr, .power = nullptr,
@ -60,10 +64,10 @@ const Configuration cyd_4848s040c_config = {
.sclk_io_num = GPIO_NUM_48, .sclk_io_num = GPIO_NUM_48,
.quadwp_io_num = -1, .quadwp_io_num = -1,
.quadhd_io_num = -1, .quadhd_io_num = -1,
.data4_io_num = 0, .data4_io_num = -1,
.data5_io_num = 0, .data5_io_num = -1,
.data6_io_num = 0, .data6_io_num = -1,
.data7_io_num = 0, .data7_io_num = -1,
.data_io_default_level = false, .data_io_default_level = false,
.max_transfer_sz = 8192, .max_transfer_sz = 8192,
.flags = 0, .flags = 0,

View File

@ -1,12 +1,10 @@
#include "CydDisplay.h" #include "CydDisplay.h"
#include "PwmBacklight.h"
#include <Gt911Touch.h> #include <Gt911Touch.h>
#include <Tactility/Log.h> #include <Tactility/Log.h>
#include <Tactility/TactilityCore.h>
#include <esp_lcd_panel_commands.h>
#include <driver/gpio.h> #include <driver/gpio.h>
#include <driver/ledc.h>
#include <esp_err.h> #include <esp_err.h>
#include <esp_lcd_panel_rgb.h> #include <esp_lcd_panel_rgb.h>
#include <esp_lcd_panel_ops.h> #include <esp_lcd_panel_ops.h>
@ -17,49 +15,6 @@
#define TAG "cyd_display" #define TAG "cyd_display"
static bool isBacklightInitialized = false;
static bool initBacklight() {
ledc_timer_config_t ledc_timer = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.duty_resolution = LEDC_TIMER_8_BIT,
.timer_num = LEDC_TIMER_0,
.freq_hz = 1000,
.clk_cfg = LEDC_AUTO_CLK,
.deconfigure = false
};
if (ledc_timer_config(&ledc_timer) != ESP_OK) {
TT_LOG_E(TAG, "Backlight led timer config failed");
return false;
}
return true;
}
static bool setBacklight(uint8_t duty) {
ledc_channel_config_t ledc_channel = {
.gpio_num = GPIO_NUM_38,
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = LEDC_CHANNEL_0,
.intr_type = LEDC_INTR_DISABLE,
.timer_sel = LEDC_TIMER_0,
.duty = duty,
.hpoint = 0,
.sleep_mode = LEDC_SLEEP_MODE_NO_ALIVE_NO_PD,
.flags = {
.output_invert = false
}
};
if (ledc_channel_config(&ledc_channel) != ESP_OK) {
TT_LOG_E(TAG, "Backlight init failed");
return false;
}
return true;
}
static const st7701_lcd_init_cmd_t st7701_lcd_init_cmds[] = { static const st7701_lcd_init_cmd_t st7701_lcd_init_cmds[] = {
// {cmd, { data }, data_size, delay_ms} // {cmd, { data }, data_size, delay_ms}
{0xFF, (uint8_t[]) {0x77, 0x01, 0x00, 0x00, 0x10}, 5, 0}, {0xFF, (uint8_t[]) {0x77, 0x01, 0x00, 0x00, 0x10}, 5, 0},
@ -124,7 +79,6 @@ bool CydDisplay::start() {
.pclk_hz = 16000000, .pclk_hz = 16000000,
.h_res = 480, .h_res = 480,
.v_res = 480, .v_res = 480,
.hsync_pulse_width = 10, .hsync_pulse_width = 10,
.hsync_back_porch = 10, .hsync_back_porch = 10,
.hsync_front_porch = 20, .hsync_front_porch = 20,
@ -145,29 +99,28 @@ bool CydDisplay::start() {
.bounce_buffer_size_px = 480 * 10, .bounce_buffer_size_px = 480 * 10,
.sram_trans_align = 8, .sram_trans_align = 8,
.psram_trans_align = 64, .psram_trans_align = 64,
.hsync_gpio_num = GPIO_NUM_16, .hsync_gpio_num = GPIO_NUM_16,
.vsync_gpio_num = GPIO_NUM_17, .vsync_gpio_num = GPIO_NUM_17,
.de_gpio_num = GPIO_NUM_18, .de_gpio_num = GPIO_NUM_18,
.pclk_gpio_num = GPIO_NUM_21, .pclk_gpio_num = GPIO_NUM_21,
.disp_gpio_num = GPIO_NUM_NC, .disp_gpio_num = GPIO_NUM_NC,
.data_gpio_nums = { .data_gpio_nums = {
GPIO_NUM_4, //B1 GPIO_NUM_4, // B1
GPIO_NUM_5, //B2 GPIO_NUM_5, // B2
GPIO_NUM_6, //B3 GPIO_NUM_6, // B3
GPIO_NUM_7, //B4 GPIO_NUM_7, // B4
GPIO_NUM_15, //B5 GPIO_NUM_15, // B5
GPIO_NUM_8, //G1 GPIO_NUM_8, // G1
GPIO_NUM_20, //G2 GPIO_NUM_20, // G2
GPIO_NUM_3, //G3 GPIO_NUM_3, // G3
GPIO_NUM_46, //G4 GPIO_NUM_46, // G4
GPIO_NUM_9, //G5 GPIO_NUM_9, // G5
GPIO_NUM_10,//G6 GPIO_NUM_10, // G6
GPIO_NUM_11, //R1 GPIO_NUM_11, // R1
GPIO_NUM_12, //R2 GPIO_NUM_12, // R2
GPIO_NUM_13, //R3 GPIO_NUM_13, // R3
GPIO_NUM_14, //R4 GPIO_NUM_14, // R4
GPIO_NUM_0 //R5 GPIO_NUM_0 // R5
}, },
.flags = { .flags = {
.disp_active_low = false, .disp_active_low = false,
@ -192,7 +145,7 @@ bool CydDisplay::start() {
const esp_lcd_panel_dev_config_t panel_config = { const esp_lcd_panel_dev_config_t panel_config = {
.reset_gpio_num = GPIO_NUM_NC, .reset_gpio_num = GPIO_NUM_NC,
.rgb_ele_order = LCD_RGB_ELEMENT_ORDER_BGR, .rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB,
.data_endian = LCD_RGB_DATA_ENDIAN_LITTLE, .data_endian = LCD_RGB_DATA_ENDIAN_LITTLE,
.bits_per_pixel = 16, .bits_per_pixel = 16,
.flags = { .flags = {
@ -292,14 +245,7 @@ std::shared_ptr<tt::hal::touch::TouchDevice> _Nullable CydDisplay::createTouch()
} }
void CydDisplay::setBacklightDuty(uint8_t backlightDuty) { void CydDisplay::setBacklightDuty(uint8_t backlightDuty) {
if (!isBacklightInitialized) { driver::pwmbacklight::setBacklightDuty(backlightDuty);
tt_check(initBacklight());
isBacklightInitialized = true;
}
if (!setBacklight(backlightDuty)) {
TT_LOG_E(TAG, "Failed to configure display backlight");
}
} }
std::shared_ptr<tt::hal::display::DisplayDevice> createDisplay() { std::shared_ptr<tt::hal::display::DisplayDevice> createDisplay() {

View File

@ -7,7 +7,7 @@ using tt::hal::sdcard::SpiSdCardDevice;
std::shared_ptr<SdCardDevice> createSdCard() { std::shared_ptr<SdCardDevice> createSdCard() {
auto config = std::make_unique<SpiSdCardDevice::Config>( auto config = std::make_unique<SpiSdCardDevice::Config>(
GPIO_NUM_10, GPIO_NUM_42,
GPIO_NUM_NC, GPIO_NUM_NC,
GPIO_NUM_NC, GPIO_NUM_NC,
GPIO_NUM_NC, GPIO_NUM_NC,

View File

@ -6,7 +6,7 @@
using namespace tt::hal; using namespace tt::hal;
bool initBoot() { bool initBoot() {
return driver::pwmbacklight::init(GPIO_NUM_2); return driver::pwmbacklight::init(GPIO_NUM_2, 200);
} }
const Configuration cyd_8048s043c_config = { const Configuration cyd_8048s043c_config = {

View File

@ -69,7 +69,7 @@ class LauncherApp : public App {
auto* display = lv_obj_get_display(parent); auto* display = lv_obj_get_display(parent);
auto horizontal_px = lv_display_get_horizontal_resolution(display); auto horizontal_px = lv_display_get_horizontal_resolution(display);
auto vertical_px = lv_display_get_vertical_resolution(display); auto vertical_px = lv_display_get_vertical_resolution(display);
bool is_landscape_display = horizontal_px > vertical_px; bool is_landscape_display = horizontal_px >= vertical_px;
if (is_landscape_display) { if (is_landscape_display) {
lv_obj_set_flex_flow(wrapper, LV_FLEX_FLOW_ROW); lv_obj_set_flex_flow(wrapper, LV_FLEX_FLOW_ROW);
} else { } else {

View File

@ -12,7 +12,7 @@ class TouchDevice : public Device {
public: public:
Type getType() const override { return Type::SdCard; } Type getType() const override { return Type::Touch; }
virtual bool start(lv_display_t* display) = 0; virtual bool start(lv_display_t* display) = 0;
virtual bool stop() = 0; virtual bool stop() = 0;