diff --git a/.github/workflows/build-firmware.yml b/.github/workflows/build-firmware.yml index 4151ec2a..40e32de7 100644 --- a/.github/workflows/build-firmware.yml +++ b/.github/workflows/build-firmware.yml @@ -27,6 +27,15 @@ jobs: with: board_id: cyd-2432s028r arch: esp32 + cyd-2432s028rv3: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: "Build" + uses: ./.github/actions/build-firmware + with: + board_id: cyd-2432s028rv3 + arch: esp32 cyd-e32r28t: runs-on: ubuntu-latest steps: diff --git a/Boards/CYD-2432S028RV3/CMakeLists.txt b/Boards/CYD-2432S028RV3/CMakeLists.txt new file mode 100644 index 00000000..d9b561f2 --- /dev/null +++ b/Boards/CYD-2432S028RV3/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 XPT2046SoftSPI PwmBacklight driver vfs fatfs +) diff --git a/Boards/CYD-2432S028RV3/Source/CYD2432S028RV3.cpp b/Boards/CYD-2432S028RV3/Source/CYD2432S028RV3.cpp new file mode 100644 index 00000000..0e1d75ba --- /dev/null +++ b/Boards/CYD-2432S028RV3/Source/CYD2432S028RV3.cpp @@ -0,0 +1,134 @@ +#include "CYD2432S028RV3.h" +#include "devices/Display.h" +#include "devices/SdCard.h" +#include +#include +#include + +// SPI Transfer +#define CYD_SPI_TRANSFER_SIZE_LIMIT (CYD2432S028RV3_LCD_DRAW_BUFFER_SIZE * LV_COLOR_DEPTH / 8) +// Display backlight (PWM) +#define CYD2432S028RV3_LCD_PIN_BACKLIGHT GPIO_NUM_21 + +using namespace tt::hal; + +static 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(CYD2432S028RV3_LCD_PIN_BACKLIGHT); +} + +static DeviceVector createDevices() { + return { + createDisplay(), + createSdCard() + }; +} + +const Configuration cyd_2432s028rv3_config = { + .initBoot = initBoot, + .createDevices = createDevices, + .i2c = { + i2c::Configuration { + .name = "CN1", + .port = I2C_NUM_0, + .initMode = i2c::InitMode::ByTactility, + .isMutable = true, + .config = (i2c_config_t) { + .mode = I2C_MODE_MASTER, + .sda_io_num = GPIO_NUM_27, + .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_12, + .sclk_io_num = GPIO_NUM_14, + .quadwp_io_num = GPIO_NUM_NC, + .quadhd_io_num = GPIO_NUM_NC, + .data4_io_num = GPIO_NUM_NC, + .data5_io_num = GPIO_NUM_NC, + .data6_io_num = GPIO_NUM_NC, + .data7_io_num = GPIO_NUM_NC, + .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() + }, + // SDCard + 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 = GPIO_NUM_NC, + .quadhd_io_num = GPIO_NUM_NC, + .data4_io_num = GPIO_NUM_NC, + .data5_io_num = GPIO_NUM_NC, + .data6_io_num = GPIO_NUM_NC, + .data7_io_num = GPIO_NUM_NC, + .data_io_default_level = false, + .max_transfer_sz = 0, + .flags = 0, + .isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO, + .intr_flags = 0 + }, + .initMode = spi::InitMode::ByTactility, + .isMutable = false, + .lock = tt::lvgl::getSyncLock() // esp_lvgl_port owns the lock for the display + }, + }, + + .uart { + uart::Configuration { + .name = "P1", + .port = UART_NUM_1, + .rxPin = GPIO_NUM_1, + .txPin = GPIO_NUM_3, + .rtsPin = GPIO_NUM_NC, + .ctsPin = GPIO_NUM_NC, + .rxBufferSize = 1024, + .txBufferSize = 1024, + .config = { + .baud_rate = 115200, + .data_bits = UART_DATA_8_BITS, + .parity = UART_PARITY_DISABLE, + .stop_bits = UART_STOP_BITS_1, + .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, + .rx_flow_ctrl_thresh = 0, + .source_clk = UART_SCLK_DEFAULT, + .flags = { + .allow_pd = 0, + .backup_before_sleep = 0, + } + } + } + } +}; diff --git a/Boards/CYD-2432S028RV3/Source/CYD2432S028RV3.h b/Boards/CYD-2432S028RV3/Source/CYD2432S028RV3.h new file mode 100644 index 00000000..cf26f42b --- /dev/null +++ b/Boards/CYD-2432S028RV3/Source/CYD2432S028RV3.h @@ -0,0 +1,6 @@ +#pragma once + +#include + +// Resistive touch version of the 2.8" yellow board version 3 +extern const tt::hal::Configuration cyd_2432s028rv3_config; diff --git a/Boards/CYD-2432S028RV3/Source/devices/Display.cpp b/Boards/CYD-2432S028RV3/Source/devices/Display.cpp new file mode 100644 index 00000000..c6760ba9 --- /dev/null +++ b/Boards/CYD-2432S028RV3/Source/devices/Display.cpp @@ -0,0 +1,54 @@ +#include "Display.h" +#include "Xpt2046SoftSpi.h" +#include +#include + +constexpr auto* TAG = "CYD"; + +static std::shared_ptr createTouch() { + auto configuration = std::make_unique( + CYD_TOUCH_MOSI_PIN, + CYD_TOUCH_MISO_PIN, + CYD_TOUCH_SCK_PIN, + CYD_TOUCH_CS_PIN, + CYD2432S028RV3_LCD_HORIZONTAL_RESOLUTION, // 240 + CYD2432S028RV3_LCD_VERTICAL_RESOLUTION, // 320 + false, // swapXY + true, // mirrorX + false // mirrorY + ); + + // Allocate the driver + auto touch = std::make_shared(std::move(configuration)); + + // Start the driver + if (!touch->start()) { + ESP_LOGE(TAG, "Touch driver start failed"); + return nullptr; + } + + return touch; +} + +std::shared_ptr createDisplay() { + auto touch = createTouch(); + + auto configuration = std::make_unique( + CYD2432S028RV3_LCD_SPI_HOST, + CYD2432S028RV3_LCD_PIN_CS, + CYD2432S028RV3_LCD_PIN_DC, + CYD2432S028RV3_LCD_HORIZONTAL_RESOLUTION, + CYD2432S028RV3_LCD_VERTICAL_RESOLUTION, + touch, + false, // swapXY + false, // mirrorX + false, // mirrorY + false, // invertColor + CYD2432S028RV3_LCD_DRAW_BUFFER_SIZE + ); + + configuration->backlightDutyFunction = driver::pwmbacklight::setBacklightDuty; + + auto display = std::make_shared(std::move(configuration)); + return std::reinterpret_pointer_cast(display); +} diff --git a/Boards/CYD-2432S028RV3/Source/devices/Display.h b/Boards/CYD-2432S028RV3/Source/devices/Display.h new file mode 100644 index 00000000..709766b2 --- /dev/null +++ b/Boards/CYD-2432S028RV3/Source/devices/Display.h @@ -0,0 +1,22 @@ +#pragma once + +#include "Tactility/hal/display/DisplayDevice.h" +#include + +// Display +#define CYD2432S028RV3_LCD_SPI_HOST SPI2_HOST +#define CYD2432S028RV3_LCD_HORIZONTAL_RESOLUTION 240 +#define CYD2432S028RV3_LCD_VERTICAL_RESOLUTION 320 +#define CYD2432S028RV3_LCD_DRAW_BUFFER_HEIGHT (CYD2432S028RV3_LCD_VERTICAL_RESOLUTION / 10) +#define CYD2432S028RV3_LCD_DRAW_BUFFER_SIZE (CYD2432S028RV3_LCD_HORIZONTAL_RESOLUTION * CYD2432S028RV3_LCD_DRAW_BUFFER_HEIGHT) +#define CYD2432S028RV3_LCD_PIN_CS GPIO_NUM_15 +#define CYD2432S028RV3_LCD_PIN_DC GPIO_NUM_2 + +// Touch (Software SPI) +#define CYD_TOUCH_MISO_PIN GPIO_NUM_39 +#define CYD_TOUCH_MOSI_PIN GPIO_NUM_32 +#define CYD_TOUCH_SCK_PIN GPIO_NUM_25 +#define CYD_TOUCH_CS_PIN GPIO_NUM_33 +#define CYD_TOUCH_IRQ_PIN GPIO_NUM_36 + +std::shared_ptr createDisplay(); diff --git a/Boards/CYD-2432S028RV3/Source/devices/SdCard.cpp b/Boards/CYD-2432S028RV3/Source/devices/SdCard.cpp new file mode 100644 index 00000000..03a26341 --- /dev/null +++ b/Boards/CYD-2432S028RV3/Source/devices/SdCard.cpp @@ -0,0 +1,21 @@ +#include "SdCard.h" +#include +#include + +using tt::hal::sdcard::SpiSdCardDevice; + +std::shared_ptr createSdCard() { + auto config = std::make_unique( + GPIO_NUM_5, + GPIO_NUM_NC, + GPIO_NUM_NC, + GPIO_NUM_NC, + SdCardDevice::MountBehaviour::AtBoot, + std::make_shared(tt::Mutex::Type::Recursive), + std::vector(), + SPI3_HOST + ); + + return std::make_shared(std::move(config)); +} + diff --git a/Boards/CYD-2432S028RV3/Source/devices/SdCard.h b/Boards/CYD-2432S028RV3/Source/devices/SdCard.h new file mode 100644 index 00000000..4da9f5b9 --- /dev/null +++ b/Boards/CYD-2432S028RV3/Source/devices/SdCard.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/Buildscripts/board.cmake b/Buildscripts/board.cmake index d9961b2e..36cff483 100644 --- a/Buildscripts/board.cmake +++ b/Buildscripts/board.cmake @@ -25,6 +25,8 @@ function(INIT_TACTILITY_GLOBALS SDKCONFIG_FILE) set(TACTILITY_BOARD_PROJECT CYD-2432S024C) elseif (board_id STREQUAL "cyd-2432s028r") set(TACTILITY_BOARD_PROJECT CYD-2432S028R) + elseif (board_id STREQUAL "cyd-2432s028rv3") + set(TACTILITY_BOARD_PROJECT CYD-2432S028RV3) elseif (board_id STREQUAL "cyd-e32r28t") set(TACTILITY_BOARD_PROJECT CYD-E32R28T) elseif (board_id STREQUAL "cyd-2432s032c") diff --git a/Firmware/Kconfig b/Firmware/Kconfig index caf41383..669d1f6b 100644 --- a/Firmware/Kconfig +++ b/Firmware/Kconfig @@ -15,6 +15,8 @@ menu "Tactility App" bool "CYD 2432S024C" config TT_BOARD_CYD_2432S028R bool "CYD 2432S028R" + config TT_BOARD_CYD_2432S028RV3 + bool "CYD 2432S028RV3" config TT_BOARD_CYD_E32R28T bool "CYD E32R28T" config TT_BOARD_CYD_2432S032C diff --git a/Firmware/Source/Boards.h b/Firmware/Source/Boards.h index cc1e4e0f..4ed55f38 100644 --- a/Firmware/Source/Boards.h +++ b/Firmware/Source/Boards.h @@ -20,6 +20,9 @@ #elif defined(CONFIG_TT_BOARD_CYD_2432S028R) #include "CYD2432S028R.h" #define TT_BOARD_HARDWARE &cyd_2432s028r_config +#elif defined(CONFIG_TT_BOARD_CYD_2432S028RV3) +#include "CYD2432S028RV3.h" +#define TT_BOARD_HARDWARE &cyd_2432s028rv3_config #elif defined(CONFIG_TT_BOARD_CYD_E32R28T) #include "E32R28T.h" #define TT_BOARD_HARDWARE &cyd_e32r28t_config diff --git a/sdkconfig.board.cyd-2432s028rv3 b/sdkconfig.board.cyd-2432s028rv3 new file mode 100644 index 00000000..3e1cc993 --- /dev/null +++ b/sdkconfig.board.cyd-2432s028rv3 @@ -0,0 +1,54 @@ +# Software defaults +# Increase stack size for WiFi (fixes crash after scan) +CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=3072 +CONFIG_ESP_MAIN_TASK_STACK_SIZE=5120 +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=5120 +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FATFS_LFN_HEAP=y +CONFIG_FATFS_VOLUME_COUNT=3 +CONFIG_FATFS_SECTOR_512=y +CONFIG_WL_SECTOR_SIZE_512=y +CONFIG_WL_SECTOR_SIZE=512 +CONFIG_WL_SECTOR_MODE_SAFE=y +CONFIG_WL_SECTOR_MODE=1 +CONFIG_MBEDTLS_SSL_PROTO_TLS1_3=y + +# Hardware: Main +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions-4mb.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions-4mb.csv" +CONFIG_TT_BOARD_NAME="CYD 2432S028RV3" +CONFIG_TT_BOARD_ID="cyd-2432s028rv3" +CONFIG_TT_BOARD_CYD_2432S028RV3=y +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 +CONFIG_LV_THEME_DEFAULT_DARK=y +# 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