diff --git a/.github/workflows/build-firmware.yml b/.github/workflows/build-firmware.yml index 9db63343..c4dc3b90 100644 --- a/.github/workflows/build-firmware.yml +++ b/.github/workflows/build-firmware.yml @@ -90,3 +90,30 @@ 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 f543f439..0e746c98 100644 --- a/App/CMakeLists.txt +++ b/App/CMakeLists.txt @@ -9,6 +9,7 @@ if (DEFINED ENV{ESP_IDF_VERSION}) ElecrowCrowpanelBasic28 ElecrowCrowpanelBasic35 M5stackCore2 + CYD-JC2432W328C ) endif() @@ -19,6 +20,8 @@ if (DEFINED ENV{ESP_IDF_VERSION}) LilygoTdeck M5stackCoreS3 UnPhone + CYD-8048S043C + CYD-JC8048W550C ) endif() diff --git a/App/Kconfig b/App/Kconfig index 9357c491..8aa88a25 100644 --- a/App/Kconfig +++ b/App/Kconfig @@ -13,6 +13,12 @@ menu "Tactility App" bool "Custom" config TT_BOARD_CYD_2432S024C bool "CYD 2432S024C" + config TT_BOARD_CYD_8048S043C + bool "CYD 8048S043C" + config TT_BOARD_CYD_JC2432W328C + bool "CYD JC2432W328C" + config TT_BOARD_CYD_JC8048W550C + bool "CYD JC8048W550C" 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 6c023c66..12c7b4dd 100644 --- a/App/Source/Boards.h +++ b/App/Source/Boards.h @@ -31,6 +31,15 @@ #elif defined(CONFIG_TT_BOARD_UNPHONE) #include "UnPhone.h" #define TT_BOARD_HARDWARE &unPhone +#elif defined(CONFIG_TT_BOARD_CYD_JC2432W328C) +#include "JC2432W328C.h" +#define TT_BOARD_HARDWARE &cyd_jc2432w328c_config +#elif defined(CONFIG_TT_BOARD_CYD_8048S043C) +#include "CYD8048S043C.h" +#define TT_BOARD_HARDWARE &cyd_8048s043c_config +#elif defined(CONFIG_TT_BOARD_CYD_JC8048W550C) +#include "JC8048W550C.h" +#define TT_BOARD_HARDWARE &cyd_jc8048w550c_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/Boards/CYD-8048S043C/CMakeLists.txt b/Boards/CYD-8048S043C/CMakeLists.txt new file mode 100644 index 00000000..3ced6b9f --- /dev/null +++ b/Boards/CYD-8048S043C/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 GT911 driver vfs fatfs +) diff --git a/Boards/CYD-8048S043C/Source/CYD8048S043C.cpp b/Boards/CYD-8048S043C/Source/CYD8048S043C.cpp new file mode 100644 index 00000000..8a00c3b4 --- /dev/null +++ b/Boards/CYD-8048S043C/Source/CYD8048S043C.cpp @@ -0,0 +1,79 @@ +#include "CYD8048S043C.h" +#include "Tactility/lvgl/LvglSync.h" +#include "hal/YellowDisplay.h" +#include "hal/YellowDisplayConstants.h" +#include "hal/YellowSdCard.h" + +#include + +using namespace tt::hal; + +const Configuration cyd_8048s043c_config = { + .createDisplay = createDisplay, + .sdcard = createYellowSdCard(), + .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_20, + .sda_pullup_en = true, + .scl_pullup_en = true, + .master = { + .clk_speed = 400000 + }, + .clk_flags = 0 + } + }, + //P4 header, JST SH 1.0, GND / 3.3V / IO17 / IO18 + i2c::Configuration { + .name = "External", + .port = I2C_NUM_1, + .initMode = i2c::InitMode::ByTactility, + .isMutable = true, + .config = (i2c_config_t) { + .mode = I2C_MODE_MASTER, + .sda_io_num = GPIO_NUM_17, + .scl_io_num = GPIO_NUM_18, + .sda_pullup_en = true, + .scl_pullup_en = true, + .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_11, + .miso_io_num = GPIO_NUM_13, + .sclk_io_num = GPIO_NUM_12, + .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-8048S043C/Source/CYD8048S043C.h b/Boards/CYD-8048S043C/Source/CYD8048S043C.h new file mode 100644 index 00000000..ab154c71 --- /dev/null +++ b/Boards/CYD-8048S043C/Source/CYD8048S043C.h @@ -0,0 +1,6 @@ +#pragma once + +#include + +// Capacitive touch version of the 4.3" yellow board +extern const tt::hal::Configuration cyd_8048s043c_config; diff --git a/Boards/CYD-8048S043C/Source/hal/YellowDisplay.cpp b/Boards/CYD-8048S043C/Source/hal/YellowDisplay.cpp new file mode 100644 index 00000000..d8700732 --- /dev/null +++ b/Boards/CYD-8048S043C/Source/hal/YellowDisplay.cpp @@ -0,0 +1,220 @@ +#include "YellowDisplay.h" +#include "YellowDisplayConstants.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#define TAG "yellow_display" + +static bool isBacklightInitialized = false; + +static bool initBacklight() { + ledc_timer_config_t ledc_timer = { + .speed_mode = CYD8048S043_LCD_BACKLIGHT_LEDC_MODE, + .duty_resolution = CYD8048S043_LCD_BACKLIGHT_LEDC_DUTY_RES, + .timer_num = CYD8048S043_LCD_BACKLIGHT_LEDC_TIMER, + .freq_hz = CYD8048S043_LCD_BACKLIGHT_LEDC_FREQUENCY, + .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 = CYD8048S043_LCD_PIN_BACKLIGHT, + .speed_mode = CYD8048S043_LCD_BACKLIGHT_LEDC_MODE, + .channel = CYD8048S043_LCD_BACKLIGHT_LEDC_CHANNEL, + .intr_type = LEDC_INTR_DISABLE, + .timer_sel = CYD8048S043_LCD_BACKLIGHT_LEDC_TIMER, + .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; +} + +bool YellowDisplay::start() { + TT_LOG_I(TAG, "Starting"); + + const esp_lcd_rgb_panel_config_t panel_config = { + .clk_src = LCD_CLK_SRC_DEFAULT, + .timings = { + .pclk_hz = 16000000, + .h_res = CYD8048S043_LCD_HORIZONTAL_RESOLUTION, + .v_res = CYD8048S043_LCD_VERTICAL_RESOLUTION, + + .hsync_pulse_width = 4, + .hsync_back_porch = 8, + .hsync_front_porch = 8, + .vsync_pulse_width = 4, + .vsync_back_porch = 8, + .vsync_front_porch = 8, + .flags = { + .hsync_idle_low = false, + .vsync_idle_low = false, + .de_idle_high = false, + .pclk_active_neg = true, + .pclk_idle_high = false + } + }, + .data_width = 16, + .bits_per_pixel = 0, + .num_fbs = 2, + .bounce_buffer_size_px = CYD8048S043_LCD_HORIZONTAL_RESOLUTION * 10, + .sram_trans_align = 8, + .psram_trans_align = 64, + + .hsync_gpio_num = CYD8048S043_LCD_PIN_HSYNC, + .vsync_gpio_num = CYD8048S043_LCD_PIN_VSYNC, + .de_gpio_num = CYD8048S043_LCD_PIN_DE, + .pclk_gpio_num = CYD8048S043_LCD_PIN_PCLK, + .disp_gpio_num = CYD8048S043_LCD_PIN_DISP_EN, + .data_gpio_nums = { + CYD8048S043_LCD_PIN_DATA0, + CYD8048S043_LCD_PIN_DATA1, + CYD8048S043_LCD_PIN_DATA2, + CYD8048S043_LCD_PIN_DATA3, + CYD8048S043_LCD_PIN_DATA4, + CYD8048S043_LCD_PIN_DATA5, + CYD8048S043_LCD_PIN_DATA6, + CYD8048S043_LCD_PIN_DATA7, + CYD8048S043_LCD_PIN_DATA8, + CYD8048S043_LCD_PIN_DATA9, + CYD8048S043_LCD_PIN_DATA10, + CYD8048S043_LCD_PIN_DATA11, + CYD8048S043_LCD_PIN_DATA12, + CYD8048S043_LCD_PIN_DATA13, + CYD8048S043_LCD_PIN_DATA14, + CYD8048S043_LCD_PIN_DATA15 + }, + .flags = { + .disp_active_low = false, + .refresh_on_demand = false, + .fb_in_psram = true, + .double_fb = true, + .no_fb = false, + .bb_invalidate_cache = false + } + }; + + if (esp_lcd_new_rgb_panel(&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; + } + + const lvgl_port_display_cfg_t disp_cfg = { + .io_handle = ioHandle, + .panel_handle = panelHandle, + .control_handle = nullptr, + .buffer_size = CYD8048S043_LCD_DRAW_BUFFER_SIZE, + .double_buffer = true, + .trans_size = 0, + .hres = CYD8048S043_LCD_HORIZONTAL_RESOLUTION, + .vres = CYD8048S043_LCD_VERTICAL_RESOLUTION, + .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 YellowDisplay::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 YellowDisplay::createTouch() { + // Note for future changes: Reset pin is 38 and interrupt pin is 18 + // or INT = NC, schematic and other info floating around is kinda conflicting... + auto configuration = std::make_unique( + I2C_NUM_0, + 800, + 480 + ); + + return std::make_shared(std::move(configuration)); +} + +void YellowDisplay::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-8048S043C/Source/hal/YellowDisplay.h b/Boards/CYD-8048S043C/Source/hal/YellowDisplay.h new file mode 100644 index 00000000..172ef92a --- /dev/null +++ b/Boards/CYD-8048S043C/Source/hal/YellowDisplay.h @@ -0,0 +1,32 @@ +#pragma once + +#include "Tactility/hal/display/DisplayDevice.h" +#include +#include + +class YellowDisplay : 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 "ST7262"; } + 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-8048S043C/Source/hal/YellowDisplayConstants.h b/Boards/CYD-8048S043C/Source/hal/YellowDisplayConstants.h new file mode 100644 index 00000000..5ba96dcc --- /dev/null +++ b/Boards/CYD-8048S043C/Source/hal/YellowDisplayConstants.h @@ -0,0 +1,42 @@ +#pragma once + +// Display backlight (PWM) +#define CYD8048S043_LCD_BACKLIGHT_LEDC_TIMER LEDC_TIMER_0 +#define CYD8048S043_LCD_BACKLIGHT_LEDC_MODE LEDC_LOW_SPEED_MODE +#define CYD8048S043_LCD_BACKLIGHT_LEDC_CHANNEL LEDC_CHANNEL_0 +#define CYD8048S043_LCD_BACKLIGHT_LEDC_DUTY_RES LEDC_TIMER_8_BIT +#define CYD8048S043_LCD_BACKLIGHT_LEDC_FREQUENCY (1000) + +#define CYD8048S043_LCD_PIN_BACKLIGHT GPIO_NUM_2 + +// Display pins +#define CYD8048S043_LCD_PIN_HSYNC GPIO_NUM_39 // HSYNC +#define CYD8048S043_LCD_PIN_VSYNC GPIO_NUM_41 // VSYNC +#define CYD8048S043_LCD_PIN_DE GPIO_NUM_40 // DE +#define CYD8048S043_LCD_PIN_PCLK GPIO_NUM_42 // DCLK + +#define CYD8048S043_LCD_PIN_DATA0 GPIO_NUM_8 // B3 +#define CYD8048S043_LCD_PIN_DATA1 GPIO_NUM_3 // B4 +#define CYD8048S043_LCD_PIN_DATA2 GPIO_NUM_46 // B5 +#define CYD8048S043_LCD_PIN_DATA3 GPIO_NUM_9 // B6 +#define CYD8048S043_LCD_PIN_DATA4 GPIO_NUM_1 // B7 + +#define CYD8048S043_LCD_PIN_DATA5 GPIO_NUM_5 // G2 +#define CYD8048S043_LCD_PIN_DATA6 GPIO_NUM_6 // G3 +#define CYD8048S043_LCD_PIN_DATA7 GPIO_NUM_7 // G4 +#define CYD8048S043_LCD_PIN_DATA8 GPIO_NUM_15 // G5 +#define CYD8048S043_LCD_PIN_DATA9 GPIO_NUM_16 // G6 +#define CYD8048S043_LCD_PIN_DATA10 GPIO_NUM_4 // G7 + +#define CYD8048S043_LCD_PIN_DATA11 GPIO_NUM_45 // R3 +#define CYD8048S043_LCD_PIN_DATA12 GPIO_NUM_48 // R4 +#define CYD8048S043_LCD_PIN_DATA13 GPIO_NUM_47 // R5 +#define CYD8048S043_LCD_PIN_DATA14 GPIO_NUM_21 // R6 +#define CYD8048S043_LCD_PIN_DATA15 GPIO_NUM_14 // R7 + +#define CYD8048S043_LCD_PIN_DISP_EN GPIO_NUM_NC // not connected + +// Display +#define CYD8048S043_LCD_HORIZONTAL_RESOLUTION 800 +#define CYD8048S043_LCD_VERTICAL_RESOLUTION 480 +#define CYD8048S043_LCD_DRAW_BUFFER_SIZE (CYD8048S043_LCD_HORIZONTAL_RESOLUTION * CYD8048S043_LCD_VERTICAL_RESOLUTION) diff --git a/Boards/CYD-8048S043C/Source/hal/YellowSdCard.cpp b/Boards/CYD-8048S043C/Source/hal/YellowSdCard.cpp new file mode 100644 index 00000000..12a46c52 --- /dev/null +++ b/Boards/CYD-8048S043C/Source/hal/YellowSdCard.cpp @@ -0,0 +1,31 @@ +#include "YellowSdCard.h" + +#define TAG "cyd8048s043c_sdcard" + +#include +#include + +#define SDCARD_SPI_HOST SPI2_HOST +#define SDCARD_PIN_CS GPIO_NUM_10 + +using tt::hal::sdcard::SpiSdCardDevice; + +std::shared_ptr createYellowSdCard() { + auto* configuration = new SpiSdCardDevice::Config( + SDCARD_PIN_CS, + GPIO_NUM_NC, + GPIO_NUM_NC, + GPIO_NUM_NC, + SdCardDevice::MountBehaviour::AtBoot, + std::make_shared(), + std::vector(), + SDCARD_SPI_HOST + ); + + auto* sdcard = (SdCardDevice*) new SpiSdCardDevice( + std::unique_ptr(configuration) + ); + + return std::shared_ptr(sdcard); +} + diff --git a/Boards/CYD-8048S043C/Source/hal/YellowSdCard.h b/Boards/CYD-8048S043C/Source/hal/YellowSdCard.h new file mode 100644 index 00000000..772f7119 --- /dev/null +++ b/Boards/CYD-8048S043C/Source/hal/YellowSdCard.h @@ -0,0 +1,8 @@ +#pragma once + +#include "Tactility/hal/sdcard/SdCardDevice.h" + +using tt::hal::sdcard::SdCardDevice; + +std::shared_ptr createYellowSdCard(); + diff --git a/Boards/CYD-JC2432W328C/CMakeLists.txt b/Boards/CYD-JC2432W328C/CMakeLists.txt new file mode 100644 index 00000000..38845d13 --- /dev/null +++ b/Boards/CYD-JC2432W328C/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 ST7789 CST816S PwmBacklight driver vfs fatfs +) diff --git a/Boards/CYD-JC2432W328C/Source/JC2432W328C.cpp b/Boards/CYD-JC2432W328C/Source/JC2432W328C.cpp new file mode 100644 index 00000000..e28c6cf9 --- /dev/null +++ b/Boards/CYD-JC2432W328C/Source/JC2432W328C.cpp @@ -0,0 +1,122 @@ +#include "JC2432W328C.h" +#include "hal/YellowDisplay.h" +#include "hal/YellowDisplayConstants.h" +#include "hal/YellowSdCard.h" + +#include +#include + +#include + +using namespace tt::hal; + +#define CYD_SPI_TRANSFER_SIZE_LIMIT (JC2432W328C_LCD_DRAW_BUFFER_SIZE * LV_COLOR_DEPTH / 8) + +bool initBoot() { + //Set the RGB Led Pins to output and turn them off + ESP_ERROR_CHECK(gpio_set_direction(GPIO_NUM_4, GPIO_MODE_OUTPUT)); //Red + ESP_ERROR_CHECK(gpio_set_direction(GPIO_NUM_16, GPIO_MODE_OUTPUT)); //Green + ESP_ERROR_CHECK(gpio_set_direction(GPIO_NUM_17, GPIO_MODE_OUTPUT)); //Blue + + //0 on, 1 off... yep it's backwards. + ESP_ERROR_CHECK(gpio_set_level(GPIO_NUM_4, 1)); //Red + ESP_ERROR_CHECK(gpio_set_level(GPIO_NUM_16, 1)); //Green + ESP_ERROR_CHECK(gpio_set_level(GPIO_NUM_17, 1)); //Blue + + return driver::pwmbacklight::init(JC2432W328C_LCD_PIN_BACKLIGHT); +} + +const Configuration cyd_jc2432w328c_config = { + .initBoot = initBoot, + .createDisplay = createDisplay, + .sdcard = createYellowSdCard(), + .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_33, + .scl_io_num = GPIO_NUM_32, + .sda_pullup_en = false, + .scl_pullup_en = false, + .master = { + .clk_speed = 400000 + }, + .clk_flags = 0 + } + }, + //CN1 header, JST SH 1.25, GND / IO22 / IO21 / 3.3V + i2c::Configuration { + .name = "External", + .port = I2C_NUM_1, + .initMode = i2c::InitMode::ByTactility, + .isMutable = true, + .config = (i2c_config_t) { + .mode = I2C_MODE_MASTER, + .sda_io_num = GPIO_NUM_21, + .scl_io_num = GPIO_NUM_22, + .sda_pullup_en = false, + .scl_pullup_en = false, + .master = { + .clk_speed = 400000 + }, + .clk_flags = 0 + } + } + }, + .spi { + //Display + spi::Configuration { + .device = SPI2_HOST, + .dma = SPI_DMA_CH_AUTO, + .config = { + .mosi_io_num = GPIO_NUM_13, + .miso_io_num = GPIO_NUM_NC, + .sclk_io_num = GPIO_NUM_14, + .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 = CYD_SPI_TRANSFER_SIZE_LIMIT, + .flags = 0, + .isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO, + .intr_flags = 0 + }, + .initMode = spi::InitMode::ByTactility, + .isMutable = false, + .lock = tt::lvgl::getSyncLock() + }, + //SD Card + spi::Configuration { + .device = SPI3_HOST, + .dma = SPI_DMA_CH_AUTO, + .config = { + .mosi_io_num = GPIO_NUM_23, + .miso_io_num = GPIO_NUM_19, + .sclk_io_num = GPIO_NUM_18, + .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-JC2432W328C/Source/JC2432W328C.h b/Boards/CYD-JC2432W328C/Source/JC2432W328C.h new file mode 100644 index 00000000..9ab9788c --- /dev/null +++ b/Boards/CYD-JC2432W328C/Source/JC2432W328C.h @@ -0,0 +1,6 @@ +#pragma once + +#include + +// Capacitive touch version of the 2.8" yellow board +extern const tt::hal::Configuration cyd_jc2432w328c_config; diff --git a/Boards/CYD-JC2432W328C/Source/hal/YellowDisplay.cpp b/Boards/CYD-JC2432W328C/Source/hal/YellowDisplay.cpp new file mode 100644 index 00000000..7e8fbb63 --- /dev/null +++ b/Boards/CYD-JC2432W328C/Source/hal/YellowDisplay.cpp @@ -0,0 +1,38 @@ +#include "YellowDisplay.h" +#include "Cst816Touch.h" +#include "YellowDisplayConstants.h" + +#include +#include + +static std::shared_ptr createTouch() { + auto configuration = std::make_unique( + I2C_NUM_0, + 240, + 320 + ); + + return std::make_shared(std::move(configuration)); +} + +std::shared_ptr createDisplay() { + auto touch = createTouch(); + + auto configuration = std::make_unique( + JC2432W328C_LCD_SPI_HOST, + JC2432W328C_LCD_PIN_CS, + JC2432W328C_LCD_PIN_DC, + JC2432W328C_LCD_HORIZONTAL_RESOLUTION, + JC2432W328C_LCD_VERTICAL_RESOLUTION, + touch, + false, + false, + false, + false, + JC2432W328C_LCD_DRAW_BUFFER_SIZE + ); + + configuration->backlightDutyFunction = driver::pwmbacklight::setBacklightDuty; + + return std::make_shared(std::move(configuration)); +} diff --git a/Boards/CYD-JC2432W328C/Source/hal/YellowDisplay.h b/Boards/CYD-JC2432W328C/Source/hal/YellowDisplay.h new file mode 100644 index 00000000..036603c9 --- /dev/null +++ b/Boards/CYD-JC2432W328C/Source/hal/YellowDisplay.h @@ -0,0 +1,6 @@ +#pragma once + +#include "Tactility/hal/display/DisplayDevice.h" +#include + +std::shared_ptr createDisplay(); diff --git a/Boards/CYD-JC2432W328C/Source/hal/YellowDisplayConstants.h b/Boards/CYD-JC2432W328C/Source/hal/YellowDisplayConstants.h new file mode 100644 index 00000000..6aa0c735 --- /dev/null +++ b/Boards/CYD-JC2432W328C/Source/hal/YellowDisplayConstants.h @@ -0,0 +1,14 @@ +#pragma once + +// Display backlight (PWM) +#define JC2432W328C_LCD_PIN_BACKLIGHT GPIO_NUM_27 + +// Display +#define JC2432W328C_LCD_SPI_HOST SPI2_HOST +#define JC2432W328C_LCD_HORIZONTAL_RESOLUTION 240 +#define JC2432W328C_LCD_VERTICAL_RESOLUTION 320 +#define JC2432W328C_LCD_DRAW_BUFFER_HEIGHT (JC2432W328C_LCD_VERTICAL_RESOLUTION / 10) +#define JC2432W328C_LCD_DRAW_BUFFER_SIZE (JC2432W328C_LCD_HORIZONTAL_RESOLUTION * JC2432W328C_LCD_DRAW_BUFFER_HEIGHT) +#define JC2432W328C_LCD_PIN_CS GPIO_NUM_15 +#define JC2432W328C_LCD_PIN_DC GPIO_NUM_2 + diff --git a/Boards/CYD-JC2432W328C/Source/hal/YellowSdCard.cpp b/Boards/CYD-JC2432W328C/Source/hal/YellowSdCard.cpp new file mode 100644 index 00000000..b1a2fa20 --- /dev/null +++ b/Boards/CYD-JC2432W328C/Source/hal/YellowSdCard.cpp @@ -0,0 +1,31 @@ +#include "YellowSdCard.h" + +#define TAG "jc2432w328c_sdcard" + +#include +#include + +#define SDCARD_SPI_HOST SPI3_HOST +#define SDCARD_PIN_CS GPIO_NUM_5 + +using tt::hal::sdcard::SpiSdCardDevice; + +std::shared_ptr createYellowSdCard() { + auto* configuration = new SpiSdCardDevice::Config( + SDCARD_PIN_CS, + GPIO_NUM_NC, + GPIO_NUM_NC, + GPIO_NUM_NC, + SdCardDevice::MountBehaviour::AtBoot, + std::make_shared(), + std::vector(), + SDCARD_SPI_HOST + ); + + auto* sdcard = (SdCardDevice*) new SpiSdCardDevice( + std::unique_ptr(configuration) + ); + + return std::shared_ptr(sdcard); +} + diff --git a/Boards/CYD-JC2432W328C/Source/hal/YellowSdCard.h b/Boards/CYD-JC2432W328C/Source/hal/YellowSdCard.h new file mode 100644 index 00000000..772f7119 --- /dev/null +++ b/Boards/CYD-JC2432W328C/Source/hal/YellowSdCard.h @@ -0,0 +1,8 @@ +#pragma once + +#include "Tactility/hal/sdcard/SdCardDevice.h" + +using tt::hal::sdcard::SdCardDevice; + +std::shared_ptr createYellowSdCard(); + diff --git a/Boards/CYD-JC8048W550C/CMakeLists.txt b/Boards/CYD-JC8048W550C/CMakeLists.txt new file mode 100644 index 00000000..c6e98b90 --- /dev/null +++ b/Boards/CYD-JC8048W550C/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 RgbDisplay GT911 PwmBacklight driver vfs fatfs +) diff --git a/Boards/CYD-JC8048W550C/Source/JC8048W550C.cpp b/Boards/CYD-JC8048W550C/Source/JC8048W550C.cpp new file mode 100644 index 00000000..d06b2153 --- /dev/null +++ b/Boards/CYD-JC8048W550C/Source/JC8048W550C.cpp @@ -0,0 +1,82 @@ +#include "JC8048W550C.h" // Don't remove, or we get a linker error ("undefined reference to `cyd_jc8048w550c_config'" - GCC bug?) +#include "PwmBacklight.h" +#include "hal/CydDisplay.h" +#include "hal/CydSdCard.h" + +using namespace tt::hal; + +bool initBoot() { + return driver::pwmbacklight::init(GPIO_NUM_2); +} + +const Configuration cyd_jc8048w550c_config = { + .initBoot = initBoot, + .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_20, + .sda_pullup_en = true, + .scl_pullup_en = true, + .master = { + .clk_speed = 400000 + }, + .clk_flags = 0 + } + }, + //P4 header, JST SH 1.25, GND / 3.3V / IO17 / IO18 or + //P5 header, JST SH 1.0, GND / 3.3V / IO17 / IO18 + i2c::Configuration { + .name = "External", + .port = I2C_NUM_1, + .initMode = i2c::InitMode::ByTactility, + .isMutable = true, + .config = (i2c_config_t) { + .mode = I2C_MODE_MASTER, + .sda_io_num = GPIO_NUM_17, + .scl_io_num = GPIO_NUM_18, + .sda_pullup_en = true, + .scl_pullup_en = true, + .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_11, + .miso_io_num = GPIO_NUM_13, + .sclk_io_num = GPIO_NUM_12, + .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-JC8048W550C/Source/JC8048W550C.h b/Boards/CYD-JC8048W550C/Source/JC8048W550C.h new file mode 100644 index 00000000..b50ad560 --- /dev/null +++ b/Boards/CYD-JC8048W550C/Source/JC8048W550C.h @@ -0,0 +1,6 @@ +#pragma once + +#include + +// Capacitive touch version of the 5" black board +extern const tt::hal::Configuration cyd_jc8048w550c_config; diff --git a/Boards/CYD-JC8048W550C/Source/hal/CydDisplay.cpp b/Boards/CYD-JC8048W550C/Source/hal/CydDisplay.cpp new file mode 100644 index 00000000..0913dd2a --- /dev/null +++ b/Boards/CYD-JC8048W550C/Source/hal/CydDisplay.cpp @@ -0,0 +1,106 @@ +#include "RgbDisplay.h" + +#include "CydDisplay.h" + +#include +#include +#include + +std::shared_ptr _Nullable createTouch() { + // Note for future changes: Reset pin is 38 and interrupt pin is 18 + // or INT = NC, schematic and other info floating around is kinda conflicting... + auto configuration = std::make_unique( + I2C_NUM_0, + 800, + 480 + ); + + return std::make_shared(std::move(configuration)); +} + +std::shared_ptr createDisplay() { + auto touch = createTouch(); + + constexpr uint32_t bufferPixels = 800 * 10; + + esp_lcd_rgb_panel_config_t rgb_panel_config = { + .clk_src = LCD_CLK_SRC_DEFAULT, + .timings = { + .pclk_hz = 16000000, + .h_res = 800, + .v_res = 480, + .hsync_pulse_width = 4, + .hsync_back_porch = 8, + .hsync_front_porch = 8, + .vsync_pulse_width = 4, + .vsync_back_porch = 8, + .vsync_front_porch = 8, + .flags = { + .hsync_idle_low = false, + .vsync_idle_low = false, + .de_idle_high = false, + .pclk_active_neg = true, + .pclk_idle_high = false + } + }, + .data_width = 16, + .bits_per_pixel = 0, + .num_fbs = 2, + .bounce_buffer_size_px = bufferPixels, + .sram_trans_align = 8, + .psram_trans_align = 64, + .hsync_gpio_num = GPIO_NUM_39, + .vsync_gpio_num = GPIO_NUM_41, + .de_gpio_num = GPIO_NUM_40 , + .pclk_gpio_num = GPIO_NUM_42, + .disp_gpio_num = GPIO_NUM_NC, + .data_gpio_nums = { + GPIO_NUM_8, // B3 + GPIO_NUM_3, // B4 + GPIO_NUM_46, // B5 + GPIO_NUM_9, // B6 + GPIO_NUM_1, // B7 + GPIO_NUM_5, // G2 + GPIO_NUM_6, // G3 + GPIO_NUM_7, // G4 + GPIO_NUM_15, // G5 + GPIO_NUM_16, // G6 + GPIO_NUM_4, // G7 + GPIO_NUM_45, // R3 + GPIO_NUM_48, // R4 + GPIO_NUM_47, // R5 + GPIO_NUM_21, // R6 + GPIO_NUM_14, // R7 + }, + .flags = { + .disp_active_low = false, + .refresh_on_demand = false, + .fb_in_psram = true, + .double_fb = true, + .no_fb = false, + .bb_invalidate_cache = false + } + }; + + RgbDisplay::BufferConfiguration buffer_config = { + .size = bufferPixels, + .useSpi = true, + .doubleBuffer = true, + .bounceBufferMode = true, + .avoidTearing = false + }; + + auto configuration = std::make_unique( + rgb_panel_config, + buffer_config, + touch, + LV_COLOR_FORMAT_RGB565, + false, + false, + false, + false, + driver::pwmbacklight::setBacklightDuty + ); + + return std::make_shared(std::move(configuration)); +} diff --git a/Boards/CYD-JC8048W550C/Source/hal/CydDisplay.h b/Boards/CYD-JC8048W550C/Source/hal/CydDisplay.h new file mode 100644 index 00000000..5a0d81b3 --- /dev/null +++ b/Boards/CYD-JC8048W550C/Source/hal/CydDisplay.h @@ -0,0 +1,5 @@ +#pragma once + +#include "Tactility/hal/display/DisplayDevice.h" + +std::shared_ptr createDisplay(); diff --git a/Boards/CYD-JC8048W550C/Source/hal/CydSdCard.cpp b/Boards/CYD-JC8048W550C/Source/hal/CydSdCard.cpp new file mode 100644 index 00000000..0bb3c2bc --- /dev/null +++ b/Boards/CYD-JC8048W550C/Source/hal/CydSdCard.cpp @@ -0,0 +1,25 @@ +#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-JC8048W550C/Source/hal/CydSdCard.h b/Boards/CYD-JC8048W550C/Source/hal/CydSdCard.h new file mode 100644 index 00000000..5cb65a73 --- /dev/null +++ b/Boards/CYD-JC8048W550C/Source/hal/CydSdCard.h @@ -0,0 +1,7 @@ +#pragma once + +#include "Tactility/hal/sdcard/SdCardDevice.h" + +using tt::hal::sdcard::SdCardDevice; + +std::shared_ptr createSdCard(); diff --git a/Buildscripts/build-and-release-all.sh b/Buildscripts/build-and-release-all.sh index 2fb598c4..c8e72282 100755 --- a/Buildscripts/build-and-release-all.sh +++ b/Buildscripts/build-and-release-all.sh @@ -31,8 +31,17 @@ release lilygo-tdeck releaseSdk release/TactilitySDK-esp32s3 -build yellow-board -release yellow-board +build cyd-2432s024c +release cyd-2432s024c + +build cyd-8048s043c +release cyd-8048s043c + +build cyd-jc2432w328c +release cyd-jc2432w328c + +build cyd-jc8048w550c +release cyd-jc8048w550c releaseSdk release/TactilitySDK-esp32 diff --git a/CMakeLists.txt b/CMakeLists.txt index 4169e5fd..ec65d970 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,16 +34,10 @@ if (DEFINED ENV{ESP_IDF_VERSION}) set(EXCLUDE_COMPONENTS "Simulator") - # Non-ESP32 boards - if(NOT "${IDF_TARGET}" STREQUAL "esp32") - set(EXCLUDE_COMPONENTS "CYD-2432S024C") - set(EXCLUDE_COMPONENTS "ElecrowCrowpanelBasic28") - set(EXCLUDE_COMPONENTS "ElecrowCrowpanelBasic35") - set(EXCLUDE_COMPONENTS "M5stackCore2") - endif() - - # Non-ESP32-S3 boards - if(NOT "${IDF_TARGET}" STREQUAL "esp32s3") + # ESP32 target should exclude ESP32-S3 boards + if("${IDF_TARGET}" STREQUAL "esp32") + set(EXCLUDE_COMPONENTS "CYD-8048S043C") + set(EXCLUDE_COMPONENTS "CYD-JC8048W550C") set(EXCLUDE_COMPONENTS "ElecrowCrowpanelAdvance28") set(EXCLUDE_COMPONENTS "ElecrowCrowpanelAdvance35") set(EXCLUDE_COMPONENTS "LilygoTdeck") @@ -51,6 +45,15 @@ if (DEFINED ENV{ESP_IDF_VERSION}) set(EXCLUDE_COMPONENTS "UnPhone") endif() + # ESP32-S3 target should exclude ESP32 boards + if("${IDF_TARGET}" STREQUAL "esp32s3") + set(EXCLUDE_COMPONENTS "CYD-2432S024C") + set(EXCLUDE_COMPONENTS "CYD-JC2432W328C") + set(EXCLUDE_COMPONENTS "ElecrowCrowpanelBasic28") + set(EXCLUDE_COMPONENTS "ElecrowCrowpanelBasic35") + set(EXCLUDE_COMPONENTS "M5stackCore2") + endif() + # LVGL get_filename_component( LVGL_CONFIG_FULL_PATH Libraries/lvgl_conf ABSOLUTE diff --git a/Drivers/ILI934x/Source/Ili934xDisplay.h b/Drivers/ILI934x/Source/Ili934xDisplay.h index 40247cdb..dd32d3b4 100644 --- a/Drivers/ILI934x/Source/Ili934xDisplay.h +++ b/Drivers/ILI934x/Source/Ili934xDisplay.h @@ -94,5 +94,3 @@ public: lv_display_t* _Nullable getLvglDisplay() const final { return displayHandle; } }; - -std::shared_ptr createDisplay(); diff --git a/Drivers/RgbDisplay/CMakeLists.txt b/Drivers/RgbDisplay/CMakeLists.txt new file mode 100644 index 00000000..8fd62cfe --- /dev/null +++ b/Drivers/RgbDisplay/CMakeLists.txt @@ -0,0 +1,5 @@ +idf_component_register( + SRC_DIRS "Source" + INCLUDE_DIRS "Source" + REQUIRES Tactility esp_lvgl_port esp_lcd +) diff --git a/Drivers/RgbDisplay/README.md b/Drivers/RgbDisplay/README.md new file mode 100644 index 00000000..48af5bb3 --- /dev/null +++ b/Drivers/RgbDisplay/README.md @@ -0,0 +1,3 @@ +# RGB Display Driver + +This driver is used for displays that use multiple parallel data lanes. diff --git a/Drivers/RgbDisplay/Source/RgbDisplay.cpp b/Drivers/RgbDisplay/Source/RgbDisplay.cpp new file mode 100644 index 00000000..d75da726 --- /dev/null +++ b/Drivers/RgbDisplay/Source/RgbDisplay.cpp @@ -0,0 +1,109 @@ +#include "RgbDisplay.h" + +#include + +#include +#include +#include +#include + +#define TAG "RgbDisplay" + +bool RgbDisplay::start() { + TT_LOG_I(TAG, "Starting"); + + if (esp_lcd_new_rgb_panel(&configuration->panelConfig, &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_swap_xy(panelHandle, configuration->swapXY) != ESP_OK) { + TT_LOG_E(TAG, "Failed to swap XY"); + return false; + } + + if (esp_lcd_panel_mirror(panelHandle, configuration->mirrorX, configuration->mirrorY) != ESP_OK) { + TT_LOG_E(TAG, "Failed to set panel to mirror"); + return false; + } + + if (esp_lcd_panel_invert_color(panelHandle, configuration->invertColor) != ESP_OK) { + TT_LOG_E(TAG, "Failed to set panel to invert"); + return false; + } + + auto horizontal_resolution = configuration->panelConfig.timings.h_res; + auto vertical_resolution = configuration->panelConfig.timings.v_res; + + uint32_t buffer_size; + if (configuration->bufferConfiguration.size == 0) { + buffer_size = horizontal_resolution * vertical_resolution / 15; + } else { + buffer_size = configuration->bufferConfiguration.size; + } + + const lvgl_port_display_cfg_t display_config = { + .io_handle = ioHandle, + .panel_handle = panelHandle, + .control_handle = nullptr, + .buffer_size = buffer_size, + .double_buffer = configuration->bufferConfiguration.doubleBuffer, + .trans_size = 0, + .hres = horizontal_resolution, + .vres = vertical_resolution, + .monochrome = false, + .rotation = { + .swap_xy = configuration->swapXY, + .mirror_x = configuration->mirrorX, + .mirror_y = configuration->mirrorY, + }, + .color_format = configuration->colorFormat, + .flags = { + .buff_dma = !configuration->bufferConfiguration.useSpi, + .buff_spiram = configuration->bufferConfiguration.useSpi, + .sw_rotate = false, + .swap_bytes = false, + .full_refresh = false, + .direct_mode = false + } + }; + + const lvgl_port_display_rgb_cfg_t rgb_config = { + .flags = { + .bb_mode = configuration->bufferConfiguration.bounceBufferMode, + .avoid_tearing = configuration->bufferConfiguration.avoidTearing + } + }; + + displayHandle = lvgl_port_add_disp_rgb(&display_config, &rgb_config); + TT_LOG_I(TAG, "Finished"); + + return displayHandle != nullptr; +} + +bool RgbDisplay::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; +} diff --git a/Drivers/RgbDisplay/Source/RgbDisplay.h b/Drivers/RgbDisplay/Source/RgbDisplay.h new file mode 100644 index 00000000..3da18c35 --- /dev/null +++ b/Drivers/RgbDisplay/Source/RgbDisplay.h @@ -0,0 +1,91 @@ +#pragma once + +#include "Tactility/hal/display/DisplayDevice.h" + +#include +#include +#include + +#include + +class RgbDisplay : public tt::hal::display::DisplayDevice { + +public: + + struct BufferConfiguration final { + uint32_t size; // Size in pixel count. 0 means default, which is 1/15 of the screen size + bool useSpi; + bool doubleBuffer; + bool bounceBufferMode; + bool avoidTearing; + }; + + class Configuration final { + public: + + esp_lcd_rgb_panel_config_t panelConfig; + BufferConfiguration bufferConfiguration; + std::shared_ptr touch; + lv_color_format_t colorFormat; + bool swapXY; + bool mirrorX; + bool mirrorY; + bool invertColor; + std::function _Nullable backlightDutyFunction; + + Configuration( + esp_lcd_rgb_panel_config_t panelConfig, + BufferConfiguration bufferConfiguration, + std::shared_ptr touch, + lv_color_format_t colorFormat, + bool swapXY = false, + bool mirrorX = false, + bool mirrorY = false, + bool invertColor = false, + std::function _Nullable backlightDutyFunction = nullptr + ) : panelConfig(panelConfig), + bufferConfiguration(bufferConfiguration), + touch(std::move(touch)), + colorFormat(colorFormat), + swapXY(swapXY), + mirrorX(mirrorX), + mirrorY(mirrorY), + invertColor(invertColor), + backlightDutyFunction(std::move(backlightDutyFunction)) + {} + }; + +private: + + std::unique_ptr configuration = nullptr; + esp_lcd_panel_io_handle_t ioHandle = nullptr; + esp_lcd_panel_handle_t panelHandle = nullptr; + lv_display_t* displayHandle = nullptr; + +public: + + explicit RgbDisplay(std::unique_ptr inConfiguration) : configuration(std::move(inConfiguration)) { + assert(configuration != nullptr); + } + + std::string getName() const final { return "RGB Display"; } + std::string getDescription() const final { return "RGB Display"; } + + bool start() override; + + bool stop() override; + + std::shared_ptr _Nullable createTouch() final { return configuration->touch; } + + void setBacklightDuty(uint8_t backlightDuty) final { + if (configuration->backlightDutyFunction != nullptr) { + configuration->backlightDutyFunction(backlightDuty); + } + } + + bool supportsBacklightDuty() const final { return configuration->backlightDutyFunction != nullptr; } + + lv_display_t* _Nullable getLvglDisplay() const override { return displayHandle; } +}; + +std::shared_ptr createDisplay(); diff --git a/sdkconfig.board.cyd-8048S043c b/sdkconfig.board.cyd-8048S043c new file mode 100644 index 00000000..1d49d9e2 --- /dev/null +++ b/sdkconfig.board.cyd-8048S043c @@ -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_8048S043C=y +CONFIG_TT_BOARD_NAME="CYD 8048S043C" +CONFIG_TT_BOARD_ID="cyd-8048s043c" +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 diff --git a/sdkconfig.board.cyd-jc2432w328c b/sdkconfig.board.cyd-jc2432w328c new file mode 100644 index 00000000..c8b834e3 --- /dev/null +++ b/sdkconfig.board.cyd-jc2432w328c @@ -0,0 +1,46 @@ +# 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_TT_BOARD_CYD_JC2432W328C=y +CONFIG_TT_BOARD_NAME="CYD JC2432W328C" +CONFIG_TT_BOARD_ID="cyd-jc2432W328c" +CONFIG_IDF_TARGET="esp32" +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y +CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y +CONFIG_FLASHMODE_QIO=y +# LVGL +CONFIG_LV_DISP_DEF_REFR_PERIOD=10 +CONFIG_LV_DPI_DEF=160 +# Fix for IRAM +CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH=y +CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y +CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH=y +CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH=y diff --git a/sdkconfig.board.cyd-jc8048w550c b/sdkconfig.board.cyd-jc8048w550c new file mode 100644 index 00000000..4085af10 --- /dev/null +++ b/sdkconfig.board.cyd-jc8048w550c @@ -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_JC8048W550C=y +CONFIG_TT_BOARD_NAME="CYD JC8048W550C" +CONFIG_TT_BOARD_ID="cyd-jc8048w550c" +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