diff --git a/.github/workflows/build-firmware.yml b/.github/workflows/build-firmware.yml index c4dc3b90..afe80559 100644 --- a/.github/workflows/build-firmware.yml +++ b/.github/workflows/build-firmware.yml @@ -18,6 +18,42 @@ jobs: with: board_id: cyd-2432S024c arch: esp32 + cyd-jc2432w328c: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: "Build" + uses: ./.github/actions/build-firmware + with: + board_id: cyd-jc2432w328c + arch: esp32 + cyd-8048S043c: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: "Build" + uses: ./.github/actions/build-firmware + with: + board_id: cyd-8048S043c + arch: esp32s3 + cyd-jc8048w550c: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: "Build" + uses: ./.github/actions/build-firmware + with: + board_id: cyd-jc8048w550c + arch: esp32s3 + cyd-4848s040c: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: "Build" + uses: ./.github/actions/build-firmware + with: + board_id: cyd-4848s040c + arch: esp32s3 elecrow-crowpanel-advance-28: runs-on: ubuntu-latest steps: @@ -90,30 +126,3 @@ jobs: with: board_id: unphone arch: esp32s3 - cyd-jc2432w328c: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: "Build" - uses: ./.github/actions/build-firmware - with: - board_id: cyd-jc2432w328c - arch: esp32 - cyd-8048S043c: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: "Build" - uses: ./.github/actions/build-firmware - with: - board_id: cyd-8048S043c - arch: esp32s3 - cyd-jc8048w550c: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: "Build" - uses: ./.github/actions/build-firmware - with: - board_id: cyd-jc8048w550c - arch: esp32s3 diff --git a/App/CMakeLists.txt b/App/CMakeLists.txt index 0e746c98..d98a7300 100644 --- a/App/CMakeLists.txt +++ b/App/CMakeLists.txt @@ -22,6 +22,7 @@ if (DEFINED ENV{ESP_IDF_VERSION}) UnPhone CYD-8048S043C CYD-JC8048W550C + CYD-4848S040C ) endif() diff --git a/App/Kconfig b/App/Kconfig index 8aa88a25..239da03b 100644 --- a/App/Kconfig +++ b/App/Kconfig @@ -19,6 +19,8 @@ menu "Tactility App" bool "CYD JC2432W328C" config TT_BOARD_CYD_JC8048W550C bool "CYD JC8048W550C" + config TT_BOARD_CYD_4848S040C + bool "CYD 4848S040C" config TT_BOARD_ELECROW_CROWPANEL_ADVANCE_28 bool "Elecrow CrowPanel Advance 2.8" config TT_BOARD_ELECROW_CROWPANEL_ADVANCE_35 diff --git a/App/Source/Boards.h b/App/Source/Boards.h index 12c7b4dd..86413dbb 100644 --- a/App/Source/Boards.h +++ b/App/Source/Boards.h @@ -40,6 +40,9 @@ #elif defined(CONFIG_TT_BOARD_CYD_JC8048W550C) #include "JC8048W550C.h" #define TT_BOARD_HARDWARE &cyd_jc8048w550c_config +#elif defined(CONFIG_TT_BOARD_CYD_4848S040C) +#include "CYD4848S040C.h" +#define TT_BOARD_HARDWARE &cyd_4848s040c_config #else #define TT_BOARD_HARDWARE NULL #error Replace TT_BOARD_HARDWARE in main.c with your own. Or copy one of the ./sdkconfig.board.* files into ./sdkconfig. diff --git a/App/idf_component.yml b/App/idf_component.yml index ff1b8500..30944b9d 100644 --- a/App/idf_component.yml +++ b/App/idf_component.yml @@ -8,6 +8,11 @@ dependencies: espressif/esp_lcd_touch_ft5x06: "1.0.6~1" espressif/esp_io_expander: "1.0.1" espressif/esp_io_expander_tca95xx_16bit: "1.0.1" + espressif/esp_lcd_st7701: + version: "1.1.1" + rules: + - if: "target in [esp32s3, esp32p4]" + espressif/esp_lcd_panel_io_additions: "1.0.1" espressif/esp_tinyusb: version: "1.5.0" rules: diff --git a/Boards/CYD-4848S040C/CMakeLists.txt b/Boards/CYD-4848S040C/CMakeLists.txt new file mode 100644 index 00000000..e3e92966 --- /dev/null +++ b/Boards/CYD-4848S040C/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB_RECURSE SOURCE_FILES Source/*.c*) + +idf_component_register( + SRCS ${SOURCE_FILES} + INCLUDE_DIRS "Source" + REQUIRES Tactility esp_lvgl_port esp_lcd esp_lcd_st7701 esp_lcd_panel_io_additions GT911 driver vfs fatfs +) diff --git a/Boards/CYD-4848S040C/Source/CYD4848S040C.cpp b/Boards/CYD-4848S040C/Source/CYD4848S040C.cpp new file mode 100644 index 00000000..cdf88e49 --- /dev/null +++ b/Boards/CYD-4848S040C/Source/CYD4848S040C.cpp @@ -0,0 +1,78 @@ +#include "CYD4848S040C.h" +#include "Tactility/lvgl/LvglSync.h" +#include "hal/CydDisplay.h" +#include "hal/CydSdCard.h" + +#include + +using namespace tt::hal; + +const Configuration cyd_4848s040c_config = { + .createDisplay = createDisplay, + .sdcard = createSdCard(), + .power = nullptr, + .i2c = { + //Touch + i2c::Configuration { + .name = "Internal", + .port = I2C_NUM_0, + .initMode = i2c::InitMode::ByTactility, + .isMutable = true, + .config = (i2c_config_t) { + .mode = I2C_MODE_MASTER, + .sda_io_num = GPIO_NUM_19, + .scl_io_num = GPIO_NUM_45, + .sda_pullup_en = true, + .scl_pullup_en = true, + .master = { + .clk_speed = 400000 + }, + .clk_flags = 0 + } + }, + //H1 header, + i2c::Configuration { + .name = "External", + .port = I2C_NUM_1, + .initMode = i2c::InitMode::Disabled, + .isMutable = true, + .config = (i2c_config_t) { + .mode = I2C_MODE_MASTER, + .sda_io_num = GPIO_NUM_NC, + .scl_io_num = GPIO_NUM_NC, + .sda_pullup_en = false, + .scl_pullup_en = false, + .master = { + .clk_speed = 400000 + }, + .clk_flags = 0 + } + } + }, + .spi { + //SD Card + spi::Configuration { + .device = SPI2_HOST, + .dma = SPI_DMA_CH_AUTO, + .config = { + .mosi_io_num = GPIO_NUM_47, + .miso_io_num = GPIO_NUM_41, + .sclk_io_num = GPIO_NUM_48, + .quadwp_io_num = -1, + .quadhd_io_num = -1, + .data4_io_num = 0, + .data5_io_num = 0, + .data6_io_num = 0, + .data7_io_num = 0, + .data_io_default_level = false, + .max_transfer_sz = 8192, + .flags = 0, + .isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO, + .intr_flags = 0 + }, + .initMode = spi::InitMode::ByTactility, + .isMutable = false, + .lock = nullptr + } + } +}; diff --git a/Boards/CYD-4848S040C/Source/CYD4848S040C.h b/Boards/CYD-4848S040C/Source/CYD4848S040C.h new file mode 100644 index 00000000..e66e1d65 --- /dev/null +++ b/Boards/CYD-4848S040C/Source/CYD4848S040C.h @@ -0,0 +1,6 @@ +#pragma once + +#include + +// Capacitive touch version of the 4" square yellow board +extern const tt::hal::Configuration cyd_4848s040c_config; diff --git a/Boards/CYD-4848S040C/Source/hal/CydDisplay.cpp b/Boards/CYD-4848S040C/Source/hal/CydDisplay.cpp new file mode 100644 index 00000000..d458e189 --- /dev/null +++ b/Boards/CYD-4848S040C/Source/hal/CydDisplay.cpp @@ -0,0 +1,307 @@ +#include "CydDisplay.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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[] = { + // {cmd, { data }, data_size, delay_ms} + {0xFF, (uint8_t[]) {0x77, 0x01, 0x00, 0x00, 0x10}, 5, 0}, + {0xC0, (uint8_t[]) {0x3B, 0x00}, 2, 0}, + {0xC1, (uint8_t[]) {0x0D, 0x02}, 2, 0}, + {0xC2, (uint8_t[]) {0x31, 0x05}, 2, 0}, + {0xCD, (uint8_t[]) {0x00}, 1, 0}, //0x08 + //Positive Voltage Gamma Control + {0xB0, (uint8_t[]) {0x00, 0x11, 0x18, 0x0E, 0x11, 0x06, 0x07, 0x08, 0x07, 0x22, 0x04, 0x12, 0x0F, 0xAA, 0x31, 0x18}, 16, 0}, + //Negative Voltage Gamma Control + {0xB1, (uint8_t[]) {0x00, 0x11, 0x19, 0x0E, 0x12, 0x07, 0x08, 0x08, 0x08, 0x22, 0x04, 0x11, 0x11, 0xA9, 0x32, 0x18}, 16, 0}, + //Page1 + {0xFF, (uint8_t[]) {0x77, 0x01, 0x00, 0x00, 0x11}, 5, 0}, + {0xB0, (uint8_t[]) {0x60}, 1, 0}, //Vop=4.7375v + {0xB1, (uint8_t[]) {0x32}, 1, 0}, //VCOM=32 + {0xB2, (uint8_t[]) {0x07}, 1, 0}, //VGH=15v + {0xB3, (uint8_t[]) {0x80}, 1, 0}, + {0xB5, (uint8_t[]) {0x49}, 1, 0}, //VGL=-10.17v + {0xB7, (uint8_t[]) {0x85}, 1, 0}, + {0xB8, (uint8_t[]) {0x21}, 1, 0}, //AVDD=6.6 & AVCL=-4.6 + {0xC1, (uint8_t[]) {0x78}, 1, 0}, + {0xC2, (uint8_t[]) {0x78}, 1, 0}, + {0xE0, (uint8_t[]) {0x00, 0x1B, 0x02}, 3, 0}, + {0xE1, (uint8_t[]) {0x08, 0xA0, 0x00, 0x00, 0x07, 0xA0, 0x00, 0x00, 0x00, 0x44, 0x44}, 11, 0}, + {0xE2, (uint8_t[]) {0x11, 0x11, 0x44, 0x44, 0xED, 0xA0, 0x00, 0x00, 0xEC, 0xA0, 0x00, 0x00}, 12, 0}, + {0xE3, (uint8_t[]) {0x00, 0x00, 0x11, 0x11}, 4, 0}, + {0xE4, (uint8_t[]) {0x44, 0x44}, 2, 0}, + {0xE5, (uint8_t[]) {0x0A, 0xE9, 0xD8, 0xA0, 0x0C, 0xEB, 0xD8, 0xA0, 0x0E, 0xED, 0xD8, 0xA0, 0x10, 0xEF, 0xD8, 0xA0}, 16, 0}, + {0xE6, (uint8_t[]) {0x00, 0x00, 0x11, 0x11}, 4, 0}, + {0xE7, (uint8_t[]) {0x44, 0x44}, 2, 0}, + {0xE8, (uint8_t[]) {0x09, 0xE8, 0xD8, 0xA0, 0x0B, 0xEA, 0xD8, 0xA0, 0x0D, 0xEC, 0xD8, 0xA0, 0x0F, 0xEE, 0xD8, 0xA0}, 16, 0}, + {0xEB, (uint8_t[]) {0x02, 0x00, 0xE4, 0xE4, 0x88, 0x00, 0x40}, 7, 0}, + {0xEC, (uint8_t[]) {0x3C, 0x00}, 2, 0}, + {0xED, (uint8_t[]) {0xAB, 0x89, 0x76, 0x54, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x45, 0x67, 0x98, 0xBA}, 16, 0}, + //VAP & VAN + {0xFF, (uint8_t[]) {0x77, 0x01, 0x00, 0x00, 0x13}, 5, 0}, + {0xE5, (uint8_t[]) {0xE4}, 1, 0}, + {0xFF, (uint8_t[]) {0x77, 0x01, 0x00, 0x00, 0x00}, 5, 0}, + {0x3A, (uint8_t[]) {0x60}, 1, 10}, //0x70 RGB888, 0x60 RGB666, 0x50 RGB565 + {0x11, (uint8_t[]) {0x00}, 0, 120}, //Sleep Out + {0x29, (uint8_t[]) {0x00}, 0, 0}, //Display On +}; + +bool CydDisplay::start() { + TT_LOG_I(TAG, "Starting"); + + spi_line_config_t line_config = { + .cs_io_type = IO_TYPE_GPIO, + .cs_gpio_num = GPIO_NUM_39, + .scl_io_type = IO_TYPE_GPIO, + .scl_gpio_num = GPIO_NUM_48, + .sda_io_type = IO_TYPE_GPIO, + .sda_gpio_num = GPIO_NUM_47, + .io_expander = NULL, + }; + esp_lcd_panel_io_3wire_spi_config_t panel_io_config = ST7701_PANEL_IO_3WIRE_SPI_CONFIG(line_config, 0); + ESP_ERROR_CHECK(esp_lcd_new_panel_io_3wire_spi(&panel_io_config, &ioHandle)); + + const esp_lcd_rgb_panel_config_t rgb_config = { + .clk_src = LCD_CLK_SRC_DEFAULT, + .timings = { + .pclk_hz = 16000000, + .h_res = 480, + .v_res = 480, + + .hsync_pulse_width = 10, + .hsync_back_porch = 10, + .hsync_front_porch = 20, + .vsync_pulse_width = 10, + .vsync_back_porch = 10, + .vsync_front_porch = 10, + .flags = { + .hsync_idle_low = false, + .vsync_idle_low = false, + .de_idle_high = false, + .pclk_active_neg = false, + .pclk_idle_high = false + } + }, + .data_width = 16, + .bits_per_pixel = 16, + .num_fbs = 2, + .bounce_buffer_size_px = 480 * 10, + .sram_trans_align = 8, + .psram_trans_align = 64, + + .hsync_gpio_num = GPIO_NUM_16, + .vsync_gpio_num = GPIO_NUM_17, + .de_gpio_num = GPIO_NUM_18, + .pclk_gpio_num = GPIO_NUM_21, + .disp_gpio_num = GPIO_NUM_NC, + .data_gpio_nums = { + GPIO_NUM_4, //B1 + GPIO_NUM_5, //B2 + GPIO_NUM_6, //B3 + GPIO_NUM_7, //B4 + GPIO_NUM_15, //B5 + GPIO_NUM_8, //G1 + GPIO_NUM_20, //G2 + GPIO_NUM_3, //G3 + GPIO_NUM_46, //G4 + GPIO_NUM_9, //G5 + GPIO_NUM_10,//G6 + GPIO_NUM_11, //R1 + GPIO_NUM_12, //R2 + GPIO_NUM_13, //R3 + GPIO_NUM_14, //R4 + GPIO_NUM_0 //R5 + }, + .flags = { + .disp_active_low = false, + .refresh_on_demand = false, + .fb_in_psram = true, + .double_fb = true, + .no_fb = false, + .bb_invalidate_cache = true + } + }; + + st7701_vendor_config_t vendor_config = { + .init_cmds = st7701_lcd_init_cmds, + .init_cmds_size = sizeof(st7701_lcd_init_cmds) / sizeof(st7701_lcd_init_cmd_t), + .rgb_config = &rgb_config, + .flags = { + .use_mipi_interface = 0, + .mirror_by_cmd = 1, + .auto_del_panel_io = 0, + }, + }; + + const esp_lcd_panel_dev_config_t panel_config = { + .reset_gpio_num = GPIO_NUM_NC, + .rgb_ele_order = LCD_RGB_ELEMENT_ORDER_BGR, + .data_endian = LCD_RGB_DATA_ENDIAN_LITTLE, + .bits_per_pixel = 16, + .flags = { + .reset_active_high = false, + }, + .vendor_config = &vendor_config, + }; + + if (esp_lcd_new_panel_st7701(ioHandle, &panel_config, &panelHandle) != ESP_OK) { + TT_LOG_E(TAG, "Failed to create panel"); + return false; + } + + if (esp_lcd_panel_reset(panelHandle) != ESP_OK) { + TT_LOG_E(TAG, "Failed to reset panel"); + return false; + } + + if (esp_lcd_panel_init(panelHandle) != ESP_OK) { + TT_LOG_E(TAG, "Failed to init panel"); + return false; + } + + if (esp_lcd_panel_invert_color(panelHandle, false) != ESP_OK) { + TT_LOG_E(TAG, "Failed to invert color"); + } + + esp_lcd_panel_set_gap(panelHandle, 0, 0); + + if (esp_lcd_panel_disp_on_off(panelHandle, true) != ESP_OK) { + TT_LOG_E(TAG, "Failed to turn display on"); + } + + const lvgl_port_display_cfg_t disp_cfg = { + .io_handle = ioHandle, + .panel_handle = panelHandle, + .control_handle = nullptr, + .buffer_size = (480 * 480), + .double_buffer = true, + .trans_size = 0, + .hres = 480, + .vres = 480, + .monochrome = false, + .rotation = { + .swap_xy = false, + .mirror_x = false, + .mirror_y = false, + }, + .color_format = LV_COLOR_FORMAT_RGB565, + .flags = { + .buff_dma = false, + .buff_spiram = true, + .sw_rotate = false, + .swap_bytes = false, + .full_refresh = false, + .direct_mode = false + } + }; + + const lvgl_port_display_rgb_cfg_t rgb_cfg = { + .flags = { + .bb_mode = true, + .avoid_tearing = false + } + }; + + displayHandle = lvgl_port_add_disp_rgb(&disp_cfg, &rgb_cfg); + TT_LOG_I(TAG, "Finished"); + return displayHandle != nullptr; +} + +bool CydDisplay::stop() { + assert(displayHandle != nullptr); + + lvgl_port_remove_disp(displayHandle); + + if (esp_lcd_panel_del(panelHandle) != ESP_OK) { + return false; + } + + if (esp_lcd_panel_io_del(ioHandle) != ESP_OK) { + return false; + } + + displayHandle = nullptr; + return true; +} + +std::shared_ptr _Nullable CydDisplay::createTouch() { + auto configuration = std::make_unique( + I2C_NUM_0, + 480, + 480 + ); + + return std::make_shared(std::move(configuration)); +} + +void CydDisplay::setBacklightDuty(uint8_t backlightDuty) { + if (!isBacklightInitialized) { + tt_check(initBacklight()); + isBacklightInitialized = true; + } + + if (!setBacklight(backlightDuty)) { + TT_LOG_E(TAG, "Failed to configure display backlight"); + } +} + +std::shared_ptr createDisplay() { + return std::make_shared(); +} diff --git a/Boards/CYD-4848S040C/Source/hal/CydDisplay.h b/Boards/CYD-4848S040C/Source/hal/CydDisplay.h new file mode 100644 index 00000000..8418afed --- /dev/null +++ b/Boards/CYD-4848S040C/Source/hal/CydDisplay.h @@ -0,0 +1,32 @@ +#pragma once + +#include "Tactility/hal/display/DisplayDevice.h" +#include +#include + +class CydDisplay : public tt::hal::display::DisplayDevice { + +private: + + esp_lcd_panel_io_handle_t ioHandle = nullptr; + esp_lcd_panel_handle_t panelHandle = nullptr; + lv_display_t* displayHandle = nullptr; + +public: + + std::string getName() const final { return "ST7701S"; } + std::string getDescription() const final { return "RGB Display"; } + + bool start() override; + + bool stop() override; + + std::shared_ptr _Nullable createTouch() override; + + void setBacklightDuty(uint8_t backlightDuty) override; + bool supportsBacklightDuty() const override { return true; } + + lv_display_t* _Nullable getLvglDisplay() const override { return displayHandle; } +}; + +std::shared_ptr createDisplay(); diff --git a/Boards/CYD-4848S040C/Source/hal/CydSdCard.cpp b/Boards/CYD-4848S040C/Source/hal/CydSdCard.cpp new file mode 100644 index 00000000..48ad20b9 --- /dev/null +++ b/Boards/CYD-4848S040C/Source/hal/CydSdCard.cpp @@ -0,0 +1,26 @@ +#include "CydSdCard.h" + +#include +#include + +using tt::hal::sdcard::SpiSdCardDevice; + +std::shared_ptr createSdCard() { + auto config = std::make_unique( + GPIO_NUM_10, + GPIO_NUM_NC, + GPIO_NUM_NC, + GPIO_NUM_NC, + SdCardDevice::MountBehaviour::AtBoot, + std::make_shared(), + std::vector(), + SPI2_HOST + ); + + auto sdcard = std::make_shared( + std::move(config) + ); + + return std::static_pointer_cast(sdcard); +} + diff --git a/Boards/CYD-4848S040C/Source/hal/CydSdCard.h b/Boards/CYD-4848S040C/Source/hal/CydSdCard.h new file mode 100644 index 00000000..4da9f5b9 --- /dev/null +++ b/Boards/CYD-4848S040C/Source/hal/CydSdCard.h @@ -0,0 +1,8 @@ +#pragma once + +#include "Tactility/hal/sdcard/SdCardDevice.h" + +using tt::hal::sdcard::SdCardDevice; + +std::shared_ptr createSdCard(); + diff --git a/CMakeLists.txt b/CMakeLists.txt index ec65d970..b04b62d1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,6 +38,7 @@ if (DEFINED ENV{ESP_IDF_VERSION}) if("${IDF_TARGET}" STREQUAL "esp32") set(EXCLUDE_COMPONENTS "CYD-8048S043C") set(EXCLUDE_COMPONENTS "CYD-JC8048W550C") + set(EXCLUDE_COMPONENTS "CYD-4848S040C") set(EXCLUDE_COMPONENTS "ElecrowCrowpanelAdvance28") set(EXCLUDE_COMPONENTS "ElecrowCrowpanelAdvance35") set(EXCLUDE_COMPONENTS "LilygoTdeck") diff --git a/sdkconfig.board.cyd-4848s040c b/sdkconfig.board.cyd-4848s040c new file mode 100644 index 00000000..3385d646 --- /dev/null +++ b/sdkconfig.board.cyd-4848s040c @@ -0,0 +1,55 @@ +# Software defaults +# Increase stack size for WiFi (fixes crash after scan) +CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=3072 +CONFIG_LV_FONT_MONTSERRAT_14=y +CONFIG_LV_FONT_MONTSERRAT_18=y +CONFIG_LV_USE_USER_DATA=y +CONFIG_LV_USE_FS_STDIO=y +CONFIG_LV_FS_STDIO_LETTER=65 +CONFIG_LV_FS_STDIO_PATH="" +CONFIG_LV_FS_STDIO_CACHE_SIZE=4096 +CONFIG_LV_USE_LODEPNG=y +CONFIG_LV_USE_BUILTIN_MALLOC=n +CONFIG_LV_USE_CLIB_MALLOC=y +CONFIG_LV_USE_MSGBOX=n +CONFIG_LV_USE_SPINNER=n +CONFIG_LV_USE_WIN=n +CONFIG_LV_USE_SNAPSHOT=y +CONFIG_FREERTOS_HZ=1000 +CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=2 +CONFIG_FREERTOS_SMP=n +CONFIG_FREERTOS_UNICORE=n +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=4096 +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" +CONFIG_FATFS_LFN_HEAP=y +CONFIG_FATFS_VOLUME_COUNT=3 + +# Hardware: Main +CONFIG_COMPILER_OPTIMIZATION_PERF=y +CONFIG_IDF_EXPERIMENTAL_FEATURES=y +CONFIG_TT_BOARD_CYD_4848S040C=y +CONFIG_TT_BOARD_NAME="CYD 4848S040C" +CONFIG_TT_BOARD_ID="cyd-4848s040c" +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y +CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_FLASHMODE_QIO=y +# Hardware: SPI RAM +CONFIG_ESP32S3_SPIRAM_SUPPORT=y +CONFIG_SPIRAM_MODE_OCT=y +CONFIG_SPIRAM_FETCH_INSTRUCTIONS=y +CONFIG_SPIRAM_RODATA=y +CONFIG_SPIRAM_XIP_FROM_PSRAM=y +CONFIG_ESP32S3_DATA_CACHE_LINE_64B=y +CONFIG_SPIRAM_SPEED_80M=y +CONFIG_SPIRAM_USE_MALLOC=y +CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y +# SPI Flash +CONFIG_ESPTOOLPY_FLASHFREQ_80M=y +# LVGL +CONFIG_LV_DISP_DEF_REFR_PERIOD=10 +CONFIG_LV_DPI_DEF=139