From 10e32e7b72a7e3a5f1eb8a5bbfb22b75ee7c55cd Mon Sep 17 00:00:00 2001 From: Madrajib LAB Date: Thu, 28 Nov 2024 20:37:19 +0530 Subject: [PATCH 1/2] Enable CYD display for CrowPanel 2.8 Inch touch display --- CYD-Klipper/boards/esp32-2432S028R.json | 8 ++-- CYD-Klipper/platformio.ini | 2 +- .../src/core/device/ESP32-2432S028R.cpp | 37 ++++++++----------- 3 files changed, 20 insertions(+), 27 deletions(-) diff --git a/CYD-Klipper/boards/esp32-2432S028R.json b/CYD-Klipper/boards/esp32-2432S028R.json index fe82521..4cf9778 100644 --- a/CYD-Klipper/boards/esp32-2432S028R.json +++ b/CYD-Klipper/boards/esp32-2432S028R.json @@ -8,7 +8,7 @@ "-DUSER_SETUP_LOADED=1", "-DILI9341_2_DRIVER=1", "-DTFT_BACKLIGHT_ON=HIGH", - "-DTFT_BL=21", + "-DTFT_BL=27", "-DTFT_MISO=12", "-DTFT_MOSI=13", "-DTFT_SCLK=14", @@ -16,10 +16,10 @@ "-DTFT_DC=2", "-DTFT_RST=-1", "-DLOAD_GCLD=1", - "-DSPI_FREQUENCY=55000000", + "-DSPI_FREQUENCY=15999999", "-DSPI_READ_FREQUENCY=20000000", - "-DSPI_TOUCH_FREQUENCY=2500000", - "-DTOUCH_CS=-1", + "-DSPI_TOUCH_FREQUENCY=600000", + "-DTOUCH_CS=33", "-DCYD_SCREEN_HEIGHT_PX=240", "-DCYD_SCREEN_WIDTH_PX=320", diff --git a/CYD-Klipper/platformio.ini b/CYD-Klipper/platformio.ini index 87de374..21fc8e0 100644 --- a/CYD-Klipper/platformio.ini +++ b/CYD-Klipper/platformio.ini @@ -9,7 +9,7 @@ ; https://docs.platformio.org/page/projectconf.html [env] -platform = https://github.com/platformio/platform-espressif32#v6.4.0 +platform = https://github.com/platformio/platform-espressif32 board = esp32dev framework = arduino monitor_speed = 115200 diff --git a/CYD-Klipper/src/core/device/ESP32-2432S028R.cpp b/CYD-Klipper/src/core/device/ESP32-2432S028R.cpp index d35cb34..cdd3c27 100644 --- a/CYD-Klipper/src/core/device/ESP32-2432S028R.cpp +++ b/CYD-Klipper/src/core/device/ESP32-2432S028R.cpp @@ -9,26 +9,21 @@ #include #include "../../conf/global_config.h" #include "lvgl.h" -#include #include #include "../lv_setup.h" -#define XPT2046_IRQ 36 -#define XPT2046_MOSI 32 -#define XPT2046_MISO 39 -#define XPT2046_CLK 25 -#define XPT2046_CS 33 #define CPU_FREQ_HIGH 240 #define CPU_FREQ_LOW 80 - -SPIClass touchscreen_spi = SPIClass(HSPI); -XPT2046_Touchscreen touchscreen(XPT2046_CS, XPT2046_IRQ); +#define TOUCH_THRESHOLD 600 static lv_disp_draw_buf_t draw_buf; static lv_color_t buf[CYD_SCREEN_HEIGHT_PX * CYD_SCREEN_WIDTH_PX / 10]; +uint16_t calData[5] = { 189, 3416, 359, 3439, 1}; TFT_eSPI tft = TFT_eSPI(); +uint16_t touchX, touchY; + void screen_setBrightness(byte brightness) { // calculate duty, 4095 from 2 ^ 12 - 1 @@ -53,12 +48,11 @@ void screen_lv_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *col void screen_lv_touchRead(lv_indev_drv_t *indev_driver, lv_indev_data_t *data) { - if (touchscreen.tirqTouched() && touchscreen.touched()) + if (tft.getTouch( &touchX, &touchY, TOUCH_THRESHOLD)) { - TS_Point p = touchscreen.getPoint(); data->state = LV_INDEV_STATE_PR; - data->point.x = p.x; - data->point.y = p.y; + data->point.x = touchX; + data->point.y = touchY; } else { @@ -72,13 +66,15 @@ void set_invert_display(){ void screen_setup() { - touchscreen_spi.begin(XPT2046_CLK, XPT2046_MISO, XPT2046_MOSI, XPT2046_CS); - touchscreen.begin(touchscreen_spi); - touchscreen.setRotation(global_config.rotate_screen ? 3 : 1); - lv_init(); tft.init(); + tft.fillScreen(TFT_BLACK); + tft.invertDisplay(false); + delay(300); + + tft.setRotation(1); + tft.setTouch( calData ); if (global_config.display_mode) { // <3 https://github.com/witnessmenow/ESP32-Cheap-Yellow-Display/blob/main/cyd.md#the-display-doesnt-look-as-good @@ -92,11 +88,8 @@ void screen_setup() ledcSetup(0, 5000, 12); ledcAttachPin(21, 0); - tft.setRotation(global_config.rotate_screen ? 3 : 1); - tft.fillScreen(TFT_BLACK); - set_invert_display(); - touchscreen_spi.begin(XPT2046_CLK, XPT2046_MISO, XPT2046_MOSI, XPT2046_CS); - touchscreen.begin(touchscreen_spi); + pinMode(TFT_BL, OUTPUT); + digitalWrite(TFT_BL, HIGH); lv_disp_draw_buf_init(&draw_buf, buf, NULL, CYD_SCREEN_HEIGHT_PX * CYD_SCREEN_WIDTH_PX / 10); From f64f300860b908f139d5ffa1956c73209bb28666 Mon Sep 17 00:00:00 2001 From: Madrajib LAB Date: Sat, 30 Nov 2024 09:49:25 +0530 Subject: [PATCH 2/2] Add support for CROWPANEL 2.8 inch resistive cyd varient boards. --- CYD-Klipper/boards/esp32-CROWPANEL-28R.json | 63 ++++++++++ CYD-Klipper/platformio.ini | 10 ++ .../src/core/device/ESP32-CROWPANEL_28R.cpp | 113 ++++++++++++++++++ 3 files changed, 186 insertions(+) create mode 100644 CYD-Klipper/boards/esp32-CROWPANEL-28R.json create mode 100644 CYD-Klipper/src/core/device/ESP32-CROWPANEL_28R.cpp diff --git a/CYD-Klipper/boards/esp32-CROWPANEL-28R.json b/CYD-Klipper/boards/esp32-CROWPANEL-28R.json new file mode 100644 index 0000000..1807b92 --- /dev/null +++ b/CYD-Klipper/boards/esp32-CROWPANEL-28R.json @@ -0,0 +1,63 @@ +{ + "build": { + "arduino": { + "ldscript": "esp32_out.ld" + }, + "core": "esp32", + "extra_flags": [ + "-DUSER_SETUP_LOADED=1", + "-DILI9341_2_DRIVER=1", + "-DTFT_BACKLIGHT_ON=HIGH", + "-DTFT_BL=27", + "-DTFT_MISO=12", + "-DTFT_MOSI=13", + "-DTFT_SCLK=14", + "-DTFT_CS=15", + "-DTFT_DC=2", + "-DTFT_RST=-1", + "-DLOAD_GCLD=1", + "-DSPI_FREQUENCY=15999999", + "-DSPI_READ_FREQUENCY=20000000", + "-DSPI_TOUCH_FREQUENCY=600000", + "-DTOUCH_CS=33", + + "-DCYD_SCREEN_HEIGHT_PX=240", + "-DCYD_SCREEN_WIDTH_PX=320", + "-DCYD_SCREEN_GAP_PX=8", + "-DCYD_SCREEN_MIN_BUTTON_HEIGHT_PX=35", + "-DCYD_SCREEN_MIN_BUTTON_WIDTH_PX=35", + "-DCYD_SCREEN_FONT=lv_font_montserrat_14", + "-DCYD_SCREEN_FONT_SMALL=lv_font_montserrat_10", + "-DCYD_SCREEN_SIDEBAR_SIZE_PX=40", + "-DCYD_SCREEN_DRIVER_ESP32_CROWPANEL_28R=1" + ], + "f_cpu": "240000000L", + "f_flash": "40000000L", + "flash_mode": "dio", + "mcu": "esp32", + "variant": "esp32" + }, + "connectivity": [ + "wifi", + "bluetooth", + "ethernet", + "can" + ], + "debug": { + "openocd_board": "esp-wroom-32.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "esp32-2432S028R", + "upload": { + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://www.aliexpress.com/item/1005004502250619.html", + "vendor": "Sunton" + } \ No newline at end of file diff --git a/CYD-Klipper/platformio.ini b/CYD-Klipper/platformio.ini index 87de374..9fa6052 100644 --- a/CYD-Klipper/platformio.ini +++ b/CYD-Klipper/platformio.ini @@ -84,3 +84,13 @@ board = esp32-4827S043C-smartdisplay [env:esp32-8048S043C-SD] board = esp32-8048S043C-smartdisplay +[env:esp32-CROWPANEL-28R] +platform = https://github.com/platformio/platform-espressif32#v6.9.0 +board = esp32-CROWPANEL-28R +lib_deps = + SPI + https://github.com/suchmememanyskill/lvgl + https://github.com/Bodmer/TFT_eSPI.git + bblanchon/ArduinoJson@^7.0.0 + plageoj/UrlEncode@^1.0.1 + erriez/ErriezCRC32 @ ^1.0.1 \ No newline at end of file diff --git a/CYD-Klipper/src/core/device/ESP32-CROWPANEL_28R.cpp b/CYD-Klipper/src/core/device/ESP32-CROWPANEL_28R.cpp new file mode 100644 index 0000000..745a649 --- /dev/null +++ b/CYD-Klipper/src/core/device/ESP32-CROWPANEL_28R.cpp @@ -0,0 +1,113 @@ +#ifdef CYD_SCREEN_DRIVER_ESP32_CROWPANEL_28R +#include "../screen_driver.h" + +#ifdef CYD_SCREEN_VERTICAL + #error "Vertical screen not supported with the ESP32_CROWPANEL_28R driver" +#endif + +#include +#include +#include "../../conf/global_config.h" +#include "lvgl.h" +#include +#include "../lv_setup.h" + +#define CPU_FREQ_HIGH 240 +#define CPU_FREQ_LOW 80 +#define TOUCH_THRESHOLD 600 + +static lv_disp_draw_buf_t draw_buf; +static lv_color_t buf[CYD_SCREEN_HEIGHT_PX * CYD_SCREEN_WIDTH_PX / 10]; +uint16_t calData[5] = { 189, 3416, 359, 3439, 1}; + +TFT_eSPI tft = TFT_eSPI(); + +uint16_t touchX, touchY; + +void screen_setBrightness(byte brightness) +{ + // calculate duty, 4095 from 2 ^ 12 - 1 + uint32_t duty = (4095 / 255) * brightness; + + // write duty to LEDC + ledcWrite(0, duty); +} + +void screen_lv_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) +{ + uint32_t w = (area->x2 - area->x1 + 1); + uint32_t h = (area->y2 - area->y1 + 1); + + tft.startWrite(); + tft.setAddrWindow(area->x1, area->y1, w, h); + tft.pushColors((uint16_t *)&color_p->full, w * h, true); + tft.endWrite(); + + lv_disp_flush_ready(disp); +} + +void screen_lv_touchRead(lv_indev_drv_t *indev_driver, lv_indev_data_t *data) +{ + if (tft.getTouch( &touchX, &touchY, TOUCH_THRESHOLD)) + { + data->state = LV_INDEV_STATE_PR; + data->point.x = touchX; + data->point.y = touchY; + } + else + { + data->state = LV_INDEV_STATE_REL; + } +} + +void set_invert_display(){ + tft.invertDisplay(get_current_printer_config()->invert_colors); +} + +void screen_setup() +{ + lv_init(); + + tft.init(); + tft.fillScreen(TFT_BLACK); + tft.invertDisplay(false); + delay(300); + + tft.setRotation(1); + tft.setTouch( calData ); + + if (global_config.display_mode) { + // <3 https://github.com/witnessmenow/ESP32-Cheap-Yellow-Display/blob/main/cyd.md#the-display-doesnt-look-as-good + tft.writecommand(ILI9341_GAMMASET); //Gamma curve selected + tft.writedata(2); + delay(120); + tft.writecommand(ILI9341_GAMMASET); //Gamma curve selected + tft.writedata(1); + } + + ledcSetup(0, 5000, 12); + ledcAttachPin(TFT_BL, 0); + + // pinMode(TFT_BL, OUTPUT); + // digitalWrite(TFT_BL, HIGH); + + lv_disp_draw_buf_init(&draw_buf, buf, NULL, CYD_SCREEN_HEIGHT_PX * CYD_SCREEN_WIDTH_PX / 10); + + /*Initialize the display*/ + static lv_disp_drv_t disp_drv; + lv_disp_drv_init(&disp_drv); + disp_drv.hor_res = CYD_SCREEN_WIDTH_PX; + disp_drv.ver_res = CYD_SCREEN_HEIGHT_PX; + disp_drv.flush_cb = screen_lv_flush; + disp_drv.draw_buf = &draw_buf; + lv_disp_drv_register(&disp_drv); + + /*Initialize the (dummy) input device driver*/ + static lv_indev_drv_t indev_drv; + lv_indev_drv_init(&indev_drv); + indev_drv.type = LV_INDEV_TYPE_POINTER; + indev_drv.read_cb = screen_lv_touchRead; + lv_indev_drv_register(&indev_drv); +} + +#endif // CYD_SCREEN_DRIVER_ESP32_CROWPANEL_28R \ No newline at end of file