From afd732a1dd8ca792b328ba74531b37a614122e64 Mon Sep 17 00:00:00 2001 From: Shadowtrance Date: Thu, 27 Feb 2025 23:20:06 +1000 Subject: [PATCH] New Board Additions JC2432W328C ESP32-8048S043C JC8048W550C --- .github/workflows/build-firmware.yml | 27 +++ App/CMakeLists.txt | 3 + App/Kconfig | 6 + App/Source/Boards.h | 9 + Boards/CYD-8048S043C/CMakeLists.txt | 7 + Boards/CYD-8048S043C/Source/CYD8048S043C.cpp | 79 +++++++ Boards/CYD-8048S043C/Source/CYD8048S043C.h | 6 + .../Source/hal/YellowDisplay.cpp | 220 ++++++++++++++++++ .../CYD-8048S043C/Source/hal/YellowDisplay.h | 32 +++ .../Source/hal/YellowDisplayConstants.h | 42 ++++ .../CYD-8048S043C/Source/hal/YellowSdCard.cpp | 31 +++ .../CYD-8048S043C/Source/hal/YellowSdCard.h | 8 + Boards/CYD-JC2432W328C/CMakeLists.txt | 7 + Boards/CYD-JC2432W328C/Source/JC2432W328C.cpp | 122 ++++++++++ Boards/CYD-JC2432W328C/Source/JC2432W328C.h | 6 + .../Source/hal/YellowDisplay.cpp | 38 +++ .../Source/hal/YellowDisplay.h | 6 + .../Source/hal/YellowDisplayConstants.h | 14 ++ .../Source/hal/YellowSdCard.cpp | 31 +++ .../CYD-JC2432W328C/Source/hal/YellowSdCard.h | 8 + Boards/CYD-JC8048W550C/CMakeLists.txt | 7 + Boards/CYD-JC8048W550C/Source/JC8048W550C.cpp | 80 +++++++ Boards/CYD-JC8048W550C/Source/JC8048W550C.h | 6 + .../Source/hal/BlackDisplay.cpp | 220 ++++++++++++++++++ .../CYD-JC8048W550C/Source/hal/BlackDisplay.h | 32 +++ .../Source/hal/BlackDisplayConstants.h | 42 ++++ .../Source/hal/BlackSdCard.cpp | 31 +++ .../CYD-JC8048W550C/Source/hal/BlackSdCard.h | 8 + CMakeLists.txt | 3 + sdkconfig.board.cyd-8048S043c | 55 +++++ sdkconfig.board.cyd-jc2432w328c | 46 ++++ sdkconfig.board.cyd-jc8048w550c | 55 +++++ 32 files changed, 1287 insertions(+) create mode 100644 Boards/CYD-8048S043C/CMakeLists.txt create mode 100644 Boards/CYD-8048S043C/Source/CYD8048S043C.cpp create mode 100644 Boards/CYD-8048S043C/Source/CYD8048S043C.h create mode 100644 Boards/CYD-8048S043C/Source/hal/YellowDisplay.cpp create mode 100644 Boards/CYD-8048S043C/Source/hal/YellowDisplay.h create mode 100644 Boards/CYD-8048S043C/Source/hal/YellowDisplayConstants.h create mode 100644 Boards/CYD-8048S043C/Source/hal/YellowSdCard.cpp create mode 100644 Boards/CYD-8048S043C/Source/hal/YellowSdCard.h create mode 100644 Boards/CYD-JC2432W328C/CMakeLists.txt create mode 100644 Boards/CYD-JC2432W328C/Source/JC2432W328C.cpp create mode 100644 Boards/CYD-JC2432W328C/Source/JC2432W328C.h create mode 100644 Boards/CYD-JC2432W328C/Source/hal/YellowDisplay.cpp create mode 100644 Boards/CYD-JC2432W328C/Source/hal/YellowDisplay.h create mode 100644 Boards/CYD-JC2432W328C/Source/hal/YellowDisplayConstants.h create mode 100644 Boards/CYD-JC2432W328C/Source/hal/YellowSdCard.cpp create mode 100644 Boards/CYD-JC2432W328C/Source/hal/YellowSdCard.h create mode 100644 Boards/CYD-JC8048W550C/CMakeLists.txt create mode 100644 Boards/CYD-JC8048W550C/Source/JC8048W550C.cpp create mode 100644 Boards/CYD-JC8048W550C/Source/JC8048W550C.h create mode 100644 Boards/CYD-JC8048W550C/Source/hal/BlackDisplay.cpp create mode 100644 Boards/CYD-JC8048W550C/Source/hal/BlackDisplay.h create mode 100644 Boards/CYD-JC8048W550C/Source/hal/BlackDisplayConstants.h create mode 100644 Boards/CYD-JC8048W550C/Source/hal/BlackSdCard.cpp create mode 100644 Boards/CYD-JC8048W550C/Source/hal/BlackSdCard.h create mode 100644 sdkconfig.board.cyd-8048S043c create mode 100644 sdkconfig.board.cyd-jc2432w328c create mode 100644 sdkconfig.board.cyd-jc8048w550c diff --git a/.github/workflows/build-firmware.yml b/.github/workflows/build-firmware.yml index 9db633430..c4dc3b901 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 f543f4399..0e746c98a 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 9357c4917..0219557ce 100644 --- a/App/Kconfig +++ b/App/Kconfig @@ -29,6 +29,12 @@ menu "Tactility App" bool "M5Stack CoreS3" config TT_BOARD_UNPHONE bool "unPhone" + config TT_BOARD_CYD_JC2432W328C + bool "CYD JC2432W328C" + config TT_BOARD_CYD_8048S043C + bool "CYD 8048S043C" + config TT_BOARD_CYD_JC8048W550C + bool "CYD JC8048W550C" help Select a board/hardware configuration. Use TT_BOARD_CUSTOM if you will manually configure the board in your project. diff --git a/App/Source/Boards.h b/App/Source/Boards.h index 6c023c669..12c7b4dd3 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 000000000..3ced6b9f8 --- /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 000000000..8a00c3b41 --- /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 000000000..ab154c713 --- /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 000000000..d87007323 --- /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 000000000..172ef92a2 --- /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 000000000..5ba96dccb --- /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 000000000..12a46c526 --- /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 000000000..772f7119b --- /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 000000000..38845d132 --- /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 000000000..e28c6cf95 --- /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 000000000..9ab9788c1 --- /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 000000000..ca426f487 --- /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 000000000..036603c92 --- /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 000000000..6aa0c735f --- /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 000000000..b1a2fa20c --- /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 000000000..772f7119b --- /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 000000000..3ced6b9f8 --- /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 GT911 driver vfs fatfs +) diff --git a/Boards/CYD-JC8048W550C/Source/JC8048W550C.cpp b/Boards/CYD-JC8048W550C/Source/JC8048W550C.cpp new file mode 100644 index 000000000..d8fe50e7f --- /dev/null +++ b/Boards/CYD-JC8048W550C/Source/JC8048W550C.cpp @@ -0,0 +1,80 @@ +#include "JC8048W550C.h" +#include "Tactility/lvgl/LvglSync.h" +#include "hal/BlackDisplay.h" +#include "hal/BlackDisplayConstants.h" +#include "hal/BlackSdCard.h" + +#include + +using namespace tt::hal; + +const Configuration cyd_jc8048w550c_config = { + .createDisplay = createDisplay, + .sdcard = createBlackSdCard(), + .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 000000000..b50ad5600 --- /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/BlackDisplay.cpp b/Boards/CYD-JC8048W550C/Source/hal/BlackDisplay.cpp new file mode 100644 index 000000000..e380e49f9 --- /dev/null +++ b/Boards/CYD-JC8048W550C/Source/hal/BlackDisplay.cpp @@ -0,0 +1,220 @@ +#include "BlackDisplay.h" +#include "BlackDisplayConstants.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#define TAG "black_display" + +static bool isBacklightInitialized = false; + +static bool initBacklight() { + ledc_timer_config_t ledc_timer = { + .speed_mode = JC8048W550_LCD_BACKLIGHT_LEDC_MODE, + .duty_resolution = JC8048W550_LCD_BACKLIGHT_LEDC_DUTY_RES, + .timer_num = JC8048W550_LCD_BACKLIGHT_LEDC_TIMER, + .freq_hz = JC8048W550_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 = JC8048W550_LCD_PIN_BACKLIGHT, + .speed_mode = JC8048W550_LCD_BACKLIGHT_LEDC_MODE, + .channel = JC8048W550_LCD_BACKLIGHT_LEDC_CHANNEL, + .intr_type = LEDC_INTR_DISABLE, + .timer_sel = JC8048W550_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 BlackDisplay::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 = JC8048W550_LCD_HORIZONTAL_RESOLUTION, + .v_res = JC8048W550_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 = JC8048W550_LCD_HORIZONTAL_RESOLUTION * 10, + .sram_trans_align = 8, + .psram_trans_align = 64, + + .hsync_gpio_num = JC8048W550_LCD_PIN_HSYNC, + .vsync_gpio_num = JC8048W550_LCD_PIN_VSYNC, + .de_gpio_num = JC8048W550_LCD_PIN_DE, + .pclk_gpio_num = JC8048W550_LCD_PIN_PCLK, + .disp_gpio_num = JC8048W550_LCD_PIN_DISP_EN, + .data_gpio_nums = { + JC8048W550_LCD_PIN_DATA0, + JC8048W550_LCD_PIN_DATA1, + JC8048W550_LCD_PIN_DATA2, + JC8048W550_LCD_PIN_DATA3, + JC8048W550_LCD_PIN_DATA4, + JC8048W550_LCD_PIN_DATA5, + JC8048W550_LCD_PIN_DATA6, + JC8048W550_LCD_PIN_DATA7, + JC8048W550_LCD_PIN_DATA8, + JC8048W550_LCD_PIN_DATA9, + JC8048W550_LCD_PIN_DATA10, + JC8048W550_LCD_PIN_DATA11, + JC8048W550_LCD_PIN_DATA12, + JC8048W550_LCD_PIN_DATA13, + JC8048W550_LCD_PIN_DATA14, + JC8048W550_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 = JC8048W550_LCD_DRAW_BUFFER_SIZE, + .double_buffer = true, + .trans_size = 0, + .hres = JC8048W550_LCD_HORIZONTAL_RESOLUTION, + .vres = JC8048W550_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 BlackDisplay::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 BlackDisplay::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 BlackDisplay::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-JC8048W550C/Source/hal/BlackDisplay.h b/Boards/CYD-JC8048W550C/Source/hal/BlackDisplay.h new file mode 100644 index 000000000..733d9bd1d --- /dev/null +++ b/Boards/CYD-JC8048W550C/Source/hal/BlackDisplay.h @@ -0,0 +1,32 @@ +#pragma once + +#include "Tactility/hal/display/DisplayDevice.h" +#include +#include + +class BlackDisplay : 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-JC8048W550C/Source/hal/BlackDisplayConstants.h b/Boards/CYD-JC8048W550C/Source/hal/BlackDisplayConstants.h new file mode 100644 index 000000000..09dc11aae --- /dev/null +++ b/Boards/CYD-JC8048W550C/Source/hal/BlackDisplayConstants.h @@ -0,0 +1,42 @@ +#pragma once + +// Display backlight (PWM) +#define JC8048W550_LCD_BACKLIGHT_LEDC_TIMER LEDC_TIMER_0 +#define JC8048W550_LCD_BACKLIGHT_LEDC_MODE LEDC_LOW_SPEED_MODE +#define JC8048W550_LCD_BACKLIGHT_LEDC_CHANNEL LEDC_CHANNEL_0 +#define JC8048W550_LCD_BACKLIGHT_LEDC_DUTY_RES LEDC_TIMER_8_BIT +#define JC8048W550_LCD_BACKLIGHT_LEDC_FREQUENCY (1000) + +#define JC8048W550_LCD_PIN_BACKLIGHT GPIO_NUM_2 + +// Display pins +#define JC8048W550_LCD_PIN_HSYNC GPIO_NUM_39 // HSYNC +#define JC8048W550_LCD_PIN_VSYNC GPIO_NUM_41 // VSYNC +#define JC8048W550_LCD_PIN_DE GPIO_NUM_40 // DE +#define JC8048W550_LCD_PIN_PCLK GPIO_NUM_42 // DCLK + +#define JC8048W550_LCD_PIN_DATA0 GPIO_NUM_8 // B3 +#define JC8048W550_LCD_PIN_DATA1 GPIO_NUM_3 // B4 +#define JC8048W550_LCD_PIN_DATA2 GPIO_NUM_46 // B5 +#define JC8048W550_LCD_PIN_DATA3 GPIO_NUM_9 // B6 +#define JC8048W550_LCD_PIN_DATA4 GPIO_NUM_1 // B7 + +#define JC8048W550_LCD_PIN_DATA5 GPIO_NUM_5 // G2 +#define JC8048W550_LCD_PIN_DATA6 GPIO_NUM_6 // G3 +#define JC8048W550_LCD_PIN_DATA7 GPIO_NUM_7 // G4 +#define JC8048W550_LCD_PIN_DATA8 GPIO_NUM_15 // G5 +#define JC8048W550_LCD_PIN_DATA9 GPIO_NUM_16 // G6 +#define JC8048W550_LCD_PIN_DATA10 GPIO_NUM_4 // G7 + +#define JC8048W550_LCD_PIN_DATA11 GPIO_NUM_45 // R3 +#define JC8048W550_LCD_PIN_DATA12 GPIO_NUM_48 // R4 +#define JC8048W550_LCD_PIN_DATA13 GPIO_NUM_47 // R5 +#define JC8048W550_LCD_PIN_DATA14 GPIO_NUM_21 // R6 +#define JC8048W550_LCD_PIN_DATA15 GPIO_NUM_14 // R7 + +#define JC8048W550_LCD_PIN_DISP_EN GPIO_NUM_NC // not connected + +// Display +#define JC8048W550_LCD_HORIZONTAL_RESOLUTION 800 +#define JC8048W550_LCD_VERTICAL_RESOLUTION 480 +#define JC8048W550_LCD_DRAW_BUFFER_SIZE (JC8048W550_LCD_HORIZONTAL_RESOLUTION * JC8048W550_LCD_VERTICAL_RESOLUTION) diff --git a/Boards/CYD-JC8048W550C/Source/hal/BlackSdCard.cpp b/Boards/CYD-JC8048W550C/Source/hal/BlackSdCard.cpp new file mode 100644 index 000000000..b2ff15d67 --- /dev/null +++ b/Boards/CYD-JC8048W550C/Source/hal/BlackSdCard.cpp @@ -0,0 +1,31 @@ +#include "BlackSdCard.h" + +#define TAG "jc8048w550c_sdcard" + +#include +#include + +#define SDCARD_SPI_HOST SPI2_HOST +#define SDCARD_PIN_CS GPIO_NUM_10 + +using tt::hal::sdcard::SpiSdCardDevice; + +std::shared_ptr createBlackSdCard() { + 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-JC8048W550C/Source/hal/BlackSdCard.h b/Boards/CYD-JC8048W550C/Source/hal/BlackSdCard.h new file mode 100644 index 000000000..b1422951c --- /dev/null +++ b/Boards/CYD-JC8048W550C/Source/hal/BlackSdCard.h @@ -0,0 +1,8 @@ +#pragma once + +#include "Tactility/hal/sdcard/SdCardDevice.h" + +using tt::hal::sdcard::SdCardDevice; + +std::shared_ptr createBlackSdCard(); + diff --git a/CMakeLists.txt b/CMakeLists.txt index 4169e5fd3..c34e34da3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,6 +40,7 @@ if (DEFINED ENV{ESP_IDF_VERSION}) set(EXCLUDE_COMPONENTS "ElecrowCrowpanelBasic28") set(EXCLUDE_COMPONENTS "ElecrowCrowpanelBasic35") set(EXCLUDE_COMPONENTS "M5stackCore2") + set(EXCLUDE_COMPONENTS "CYD-JC2432W328C") endif() # Non-ESP32-S3 boards @@ -49,6 +50,8 @@ if (DEFINED ENV{ESP_IDF_VERSION}) set(EXCLUDE_COMPONENTS "LilygoTdeck") set(EXCLUDE_COMPONENTS "M5stackCoreS3") set(EXCLUDE_COMPONENTS "UnPhone") + set(EXCLUDE_COMPONENTS "CYD-8048S043C") + set(EXCLUDE_COMPONENTS "CYD-JC8048W550C") endif() # LVGL diff --git a/sdkconfig.board.cyd-8048S043c b/sdkconfig.board.cyd-8048S043c new file mode 100644 index 000000000..1d49d9e22 --- /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 000000000..c8b834e38 --- /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 000000000..4a488e69e --- /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