diff --git a/.gitmodules b/.gitmodules index de1368499a..f46c183588 100644 --- a/.gitmodules +++ b/.gitmodules @@ -89,3 +89,19 @@ path = sdk/bouffalo_sdk url = https://github.com/bouffalolab/bouffalo_sdk branch = master +[submodule "libraries/ESP32_Display_Panel"] + path = libraries/ESP32_Display_Panel + url = https://github.com/esp-arduino-libs/ESP32_Display_Panel.git + branch = master +[submodule "libraries/ESP32_IO_Expander"] + path = libraries/ESP32_IO_Expander + url = https://github.com/esp-arduino-libs/ESP32_IO_Expander.git + branch = master +[submodule "libraries/esp-lib-utils"] + path = libraries/esp-lib-utils + url = https://github.com/esp-arduino-libs/esp-lib-utils.git + branch = master +[submodule "libraries/lvgl"] + path = libraries/lvgl + url = https://github.com/lvgl/lvgl.git + branch = release/v8.4 diff --git a/build_error.txt b/build_error.txt new file mode 100644 index 0000000000..52fca22f20 --- /dev/null +++ b/build_error.txt @@ -0,0 +1,109 @@ +============================================== +Building OpenBeken ESP32 on Windows natively +Target: esp32s3ram +Size: 4MB +Variant (2=tuyaMCU/4MB): 2 +Bootloader Addr: 0x0 +Build Directory: platforms\ESP-IDF\build-s3ram +Action: build +============================================== +[INFO] ESP-IDF 'idf.py' not found in PATH. +[INFO] Attempting to load from sdk\esp-idf... +Activating ESP-IDF 5.5 +Setting IDF_PATH to 'W:\GIT\OpenBK7231T\apps\OpenBK7231T_App\sdk\esp-idf'. +* Checking python version ... 3.14.3 +* Checking python dependencies ... OK +* Deactivating the current ESP-IDF environment (if any) ... OK +* Establishing a new ESP-IDF environment ... OK +* Identifying shell ... cmd.exe +* Detecting outdated tools in system ... Found tools that are not used by active ESP-IDF version. +For removing old versions of ccache, cmake, esp-clang, idf-exe, mconf, ninja, openocd-esp32, riscv32-esp-elf-gdb, xtensa-esp-elf-gdb, xtensa-lx106-elf use command 'python.exe W:\GIT\OpenBK7231T\apps\OpenBK7231T_App\sdk\esp-idf\tools\idf_tools.py +uninstall' +To free up even more space, remove installation packages of those tools. +Use option python.exe W:\GIT\OpenBK7231T\apps\OpenBK7231T_App\sdk\esp-idf\tools\idf_tools.py uninstall --remove-archives. + +Done You can now compile ESP-IDF projects. +Go to the project directory and run: + + idf.py build + +[INFO] ESP-IDF environment is ready. +[INFO] Running Berry prebuild... +[INFO] Repo root: W:\GIT\OpenBK7231T\apps\OpenBK7231T_App +[INFO] Using Python command: python +[INFO] Executing Berry C-Object-Compiler (coc)... +[INFO] Berry prebuild completed successfully. +[INFO] Running CMake configuration for esp32s3ram... +-- Minimal build - OFF +-- Building ESP-IDF components for target esp32s3 +-- Checking Python dependencies... +Python requirements are satisfied. +Constraint file: C:\Users\iwos2\.espressif\espidf.constraints.v5.5.txt +Requirement files: + - W:\GIT\OpenBK7231T\apps\OpenBK7231T_App\sdk\esp-idf\tools\requirements\requirements.core.txt +Python being checked: C:\Users\iwos2\.espressif\python_env\idf5.5_py3.14_env\Scripts\python.exe +-- Project sdkconfig file W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF/sdkconfig +Loading defaults file W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF/sdkconfig.defaults... +W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF/sdkconfig.defaults:8 CONFIG_NEWLIB_NANO_FORMAT was replaced with CONFIG_LIBC_NEWLIB_NANO_FORMAT +Loading defaults file W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF/sdkconfig.defaults.esp32s3... +Loading defaults file W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF/sdkconfig.defaults.esp32s3ram... +-- Compiler supported targets: xtensa-esp-elf +-- USING O3 +-- App "OpenBeken" version: 1.18.288-3-g8d7ebae9-dirty +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF/build-s3ram/esp-idf/esp_system/ld/memory.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF/build-s3ram/esp-idf/esp_system/ld/sections.ld.in +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.api.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.bt_funcs.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libgcc.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.wdt.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.version.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_master.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_50.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_smp.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_dtm.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_test.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_scan.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libc.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.newlib.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/soc/esp32s3/ld/esp32s3.peripherals.ld +-- Component idf::main will be linked with -Wl,--whole-archive +-- Components: app_trace app_update bootloader bootloader_support bt cmock console cxx driver efuse esp-tls esp_adc esp_app_format esp_bootloader_format esp_coex esp_common esp_driver_ana_cmpr esp_driver_bitscrambler esp_driver_cam esp_driver_dac esp_driver_gpio esp_driver_gptimer esp_driver_i2c esp_driver_i2s esp_driver_isp esp_driver_jpeg esp_driver_ledc esp_driver_mcpwm esp_driver_parlio esp_driver_pcnt esp_driver_ppa esp_driver_rmt esp_driver_sdio esp_driver_sdm esp_driver_sdmmc esp_driver_sdspi esp_driver_spi esp_driver_touch_sens esp_driver_tsens esp_driver_twai esp_driver_uart esp_driver_usb_serial_jtag esp_eth esp_event esp_gdbstub esp_hid esp_http_client esp_http_server esp_https_ota esp_https_server esp_hw_support esp_lcd esp_local_ctrl esp_mm esp_netif esp_netif_stack esp_partition esp_phy esp_pm esp_psram esp_ringbuf esp_rom esp_security esp_system esp_timer esp_vfs_console esp_wifi espcoredump esptool_py fatfs freertos hal heap http_parser idf_test ieee802154 json log lwip main mbedtls mqtt newlib nvs_flash nvs_sec_provider openthread partition_table perfmon protobuf-c protocomm pthread rt sdmmc soc spi_flash spiffs tcp_transport touch_element ulp unity usb vfs wear_levelling wifi_provisioning wpa_supplicant xtensa +-- Component paths: W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/app_trace W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/app_update W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/bootloader W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/bootloader_support W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/bt W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/cmock W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/console W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/cxx W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/driver W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/efuse W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp-tls W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_adc W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_app_format W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_bootloader_format W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_coex W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_common W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_ana_cmpr W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_bitscrambler W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_cam W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_dac W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_gpio W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_gptimer W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_i2c W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_i2s W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_isp W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_jpeg W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_ledc W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_mcpwm W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_parlio W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_pcnt W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_ppa W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_rmt W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_sdio W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_sdm W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_sdmmc W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_sdspi W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_spi W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_touch_sens W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_tsens W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_twai W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_uart W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_usb_serial_jtag W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_eth W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_event W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_gdbstub W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hid W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_http_client W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_http_server W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_https_ota W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_https_server W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_lcd W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_local_ctrl W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_mm W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_netif W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_netif_stack W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_partition W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_phy W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_pm W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_psram W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_ringbuf W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_security W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_system W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_timer W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_vfs_console W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_wifi W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/espcoredump W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esptool_py W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/fatfs W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/hal W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/heap W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/http_parser W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/idf_test W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/ieee802154 W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/json W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/log W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF/main W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mqtt W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/newlib W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/nvs_flash W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/nvs_sec_provider W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/openthread W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/partition_table W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/perfmon W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/protobuf-c W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/protocomm W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/pthread W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/rt W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/sdmmc W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/soc W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/spi_flash W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/spiffs W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/tcp_transport W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/touch_element W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/ulp W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/unity W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/usb W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/vfs W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/wear_levelling W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/wifi_provisioning W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/wpa_supplicant W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/xtensa +-- Configuring done (34.8s) +-- Generating done (5.1s) +-- Build files have been written to: W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF/build-s3ram +[INFO] Building with CMake/Ninja... +[1/259] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_cse7766.c.obj +[2/259] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_main.c.obj +FAILED: esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_main.c.obj +C:\Users\iwos2\.espressif\tools\xtensa-esp-elf\esp-14.2.0_20241119\xtensa-esp-elf\bin\xtensa-esp32s3-elf-gcc.exe -DESP_PLATFORM -DIDF_VER=\"v5.5.1\" -DLWIP_NOASSERT=1 -DMBEDTLS_CONFIG_FILE=\"mbedtls/esp_config.h\" -DOBK_VARIANT=2 -DPLATFORM_ESPIDF=1 -DSOC_MMU_PAGE_SIZE=CONFIG_MMU_PAGE_SIZE -DSOC_XTAL_FREQ_MHZ=CONFIG_XTAL_FREQ -DUSER_SW_VER=\"dev_esp32\" -D_GLIBCXX_HAVE_POSIX_SEMAPHORE -D_GLIBCXX_USE_POSIX_SEMAPHORE -D_GNU_SOURCE -D_POSIX_READER_WRITER_LOCKS -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/../../libraries/berry/src -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/../../include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/../../src/driver/display -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF/build-s3ram/config -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/newlib/platform_include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos/config/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos/config/include/freertos -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos/config/xtensa/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos/FreeRTOS-Kernel/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/include/freertos -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos/esp_additions/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/include/soc -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/include/soc/esp32s3 -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/dma/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/ldo/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/debug_probe/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/mspi_timing_tuning/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/mspi_timing_tuning/tuning_scheme_impl/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/power_supply/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/port/esp32s3/. -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/port/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/mspi_timing_tuning/port/esp32s3/. -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/mspi_timing_tuning/port/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/heap/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/heap/tlsf -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/log/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/soc/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/soc/esp32s3 -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/soc/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/soc/esp32s3/register -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/hal/platform_port/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/hal/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/hal/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/include/esp32s3 -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3 -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_common/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_system/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_system/port/soc -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_system/port/include/private -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/xtensa/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/xtensa/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/xtensa/deprecated_include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/include/apps -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/include/apps/sntp -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/lwip/src/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/port/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/port/freertos/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/port/esp32xx/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/port/esp32xx/include/arch -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/port/esp32xx/include/sys -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mqtt/esp-mqtt/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_event/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/tcp_transport/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp-tls -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp-tls/esp-tls-crypto -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls/port/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls/mbedtls/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls/mbedtls/library -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls/esp_crt_bundle/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls/mbedtls/3rdparty/everest/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls/mbedtls/3rdparty/p256-m -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls/mbedtls/3rdparty/p256-m/p256-m -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_timer/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_wifi/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_wifi/include/local -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_wifi/wifi_apps/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_wifi/wifi_apps/nan_app/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_phy/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_phy/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_netif/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/nvs_flash/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_partition/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_tsens/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_gpio/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_pm/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/app_update/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/bootloader_support/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/bootloader_support/bootloader_flash/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_app_format/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_bootloader_format/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_adc/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_adc/interface -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_adc/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_adc/deprecated/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_uart/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_ledc/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/spi_flash/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_spi/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_gptimer/include -mlongcalls -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -fdiagnostics-color=always -ffunction-sections -fdata-sections -Wall -Werror=all -Wno-error=unused-function -Wno-error=unused-variable -Wno-error=unused-but-set-variable -Wno-error=deprecated-declarations -Wextra -Wno-error=extra -Wno-unused-parameter -Wno-sign-compare -Wno-enum-conversion -gdwarf-4 -ggdb -DENABLE_DRIVER_MDNS=1 -DLWIP_MDNS_RESPONDER=1 -mdisable-hardware-atomics -Os -freorder-blocks -fmacro-prefix-map=W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF=. -fmacro-prefix-map=W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf=/IDF -fstrict-volatile-bitfields -fno-jump-tables -fno-tree-switch-conversion -Wno-error=format-truncation -Wno-error=incompatible-pointer-types -DLV_CONF_INCLUDE_SIMPLE=1 -std=gnu17 -Wno-old-style-declaration -MD -MT esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_main.c.obj -MF esp-idf\main\CMakeFiles\__idf_main.dir\W_\GIT\OpenBK7231T\apps\OpenBK7231T_App\src\driver\drv_main.c.obj.d -o esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_main.c.obj -c W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_main.c +W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_main.c:1530:9: error: expected '}' before '{' token + 1530 | { "Display", // Driver Name + | ^ +W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_main.c:54:31: note: to match this '{' + 54 | static driver_t g_drivers[] = { + | ^ +[3/259] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_dmx512.c.obj +W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_dmx512.c: In function 'DMX_Init': +W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_dmx512.c:109:27: warning: assignment to 'void (*)(uint32_t, byte)' {aka 'void (*)(long unsigned int, unsigned char)'} from incompatible pointer type 'void (*)(int, byte)' {aka 'void (*)(int, unsigned char)'} [-Wincompatible-pointer-types] + 109 | ws_export.setByte = DMX_setByte; + | ^ +[4/259] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_ddp.c.obj +W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_ddp.c: In function 'DDP_Parse': +W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_ddp.c:129:22: warning: unused variable 'bytesPerPixel' [-Wunused-variable] + 129 | byte bytesPerPixel = ((data[2] & 0b00111000) >> 3 == 0b011) ? 4 : 3; + | ^~~~~~~~~~~~~ +[5/259] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_drawers.c.obj +[6/259] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_dht.c.obj +[7/259] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_debouncer.c.obj +[8/259] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_dht_internal.c.obj +W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_dht_internal.c: In function 'DHT_computeHeatIndexInternal': +W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_dht_internal.c:231:38: warning: using integer absolute value function 'abs' when argument is of floating-point type 'double' [-Wabsolute-value] + 231 | sqrt((17.0 - abs(temperature - 95.0)) * 0.05882); + | ^~~ +[9/259] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_doorSensorWithDeepSleep.c.obj +[10/259] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_ds1820_common.c.obj +[11/259] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_ds1820_simple.c.obj +ninja: build stopped: subcommand failed. +[ERROR] Build failed diff --git a/build_output.txt b/build_output.txt new file mode 100644 index 0000000000..b0e8ae6598 --- /dev/null +++ b/build_output.txt @@ -0,0 +1,102 @@ +============================================== +Building OpenBeken ESP32 on Windows natively +Target: esp32s3ram +Size: 4MB +Variant (2=tuyaMCU/4MB): 2 +Bootloader Addr: 0x0 +Build Directory: platforms\ESP-IDF\build-s3ram +Action: build +============================================== +[INFO] ESP-IDF 'idf.py' not found in PATH. +[INFO] Attempting to load from sdk\esp-idf... +Activating ESP-IDF 5.5 +Setting IDF_PATH to 'W:\GIT\OpenBK7231T\apps\OpenBK7231T_App\sdk\esp-idf'. +* Checking python version ... 3.14.3 +* Checking python dependencies ... OK +* Deactivating the current ESP-IDF environment (if any) ... OK +* Establishing a new ESP-IDF environment ... OK +* Identifying shell ... cmd.exe +* Detecting outdated tools in system ... Found tools that are not used by active ESP-IDF version. +For removing old versions of ccache, cmake, esp-clang, idf-exe, mconf, ninja, openocd-esp32, riscv32-esp-elf-gdb, xtensa-esp-elf-gdb, xtensa-lx106-elf use command 'python.exe W:\GIT\OpenBK7231T\apps\OpenBK7231T_App\sdk\esp-idf\tools\idf_tools.py +uninstall' +To free up even more space, remove installation packages of those tools. +Use option python.exe W:\GIT\OpenBK7231T\apps\OpenBK7231T_App\sdk\esp-idf\tools\idf_tools.py uninstall --remove-archives. + +Done You can now compile ESP-IDF projects. +Go to the project directory and run: + + idf.py build + +[INFO] ESP-IDF environment is ready. +[INFO] Running Berry prebuild... +[INFO] Repo root: W:\GIT\OpenBK7231T\apps\OpenBK7231T_App +[INFO] Using Python command: python +[INFO] Executing Berry C-Object-Compiler (coc)... +[INFO] Berry prebuild completed successfully. +[INFO] Running CMake configuration for esp32s3ram... +-- Minimal build - OFF +-- Building ESP-IDF components for target esp32s3 +-- Checking Python dependencies... +Python requirements are satisfied. +Constraint file: C:\Users\iwos2\.espressif\espidf.constraints.v5.5.txt +Requirement files: + - W:\GIT\OpenBK7231T\apps\OpenBK7231T_App\sdk\esp-idf\tools\requirements\requirements.core.txt +Python being checked: C:\Users\iwos2\.espressif\python_env\idf5.5_py3.14_env\Scripts\python.exe +-- ENABLE_DISPLAY is '' in main/CMakeLists.txt +-- Project sdkconfig file W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF/sdkconfig +Loading defaults file W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF/sdkconfig.defaults... +W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF/sdkconfig.defaults:8 CONFIG_NEWLIB_NANO_FORMAT was replaced with CONFIG_LIBC_NEWLIB_NANO_FORMAT +Loading defaults file W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF/sdkconfig.defaults.esp32s3... +Loading defaults file W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF/sdkconfig.defaults.esp32s3ram... +-- Compiler supported targets: xtensa-esp-elf +-- USING O3 +-- App "OpenBeken" version: 1.18.288-3-g8d7ebae9-dirty +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF/build-s3ram/esp-idf/esp_system/ld/memory.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF/build-s3ram/esp-idf/esp_system/ld/sections.ld.in +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.api.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.bt_funcs.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libgcc.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.wdt.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.version.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_master.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_50.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_smp.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_dtm.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_test.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_scan.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libc.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.newlib.ld +-- Adding linker script W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/soc/esp32s3/ld/esp32s3.peripherals.ld +-- ENABLE_DISPLAY is '1' in main/CMakeLists.txt +-- Component idf::main will be linked with -Wl,--whole-archive +-- Components: ESP32_Display_Panel ESP32_IO_Expander app_trace app_update bootloader bootloader_support bt cmock console cxx driver efuse esp-lib-utils esp-tls esp_adc esp_app_format esp_bootloader_format esp_coex esp_common esp_driver_ana_cmpr esp_driver_bitscrambler esp_driver_cam esp_driver_dac esp_driver_gpio esp_driver_gptimer esp_driver_i2c esp_driver_i2s esp_driver_isp esp_driver_jpeg esp_driver_ledc esp_driver_mcpwm esp_driver_parlio esp_driver_pcnt esp_driver_ppa esp_driver_rmt esp_driver_sdio esp_driver_sdm esp_driver_sdmmc esp_driver_sdspi esp_driver_spi esp_driver_touch_sens esp_driver_tsens esp_driver_twai esp_driver_uart esp_driver_usb_serial_jtag esp_eth esp_event esp_gdbstub esp_hid esp_http_client esp_http_server esp_https_ota esp_https_server esp_hw_support esp_lcd esp_local_ctrl esp_mm esp_netif esp_netif_stack esp_partition esp_phy esp_pm esp_psram esp_ringbuf esp_rom esp_security esp_system esp_timer esp_vfs_console esp_wifi espcoredump esptool_py fatfs freertos hal heap http_parser idf_test ieee802154 json log lvgl lwip main mbedtls mqtt newlib nvs_flash nvs_sec_provider openthread partition_table perfmon protobuf-c protocomm pthread rt sdmmc soc spi_flash spiffs tcp_transport touch_element ulp unity usb vfs wear_levelling wifi_provisioning wpa_supplicant xtensa +-- Component paths: W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/libraries/ESP32_Display_Panel W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/libraries/ESP32_IO_Expander W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/app_trace W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/app_update W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/bootloader W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/bootloader_support W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/bt W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/cmock W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/console W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/cxx W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/driver W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/efuse W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/libraries/esp-lib-utils W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp-tls W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_adc W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_app_format W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_bootloader_format W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_coex W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_common W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_ana_cmpr W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_bitscrambler W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_cam W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_dac W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_gpio W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_gptimer W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_i2c W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_i2s W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_isp W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_jpeg W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_ledc W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_mcpwm W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_parlio W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_pcnt W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_ppa W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_rmt W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_sdio W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_sdm W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_sdmmc W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_sdspi W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_spi W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_touch_sens W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_tsens W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_twai W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_uart W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_usb_serial_jtag W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_eth W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_event W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_gdbstub W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hid W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_http_client W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_http_server W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_https_ota W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_https_server W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_lcd W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_local_ctrl W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_mm W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_netif W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_netif_stack W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_partition W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_phy W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_pm W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_psram W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_ringbuf W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_security W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_system W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_timer W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_vfs_console W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_wifi W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/espcoredump W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esptool_py W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/fatfs W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/hal W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/heap W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/http_parser W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/idf_test W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/ieee802154 W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/json W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/log W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/libraries/lvgl W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF/main W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mqtt W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/newlib W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/nvs_flash W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/nvs_sec_provider W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/openthread W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/partition_table W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/perfmon W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/protobuf-c W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/protocomm W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/pthread W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/rt W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/sdmmc W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/soc W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/spi_flash W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/spiffs W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/tcp_transport W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/touch_element W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/ulp W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/unity W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/usb W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/vfs W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/wear_levelling W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/wifi_provisioning W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/wpa_supplicant W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/xtensa +-- Configuring done (44.5s) +-- Generating done (9.2s) +-- Build files have been written to: W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF/build-s3ram +[INFO] Building with CMake/Ninja... +[1/606] Building CXX object esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/display/lvgl_v8_port.cpp.obj +FAILED: esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/display/lvgl_v8_port.cpp.obj +C:\Users\iwos2\.espressif\tools\xtensa-esp-elf\esp-14.2.0_20241119\xtensa-esp-elf\bin\xtensa-esp32s3-elf-g++.exe -DESP_PLATFORM -DIDF_VER=\"v5.5.1\" -DLWIP_NOASSERT=1 -DMBEDTLS_CONFIG_FILE=\"mbedtls/esp_config.h\" -DOBK_VARIANT=2 -DPLATFORM_ESPIDF=1 -DSOC_MMU_PAGE_SIZE=CONFIG_MMU_PAGE_SIZE -DSOC_XTAL_FREQ_MHZ=CONFIG_XTAL_FREQ -DUSER_SW_VER=\"dev_esp32\" -D_GLIBCXX_HAVE_POSIX_SEMAPHORE -D_GLIBCXX_USE_POSIX_SEMAPHORE -D_GNU_SOURCE -D_POSIX_READER_WRITER_LOCKS -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/../../libraries/berry/src -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/../../include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/../../src/driver/display -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF/build-s3ram/config -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/newlib/platform_include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos/config/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos/config/include/freertos -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos/config/xtensa/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos/FreeRTOS-Kernel/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/include/freertos -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos/esp_additions/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/include/soc -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/include/soc/esp32s3 -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/dma/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/ldo/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/debug_probe/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/mspi_timing_tuning/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/mspi_timing_tuning/tuning_scheme_impl/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/power_supply/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/port/esp32s3/. -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/port/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/mspi_timing_tuning/port/esp32s3/. -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/mspi_timing_tuning/port/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/heap/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/heap/tlsf -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/log/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/soc/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/soc/esp32s3 -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/soc/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/soc/esp32s3/register -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/hal/platform_port/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/hal/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/hal/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/include/esp32s3 -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3 -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_common/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_system/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_system/port/soc -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_system/port/include/private -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/xtensa/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/xtensa/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/xtensa/deprecated_include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/include/apps -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/include/apps/sntp -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/lwip/src/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/port/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/port/freertos/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/port/esp32xx/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/port/esp32xx/include/arch -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/port/esp32xx/include/sys -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mqtt/esp-mqtt/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_event/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/tcp_transport/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp-tls -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp-tls/esp-tls-crypto -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls/port/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls/mbedtls/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls/mbedtls/library -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls/esp_crt_bundle/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls/mbedtls/3rdparty/everest/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls/mbedtls/3rdparty/p256-m -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls/mbedtls/3rdparty/p256-m/p256-m -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_timer/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_wifi/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_wifi/include/local -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_wifi/wifi_apps/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_wifi/wifi_apps/nan_app/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_phy/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_phy/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_netif/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/nvs_flash/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_partition/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_tsens/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_gpio/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_pm/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/app_update/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/bootloader_support/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/bootloader_support/bootloader_flash/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_app_format/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_bootloader_format/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_adc/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_adc/interface -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_adc/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_adc/deprecated/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_uart/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_ledc/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/spi_flash/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_spi/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_gptimer/include -mlongcalls -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -fdiagnostics-color=always -ffunction-sections -fdata-sections -Wall -Werror=all -Wno-error=unused-function -Wno-error=unused-variable -Wno-error=unused-but-set-variable -Wno-error=deprecated-declarations -Wextra -Wno-error=extra -Wno-unused-parameter -Wno-sign-compare -Wno-enum-conversion -gdwarf-4 -ggdb -DENABLE_DRIVER_MDNS=1 -DLWIP_MDNS_RESPONDER=1 -mdisable-hardware-atomics -Os -freorder-blocks -fmacro-prefix-map=W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF=. -fmacro-prefix-map=W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf=/IDF -fstrict-volatile-bitfields -fno-jump-tables -fno-tree-switch-conversion -Wno-error=format-truncation -Wno-error=incompatible-pointer-types -DLV_CONF_INCLUDE_SIMPLE=1 -std=gnu++2b -fno-exceptions -fno-rtti -fuse-cxa-atexit -MD -MT esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/display/lvgl_v8_port.cpp.obj -MF esp-idf\main\CMakeFiles\__idf_main.dir\W_\GIT\OpenBK7231T\apps\OpenBK7231T_App\src\driver\display\lvgl_v8_port.cpp.obj.d -o esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/display/lvgl_v8_port.cpp.obj -c W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/display/lvgl_v8_port.cpp +W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/display/lvgl_v8_port.cpp:8:10: fatal error: esp_lib_utils.h: No such file or directory + 8 | #include "esp_lib_utils.h" + | ^~~~~~~~~~~~~~~~~ +compilation terminated. +[2/606] Building CXX object esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_display.cpp.obj +FAILED: esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_display.cpp.obj +C:\Users\iwos2\.espressif\tools\xtensa-esp-elf\esp-14.2.0_20241119\xtensa-esp-elf\bin\xtensa-esp32s3-elf-g++.exe -DESP_PLATFORM -DIDF_VER=\"v5.5.1\" -DLWIP_NOASSERT=1 -DMBEDTLS_CONFIG_FILE=\"mbedtls/esp_config.h\" -DOBK_VARIANT=2 -DPLATFORM_ESPIDF=1 -DSOC_MMU_PAGE_SIZE=CONFIG_MMU_PAGE_SIZE -DSOC_XTAL_FREQ_MHZ=CONFIG_XTAL_FREQ -DUSER_SW_VER=\"dev_esp32\" -D_GLIBCXX_HAVE_POSIX_SEMAPHORE -D_GLIBCXX_USE_POSIX_SEMAPHORE -D_GNU_SOURCE -D_POSIX_READER_WRITER_LOCKS -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/../../libraries/berry/src -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/../../include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/../../src/driver/display -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF/build-s3ram/config -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/newlib/platform_include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos/config/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos/config/include/freertos -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos/config/xtensa/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos/FreeRTOS-Kernel/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/include/freertos -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/freertos/esp_additions/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/include/soc -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/include/soc/esp32s3 -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/dma/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/ldo/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/debug_probe/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/mspi_timing_tuning/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/mspi_timing_tuning/tuning_scheme_impl/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/power_supply/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/port/esp32s3/. -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/port/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/mspi_timing_tuning/port/esp32s3/. -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_hw_support/mspi_timing_tuning/port/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/heap/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/heap/tlsf -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/log/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/soc/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/soc/esp32s3 -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/soc/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/soc/esp32s3/register -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/hal/platform_port/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/hal/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/hal/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3/include/esp32s3 -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_rom/esp32s3 -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_common/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_system/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_system/port/soc -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_system/port/include/private -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/xtensa/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/xtensa/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/xtensa/deprecated_include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/include/apps -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/include/apps/sntp -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/lwip/src/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/port/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/port/freertos/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/port/esp32xx/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/port/esp32xx/include/arch -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/lwip/port/esp32xx/include/sys -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mqtt/esp-mqtt/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_event/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/tcp_transport/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp-tls -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp-tls/esp-tls-crypto -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls/port/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls/mbedtls/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls/mbedtls/library -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls/esp_crt_bundle/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls/mbedtls/3rdparty/everest/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls/mbedtls/3rdparty/p256-m -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/mbedtls/mbedtls/3rdparty/p256-m/p256-m -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_timer/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_wifi/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_wifi/include/local -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_wifi/wifi_apps/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_wifi/wifi_apps/nan_app/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_phy/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_phy/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_netif/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/nvs_flash/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_partition/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_tsens/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_gpio/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_pm/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/app_update/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/bootloader_support/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/bootloader_support/bootloader_flash/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_app_format/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_bootloader_format/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_adc/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_adc/interface -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_adc/esp32s3/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_adc/deprecated/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_uart/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_ledc/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/spi_flash/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_spi/include -IW:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf/components/esp_driver_gptimer/include -mlongcalls -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -fdiagnostics-color=always -ffunction-sections -fdata-sections -Wall -Werror=all -Wno-error=unused-function -Wno-error=unused-variable -Wno-error=unused-but-set-variable -Wno-error=deprecated-declarations -Wextra -Wno-error=extra -Wno-unused-parameter -Wno-sign-compare -Wno-enum-conversion -gdwarf-4 -ggdb -DENABLE_DRIVER_MDNS=1 -DLWIP_MDNS_RESPONDER=1 -mdisable-hardware-atomics -Os -freorder-blocks -fmacro-prefix-map=W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/platforms/ESP-IDF=. -fmacro-prefix-map=W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/sdk/esp-idf=/IDF -fstrict-volatile-bitfields -fno-jump-tables -fno-tree-switch-conversion -Wno-error=format-truncation -Wno-error=incompatible-pointer-types -DLV_CONF_INCLUDE_SIMPLE=1 -std=gnu++2b -fno-exceptions -fno-rtti -fuse-cxa-atexit -MD -MT esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_display.cpp.obj -MF esp-idf\main\CMakeFiles\__idf_main.dir\W_\GIT\OpenBK7231T\apps\OpenBK7231T_App\src\driver\drv_display.cpp.obj.d -o esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_display.cpp.obj -c W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_display.cpp +W:/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/driver/drv_display.cpp:9:10: fatal error: esp_display_panel.hpp: No such file or directory + 9 | #include + | ^~~~~~~~~~~~~~~~~~~~~~~ +compilation terminated. +[3/606] Building CXX object esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/libraries/IRremoteESP8266/src/ir_Dish.cpp.obj +[4/606] Building CXX object esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/libraries/IRremoteESP8266/src/ir_Denon.cpp.obj +[5/606] Building CXX object esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/libraries/IRremoteESP8266/src/ir_EliteScreens.cpp.obj +[6/606] Building CXX object esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/libraries/IRremoteESP8266/src/ir_Doshisha.cpp.obj +[7/606] Building CXX object esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/libraries/IRremoteESP8266/src/ir_Delonghi.cpp.obj +[8/606] Building CXX object esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/libraries/IRremoteESP8266/src/ir_Electra.cpp.obj +[9/606] Building CXX object esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/libraries/IRremoteESP8266/src/ir_Ecoclim.cpp.obj +[10/606] Building CXX object esp-idf/main/CMakeFiles/__idf_main.dir/W_/GIT/OpenBK7231T/apps/OpenBK7231T_App/src/libraries/IRremoteESP8266/src/ir_Daikin.cpp.obj +ninja: build stopped: subcommand failed. +[ERROR] Build failed diff --git a/build_scripts/build_esp32.bat b/build_scripts/build_esp32.bat index a258b314d7..04f0870e85 100644 --- a/build_scripts/build_esp32.bat +++ b/build_scripts/build_esp32.bat @@ -37,6 +37,18 @@ if "%TARGET%"=="esp32" ( ) else if "%TARGET%"=="esp32s3" ( set BUILD_DIR=platforms\ESP-IDF\build-s3 set BOOTLOADER_ADDR=0x0 +) else if "%TARGET%"=="esp32s3ram" ( + set BUILD_DIR=platforms\ESP-IDF\build-s3ram + set BOOTLOADER_ADDR=0x0 +) else if "%TARGET%"=="esp32s3ram_waveshare_5" ( + set BUILD_DIR=platforms\ESP-IDF\build-s3ram-waveshare-5 + set BOOTLOADER_ADDR=0x0 +) else if "%TARGET%"=="esp32s3ram_waveshare_4_3" ( + set BUILD_DIR=platforms\ESP-IDF\build-s3ram-waveshare-4-3 + set BOOTLOADER_ADDR=0x0 +) else if "%TARGET%"=="esp32s3ram_elecrow_7" ( + set BUILD_DIR=platforms\ESP-IDF\build-s3ram-elecrow-7 + set BOOTLOADER_ADDR=0x0 ) else ( echo [ERROR] Unknown target: %TARGET% exit /b 1 @@ -104,15 +116,44 @@ if exist platforms\ESP-IDF\partitions.csv del platforms\ESP-IDF\partitions.csv copy /y platforms\ESP-IDF\partitions-4mb.csv platforms\ESP-IDF\partitions.csv >nul :: Set environment variables for IDF cmake -set IDF_TARGET=%TARGET% - +set CMAKE_ARGS= +if "%TARGET%"=="esp32s3ram" ( + set IDF_TARGET=esp32s3 + set SDKCONFIG_DEFAULTS=sdkconfig.defaults;sdkconfig.defaults.esp32s3ram + set ENABLE_DISPLAY=1 + set CMAKE_ARGS=-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.defaults.esp32s3ram" -DENABLE_DISPLAY=1 +) else if "%TARGET%"=="esp32s3ram_waveshare_5" ( + set IDF_TARGET=esp32s3 + echo CONFIG_BOARD_WAVESHARE_ESP32_S3_TOUCH_LCD_5=y > platforms\ESP-IDF\sdkconfig.tmp + echo CONFIG_ESP_PANEL_BOARD_DEFAULT_USE_SUPPORTED=y >> platforms\ESP-IDF\sdkconfig.tmp + set SDKCONFIG_DEFAULTS=sdkconfig.defaults;sdkconfig.defaults.esp32s3ram;sdkconfig.tmp + set ENABLE_DISPLAY=1 + set CMAKE_ARGS=-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.defaults.esp32s3ram;sdkconfig.tmp" -DENABLE_DISPLAY=1 +) else if "%TARGET%"=="esp32s3ram_waveshare_4_3" ( + set IDF_TARGET=esp32s3 + echo CONFIG_BOARD_WAVESHARE_ESP32_S3_TOUCH_LCD_4_3=y > platforms\ESP-IDF\sdkconfig.tmp + echo CONFIG_ESP_PANEL_BOARD_DEFAULT_USE_SUPPORTED=y >> platforms\ESP-IDF\sdkconfig.tmp + set SDKCONFIG_DEFAULTS=sdkconfig.defaults;sdkconfig.defaults.esp32s3ram;sdkconfig.tmp + set ENABLE_DISPLAY=1 + set CMAKE_ARGS=-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.defaults.esp32s3ram;sdkconfig.tmp" -DENABLE_DISPLAY=1 +) else if "%TARGET%"=="esp32s3ram_elecrow_7" ( + set IDF_TARGET=esp32s3 + echo CONFIG_BOARD_ELECROW_CROWPANEL_7_0=y > platforms\ESP-IDF\sdkconfig.tmp + echo CONFIG_ESP_PANEL_BOARD_DEFAULT_USE_SUPPORTED=y >> platforms\ESP-IDF\sdkconfig.tmp + set SDKCONFIG_DEFAULTS=sdkconfig.defaults;sdkconfig.defaults.esp32s3ram;sdkconfig.tmp + set ENABLE_DISPLAY=1 + set CMAKE_ARGS=-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.defaults.esp32s3ram;sdkconfig.tmp" -DENABLE_DISPLAY=1 +) else ( + set ENABLE_DISPLAY=0 + set IDF_TARGET=%TARGET% +) :: --- Berry prebuild --- call build_scripts\berry_prebuild.bat :: Configure CMake via ESP-IDF toolchain echo [INFO] Running CMake configuration for %TARGET%... -cmake platforms\ESP-IDF -B %BUILD_DIR% -G "Ninja" +cmake platforms\ESP-IDF -B %BUILD_DIR% -G "Ninja" %CMAKE_ARGS% if !errorlevel! neq 0 ( echo [ERROR] CMake configuration failed! exit /b 1 @@ -147,6 +188,14 @@ if "%TARGET%"=="esp32" ( set OUT_NAME=OpenESP32S2 ) else if "%TARGET%"=="esp32s3" ( set OUT_NAME=OpenESP32S3 +) else if "%TARGET%"=="esp32s3ram" ( + set OUT_NAME=OpenESP32S3RAM +) else if "%TARGET%"=="esp32s3ram_waveshare_5" ( + set OUT_NAME=OpenESP32S3RAM_WAVESHARE_5 +) else if "%TARGET%"=="esp32s3ram_waveshare_4_3" ( + set OUT_NAME=OpenESP32S3RAM_WAVESHARE_4_3 +) else if "%TARGET%"=="esp32s3ram_elecrow_7" ( + set OUT_NAME=OpenESP32S3RAM_ELECROW_7 ) else ( set OUT_NAME=Open%TARGET% ) @@ -156,9 +205,13 @@ echo [INFO] Merging binaries with esptool... set FACTORY_BIN=output\%APP_VERSION%\!OUT_NAME!_%APP_VERSION%.factory.bin set IMG_BIN=output\%APP_VERSION%\!OUT_NAME!_%APP_VERSION%.img -python -m esptool -c %TARGET% merge_bin -o !FACTORY_BIN! --flash_mode dio --flash_size %ESP_FSIZE% %BOOTLOADER_ADDR% %BUILD_DIR%\bootloader\bootloader.bin 0x8000 %BUILD_DIR%\partition_table\partition-table.bin 0x10000 %BUILD_DIR%\OpenBeken.bin +python -m esptool --chip %IDF_TARGET% merge_bin -o "output\%APP_VERSION%\%OUT_NAME%.factory.bin" ^ + --flash_mode dio --flash_freq 40m --flash_size %ESP_FSIZE% ^ + %BOOTLOADER_ADDR% "%BUILD_DIR%\bootloader\bootloader.bin" ^ + 0x8000 "%BUILD_DIR%\partition_table\partition-table.bin" ^ + 0x10000 "%BUILD_DIR%\OpenBeken.bin" if !errorlevel! neq 0 ( - echo [ERROR] esptool merge failed! + echo [ERROR] esptool merge failed exit /b 1 ) @@ -170,5 +223,15 @@ echo Output files located in output\%APP_VERSION% echo Factory Bin: !FACTORY_BIN! echo OTA Bin: !IMG_BIN! echo ============================================== + +if "%ACTION%"=="flash" ( + echo [INFO] Flashing via UART... + python -m esptool --chip %IDF_TARGET% write_flash 0x0 "output\%APP_VERSION%\%OUT_NAME%.factory.bin" + if !errorlevel! neq 0 ( + echo [ERROR] esptool flash failed + exit /b 1 + ) +) + exit /b 0 diff --git a/build_scripts/obk_esp32s3ram_build.bat b/build_scripts/obk_esp32s3ram_build.bat new file mode 100644 index 0000000000..f07ae8c41f --- /dev/null +++ b/build_scripts/obk_esp32s3ram_build.bat @@ -0,0 +1,2 @@ +@echo off +call "%~dp0build_esp32.bat" esp32s3ram build diff --git a/build_scripts/obk_esp32s3ram_elecrow_7_build.bat b/build_scripts/obk_esp32s3ram_elecrow_7_build.bat new file mode 100644 index 0000000000..547bf36c88 --- /dev/null +++ b/build_scripts/obk_esp32s3ram_elecrow_7_build.bat @@ -0,0 +1,2 @@ +@echo off +call "%~dp0build_esp32.bat" esp32s3ram_elecrow_7 build diff --git a/build_scripts/obk_esp32s3ram_waveshare_4_3_build.bat b/build_scripts/obk_esp32s3ram_waveshare_4_3_build.bat new file mode 100644 index 0000000000..bd549182c1 --- /dev/null +++ b/build_scripts/obk_esp32s3ram_waveshare_4_3_build.bat @@ -0,0 +1,2 @@ +@echo off +call "%~dp0build_esp32.bat" esp32s3ram_waveshare_4_3 build diff --git a/build_scripts/obk_esp32s3ram_waveshare_5_build.bat b/build_scripts/obk_esp32s3ram_waveshare_5_build.bat new file mode 100644 index 0000000000..c0e9c54030 --- /dev/null +++ b/build_scripts/obk_esp32s3ram_waveshare_5_build.bat @@ -0,0 +1,2 @@ +@echo off +call "%~dp0build_esp32.bat" esp32s3ram_waveshare_5 build diff --git a/libraries/ESP32_Display_Panel b/libraries/ESP32_Display_Panel new file mode 160000 index 0000000000..31771b3f32 --- /dev/null +++ b/libraries/ESP32_Display_Panel @@ -0,0 +1 @@ +Subproject commit 31771b3f32911ad5b743af225a0f6d94f2d39893 diff --git a/libraries/ESP32_IO_Expander b/libraries/ESP32_IO_Expander new file mode 160000 index 0000000000..e79a63876a --- /dev/null +++ b/libraries/ESP32_IO_Expander @@ -0,0 +1 @@ +Subproject commit e79a63876a1d8a834cf8ec8f8b698ff9d9374579 diff --git a/libraries/esp-lib-utils b/libraries/esp-lib-utils new file mode 160000 index 0000000000..bb9ea3d6d9 --- /dev/null +++ b/libraries/esp-lib-utils @@ -0,0 +1 @@ +Subproject commit bb9ea3d6d95d4f0ec9ebc9f65659a4b5d2977663 diff --git a/libraries/lvgl b/libraries/lvgl new file mode 160000 index 0000000000..4495f42863 --- /dev/null +++ b/libraries/lvgl @@ -0,0 +1 @@ +Subproject commit 4495f428630cc1741bd8bfd977f080e8460e8e8d diff --git a/openBeken_win32_mvsc2017.vcxproj.filters b/openBeken_win32_mvsc2017.vcxproj.filters index 6039a7bbf0..90c1e70283 100644 --- a/openBeken_win32_mvsc2017.vcxproj.filters +++ b/openBeken_win32_mvsc2017.vcxproj.filters @@ -1,4 +1,4 @@ - + diff --git a/platforms/ESP-IDF/.gitignore b/platforms/ESP-IDF/.gitignore index 86be639bfa..4885544eda 100644 --- a/platforms/ESP-IDF/.gitignore +++ b/platforms/ESP-IDF/.gitignore @@ -1,3 +1,6 @@ build* sdkconfig -partitions.csv \ No newline at end of file +sdkconfig.old +partitions.csv +managed_components/ +dependencies.lock \ No newline at end of file diff --git a/platforms/ESP-IDF/CMakeLists.txt b/platforms/ESP-IDF/CMakeLists.txt index 5e3c411706..0eb97c48e2 100644 --- a/platforms/ESP-IDF/CMakeLists.txt +++ b/platforms/ESP-IDF/CMakeLists.txt @@ -17,8 +17,17 @@ add_definitions( -DUSER_SW_VER="$ENV{APP_VERSION}" ) add_definitions( -DOBK_VARIANT=$ENV{OBK_VARIANT} ) include_directories("$ENV{IDF_PATH}/../../libraries/berry/src") include_directories("$ENV{IDF_PATH}/../../include") +include_directories("$ENV{IDF_PATH}/../../src/driver/display") + +if(ENABLE_DISPLAY OR (DEFINED ENV{ENABLE_DISPLAY} AND "$ENV{ENABLE_DISPLAY}" EQUAL "1")) + list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/../../libraries/ESP32_Display_Panel" "$ENV{IDF_PATH}/../../libraries/lvgl" "$ENV{IDF_PATH}/../../libraries/ESP32_IO_Expander" "$ENV{IDF_PATH}/../../libraries/esp-lib-utils") +endif() #set(PROJECT_VER "$ENV{APP_VERSION}") project(OpenBeken) -idf_build_set_property(COMPILE_OPTIONS "-Wno-error=format-truncation" APPEND) -idf_build_set_property(COMPILE_OPTIONS "-Wno-error=incompatible-pointer-types" APPEND) +idf_build_set_property(COMPILE_OPTIONS "-Wno-error=format-truncation" "-Wno-error=incompatible-pointer-types" "-Wno-error=int-conversion" "-Wno-error=unused-but-set-variable" "-Wno-error=unused-function" "-Wno-error=unused-variable" "-Wno-error=implicit-fallthrough" APPEND) + + +if(ENABLE_DISPLAY OR (DEFINED ENV{ENABLE_DISPLAY} AND "$ENV{ENABLE_DISPLAY}" EQUAL "1")) + idf_build_set_property(COMPILE_OPTIONS "-DENABLE_DISPLAY=1" "-DLV_CONF_INCLUDE_SIMPLE=1" "-DBOARD_WAVESHARE_ESP32_S3_TOUCH_LCD_5=1" "-DESP_PANEL_BOARD_DEFAULT_USE_SUPPORTED=1" "-DESP_PANEL_BOARD_USE_SUPPORTED_FILE=1" "-DESP_PANEL_BOARD_INCLUDE_SUPPORTED_SIMPLE=1" APPEND) +endif() diff --git a/platforms/ESP-IDF/main/CMakeLists.txt b/platforms/ESP-IDF/main/CMakeLists.txt index cf61f19d71..61aff3d9b9 100644 --- a/platforms/ESP-IDF/main/CMakeLists.txt +++ b/platforms/ESP-IDF/main/CMakeLists.txt @@ -18,6 +18,7 @@ set(PROJ_ALL_SRC ${OBK_SRCS}hal/espidf/hal_uart_espidf.c ${OBK_SRCS}hal/espidf/hal_ota_espidf.c ${OBKM_SRC} + ${OBKM_SRC_CXX} ${BERRY_SRC_C} ../../../libraries/mqtt_patched.c ) @@ -35,8 +36,16 @@ if(ENABLE_MDNS_ESPIDF) ../../../sdk/esp-idf/components/lwip/lwip/src/apps/mdns/mdns_out.c ) endif() +set(PRIV_REQ_COMPONENTS mqtt lwip esp_wifi nvs_flash esp_driver_tsens esp_driver_gpio esp_pm esp_partition app_update esp_adc esp_driver_uart esp_driver_ledc spi_flash esp_driver_spi esp_driver_gptimer) +message(STATUS "ENABLE_DISPLAY is '${ENABLE_DISPLAY}' in main/CMakeLists.txt") +if(ENABLE_DISPLAY OR (DEFINED ENV{ENABLE_DISPLAY} AND "$ENV{ENABLE_DISPLAY}" EQUAL "1")) + list(APPEND PRIV_REQ_COMPONENTS ESP32_Display_Panel lvgl) +endif() + idf_component_register(SRCS ${PROJ_ALL_SRC} WHOLE_ARCHIVE - PRIV_REQUIRES mqtt lwip esp_wifi nvs_flash esp_driver_tsens esp_driver_gpio esp_pm esp_partition app_update esp_adc esp_driver_uart esp_driver_ledc spi_flash esp_driver_spi esp_driver_gptimer) + PRIV_REQUIRES ${PRIV_REQ_COMPONENTS}) + +target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-error=format-truncation" "-Wno-error=incompatible-pointer-types" "-Wno-error=int-conversion" "-Wno-error=unused-but-set-variable" "-Wno-error=unused-function" "-Wno-error=unused-variable" "-Wno-error=implicit-fallthrough" "-Wno-error=maybe-uninitialized") target_compile_definitions(${COMPONENT_LIB} PRIVATE USER_SW_VER="$ENV{APP_VERSION}") target_compile_definitions(${COMPONENT_LIB} PRIVATE OBK_VARIANT=$ENV{OBK_VARIANT}) diff --git a/platforms/ESP-IDF/sdkconfig.defaults.esp32s3ram b/platforms/ESP-IDF/sdkconfig.defaults.esp32s3ram new file mode 100644 index 0000000000..aeb78b9225 --- /dev/null +++ b/platforms/ESP-IDF/sdkconfig.defaults.esp32s3ram @@ -0,0 +1,8 @@ +CONFIG_PM_ENABLE=y +CONFIG_PM_DFS_INIT_AUTO=y +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_SPIRAM=y +CONFIG_SPIRAM_MODE_OCT=y +CONFIG_SPIRAM_SPEED_80M=y +CONFIG_SPIRAM_FETCH_INSTRUCTIONS=y +CONFIG_SPIRAM_RODATA=y \ No newline at end of file diff --git a/platforms/obk_main.cmake b/platforms/obk_main.cmake index 8481a56d4e..212a40f304 100644 --- a/platforms/obk_main.cmake +++ b/platforms/obk_main.cmake @@ -180,6 +180,10 @@ endif() set(OBKM_SRC_CXX ${OBK_SRCS}driver/drv_ir.cpp ${OBK_SRCS}driver/drv_ir_new.cpp + ${OBK_SRCS}driver/drv_display_shared.cpp + ${OBK_SRCS}driver/drv_display_hello.cpp + ${OBK_SRCS}driver/drv_display_demo.cpp + ${OBK_SRCS}driver/display/lvgl_v8_port.cpp ${OBK_SRCS}libraries/IRremoteESP8266/src/IRac.cpp ${OBK_SRCS}libraries/IRremoteESP8266/src/IRproto.cpp ${OBK_SRCS}libraries/IRremoteESP8266/src/IRrecv.cpp diff --git a/src/cmnds/cmd_main.c b/src/cmnds/cmd_main.c index 98b0e9163f..e6dfce9768 100644 --- a/src/cmnds/cmd_main.c +++ b/src/cmnds/cmd_main.c @@ -1174,6 +1174,9 @@ void CMD_Init_Delayed() { CMD_StartTCPCommandLine(); } #endif +#if ENABLE_DRIVER_DISPLAY + CMD_ExecuteCommand("startDriver DisplayDemo", 0); +#endif #if PLATFORM_BEKEN || WINDOWS || PLATFORM_BL602 || PLATFORM_ESPIDF || PLATFORM_ESP8266 \ || PLATFORM_REALTEK || PLATFORM_ECR6600 || PLATFORM_XRADIO UART_AddCommands(); diff --git a/src/driver/display/esp_panel_board_custom_conf.h b/src/driver/display/esp_panel_board_custom_conf.h new file mode 100644 index 0000000000..752f81f29c --- /dev/null +++ b/src/driver/display/esp_panel_board_custom_conf.h @@ -0,0 +1,759 @@ +/* + * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +/** + * @file esp_panel_board_custom_conf.h + * @brief Configuration file for custom ESP development boards + * @author + * @link + * + * This file contains all the configurations needed for a custom board using ESP Panel. + * Users can modify these configurations according to their hardware design. + */ + +#pragma once + +// *INDENT-OFF* + +/** + * @brief Flag to enable custom board configuration (0/1) + * + * Set to `1` to enable custom board configuration, `0` to disable + */ +#define ESP_PANEL_BOARD_DEFAULT_USE_CUSTOM (0) + +#if ESP_PANEL_BOARD_DEFAULT_USE_CUSTOM +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////// Please update the following macros to configure general parameters /////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Board name (format: "Manufacturer:Model") + */ +#define ESP_PANEL_BOARD_NAME "Custom:Custom" + +/** + * @brief Panel resolution configuration in pixels + */ +#define ESP_PANEL_BOARD_WIDTH (320) // Panel width (horizontal, in pixels) +#define ESP_PANEL_BOARD_HEIGHT (240) // Panel height (vertical, in pixels) + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////// Please update the following macros to configure the LCD panel ///////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * @brief LCD panel configuration flag (0/1) + * + * Set to `1` to enable LCD panel support, `0` to disable + */ +#define ESP_PANEL_BOARD_USE_LCD (0) + +#if ESP_PANEL_BOARD_USE_LCD +/** + * @brief LCD controller selection + * + * Supported controllers: + * - `AXS15231B` + * - `EK9716B`, `EK79007` + * - `GC9A01`, `GC9B71`, `GC9503` + * - `HX8399` + * - `ILI9341`, `ILI9881C` + * - `JD9165`, `JD9365` + * - `NV3022B` + * - `SH8601` + * - `SPD2010` + * - `ST7262`, `ST7701`, `ST7703`, `ST7789`, `ST7796`, `ST77903`, `ST77916`, `ST77922` + */ +#define ESP_PANEL_BOARD_LCD_CONTROLLER ILI9341 + +/** + * @brief LCD bus type selection + * + * Supported bus types: + * - `ESP_PANEL_BUS_TYPE_SPI` + * - `ESP_PANEL_BUS_TYPE_QSPI` + * - `ESP_PANEL_BUS_TYPE_RGB` (ESP32-S3 only) + * - `ESP_PANEL_BUS_TYPE_MIPI_DSI` (ESP32-P4 only) + */ +#define ESP_PANEL_BOARD_LCD_BUS_TYPE (ESP_PANEL_BUS_TYPE_SPI) + +#if (ESP_PANEL_BOARD_LCD_BUS_TYPE == ESP_PANEL_BUS_TYPE_SPI) || \ + (ESP_PANEL_BOARD_LCD_BUS_TYPE == ESP_PANEL_BUS_TYPE_QSPI) +/** + * If set to 1, the bus will skip to initialize the corresponding host. Users need to initialize the host in advance. + * + * For drivers which created by this library, even if they use the same host, the host will be initialized only once. + * So it is not necessary to set the macro to `1`. For other drivers (like `Wire`), please set the macro to `1` + * ensure that the host is initialized only once. + */ +#define ESP_PANEL_BOARD_LCD_BUS_SKIP_INIT_HOST (0) // 0/1. Typically set to 0 +#endif + +/** + * @brief LCD bus parameters configuration + * + * Configure parameters based on the selected bus type. Parameters for other bus types will be ignored. + * For detailed parameter explanations, see: + * https://docs.espressif.com/projects/esp-idf/en/v5.3.1/esp32s3/api-reference/peripherals/lcd/index.html + * https://docs.espressif.com/projects/esp-iot-solution/en/latest/display/lcd/index.html + */ +#if ESP_PANEL_BOARD_LCD_BUS_TYPE == ESP_PANEL_BUS_TYPE_SPI + +/** + * @brief SPI bus + */ +/* For general */ +#define ESP_PANEL_BOARD_LCD_SPI_HOST_ID (1) // Typically set to 1 +#if !ESP_PANEL_BOARD_LCD_BUS_SKIP_INIT_HOST +/* For host */ +#define ESP_PANEL_BOARD_LCD_SPI_IO_SCK (7) +#define ESP_PANEL_BOARD_LCD_SPI_IO_MOSI (6) +#define ESP_PANEL_BOARD_LCD_SPI_IO_MISO (-1) // -1 if not used +#endif // ESP_PANEL_BOARD_LCD_BUS_SKIP_INIT_HOST +/* For panel */ +#define ESP_PANEL_BOARD_LCD_SPI_IO_CS (5) // -1 if not used +#define ESP_PANEL_BOARD_LCD_SPI_IO_DC (4) +#define ESP_PANEL_BOARD_LCD_SPI_MODE (0) // 0-3. Typically set to 0 +#define ESP_PANEL_BOARD_LCD_SPI_CLK_HZ (40 * 1000 * 1000) +// Should be an integer divisor of 80M, typically set to 40M +#define ESP_PANEL_BOARD_LCD_SPI_CMD_BITS (8) // Typically set to 8 +#define ESP_PANEL_BOARD_LCD_SPI_PARAM_BITS (8) // Typically set to 8 + +#elif ESP_PANEL_BOARD_LCD_BUS_TYPE == ESP_PANEL_BUS_TYPE_QSPI + +/** + * @brief QSPI bus + */ +/* For general */ +#define ESP_PANEL_BOARD_LCD_QSPI_HOST_ID (1) // Typically set to 1 +#if !ESP_PANEL_BOARD_LCD_BUS_SKIP_INIT_HOST +/* For host */ +#define ESP_PANEL_BOARD_LCD_QSPI_IO_SCK (9) +#define ESP_PANEL_BOARD_LCD_QSPI_IO_DATA0 (10) +#define ESP_PANEL_BOARD_LCD_QSPI_IO_DATA1 (11) +#define ESP_PANEL_BOARD_LCD_QSPI_IO_DATA2 (12) +#define ESP_PANEL_BOARD_LCD_QSPI_IO_DATA3 (13) +#endif // ESP_PANEL_BOARD_LCD_BUS_SKIP_INIT_HOST +/* For panel */ +#define ESP_PANEL_BOARD_LCD_QSPI_IO_CS (5) // -1 if not used +#define ESP_PANEL_BOARD_LCD_QSPI_MODE (0) // 0-3, typically set to 0 +#define ESP_PANEL_BOARD_LCD_QSPI_CLK_HZ (40 * 1000 * 1000) +// Should be an integer divisor of 80M, typically set to 40M +#define ESP_PANEL_BOARD_LCD_QSPI_CMD_BITS (32) // Typically set to 32 +#define ESP_PANEL_BOARD_LCD_QSPI_PARAM_BITS (8) // Typically set to 8 + +#elif ESP_PANEL_BOARD_LCD_BUS_TYPE == ESP_PANEL_BUS_TYPE_RGB + +/** + * @brief RGB bus + */ +/** + * Set to 0 if using simple "RGB" interface which does not contain "3-wire SPI" interface. + */ +#define ESP_PANEL_BOARD_LCD_RGB_USE_CONTROL_PANEL (1) // 0/1. Typically set to 1 + +#if ESP_PANEL_BOARD_LCD_RGB_USE_CONTROL_PANEL +/* For control panel (3wire-SPI) */ +#define ESP_PANEL_BOARD_LCD_RGB_SPI_IO_CS (0) +#define ESP_PANEL_BOARD_LCD_RGB_SPI_IO_SCK (1) +#define ESP_PANEL_BOARD_LCD_RGB_SPI_IO_SDA (2) +#define ESP_PANEL_BOARD_LCD_RGB_SPI_CS_USE_EXPNADER (0) // Set to 1 if the signal is controlled by an IO expander +#define ESP_PANEL_BOARD_LCD_RGB_SPI_SCL_USE_EXPNADER (0) // Set to 1 if the signal is controlled by an IO expander +#define ESP_PANEL_BOARD_LCD_RGB_SPI_SDA_USE_EXPNADER (0) // Set to 1 if the signal is controlled by an IO expander +#define ESP_PANEL_BOARD_LCD_RGB_SPI_MODE (0) // 0-3, typically set to 0 +#define ESP_PANEL_BOARD_LCD_RGB_SPI_CMD_BYTES (1) // Typically set to 1 +#define ESP_PANEL_BOARD_LCD_RGB_SPI_PARAM_BYTES (1) // Typically set to 1 +#define ESP_PANEL_BOARD_LCD_RGB_SPI_USE_DC_BIT (1) // 0/1. Typically set to 1 +#endif // ESP_PANEL_BOARD_LCD_RGB_USE_CONTROL_PANEL +/* For refresh panel (RGB) */ +#define ESP_PANEL_BOARD_LCD_RGB_CLK_HZ (16 * 1000 * 1000) +// To increase the upper limit of the PCLK, see: https://docs.espressif.com/projects/esp-faq/en/latest/software-framework/peripherals/lcd.html#how-can-i-increase-the-upper-limit-of-pclk-settings-on-esp32-s3-while-ensuring-normal-rgb-screen-display +#define ESP_PANEL_BOARD_LCD_RGB_HPW (10) +#define ESP_PANEL_BOARD_LCD_RGB_HBP (10) +#define ESP_PANEL_BOARD_LCD_RGB_HFP (20) +#define ESP_PANEL_BOARD_LCD_RGB_VPW (10) +#define ESP_PANEL_BOARD_LCD_RGB_VBP (10) +#define ESP_PANEL_BOARD_LCD_RGB_VFP (10) +#define ESP_PANEL_BOARD_LCD_RGB_PCLK_ACTIVE_NEG (0) // 0: rising edge, 1: falling edge. Typically set to 0 + // The following sheet shows the valid combinations of + // data width and pixel bits: + // ┏---------------------------------┳- -------------------------------┓ +#define ESP_PANEL_BOARD_LCD_RGB_DATA_WIDTH (16) // | 16 | 8 | +#define ESP_PANEL_BOARD_LCD_RGB_PIXEL_BITS (ESP_PANEL_LCD_COLOR_BITS_RGB565) // | ESP_PANEL_LCD_COLOR_BITS_RGB565 | ESP_PANEL_LCD_COLOR_BITS_RGB888 | + // ┗---------------------------------┻---------------------------------┛ +// To understand color format of RGB LCD, see: https://docs.espressif.com/projects/esp-iot-solution/en/latest/display/lcd/rgb_lcd.html#color-formats +#define ESP_PANEL_BOARD_LCD_RGB_BOUNCE_BUF_SIZE (ESP_PANEL_BOARD_WIDTH * 10) +// Bounce buffer size in bytes. It is used to avoid screen drift +// for ESP32-S3. Typically set to `ESP_PANEL_BOARD_WIDTH * 10` +// The size should satisfy `size * N = LCD_width * LCD_height`, +// where N is an even number. +// For more details, see: https://github.com/esp-arduino-libs/ESP32_Display_Panel/blob/master/docs/FAQ.md#how-to-fix-screen-drift-issue-when-driving-rgb-lcd-with-esp32-s3 +#define ESP_PANEL_BOARD_LCD_RGB_IO_HSYNC (46) +#define ESP_PANEL_BOARD_LCD_RGB_IO_VSYNC (3) +#define ESP_PANEL_BOARD_LCD_RGB_IO_DE (17) // -1 if not used +#define ESP_PANEL_BOARD_LCD_RGB_IO_PCLK (9) +#define ESP_PANEL_BOARD_LCD_RGB_IO_DISP (-1) // -1 if not used. Typically set to -1 + +// The following sheet shows the mapping of ESP GPIOs to +// LCD data pins with different data width and color format: +// ┏------┳- ------------┳--------------------------┓ +// | ESP: | 8-bit RGB888 | 16-bit RGB565 | +// |------|--------------|--------------------------| +// | LCD: | RGB888 | RGB565 | RGB666 | RGB888 | +// ┗------|--------------|--------|--------|--------| +#define ESP_PANEL_BOARD_LCD_RGB_IO_DATA0 (10) // | D0 | B0 | B0-1 | B0-3 | +#define ESP_PANEL_BOARD_LCD_RGB_IO_DATA1 (11) // | D1 | B1 | B2 | B4 | +#define ESP_PANEL_BOARD_LCD_RGB_IO_DATA2 (12) // | D2 | B2 | B3 | B5 | +#define ESP_PANEL_BOARD_LCD_RGB_IO_DATA3 (13) // | D3 | B3 | B4 | B6 | +#define ESP_PANEL_BOARD_LCD_RGB_IO_DATA4 (14) // | D4 | B4 | B5 | B7 | +#define ESP_PANEL_BOARD_LCD_RGB_IO_DATA5 (21) // | D5 | G0 | G0 | G0-2 | +#define ESP_PANEL_BOARD_LCD_RGB_IO_DATA6 (47) // | D6 | G1 | G1 | G3 | +#define ESP_PANEL_BOARD_LCD_RGB_IO_DATA7 (48) // | D7 | G2 | G2 | G4 | +#if ESP_PANEL_BOARD_LCD_RGB_DATA_WIDTH > 8 // ┗--------------┫--------|--------|--------| +#define ESP_PANEL_BOARD_LCD_RGB_IO_DATA8 (45) // | G3 | G3 | G5 | +#define ESP_PANEL_BOARD_LCD_RGB_IO_DATA9 (38) // | G4 | G4 | G6 | +#define ESP_PANEL_BOARD_LCD_RGB_IO_DATA10 (39) // | G5 | G5 | G7 | +#define ESP_PANEL_BOARD_LCD_RGB_IO_DATA11 (40) // | R0 | R0-1 | R0-3 | +#define ESP_PANEL_BOARD_LCD_RGB_IO_DATA12 (41) // | R1 | R2 | R4 | +#define ESP_PANEL_BOARD_LCD_RGB_IO_DATA13 (42) // | R2 | R3 | R5 | +#define ESP_PANEL_BOARD_LCD_RGB_IO_DATA14 (2) // | R3 | R4 | R6 | +#define ESP_PANEL_BOARD_LCD_RGB_IO_DATA15 (1) // | R4 | R5 | R7 | + // ┗--------┻--------┻--------┛ +#endif // ESP_PANEL_BOARD_LCD_RGB_DATA_WIDTH + +#elif ESP_PANEL_BOARD_LCD_BUS_TYPE == ESP_PANEL_BUS_TYPE_MIPI_DSI + +/** + * @brief MIPI DSI bus + */ +/* For host */ +#define ESP_PANEL_BOARD_LCD_MIPI_DSI_LANE_NUM (2) // ESP32-P4 supports 1 or 2 lanes +#define ESP_PANEL_BOARD_LCD_MIPI_DSI_LANE_RATE_MBPS (1000) // Single lane bit rate, should check the LCD drive IC + // datasheet for the supported lane rate. Different + // color format (RGB565/RGB888) may have different + // lane bit rate requirements. + // ESP32-P4 supports max 1500Mbps +/* For refresh panel (DPI) */ +#define ESP_PANEL_BOARD_LCD_MIPI_DPI_CLK_MHZ (52) +#define ESP_PANEL_BOARD_LCD_MIPI_DPI_PIXEL_BITS (ESP_PANEL_LCD_COLOR_BITS_RGB565) +// ESP_PANEL_LCD_COLOR_BITS_RGB565/RGB666/RGB888 +#define ESP_PANEL_BOARD_LCD_MIPI_DPI_HPW (10) +#define ESP_PANEL_BOARD_LCD_MIPI_DPI_HBP (160) +#define ESP_PANEL_BOARD_LCD_MIPI_DPI_HFP (160) +#define ESP_PANEL_BOARD_LCD_MIPI_DPI_VPW (1) +#define ESP_PANEL_BOARD_LCD_MIPI_DPI_VBP (23) +#define ESP_PANEL_BOARD_LCD_MIPI_DPI_VFP (12) +/* For DSI power PHY */ +#define ESP_PANEL_BOARD_LCD_MIPI_PHY_LDO_ID (3) // -1 if not used. + +#else + +#error "The function is not ready and will be implemented in the future." + +#endif // ESP_PANEL_BOARD_LCD_BUS_TYPE + +/** + * @brief LCD specific flags configuration + * + * These flags are specific to the "3-wire SPI + RGB" bus. + */ +#if (ESP_PANEL_BOARD_LCD_BUS_TYPE == ESP_PANEL_BUS_TYPE_RGB) && ESP_PANEL_BOARD_LCD_RGB_USE_CONTROL_PANEL +/** + * @brief Enable IO multiplex + * + * Set to 1 if the 3-wire SPI pins are sharing other pins of the RGB interface to save GPIOs. Then, the control panel + * and its pins (except CS signal) will be released after LCD call `init()`. All `*_by_cmd` flags will be invalid. + */ +#define ESP_PANEL_BOARD_LCD_FLAGS_ENABLE_IO_MULTIPLEX (0) // typically set to 0 +/** + * @brief Mirror by command + * + * Set to 1 if the `mirror()` function will be implemented by LCD command. Otherwise, the function will be implemented by + * software. Only valid when `ESP_PANEL_BOARD_LCD_FLAGS_ENABLE_IO_MULTIPLEX` is 0. + */ +#define ESP_PANEL_BOARD_LCD_FLAGS_MIRROR_BY_CMD (!ESP_PANEL_BOARD_LCD_FLAGS_ENABLE_IO_MULTIPLEX) +#endif // ESP_PANEL_BOARD_LCD_RGB_USE_CONTROL_PANEL + +/** + * @brief LCD vendor initialization commands + * + * Vendor specific initialization can be different between manufacturers, should consult the LCD supplier for + * initialization sequence code. Please uncomment and change the following macro definitions. Otherwise, the LCD driver + * will use the default initialization sequence code. + * + * The initialization sequence can be specified in two formats: + * 1. Raw format: + * {command, (uint8_t []){data0, data1, ...}, data_size, delay_ms} + * 2. Helper macros: + * - ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(delay_ms, command, {data0, data1, ...}) + * - ESP_PANEL_LCD_CMD_WITH_NONE_PARAM(delay_ms, command) + */ +/* +#define ESP_PANEL_BOARD_LCD_VENDOR_INIT_CMD() \ + { \ + {0xFF, (uint8_t []){0x77, 0x01, 0x00, 0x00, 0x10}, 5, 0}, \ + {0xC0, (uint8_t []){0x3B, 0x00}, 2, 0}, \ + {0xC1, (uint8_t []){0x0D, 0x02}, 2, 0}, \ + {0x29, (uint8_t []){0x00}, 0, 120}, \ + or + ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xFF, {0x77, 0x01, 0x00, 0x00, 0x10}), \ + ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xC0, {0x3B, 0x00}), \ + ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xC1, {0x0D, 0x02}), \ + ESP_PANEL_LCD_CMD_WITH_NONE_PARAM(120, 0x29), \ + } +*/ + +/** + * @brief LCD color configuration + */ +#define ESP_PANEL_BOARD_LCD_COLOR_BITS (ESP_PANEL_LCD_COLOR_BITS_RGB565) +// ESP_PANEL_LCD_COLOR_BITS_RGB565/RGB666/RGB888 +#define ESP_PANEL_BOARD_LCD_COLOR_BGR_ORDER (0) // 0: RGB, 1: BGR +#define ESP_PANEL_BOARD_LCD_COLOR_INEVRT_BIT (0) // 0/1 + +/** + * @brief LCD transformation configuration + */ +#define ESP_PANEL_BOARD_LCD_SWAP_XY (0) // 0/1 +#define ESP_PANEL_BOARD_LCD_MIRROR_X (0) // 0/1 +#define ESP_PANEL_BOARD_LCD_MIRROR_Y (0) // 0/1 +#define ESP_PANEL_BOARD_LCD_GAP_X (0) // [0, ESP_PANEL_BOARD_WIDTH] +#define ESP_PANEL_BOARD_LCD_GAP_Y (0) // [0, ESP_PANEL_BOARD_HEIGHT] + +/** + * @brief LCD reset pin configuration + */ +#define ESP_PANEL_BOARD_LCD_RST_IO (-1) // Reset pin, -1 if not used +#define ESP_PANEL_BOARD_LCD_RST_LEVEL (0) // Reset active level, 0: low, 1: high + +#endif // ESP_PANEL_BOARD_USE_LCD + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////// Please update the following macros to configure the touch panel /////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Touch panel configuration flag (0/1) + * + * Set to `1` to enable touch panel support, `0` to disable + */ +#define ESP_PANEL_BOARD_USE_TOUCH (0) + +#if ESP_PANEL_BOARD_USE_TOUCH +/** + * @brief Touch controller selection + * + * Supported controllers: + * - `AXS15231B` + * - `CHSC6540` + * - `CST816S` + * - `FT5x06` + * - `GT911`, `GT1151` + * - `SPD2010` + * - `ST1633`, `ST7123` + * - `STMPE610` + * - `TT21100` + * - `XPT2046` + */ +#define ESP_PANEL_BOARD_TOUCH_CONTROLLER TT21100 + +/** + * @brief Touch bus type selection + * + * Supported types: + * - `ESP_PANEL_BUS_TYPE_I2C` + * - `ESP_PANEL_BUS_TYPE_SPI` + */ +#define ESP_PANEL_BOARD_TOUCH_BUS_TYPE (ESP_PANEL_BUS_TYPE_I2C) + +#if (ESP_PANEL_BOARD_TOUCH_BUS_TYPE == ESP_PANEL_BUS_TYPE_I2C) || \ + (ESP_PANEL_BOARD_TOUCH_BUS_TYPE == ESP_PANEL_BUS_TYPE_SPI) +/** + * If set to 1, the bus will skip to initialize the corresponding host. Users need to initialize the host in advance. + * + * For drivers which created by this library, even if they use the same host, the host will be initialized only once. + * So it is not necessary to set the macro to `1`. For other drivers (like `Wire`), please set the macro to `1` + * ensure that the host is initialized only once. + */ +#define ESP_PANEL_BOARD_TOUCH_BUS_SKIP_INIT_HOST (0) // 0/1. Typically set to 0 +#endif + +/** + * @brief Touch bus parameters configuration + */ +#if ESP_PANEL_BOARD_TOUCH_BUS_TYPE == ESP_PANEL_BUS_TYPE_I2C + +/** + * @brief I2C bus + */ +/* For general */ +#define ESP_PANEL_BOARD_TOUCH_I2C_HOST_ID (0) // Typically set to 0 +#if !ESP_PANEL_BOARD_TOUCH_BUS_SKIP_INIT_HOST +/* For host */ +#define ESP_PANEL_BOARD_TOUCH_I2C_CLK_HZ (400 * 1000) +// Typically set to 400K +#define ESP_PANEL_BOARD_TOUCH_I2C_SCL_PULLUP (1) // 0/1. Typically set to 1 +#define ESP_PANEL_BOARD_TOUCH_I2C_SDA_PULLUP (1) // 0/1. Typically set to 1 +#define ESP_PANEL_BOARD_TOUCH_I2C_IO_SCL (18) +#define ESP_PANEL_BOARD_TOUCH_I2C_IO_SDA (8) +#endif +/* For panel */ +#define ESP_PANEL_BOARD_TOUCH_I2C_ADDRESS (0) // Typically set to 0 to use the default address. + // - For touchs with only one address, set to 0 + // - For touchs with multiple addresses, set to 0 or + // the address. Like GT911, there are two addresses: + // 0x5D(default) and 0x14 + +#elif ESP_PANEL_BOARD_TOUCH_BUS_TYPE == ESP_PANEL_BUS_TYPE_SPI + +/** + * @brief SPI bus + */ +/* For general */ +#define ESP_PANEL_BOARD_TOUCH_SPI_HOST_ID (1) // Typically set to 1 +#if !ESP_PANEL_BOARD_TOUCH_BUS_SKIP_INIT_HOST +/* For host */ +#define ESP_PANEL_BOARD_TOUCH_SPI_IO_SCK (7) +#define ESP_PANEL_BOARD_TOUCH_SPI_IO_MOSI (6) +#define ESP_PANEL_BOARD_TOUCH_SPI_IO_MISO (9) +#endif +/* For panel */ +#define ESP_PANEL_BOARD_TOUCH_SPI_IO_CS (5) +#define ESP_PANEL_BOARD_TOUCH_SPI_CLK_HZ (1 * 1000 * 1000) // Should be integer divisor of 80M + +#else + +#error "The function is not ready and will be implemented in the future." + +#endif // ESP_PANEL_BOARD_TOUCH_BUS_TYPE + +/** + * @brief Touch panel transformation flags + */ +#define ESP_PANEL_BOARD_TOUCH_SWAP_XY (0) // 0/1 +#define ESP_PANEL_BOARD_TOUCH_MIRROR_X (0) // 0/1 +#define ESP_PANEL_BOARD_TOUCH_MIRROR_Y (0) // 0/1 + +/** + * @brief Touch panel control pins + */ +#define ESP_PANEL_BOARD_TOUCH_RST_IO (-1) // Reset pin, -1 if not used +#define ESP_PANEL_BOARD_TOUCH_RST_LEVEL (0) // Reset active level, 0: low, 1: high +#define ESP_PANEL_BOARD_TOUCH_INT_IO (-1) // Interrupt pin, -1 if not used +#define ESP_PANEL_BOARD_TOUCH_INT_LEVEL (0) // Interrupt active level, 0: low, 1: high + +#endif // ESP_PANEL_BOARD_USE_TOUCH + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Please update the following macros to configure the backlight //////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Backlight configuration flag (0/1) + * + * Set to `1` to enable backlight support, `0` to disable + */ +#define ESP_PANEL_BOARD_USE_BACKLIGHT (0) + +#if ESP_PANEL_BOARD_USE_BACKLIGHT +/** + * @brief Backlight control type selection + * + * Supported types: + * - `ESP_PANEL_BACKLIGHT_TYPE_SWITCH_GPIO`: Use GPIO switch to control the backlight, only support on/off + * - `ESP_PANEL_BACKLIGHT_TYPE_SWITCH_EXPANDER`: Use IO expander to control the backlight, only support on/off + * - `ESP_PANEL_BACKLIGHT_TYPE_PWM_LEDC`: Use LEDC PWM to control the backlight, support brightness adjustment + * - `ESP_PANEL_BACKLIGHT_TYPE_CUSTOM`: Use custom function to control the backlight + */ +#define ESP_PANEL_BOARD_BACKLIGHT_TYPE (ESP_PANEL_BACKLIGHT_TYPE_PWM_LEDC) + +#if (ESP_PANEL_BOARD_BACKLIGHT_TYPE == ESP_PANEL_BACKLIGHT_TYPE_SWITCH_GPIO) || \ + (ESP_PANEL_BOARD_BACKLIGHT_TYPE == ESP_PANEL_BACKLIGHT_TYPE_SWITCH_EXPANDER) || \ + (ESP_PANEL_BOARD_BACKLIGHT_TYPE == ESP_PANEL_BACKLIGHT_TYPE_PWM_LEDC) + +/** + * @brief Backlight control pin configuration + */ +#define ESP_PANEL_BOARD_BACKLIGHT_IO (38) // Output GPIO pin number +#define ESP_PANEL_BOARD_BACKLIGHT_ON_LEVEL (1) // Active level, 0: low, 1: high + +#if ESP_PANEL_BOARD_BACKLIGHT_TYPE == ESP_PANEL_BACKLIGHT_TYPE_PWM_LEDC +/** + * @brief PWM parameters configuration + */ +#define ESP_PANEL_BOARD_BACKLIGHT_PWM_FREQ_HZ (5000) // LEDC timer frequency. + // Different backlight driver chips may have different + // frequency limits, please refer to the datasheet of + // the specific chip. + // https://github.com/esp-arduino-libs/ESP32_Display_Panel/issues/188 + +#define ESP_PANEL_BOARD_BACKLIGHT_PWM_DUTY_RESOLUTION (10) // LEDC timer duty resolution. + // The frequency and duty resolution of the LEDC timer + // need to be properly matched, please refer to: + // https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/ledc.html#supported-range-of-frequency-and-duty-resolutions +#endif + +#elif ESP_PANEL_BOARD_BACKLIGHT_TYPE == ESP_PANEL_BACKLIGHT_TYPE_CUSTOM + +/** + * @brief Custom backlight control function + * + * @param[in] percent Brightness percentage (0-100) + * @param[in] user_data User data pointer, typically points to Board instance. + * + * @return true on success, false on failure + */ +#define ESP_PANEL_BOARD_BACKLIGHT_CUSTOM_FUNCTION(percent, user_data) \ + { \ + auto board = static_cast(user_data); \ + return true; \ + } + +#endif // ESP_PANEL_BOARD_BACKLIGHT_TYPE + +/** + * @brief Backlight idle state configuration (0/1) + * + * Set to 1 if want to turn off the backlight after initializing. Otherwise, the backlight will be on. + */ +#define ESP_PANEL_BOARD_BACKLIGHT_IDLE_OFF (0) + +#endif // ESP_PANEL_BOARD_USE_BACKLIGHT + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Please update the following macros to configure the IO expander ////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * @brief IO expander configuration flag (0/1) + * + * Set to `1` to enable IO expander support, `0` to disable + */ +#define ESP_PANEL_BOARD_USE_EXPANDER (0) + +#if ESP_PANEL_BOARD_USE_EXPANDER +/** + * @brief IO expander chip selection + * + * Supported chips: + * - `CH422G` + * - `HT8574` + * - `TCA95XX_8BIT` + * - `TCA95XX_16BIT` + */ +#define ESP_PANEL_BOARD_EXPANDER_CHIP TCA95XX_8BIT + +/** + * @brief IO expander I2C bus parameters configuration + */ +/** + * If set to 1, the bus will skip to initialize the corresponding host. Users need to initialize the host in advance. + * + * For drivers which created by this library, even if they use the same host, the host will be initialized only once. + * So it is not necessary to set the macro to `1`. For other devices, please set the macro to `1` ensure that the + * host is initialized only once. + */ +#define ESP_PANEL_BOARD_EXPANDER_SKIP_INIT_HOST (0) // 0/1 +/* For general */ +#define ESP_PANEL_BOARD_EXPANDER_I2C_HOST_ID (0) // Typically set to 0 +/* For host */ +#if !ESP_PANEL_BOARD_EXPANDER_SKIP_INIT_HOST +#define ESP_PANEL_BOARD_EXPANDER_I2C_CLK_HZ (400 * 1000) +// Typically set to 400K +#define ESP_PANEL_BOARD_EXPANDER_I2C_SCL_PULLUP (1) // 0/1. Typically set to 1 +#define ESP_PANEL_BOARD_EXPANDER_I2C_SDA_PULLUP (1) // 0/1. Typically set to 1 +#define ESP_PANEL_BOARD_EXPANDER_I2C_IO_SCL (18) +#define ESP_PANEL_BOARD_EXPANDER_I2C_IO_SDA (8) +#endif // ESP_PANEL_BOARD_EXPANDER_SKIP_INIT_HOST +/* For device */ +#define ESP_PANEL_BOARD_EXPANDER_I2C_ADDRESS (0x20) // The actual I2C address. Even for the same model of IC, + // the I2C address may be different, and confirmation based on + // the actual hardware connection is required +#endif // ESP_PANEL_BOARD_USE_EXPANDER + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////// Please utilize the following macros to execute any additional code if required ///////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Pre-begin function for board initialization + * + * @param[in] p Pointer to the board object + * @return true on success, false on failure + */ +/* +#define ESP_PANEL_BOARD_PRE_BEGIN_FUNCTION(p) \ + { \ + auto board = static_cast(p); \ + return true; \ + } +*/ + +/** + * @brief Post-begin function for board initialization + * + * @param[in] p Pointer to the board object + * @return true on success, false on failure + */ +/* +#define ESP_PANEL_BOARD_POST_BEGIN_FUNCTION(p) \ + { \ + auto board = static_cast(p); \ + return true; \ + } +*/ + +/** + * @brief Pre-delete function for board initialization + * + * @param[in] p Pointer to the board object + * @return true on success, false on failure + */ +/* +#define ESP_PANEL_BOARD_PRE_DEL_FUNCTION(p) \ + { \ + auto board = static_cast(p); \ + return true; \ + } +*/ + +/** + * @brief Post-delete function for board initialization + * + * @param[in] p Pointer to the board object + * @return true on success, false on failure + */ +/* +#define ESP_PANEL_BOARD_POST_DEL_FUNCTION(p) \ + { \ + auto board = static_cast(p); \ + return true; \ + } +*/ + +/** + * @brief Pre-begin function for IO expander initialization + * + * @param[in] p Pointer to the board object + * @return true on success, false on failure + */ +/* +#define ESP_PANEL_BOARD_EXPANDER_PRE_BEGIN_FUNCTION(p) \ + { \ + auto board = static_cast(p); \ + return true; \ + } +*/ + +/** + * @brief Post-begin function for IO expander initialization + * + * @param[in] p Pointer to the board object + * @return true on success, false on failure + */ +/* +#define ESP_PANEL_BOARD_EXPANDER_POST_BEGIN_FUNCTION(p) \ + { \ + auto board = static_cast(p); \ + return true; \ + } +*/ + +/** + * @brief Pre-begin function for LCD initialization + * + * @param[in] p Pointer to the board object + * @return true on success, false on failure + */ +/* +#define ESP_PANEL_BOARD_LCD_PRE_BEGIN_FUNCTION(p) \ + { \ + auto board = static_cast(p); \ + return true; \ + } +*/ + +/** + * @brief Post-begin function for LCD initialization + * + * @param[in] p Pointer to the board object + * @return true on success, false on failure + */ +/* +#define ESP_PANEL_BOARD_LCD_POST_BEGIN_FUNCTION(p) \ + { \ + auto board = static_cast(p); \ + return true; \ + } +*/ + +/** + * @brief Pre-begin function for touch panel initialization + * + * @param[in] p Pointer to the board object + * @return true on success, false on failure + */ +/* +#define ESP_PANEL_BOARD_TOUCH_PRE_BEGIN_FUNCTION(p) \ + { \ + auto board = static_cast(p); \ + return true; \ + } +*/ + +/** + * @brief Post-begin function for touch panel initialization + * + * @param[in] p Pointer to the board object + * @return true on success, false on failure + */ +/* +#define ESP_PANEL_BOARD_TOUCH_POST_BEGIN_FUNCTION(p) \ + { \ + auto board = static_cast(p); \ + return true; \ + } +*/ + +/** + * @brief Pre-begin function for backlight initialization + * + * @param[in] p Pointer to the board object + * @return true on success, false on failure + */ +/* +#define ESP_PANEL_BOARD_BACKLIGHT_PRE_BEGIN_FUNCTION(p) \ + { \ + auto board = static_cast(p); \ + return true; \ + } +*/ + +/** + * @brief Post-begin function for backlight initialization + * + * @param[in] p Pointer to the board object + * @return true on success, false on failure + */ +/* +#define ESP_PANEL_BOARD_BACKLIGHT_POST_BEGIN_FUNCTION(p) \ + { \ + auto board = static_cast(p); \ + return true; \ + } +*/ + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////// File Version /////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Do not change the following versions. These version numbers are used to check compatibility between this + * configuration file and the library. Rules for version numbers: + * 1. Major version mismatch: Configurations are incompatible, must use library version + * 2. Minor version mismatch: May be missing new configurations, recommended to update + * 3. Patch version mismatch: No impact on functionality + */ +#define ESP_PANEL_BOARD_CUSTOM_FILE_VERSION_MAJOR 1 +#define ESP_PANEL_BOARD_CUSTOM_FILE_VERSION_MINOR 1 +#define ESP_PANEL_BOARD_CUSTOM_FILE_VERSION_PATCH 0 + +#endif // ESP_PANEL_BOARD_DEFAULT_USE_CUSTOM + +// *INDENT-ON* diff --git a/src/driver/display/esp_panel_drivers_conf.h b/src/driver/display/esp_panel_drivers_conf.h new file mode 100644 index 0000000000..fe0aecca5f --- /dev/null +++ b/src/driver/display/esp_panel_drivers_conf.h @@ -0,0 +1,266 @@ +/* + * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +/** + * @file esp_panel_drivers_conf.h + * @brief Configuration file for ESP Panel Drivers + * + * This file contains all the configurations needed for ESP Panel Drivers. + * Users can modify these configurations according to their requirements. + */ + +#pragma once + +// *INDENT-OFF* + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////// Bus Configurations ////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Bus driver availability + * + * Enable or disable bus drivers used in the factory class. Disable to reduce code size. + * Set to `1` to enable, `0` to disable. + */ +#define ESP_PANEL_DRIVERS_BUS_USE_ALL (1) +#if !ESP_PANEL_DRIVERS_BUS_USE_ALL + #define ESP_PANEL_DRIVERS_BUS_USE_SPI (0) + #define ESP_PANEL_DRIVERS_BUS_USE_QSPI (0) + #define ESP_PANEL_DRIVERS_BUS_USE_RGB (0) + #define ESP_PANEL_DRIVERS_BUS_USE_I2C (0) + #define ESP_PANEL_DRIVERS_BUS_USE_MIPI_DSI (0) +#endif // ESP_PANEL_DRIVERS_BUS_USE_ALL + +/** + * @brief Controls compilation of unused bus drivers + * + * Enable or disable compilation of unused bus drivers. + * When set to `0`, code for unused bus drivers will be excluded to speed up compilation. At this time, + * users should ensure that the bus driver is not used. + * + * Example with SPI: + * (CONF1 = ESP_PANEL_DRIVERS_BUS_USE_SPI, CONF2 = ESP_PANEL_DRIVERS_BUS_COMPILE_UNUSED_DRIVERS) + * + * | CONF1 | CONF2 | Driver Available ( = CONF1 ^ CONF2) | Factory Support ( = CONF1) | + * |-------|-------|-------------------------------------|----------------------------| + * | 0 | 0 | No | No | + * | 1 | 0 | Yes | Yes | + * | 0 | 1 | Yes | No | + * | 1 | 1 | Yes | Yes | + */ +#define ESP_PANEL_DRIVERS_BUS_COMPILE_UNUSED_DRIVERS (1) + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////// LCD Configurations /////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * @brief LCD driver availability + * + * Enable or disable LCD drivers used in the factory class. Disable to reduce code size. + * Set to `1` to enable, `0` to disable. + */ +#define ESP_PANEL_DRIVERS_LCD_USE_ALL (0) +#if !ESP_PANEL_DRIVERS_LCD_USE_ALL + #define ESP_PANEL_DRIVERS_LCD_USE_AXS15231B (0) + #define ESP_PANEL_DRIVERS_LCD_USE_EK9716B (0) + #define ESP_PANEL_DRIVERS_LCD_USE_EK79007 (0) + #define ESP_PANEL_DRIVERS_LCD_USE_GC9A01 (0) + #define ESP_PANEL_DRIVERS_LCD_USE_GC9B71 (0) + #define ESP_PANEL_DRIVERS_LCD_USE_GC9503 (0) + #define ESP_PANEL_DRIVERS_LCD_USE_HX8399 (0) + #define ESP_PANEL_DRIVERS_LCD_USE_ILI9341 (0) + #define ESP_PANEL_DRIVERS_LCD_USE_ILI9881C (0) + #define ESP_PANEL_DRIVERS_LCD_USE_JD9165 (0) + #define ESP_PANEL_DRIVERS_LCD_USE_JD9365 (0) + #define ESP_PANEL_DRIVERS_LCD_USE_NV3022B (0) + #define ESP_PANEL_DRIVERS_LCD_USE_SH8601 (0) + #define ESP_PANEL_DRIVERS_LCD_USE_SPD2010 (0) + #define ESP_PANEL_DRIVERS_LCD_USE_ST7262 (0) + #define ESP_PANEL_DRIVERS_LCD_USE_ST7701 (0) + #define ESP_PANEL_DRIVERS_LCD_USE_ST7703 (0) + #define ESP_PANEL_DRIVERS_LCD_USE_ST7789 (0) + #define ESP_PANEL_DRIVERS_LCD_USE_ST7796 (0) + #define ESP_PANEL_DRIVERS_LCD_USE_ST77903 (0) + #define ESP_PANEL_DRIVERS_LCD_USE_ST77916 (0) + #define ESP_PANEL_DRIVERS_LCD_USE_ST77922 (0) +#endif // ESP_PANEL_DRIVERS_LCD_USE_ALL + +/** + * @brief Controls compilation of unused LCD drivers + * + * Enable or disable compilation of unused LCD drivers. + * When set to `0`, code for unused LCD drivers will be excluded to speed up compilation. At this time, + * users should ensure that the LCD driver is not used. + * + * Example with ILI9341: + * (CONF1 = ESP_PANEL_DRIVERS_LCD_USE_ILI9341, CONF2 = ESP_PANEL_DRIVERS_LCD_COMPILE_UNUSED_DRIVERS) + * + * | CONF1 | CONF2 | Driver Available ( = CONF1 ^ CONF2) | Factory Support ( = CONF1) | + * |-------|-------|-------------------------------------|----------------------------| + * | 0 | 0 | No | No | + * | 1 | 0 | Yes | Yes | + * | 0 | 1 | Yes | No | + * | 1 | 1 | Yes | Yes | + */ +#define ESP_PANEL_DRIVERS_LCD_COMPILE_UNUSED_DRIVERS (1) + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////// Touch Configurations ///////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Touch panel configuration parameters + */ +#define ESP_PANEL_DRIVERS_TOUCH_MAX_POINTS (10) // Maximum number of touch points supported +#define ESP_PANEL_DRIVERS_TOUCH_MAX_BUTTONS (5) // Maximum number of touch buttons supported + +/** + * @brief Touch driver availability + * + * Enable or disable touch drivers used in the factory class. Disable to reduce code size. + * Set to `1` to enable, `0` to disable. + */ +#define ESP_PANEL_DRIVERS_TOUCH_USE_ALL (0) +#if !ESP_PANEL_DRIVERS_TOUCH_USE_ALL + #define ESP_PANEL_DRIVERS_TOUCH_USE_AXS15231B (0) + #define ESP_PANEL_DRIVERS_TOUCH_USE_CHSC6540 (0) + #define ESP_PANEL_DRIVERS_TOUCH_USE_CST816S (0) + #define ESP_PANEL_DRIVERS_TOUCH_USE_FT5x06 (0) + #define ESP_PANEL_DRIVERS_TOUCH_USE_GT911 (0) + #define ESP_PANEL_DRIVERS_TOUCH_USE_GT1151 (0) + #define ESP_PANEL_DRIVERS_TOUCH_USE_SPD2010 (0) + #define ESP_PANEL_DRIVERS_TOUCH_USE_ST1633 (0) + #define ESP_PANEL_DRIVERS_TOUCH_USE_ST7123 (0) + #define ESP_PANEL_DRIVERS_TOUCH_USE_STMPE610 (0) + #define ESP_PANEL_DRIVERS_TOUCH_USE_TT21100 (0) + #define ESP_PANEL_DRIVERS_TOUCH_USE_XPT2046 (0) +#endif // ESP_PANEL_DRIVERS_TOUCH_USE_ALL + +/** + * @brief Controls compilation of unused touch drivers + * + * Enable or disable compilation of unused touch drivers. + * When set to `0`, code for unused touch drivers will be excluded to speed up compilation. At this time, + * users should ensure that the touch driver is not used. + * + * Example with GT911: + * (CONF1 = ESP_PANEL_DRIVERS_TOUCH_USE_GT911, CONF2 = ESP_PANEL_DRIVERS_TOUCH_COMPILE_UNUSED_DRIVERS) + * + * | CONF1 | CONF2 | Driver Available ( = CONF1 ^ CONF2) | Factory Support ( = CONF1) | + * |-------|-------|-------------------------------------|----------------------------| + * | 0 | 0 | No | No | + * | 1 | 0 | Yes | Yes | + * | 0 | 1 | Yes | No | + * | 1 | 1 | Yes | Yes | + */ +#define ESP_PANEL_DRIVERS_TOUCH_COMPILE_UNUSED_DRIVERS (1) + +#if ESP_PANEL_DRIVERS_TOUCH_USE_XPT2046 || ESP_PANEL_DRIVERS_TOUCH_COMPILE_UNUSED_DRIVERS +/** + * @brief XPT2046 touch panel specific configurations + */ + +#define ESP_PANEL_DRIVERS_TOUCH_XPT2046_Z_THRESHOLD (400) // Minimum pressure threshold for touch detection + +/** + * @brief Enable interrupt (PENIRQ) output mode + * + * When enabled, XPT2046 outputs low on PENIRQ when touch is detected (Full Power Mode). + * Consumes more power but provides interrupt capability. + */ +#define ESP_PANEL_DRIVERS_TOUCH_XPT2046_INTERRUPT_MODE (0) + +/** + * @brief Keep internal voltage reference enabled + * + * When enabled, internal Vref remains on between conversions. Slightly higher power consumption, + * but requires fewer transactions for battery voltage, aux voltage and temperature readings. + */ +#define ESP_PANEL_DRIVERS_TOUCH_XPT2046_VREF_ON_MODE (0) + +/** + * @brief Enable automatic coordinate conversion + * + * When enabled, raw ADC values (0-4096) are converted to screen coordinates. + * When disabled, `process_coordinates` must be called manually to convert values. + */ +#define ESP_PANEL_DRIVERS_TOUCH_XPT2046_CONVERT_ADC_TO_COORDS (1) + +/** + * @brief Enable data structure locking + * + * When enabled, driver locks touch position data structures during reads. + * Warning: May cause unexpected crashes. + */ +#define ESP_PANEL_DRIVERS_TOUCH_XPT2046_ENABLE_LOCKING (0) +#endif // ESP_PANEL_DRIVERS_TOUCH_USE_XPT2046 || ESP_PANEL_DRIVERS_TOUCH_COMPILE_UNUSED_DRIVERS + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////// IO Expander Configurations ////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * @brief IO Expander driver availability + * + * Enable or disable IO Expander drivers used in the factory class. Disable to reduce code size. + * Set to `1` to enable, `0` to disable. + */ +#define ESP_PANEL_DRIVERS_EXPANDER_USE_ALL (0) +#if !ESP_PANEL_DRIVERS_EXPANDER_USE_ALL + #define ESP_PANEL_DRIVERS_EXPANDER_USE_CH422G (0) + #define ESP_PANEL_DRIVERS_EXPANDER_USE_HT8574 (0) + #define ESP_PANEL_DRIVERS_EXPANDER_USE_TCA95XX_8BIT (0) + #define ESP_PANEL_DRIVERS_EXPANDER_USE_TCA95XX_16BIT (0) +#endif // ESP_PANEL_DRIVERS_EXPANDER_USE_ALL + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////// Backlight Configurations /////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Backlight driver availability + * + * Enable or disable backlight drivers used in the factory class. Disable to reduce code size. + * Set to `1` to enable, `0` to disable. + */ +#define ESP_PANEL_DRIVERS_BACKLIGHT_USE_ALL (1) +#if !ESP_PANEL_DRIVERS_BACKLIGHT_USE_ALL + #define ESP_PANEL_DRIVERS_BACKLIGHT_USE_SWITCH_GPIO (0) + #define ESP_PANEL_DRIVERS_BACKLIGHT_USE_SWITCH_EXPANDER (0) + #define ESP_PANEL_DRIVERS_BACKLIGHT_USE_PWM_LEDC (0) + #define ESP_PANEL_DRIVERS_BACKLIGHT_USE_CUSTOM (0) +#endif // ESP_PANEL_DRIVERS_BACKLIGHT_USE_ALL + +/** + * @brief Controls compilation of unused backlight drivers + * + * Enable or disable compilation of unused backlight drivers. + * When set to `0`, code for unused backlight drivers will be excluded to speed up compilation. At this time, + * users should ensure that the backlight driver is not used. + * + * Example with PWM_LEDC: + * (CONF1 = ESP_PANEL_DRIVERS_BACKLIGHT_USE_PWM_LEDC, CONF2 = ESP_PANEL_DRIVERS_BACKLIGHT_COMPILE_UNUSED_DRIVERS) + * + * | CONF1 | CONF2 | Driver Available ( = CONF1 ^ CONF2) | Factory Support ( = CONF1) | + * |-------|-------|-------------------------------------|----------------------------| + * | 0 | 0 | No | No | + * | 1 | 0 | Yes | Yes | + * | 0 | 1 | Yes | No | + * | 1 | 1 | Yes | Yes | + */ +#define ESP_PANEL_DRIVERS_BACKLIGHT_COMPILE_UNUSED_DRIVERS (1) + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////// File Version /////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Do not change the following versions. These version numbers are used to check compatibility between this + * configuration file and the library. Rules for version numbers: + * 1. Major version mismatch: Configurations are incompatible, must use library version + * 2. Minor version mismatch: May be missing new configurations, recommended to update + * 3. Patch version mismatch: No impact on functionality + */ +#define ESP_PANEL_DRIVERS_CONF_FILE_VERSION_MAJOR 1 +#define ESP_PANEL_DRIVERS_CONF_FILE_VERSION_MINOR 0 +#define ESP_PANEL_DRIVERS_CONF_FILE_VERSION_PATCH 0 + +// *INDENT-ON* diff --git a/src/driver/display/esp_utils_conf.h b/src/driver/display/esp_utils_conf.h new file mode 100644 index 0000000000..4ecc2518d1 --- /dev/null +++ b/src/driver/display/esp_utils_conf.h @@ -0,0 +1,94 @@ +/* + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +// *INDENT-OFF* + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////// Check Configurations ///////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Check handle method, choose one of the following: + * - ESP_UTILS_CHECK_HANDLE_WITH_NONE: Do nothing when check failed (Minimum code size) + * - ESP_UTILS_CHECK_HANDLE_WITH_ERROR_LOG: Print error message when check failed (Recommended) + * - ESP_UTILS_CHECK_HANDLE_WITH_ASSERT: Assert when check failed + */ +#define ESP_UTILS_CONF_CHECK_HANDLE_METHOD (ESP_UTILS_CHECK_HANDLE_WITH_ERROR_LOG) + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////// Log Configurations ////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Global log level, logs with a level lower than this will not be compiled. Choose one of the following: + * - ESP_UTILS_LOG_LEVEL_DEBUG: Extra information which is not necessary for normal use (values, pointers, sizes, etc) + * (lowest level) + * - ESP_UTILS_LOG_LEVEL_INFO: Information messages which describe the normal flow of events + * - ESP_UTILS_LOG_LEVEL_WARNING: Error conditions from which recovery measures have been taken + * - ESP_UTILS_LOG_LEVEL_ERROR: Critical errors, software module cannot recover on its own + * - ESP_UTILS_LOG_LEVEL_NONE: No log output (highest level) (Minimum code size) + */ +#define ESP_UTILS_CONF_LOG_LEVEL (ESP_UTILS_LOG_LEVEL_INFO) +#if ESP_UTILS_CONF_LOG_LEVEL == ESP_UTILS_LOG_LEVEL_DEBUG + + /** + * @brief Set to 1 if print trace log messages when enter/exit functions, useful for debugging + */ + #define ESP_UTILS_CONF_ENABLE_LOG_TRACE (0) + +#endif // ESP_UTILS_CONF_LOG_LEVEL + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////// Memory Configurations ///////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Default enable memory allocation. + * + * If enabled, the driver will use general memory allocation by default, otherwise, the driver will use `malloc` and + * `free` by default + */ +#define ESP_UTILS_CONF_MEM_GEN_ALLOC_DEFAULT_ENABLE (1) + +/** + * General Memory allocation type, choose one of the following: + * - ESP_UTILS_MEM_ALLOC_TYPE_STDLIB: Use the standard library memory allocation functions (malloc, free) + * - ESP_UTILS_MEM_ALLOC_TYPE_ESP: Use the ESP-IDF memory allocation functions (heap_caps_aligned_alloc, heap_caps_free) + * - ESP_UTILS_MEM_ALLOC_TYPE_MICROPYTHON: Use the MicroPython memory allocation functions (m_malloc, m_free) + * - ESP_UTILS_MEM_ALLOC_TYPE_CUSTOM: Use custom memory allocation functions (ESP_UTILS_MEM_ALLOC_CUSTOM_MALLOC, + * ESP_UTILS_MEM_ALLOC_CUSTOM_FREE) + */ +#define ESP_UTILS_CONF_MEM_GEN_ALLOC_TYPE (ESP_UTILS_MEM_ALLOC_TYPE_STDLIB) +#if ESP_UTILS_CONF_MEM_GEN_ALLOC_TYPE == ESP_UTILS_MEM_ALLOC_TYPE_ESP + + #define ESP_UTILS_CONF_MEM_GEN_ALLOC_ESP_ALIGN (1) + #define ESP_UTILS_CONF_MEM_GEN_ALLOC_ESP_CAPS (MALLOC_CAP_DEFAULT | MALLOC_CAP_8BIT) + +#elif ESP_UTILS_CONF_MEM_GEN_ALLOC_TYPE == ESP_UTILS_MEM_ALLOC_TYPE_CUSTOM + + #define ESP_UTILS_CONF_MEM_GEN_ALLOC_CUSTOM_INCLUDE "stdlib.h" + #define ESP_UTILS_CONF_MEM_GEN_ALLOC_CUSTOM_MALLOC malloc + #define ESP_UTILS_CONF_MEM_GEN_ALLOC_CUSTOM_FREE free + +#endif // ESP_UTILS_CONF_MEM_GEN_ALLOC_TYPE + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////// File Version /////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Do not change the following versions, they are used to check if the configurations in this file are compatible with + * the current version of `esp_utils_conf.h` in the library. The detailed rules are as follows: + * + * 1. If the major version is not consistent, then the configurations in this file are incompatible with the library + * and must be replaced with the file from the library. + * 2. If the minor version is not consistent, this file might be missing some new configurations, which will be set to + * default values. It is recommended to replace it with the file from the library. + * 3. Even if the patch version is not consistent, it will not affect normal functionality. + */ +#define ESP_UTILS_CONF_FILE_VERSION_MAJOR 1 +#define ESP_UTILS_CONF_FILE_VERSION_MINOR 2 +#define ESP_UTILS_CONF_FILE_VERSION_PATCH 0 + +// *INDENT-ON* diff --git a/src/driver/display/lv_conf.h b/src/driver/display/lv_conf.h new file mode 100644 index 0000000000..805bae255d --- /dev/null +++ b/src/driver/display/lv_conf.h @@ -0,0 +1,793 @@ +/** + * @file lv_conf.h + * Configuration file for v8.4.0 + */ + +/* + * Copy this file as `lv_conf.h` + * 1. simply next to the `lvgl` folder + * 2. or any other places and + * - define `LV_CONF_INCLUDE_SIMPLE` + * - add the path as include path + */ + +/* clang-format off */ +#if 1 /*Set it to "1" to enable content*/ + +#ifndef LV_CONF_H +#define LV_CONF_H + +#include + +/*==================== + COLOR SETTINGS + *====================*/ + +/*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/ +#define LV_COLOR_DEPTH 16 + +// Will define in `platformio.ini` according to the LCD type. +// For example: SPI LCD needs to enable it, but RGB LCD should disable it. +// /*Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)*/ +// #define LV_COLOR_16_SWAP 0 + +/*Enable features to draw on transparent background. + *It's required if opa, and transform_* style properties are used. + *Can be also used if the UI is above another layer, e.g. an OSD menu or video player.*/ +#define LV_COLOR_SCREEN_TRANSP 1 + +/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. + * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */ +#define LV_COLOR_MIX_ROUND_OFS 0 + +/*Images pixels with this color will not be drawn if they are chroma keyed)*/ +#define LV_COLOR_CHROMA_KEY lv_color_hex(0x00ff00) /*pure green*/ + +/*========================= + MEMORY SETTINGS + *=========================*/ + +/*1: use custom malloc/free, 0: use the built-in `lv_mem_alloc()` and `lv_mem_free()`*/ +#define LV_MEM_CUSTOM 1 +#if LV_MEM_CUSTOM == 0 + /*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/ + #define LV_MEM_SIZE (48U * 1024U) /*[bytes]*/ + + /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ + #define LV_MEM_ADR 0 /*0: unused*/ + /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/ + #if LV_MEM_ADR == 0 + #undef LV_MEM_POOL_INCLUDE + #undef LV_MEM_POOL_ALLOC + #endif + +#else /*LV_MEM_CUSTOM*/ +#if 1 + #define LV_MEM_CUSTOM_INCLUDE "esp_heap_caps.h" + #define LV_MEM_CUSTOM_ALLOC(size) heap_caps_malloc(size, MALLOC_CAP_SPIRAM) + #define LV_MEM_CUSTOM_FREE(ptr) heap_caps_free(ptr) + #define LV_MEM_CUSTOM_REALLOC(ptr, size) heap_caps_realloc(ptr, size, MALLOC_CAP_SPIRAM) +#else + #define LV_MEM_CUSTOM_INCLUDE + #define LV_MEM_CUSTOM_ALLOC(size) malloc(size) + #define LV_MEM_CUSTOM_FREE(ptr) free(ptr) + #define LV_MEM_CUSTOM_REALLOC(ptr, size) realloc(ptr, size) +#endif +#endif /*LV_MEM_CUSTOM*/ + +/*Number of the intermediate memory buffer used during rendering and other internal processing mechanisms. + *You will see an error log message if there wasn't enough buffers. */ +#define LV_MEM_BUF_MAX_NUM 16 + +/*Use the standard `memcpy` and `memset` instead of LVGL's own functions. (Might or might not be faster).*/ +#define LV_MEMCPY_MEMSET_STD 0 + +/*==================== + HAL SETTINGS + *====================*/ + +/*Default display refresh period. LVG will redraw changed areas with this period time*/ +#define LV_DISP_DEF_REFR_PERIOD 30 /*[ms]*/ + +/*Input device read period in milliseconds*/ +#define LV_INDEV_DEF_READ_PERIOD 30 /*[ms]*/ + +/*Use a custom tick source that tells the elapsed time in milliseconds. + *It removes the need to manually update the tick with `lv_tick_inc()`)*/ +#define LV_TICK_CUSTOM 0 +#if LV_TICK_CUSTOM + #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/ + #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/ + /*If using lvgl as ESP32 component*/ + // #define LV_TICK_CUSTOM_INCLUDE "esp_timer.h" + // #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((esp_timer_get_time() / 1000LL)) +#endif /*LV_TICK_CUSTOM*/ + +/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. + *(Not so important, you can adjust it to modify default sizes and spaces)*/ +#define LV_DPI_DEF 130 /*[px/inch]*/ + +/*======================= + * FEATURE CONFIGURATION + *=======================*/ + +/*------------- + * Drawing + *-----------*/ + +/*Enable complex draw engine. + *Required to draw shadow, gradient, rounded corners, circles, arc, skew lines, image transformations or any masks*/ +#define LV_DRAW_COMPLEX 1 +#if LV_DRAW_COMPLEX != 0 + + /*Allow buffering some shadow calculation. + *LV_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius` + *Caching has LV_SHADOW_CACHE_SIZE^2 RAM cost*/ + #define LV_SHADOW_CACHE_SIZE 0 + + /* Set number of maximally cached circle data. + * The circumference of 1/4 circle are saved for anti-aliasing + * radius * 4 bytes are used per circle (the most often used radiuses are saved) + * 0: to disable caching */ + #define LV_CIRCLE_CACHE_SIZE 4 +#endif /*LV_DRAW_COMPLEX*/ + +/** + * "Simple layers" are used when a widget has `style_opa < 255` to buffer the widget into a layer + * and blend it as an image with the given opacity. + * Note that `bg_opa`, `text_opa` etc don't require buffering into layer) + * The widget can be buffered in smaller chunks to avoid using large buffers. + * + * - LV_LAYER_SIMPLE_BUF_SIZE: [bytes] the optimal target buffer size. LVGL will try to allocate it + * - LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE: [bytes] used if `LV_LAYER_SIMPLE_BUF_SIZE` couldn't be allocated. + * + * Both buffer sizes are in bytes. + * "Transformed layers" (where transform_angle/zoom properties are used) use larger buffers + * and can't be drawn in chunks. So these settings affects only widgets with opacity. + */ +#define LV_LAYER_SIMPLE_BUF_SIZE (24 * 1024) +#define LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE (3 * 1024) + +/*Default image cache size. Image caching keeps the images opened. + *If only the built-in image formats are used there is no real advantage of caching. (I.e. if no new image decoder is added) + *With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images. + *However the opened images might consume additional RAM. + *0: to disable caching*/ +#define LV_IMG_CACHE_DEF_SIZE 0 + +/*Number of stops allowed per gradient. Increase this to allow more stops. + *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/ +#define LV_GRADIENT_MAX_STOPS 2 + +/*Default gradient buffer size. + *When LVGL calculates the gradient "maps" it can save them into a cache to avoid calculating them again. + *LV_GRAD_CACHE_DEF_SIZE sets the size of this cache in bytes. + *If the cache is too small the map will be allocated only while it's required for the drawing. + *0 mean no caching.*/ +#define LV_GRAD_CACHE_DEF_SIZE 0 + +/*Allow dithering the gradients (to achieve visual smooth color gradients on limited color depth display) + *LV_DITHER_GRADIENT implies allocating one or two more lines of the object's rendering surface + *The increase in memory consumption is (32 bits * object width) plus 24 bits * object width if using error diffusion */ +#define LV_DITHER_GRADIENT 0 +#if LV_DITHER_GRADIENT + /*Add support for error diffusion dithering. + *Error diffusion dithering gets a much better visual result, but implies more CPU consumption and memory when drawing. + *The increase in memory consumption is (24 bits * object's width)*/ + #define LV_DITHER_ERROR_DIFFUSION 0 +#endif + +/*Maximum buffer size to allocate for rotation. + *Only used if software rotation is enabled in the display driver.*/ +#define LV_DISP_ROT_MAX_BUF (10*1024) + +/*------------- + * GPU + *-----------*/ + +/*Use Arm's 2D acceleration library Arm-2D */ +#define LV_USE_GPU_ARM2D 0 + +/*Use STM32's DMA2D (aka Chrom Art) GPU*/ +#define LV_USE_GPU_STM32_DMA2D 0 +#if LV_USE_GPU_STM32_DMA2D + /*Must be defined to include path of CMSIS header of target processor + e.g. "stm32f7xx.h" or "stm32f4xx.h"*/ + #define LV_GPU_DMA2D_CMSIS_INCLUDE +#endif + +/*Enable RA6M3 G2D GPU*/ +#define LV_USE_GPU_RA6M3_G2D 0 +#if LV_USE_GPU_RA6M3_G2D + /*include path of target processor + e.g. "hal_data.h"*/ + #define LV_GPU_RA6M3_G2D_INCLUDE "hal_data.h" +#endif + +/*Use SWM341's DMA2D GPU*/ +#define LV_USE_GPU_SWM341_DMA2D 0 +#if LV_USE_GPU_SWM341_DMA2D + #define LV_GPU_SWM341_DMA2D_INCLUDE "SWM341.h" +#endif + +/*Use NXP's PXP GPU iMX RTxxx platforms*/ +#define LV_USE_GPU_NXP_PXP 0 +#if LV_USE_GPU_NXP_PXP + /*1: Add default bare metal and FreeRTOS interrupt handling routines for PXP (lv_gpu_nxp_pxp_osa.c) + * and call lv_gpu_nxp_pxp_init() automatically during lv_init(). Note that symbol SDK_OS_FREE_RTOS + * has to be defined in order to use FreeRTOS OSA, otherwise bare-metal implementation is selected. + *0: lv_gpu_nxp_pxp_init() has to be called manually before lv_init() + */ + #define LV_USE_GPU_NXP_PXP_AUTO_INIT 0 +#endif + +/*Use NXP's VG-Lite GPU iMX RTxxx platforms*/ +#define LV_USE_GPU_NXP_VG_LITE 0 + +/*Use SDL renderer API*/ +#define LV_USE_GPU_SDL 0 +#if LV_USE_GPU_SDL + #define LV_GPU_SDL_INCLUDE_PATH + /*Texture cache size, 8MB by default*/ + #define LV_GPU_SDL_LRU_SIZE (1024 * 1024 * 8) + /*Custom blend mode for mask drawing, disable if you need to link with older SDL2 lib*/ + #define LV_GPU_SDL_CUSTOM_BLEND_MODE (SDL_VERSION_ATLEAST(2, 0, 6)) +#endif + +/*------------- + * Logging + *-----------*/ + +/*Enable the log module*/ +#define LV_USE_LOG 1 +#if LV_USE_LOG + + /*How important log should be added: + *LV_LOG_LEVEL_TRACE A lot of logs to give detailed information + *LV_LOG_LEVEL_INFO Log important events + *LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem + *LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail + *LV_LOG_LEVEL_USER Only logs added by the user + *LV_LOG_LEVEL_NONE Do not log anything*/ + #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN + + /*1: Print the log with 'printf'; + *0: User need to register a callback with `lv_log_register_print_cb()`*/ + #define LV_LOG_PRINTF 1 + + /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ + #define LV_LOG_TRACE_MEM 1 + #define LV_LOG_TRACE_TIMER 1 + #define LV_LOG_TRACE_INDEV 1 + #define LV_LOG_TRACE_DISP_REFR 1 + #define LV_LOG_TRACE_EVENT 1 + #define LV_LOG_TRACE_OBJ_CREATE 1 + #define LV_LOG_TRACE_LAYOUT 1 + #define LV_LOG_TRACE_ANIM 1 + +#endif /*LV_USE_LOG*/ + +/*------------- + * Asserts + *-----------*/ + +/*Enable asserts if an operation is failed or an invalid data is found. + *If LV_USE_LOG is enabled an error message will be printed on failure*/ +#define LV_USE_ASSERT_NULL 1 /*Check if the parameter is NULL. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MALLOC 1 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/ +#define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/ +#define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/ + +/*Add a custom handler when assert happens e.g. to restart the MCU*/ +#define LV_ASSERT_HANDLER_INCLUDE +#define LV_ASSERT_HANDLER while(1); /*Halt by default*/ + +/*------------- + * Others + *-----------*/ + +/*1: Show CPU usage and FPS count*/ +#define LV_USE_PERF_MONITOR 1 +#if LV_USE_PERF_MONITOR + #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT +#endif + +/*1: Show the used memory and the memory fragmentation + * Requires LV_MEM_CUSTOM = 0*/ +#define LV_USE_MEM_MONITOR 0 +#if LV_USE_MEM_MONITOR + #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT +#endif + +/*1: Draw random colored rectangles over the redrawn areas*/ +#define LV_USE_REFR_DEBUG 0 + +/*Change the built in (v)snprintf functions*/ +#define LV_SPRINTF_CUSTOM 0 +#if LV_SPRINTF_CUSTOM + #define LV_SPRINTF_INCLUDE + #define lv_snprintf snprintf + #define lv_vsnprintf vsnprintf +#else /*LV_SPRINTF_CUSTOM*/ + #define LV_SPRINTF_USE_FLOAT 0 +#endif /*LV_SPRINTF_CUSTOM*/ + +#define LV_USE_USER_DATA 1 + +/*Garbage Collector settings + *Used if lvgl is bound to higher level language and the memory is managed by that language*/ +#define LV_ENABLE_GC 0 +#if LV_ENABLE_GC != 0 + #define LV_GC_INCLUDE "gc.h" /*Include Garbage Collector related things*/ +#endif /*LV_ENABLE_GC*/ + +/*===================== + * COMPILER SETTINGS + *====================*/ + +/*For big endian systems set to 1*/ +#define LV_BIG_ENDIAN_SYSTEM 0 + +/*Define a custom attribute to `lv_tick_inc` function*/ +#define LV_ATTRIBUTE_TICK_INC + +/*Define a custom attribute to `lv_timer_handler` function*/ +#define LV_ATTRIBUTE_TIMER_HANDLER + +/*Define a custom attribute to `lv_disp_flush_ready` function*/ +#define LV_ATTRIBUTE_FLUSH_READY + +/*Required alignment size for buffers*/ +#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 + +/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default). + * E.g. __attribute__((aligned(4)))*/ +#define LV_ATTRIBUTE_MEM_ALIGN + +/*Attribute to mark large constant arrays for example font's bitmaps*/ +#define LV_ATTRIBUTE_LARGE_CONST + +/*Compiler prefix for a big array declaration in RAM*/ +#define LV_ATTRIBUTE_LARGE_RAM_ARRAY + +/*Place performance critical functions into a faster memory (e.g RAM)*/ +#define LV_ATTRIBUTE_FAST_MEM + +/*Prefix variables that are used in GPU accelerated operations, often these need to be placed in RAM sections that are DMA accessible*/ +#define LV_ATTRIBUTE_DMA + +/*Export integer constant to binding. This macro is used with constants in the form of LV_ that + *should also appear on LVGL binding API such as Micropython.*/ +#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/ + +/*Extend the default -32k..32k coordinate range to -4M..4M by using int32_t for coordinates instead of int16_t*/ +#define LV_USE_LARGE_COORD 0 + +/*================== + * FONT USAGE + *===================*/ + +/*Montserrat fonts with ASCII range and some symbols using bpp = 4 + *https://fonts.google.com/specimen/Montserrat*/ +#define LV_FONT_MONTSERRAT_8 1 +#define LV_FONT_MONTSERRAT_10 1 +#define LV_FONT_MONTSERRAT_12 1 +#define LV_FONT_MONTSERRAT_14 1 +#define LV_FONT_MONTSERRAT_16 1 +#define LV_FONT_MONTSERRAT_18 1 +#define LV_FONT_MONTSERRAT_20 1 +#define LV_FONT_MONTSERRAT_22 1 +#define LV_FONT_MONTSERRAT_24 1 +#define LV_FONT_MONTSERRAT_26 1 +#define LV_FONT_MONTSERRAT_28 1 +#define LV_FONT_MONTSERRAT_30 1 +#define LV_FONT_MONTSERRAT_32 1 +#define LV_FONT_MONTSERRAT_34 1 +#define LV_FONT_MONTSERRAT_36 1 +#define LV_FONT_MONTSERRAT_38 1 +#define LV_FONT_MONTSERRAT_40 1 +#define LV_FONT_MONTSERRAT_42 1 +#define LV_FONT_MONTSERRAT_44 1 +#define LV_FONT_MONTSERRAT_46 1 +#define LV_FONT_MONTSERRAT_48 1 + +/*Demonstrate special features*/ +#define LV_FONT_MONTSERRAT_12_SUBPX 0 +#define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/ +#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/ +#define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/ + +/*Pixel perfect monospace fonts*/ +#define LV_FONT_UNSCII_8 0 +#define LV_FONT_UNSCII_16 0 + +/*Optionally declare custom fonts here. + *You can use these fonts as default font too and they will be available globally. + *E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/ +#define LV_FONT_CUSTOM_DECLARE + +/*Always set a default font*/ +#define LV_FONT_DEFAULT &lv_font_montserrat_14 + +/*Enable handling large font and/or fonts with a lot of characters. + *The limit depends on the font size, font face and bpp. + *Compiler error will be triggered if a font needs it.*/ +#define LV_FONT_FMT_TXT_LARGE 0 + +/*Enables/disables support for compressed fonts.*/ +#define LV_USE_FONT_COMPRESSED 1 + +/*Enable subpixel rendering*/ +#define LV_USE_FONT_SUBPX 1 +#if LV_USE_FONT_SUBPX + /*Set the pixel order of the display. Physical order of RGB channels. Doesn't matter with "normal" fonts.*/ + #define LV_FONT_SUBPX_BGR 0 /*0: RGB; 1:BGR order*/ +#endif + +/*Enable drawing placeholders when glyph dsc is not found*/ +#define LV_USE_FONT_PLACEHOLDER 1 + +/*================= + * TEXT SETTINGS + *=================*/ + +/** + * Select a character encoding for strings. + * Your IDE or editor should have the same character encoding + * - LV_TXT_ENC_UTF8 + * - LV_TXT_ENC_ASCII + */ +#define LV_TXT_ENC LV_TXT_ENC_UTF8 + +/*Can break (wrap) texts on these chars*/ +#define LV_TXT_BREAK_CHARS " ,.;:-_" + +/*If a word is at least this long, will break wherever "prettiest" + *To disable, set to a value <= 0*/ +#define LV_TXT_LINE_BREAK_LONG_LEN 0 + +/*Minimum number of characters in a long word to put on a line before a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 + +/*Minimum number of characters in a long word to put on a line after a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 + +/*The control character to use for signalling text recoloring.*/ +#define LV_TXT_COLOR_CMD "#" + +/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts. + *The direction will be processed according to the Unicode Bidirectional Algorithm: + *https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/ +#define LV_USE_BIDI 0 +#if LV_USE_BIDI + /*Set the default direction. Supported values: + *`LV_BASE_DIR_LTR` Left-to-Right + *`LV_BASE_DIR_RTL` Right-to-Left + *`LV_BASE_DIR_AUTO` detect texts base direction*/ + #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO +#endif + +/*Enable Arabic/Persian processing + *In these languages characters should be replaced with an other form based on their position in the text*/ +#define LV_USE_ARABIC_PERSIAN_CHARS 0 + +/*================== + * WIDGET USAGE + *================*/ + +/*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/ + +#define LV_USE_ARC 1 + +#define LV_USE_BAR 1 + +#define LV_USE_BTN 1 + +#define LV_USE_BTNMATRIX 1 + +#define LV_USE_CANVAS 1 + +#define LV_USE_CHECKBOX 1 + +#define LV_USE_DROPDOWN 1 /*Requires: lv_label*/ + +#define LV_USE_IMG 1 /*Requires: lv_label*/ + +#define LV_USE_LABEL 1 +#if LV_USE_LABEL + #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/ + #define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/ +#endif + +#define LV_USE_LINE 1 + +#define LV_USE_ROLLER 1 /*Requires: lv_label*/ +#if LV_USE_ROLLER + #define LV_ROLLER_INF_PAGES 7 /*Number of extra "pages" when the roller is infinite*/ +#endif + +#define LV_USE_SLIDER 1 /*Requires: lv_bar*/ + +#define LV_USE_SWITCH 1 + +#define LV_USE_TEXTAREA 1 /*Requires: lv_label*/ +#if LV_USE_TEXTAREA != 0 + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ +#endif + +#define LV_USE_TABLE 1 + +/*================== + * EXTRA COMPONENTS + *==================*/ + +/*----------- + * Widgets + *----------*/ +#define LV_USE_ANIMIMG 1 + +#define LV_USE_CALENDAR 1 +#if LV_USE_CALENDAR + #define LV_CALENDAR_WEEK_STARTS_MONDAY 0 + #if LV_CALENDAR_WEEK_STARTS_MONDAY + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"} + #else + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"} + #endif + + #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} + #define LV_USE_CALENDAR_HEADER_ARROW 1 + #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 +#endif /*LV_USE_CALENDAR*/ + +#define LV_USE_CHART 1 + +#define LV_USE_COLORWHEEL 1 + +#define LV_USE_IMGBTN 1 + +#define LV_USE_KEYBOARD 1 + +#define LV_USE_LED 1 + +#define LV_USE_LIST 1 + +#define LV_USE_MENU 1 + +#define LV_USE_METER 1 + +#define LV_USE_MSGBOX 1 + +#define LV_USE_SPAN 1 +#if LV_USE_SPAN + /*A line text can contain maximum num of span descriptor */ + #define LV_SPAN_SNIPPET_STACK_SIZE 64 +#endif + +#define LV_USE_SPINBOX 1 + +#define LV_USE_SPINNER 1 + +#define LV_USE_TABVIEW 1 + +#define LV_USE_TILEVIEW 1 + +#define LV_USE_WIN 1 + +/*----------- + * Themes + *----------*/ + +/*A simple, impressive and very complete theme*/ +#define LV_USE_THEME_DEFAULT 1 +#if LV_USE_THEME_DEFAULT + + /*0: Light mode; 1: Dark mode*/ + #define LV_THEME_DEFAULT_DARK 0 + + /*1: Enable grow on press*/ + #define LV_THEME_DEFAULT_GROW 1 + + /*Default transition time in [ms]*/ + #define LV_THEME_DEFAULT_TRANSITION_TIME 80 +#endif /*LV_USE_THEME_DEFAULT*/ + +/*A very simple theme that is a good starting point for a custom theme*/ +#define LV_USE_THEME_BASIC 1 + +/*A theme designed for monochrome displays*/ +#define LV_USE_THEME_MONO 1 + +/*----------- + * Layouts + *----------*/ + +/*A layout similar to Flexbox in CSS.*/ +#define LV_USE_FLEX 1 + +/*A layout similar to Grid in CSS.*/ +#define LV_USE_GRID 1 + +/*--------------------- + * 3rd party libraries + *--------------------*/ + +/*File system interfaces for common APIs */ + +/*API for fopen, fread, etc*/ +#define LV_USE_FS_STDIO 0 +#if LV_USE_FS_STDIO + #define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for open, read, etc*/ +#define LV_USE_FS_POSIX 0 +#if LV_USE_FS_POSIX + #define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for CreateFile, ReadFile, etc*/ +#define LV_USE_FS_WIN32 0 +#if LV_USE_FS_WIN32 + #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/ +#define LV_USE_FS_FATFS 0 +#if LV_USE_FS_FATFS + #define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for LittleFS (library needs to be added separately). Uses lfs_file_open, lfs_file_read, etc*/ +#define LV_USE_FS_LITTLEFS 0 +#if LV_USE_FS_LITTLEFS + #define LV_FS_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_LITTLEFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*PNG decoder library*/ +#define LV_USE_PNG 0 + +/*BMP decoder library*/ +#define LV_USE_BMP 0 + +/* JPG + split JPG decoder library. + * Split JPG is a custom format optimized for embedded systems. */ +#define LV_USE_SJPG 0 + +/*GIF decoder library*/ +#define LV_USE_GIF 0 + +/*QR code library*/ +#define LV_USE_QRCODE 1 + +/*FreeType library*/ +#define LV_USE_FREETYPE 0 +#if LV_USE_FREETYPE + /*Memory used by FreeType to cache characters [bytes] (-1: no caching)*/ + #define LV_FREETYPE_CACHE_SIZE (16 * 1024) + #if LV_FREETYPE_CACHE_SIZE >= 0 + /* 1: bitmap cache use the sbit cache, 0:bitmap cache use the image cache. */ + /* sbit cache:it is much more memory efficient for small bitmaps(font size < 256) */ + /* if font size >= 256, must be configured as image cache */ + #define LV_FREETYPE_SBIT_CACHE 0 + /* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */ + /* (0:use system defaults) */ + #define LV_FREETYPE_CACHE_FT_FACES 0 + #define LV_FREETYPE_CACHE_FT_SIZES 0 + #endif +#endif + +/*Tiny TTF library*/ +#define LV_USE_TINY_TTF 0 +#if LV_USE_TINY_TTF + /*Load TTF data from files*/ + #define LV_TINY_TTF_FILE_SUPPORT 0 +#endif + +/*Rlottie library*/ +#define LV_USE_RLOTTIE 0 + +/*FFmpeg library for image decoding and playing videos + *Supports all major image formats so do not enable other image decoder with it*/ +#define LV_USE_FFMPEG 0 +#if LV_USE_FFMPEG + /*Dump input information to stderr*/ + #define LV_FFMPEG_DUMP_FORMAT 0 +#endif + +/*----------- + * Others + *----------*/ + +/*1: Enable API to take snapshot for object*/ +#define LV_USE_SNAPSHOT 0 + +/*1: Enable Monkey test*/ +#define LV_USE_MONKEY 0 + +/*1: Enable grid navigation*/ +#define LV_USE_GRIDNAV 0 + +/*1: Enable lv_obj fragment*/ +#define LV_USE_FRAGMENT 0 + +/*1: Support using images as font in label or span widgets */ +#define LV_USE_IMGFONT 0 + +/*1: Enable a published subscriber based messaging system */ +#define LV_USE_MSG 0 + +/*1: Enable Pinyin input method*/ +/*Requires: lv_keyboard*/ +#define LV_USE_IME_PINYIN 0 +#if LV_USE_IME_PINYIN + /*1: Use default thesaurus*/ + /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/ + #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 + /*Set the maximum number of candidate panels that can be displayed*/ + /*This needs to be adjusted according to the size of the screen*/ + #define LV_IME_PINYIN_CAND_TEXT_NUM 6 + + /*Use 9 key input(k9)*/ + #define LV_IME_PINYIN_USE_K9_MODE 1 + #if LV_IME_PINYIN_USE_K9_MODE == 1 + #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 + #endif // LV_IME_PINYIN_USE_K9_MODE +#endif + +/*================== +* EXAMPLES +*==================*/ + +/*Enable the examples to be built with the library*/ +#define LV_BUILD_EXAMPLES 1 + +/*=================== + * DEMO USAGE + ====================*/ + +/*Show some widget. It might be required to increase `LV_MEM_SIZE` */ +#define LV_USE_DEMO_WIDGETS 1 +#if LV_USE_DEMO_WIDGETS +#define LV_DEMO_WIDGETS_SLIDESHOW 0 +#endif + +/*Demonstrate the usage of encoder and keyboard*/ +#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 + +/*Benchmark your system*/ +#define LV_USE_DEMO_BENCHMARK 1 +#if LV_USE_DEMO_BENCHMARK +/*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/ +#define LV_DEMO_BENCHMARK_RGB565A8 0 +#endif + +/*Stress test for LVGL*/ +#define LV_USE_DEMO_STRESS 0 + +/*Music player demo*/ +#define LV_USE_DEMO_MUSIC 1 +#if LV_USE_DEMO_MUSIC + #define LV_DEMO_MUSIC_SQUARE 0 + #define LV_DEMO_MUSIC_LANDSCAPE 0 + #define LV_DEMO_MUSIC_ROUND 0 + #define LV_DEMO_MUSIC_LARGE 0 + #define LV_DEMO_MUSIC_AUTO_PLAY 1 +#endif + +/*--END OF LV_CONF_H--*/ + +#endif /*LV_CONF_H*/ + +#endif /*End of "Content enable"*/ diff --git a/src/driver/display/lvgl_v8_port.cpp b/src/driver/display/lvgl_v8_port.cpp new file mode 100644 index 0000000000..16c4b13b6c --- /dev/null +++ b/src/driver/display/lvgl_v8_port.cpp @@ -0,0 +1,914 @@ +#if defined(PLATFORM_ESPIDF) && defined(ENABLE_DISPLAY) + + + +#include "esp_timer.h" +#undef ESP_UTILS_LOG_TAG +#define ESP_UTILS_LOG_TAG "LvPort" +#include "esp_lib_utils.h" +#include "lvgl_v8_port.h" + +using namespace esp_panel::drivers; + +#define LVGL_PORT_ENABLE_ROTATION_OPTIMIZED (1) +#define LVGL_PORT_BUFFER_NUM_MAX (2) + +static SemaphoreHandle_t lvgl_mux = nullptr; // LVGL mutex +static TaskHandle_t lvgl_task_handle = nullptr; +static esp_timer_handle_t lvgl_tick_timer = NULL; +static void *lvgl_buf[LVGL_PORT_BUFFER_NUM_MAX] = {}; + +#if LVGL_PORT_ROTATION_DEGREE != 0 +static void *get_next_frame_buffer(LCD *lcd) +{ + static void *next_fb = NULL; + static void *fbs[2] = {NULL}; + + if (next_fb == NULL) + { + fbs[0] = lcd->getFrameBufferByIndex(0); + fbs[1] = lcd->getFrameBufferByIndex(1); + next_fb = fbs[1]; + } + else + { + next_fb = (next_fb == fbs[0]) ? fbs[1] : fbs[0]; + } + + return next_fb; +} + +__attribute__((always_inline)) static inline void copy_pixel_8bpp(uint8_t *to, const uint8_t *from) +{ + *to++ = *from++; +} + +__attribute__((always_inline)) static inline void copy_pixel_16bpp(uint8_t *to, const uint8_t *from) +{ + *(uint16_t *)to++ = *(const uint16_t *)from++; +} + +__attribute__((always_inline)) static inline void copy_pixel_24bpp(uint8_t *to, const uint8_t *from) +{ + *to++ = *from++; + *to++ = *from++; + *to++ = *from++; +} + +#define _COPY_PIXEL(_bpp, to, from) copy_pixel_##_bpp##bpp(to, from) +#define COPY_PIXEL(_bpp, to, from) _COPY_PIXEL(_bpp, to, from) + +#define ROTATE_90_ALL_BPP() \ + { \ + to_bytes_per_line = h * to_bytes_per_piexl; \ + to_index_const = (w - x_start - 1) * to_bytes_per_line; \ + for (int from_y = y_start; from_y < y_end + 1; from_y++) \ + { \ + from_index = from_y * from_bytes_per_line + x_start * from_bytes_per_piexl; \ + to_index = to_index_const + from_y * to_bytes_per_piexl; \ + for (int from_x = x_start; from_x < x_end + 1; from_x++) \ + { \ + COPY_PIXEL(LV_COLOR_DEPTH, to + to_index, from + from_index); \ + from_index += from_bytes_per_piexl; \ + to_index -= to_bytes_per_line; \ + } \ + } \ + } + +/** + * @brief Optimized transpose function for RGB565 format. + * + * @note ESP32-P4 1024x600 full-screen: 738ms -> 34ms + * @note ESP32-S3 480x480 full-screen: 380ms -> 37ms + */ +#define ROTATE_90_OPTIMIZED_16BPP(block_w, block_h) \ + { \ + for (int i = 0; i < h; i += block_h) \ + { \ + max_height = (i + block_h > h) ? h : (i + block_h); \ + for (int j = 0; j < w; j += block_w) \ + { \ + max_width = (j + block_w > w) ? w : (j + block_w); \ + start_y = w - 1 - j; \ + for (int x = i; x < max_height; x++) \ + { \ + from_next = (uint16_t *)from + x * w; \ + for (int y = j, mirrored_y = start_y; y < max_width; y += 4, mirrored_y -= 4) \ + { \ + ((uint16_t *)to)[(mirrored_y) * h + x] = *((uint32_t *)(from_next + y)) & 0xFFFF; \ + ((uint16_t *)to)[(mirrored_y - 1) * h + x] = (*((uint32_t *)(from_next + y)) >> 16) & 0xFFFF; \ + ((uint16_t *)to)[(mirrored_y - 2) * h + x] = *((uint32_t *)(from_next + y + 2)) & 0xFFFF; \ + ((uint16_t *)to)[(mirrored_y - 3) * h + x] = (*((uint32_t *)(from_next + y + 2)) >> 16) & 0xFFFF; \ + } \ + } \ + } \ + } \ + } + +#define ROTATE_180_ALL_BPP() \ + { \ + to_bytes_per_line = w * to_bytes_per_piexl; \ + to_index_const = (h - 1) * to_bytes_per_line + (w - x_start - 1) * to_bytes_per_piexl; \ + for (int from_y = y_start; from_y < y_end + 1; from_y++) \ + { \ + from_index = from_y * from_bytes_per_line + x_start * from_bytes_per_piexl; \ + to_index = to_index_const - from_y * to_bytes_per_line; \ + for (int from_x = x_start; from_x < x_end + 1; from_x++) \ + { \ + COPY_PIXEL(LV_COLOR_DEPTH, to + to_index, from + from_index); \ + from_index += from_bytes_per_piexl; \ + to_index -= to_bytes_per_piexl; \ + } \ + } \ + } + +#define ROTATE_270_OPTIMIZED_16BPP(block_w, block_h) \ + { \ + for (int i = 0; i < h; i += block_h) \ + { \ + max_height = i + block_h > h ? h : i + block_h; \ + for (int j = 0; j < w; j += block_w) \ + { \ + max_width = j + block_w > w ? w : j + block_w; \ + for (int x = i; x < max_height; x++) \ + { \ + from_next = (uint16_t *)from + x * w; \ + for (int y = j; y < max_width; y += 4) \ + { \ + ((uint16_t *)to)[y * h + (h - 1 - x)] = *((uint32_t *)(from_next + y)) & 0xFFFF; \ + ((uint16_t *)to)[(y + 1) * h + (h - 1 - x)] = (*((uint32_t *)(from_next + y)) >> 16) & 0xFFFF; \ + ((uint16_t *)to)[(y + 2) * h + (h - 1 - x)] = *((uint32_t *)(from_next + y + 2)) & 0xFFFF; \ + ((uint16_t *)to)[(y + 3) * h + (h - 1 - x)] = (*((uint32_t *)(from_next + y + 2)) >> 16) & 0xFFFF; \ + } \ + } \ + } \ + } \ + } + +#define ROTATE_270_ALL_BPP() \ + { \ + to_bytes_per_line = h * to_bytes_per_piexl; \ + from_index_const = x_start * from_bytes_per_piexl; \ + to_index_const = x_start * to_bytes_per_line + (h - 1) * to_bytes_per_piexl; \ + for (int from_y = y_start; from_y < y_end + 1; from_y++) \ + { \ + from_index = from_y * from_bytes_per_line + from_index_const; \ + to_index = to_index_const - from_y * to_bytes_per_piexl; \ + for (int from_x = x_start; from_x < x_end + 1; from_x++) \ + { \ + COPY_PIXEL(LV_COLOR_DEPTH, to + to_index, from + from_index); \ + from_index += from_bytes_per_piexl; \ + to_index += to_bytes_per_line; \ + } \ + } \ + } + +__attribute__((always_inline)) +IRAM_ATTR static inline void +rotate_copy_pixel( + const uint8_t *from, uint8_t *to, uint16_t x_start, uint16_t y_start, uint16_t x_end, uint16_t y_end, uint16_t w, + uint16_t h, uint16_t rotate) +{ + int from_bytes_per_piexl = sizeof(lv_color_t); + int from_bytes_per_line = w * from_bytes_per_piexl; + int from_index = 0; + + int to_bytes_per_piexl = LV_COLOR_DEPTH >> 3; + int to_bytes_per_line; + int to_index = 0; + int to_index_const = 0; + +#if (LV_COLOR_DEPTH == 16) && LVGL_PORT_ENABLE_ROTATION_OPTIMIZED + int max_height = 0; + int max_width = 0; + int start_y = 0; + uint16_t *from_next = NULL; +#endif + + // uint32_t time = esp_log_timestamp(); + switch (rotate) + { + case 90: +#if (LV_COLOR_DEPTH == 16) && LVGL_PORT_ENABLE_ROTATION_OPTIMIZED + ROTATE_90_OPTIMIZED_16BPP(32, 256); +#else + ROTATE_90_ALL_BPP(); +#endif + break; + case 180: + ROTATE_180_ALL_BPP(); + break; + case 270: +#if (LV_COLOR_DEPTH == 16) && LVGL_PORT_ENABLE_ROTATION_OPTIMIZED + ROTATE_270_OPTIMIZED_16BPP(32, 256); +#else + int from_index_const = 0; + ROTATE_270_ALL_BPP(); +#endif + break; + default: + break; + } + // ESP_LOGI(TAG, "rotate: end, time used:%d", (int)(esp_log_timestamp() - time)); +} +#endif /* LVGL_PORT_ROTATION_DEGREE */ + +#if LVGL_PORT_AVOID_TEAR +#if LVGL_PORT_DIRECT_MODE +#if LVGL_PORT_ROTATION_DEGREE != 0 +typedef struct +{ + uint16_t inv_p; + uint8_t inv_area_joined[LV_INV_BUF_SIZE]; + lv_area_t inv_areas[LV_INV_BUF_SIZE]; +} lv_port_dirty_area_t; + +static lv_port_dirty_area_t dirty_area; + +static void flush_dirty_save(lv_port_dirty_area_t *dirty_area) +{ + lv_disp_t *disp = _lv_refr_get_disp_refreshing(); + dirty_area->inv_p = disp->inv_p; + for (int i = 0; i < disp->inv_p; i++) + { + dirty_area->inv_area_joined[i] = disp->inv_area_joined[i]; + dirty_area->inv_areas[i] = disp->inv_areas[i]; + } +} + +typedef enum +{ + FLUSH_STATUS_PART, + FLUSH_STATUS_FULL +} lv_port_flush_status_t; + +typedef enum +{ + FLUSH_PROBE_PART_COPY, + FLUSH_PROBE_SKIP_COPY, + FLUSH_PROBE_FULL_COPY, +} lv_port_flush_probe_t; + +/** + * @brief Probe dirty area to copy + * + * @note This function is used to avoid tearing effect, and only work with LVGL direct-mode. + */ +static lv_port_flush_probe_t flush_copy_probe(lv_disp_drv_t *drv) +{ + static lv_port_flush_status_t prev_status = FLUSH_STATUS_PART; + lv_port_flush_status_t cur_status; + lv_port_flush_probe_t probe_result; + lv_disp_t *disp_refr = _lv_refr_get_disp_refreshing(); + + uint32_t flush_ver = 0; + uint32_t flush_hor = 0; + for (int i = 0; i < disp_refr->inv_p; i++) + { + if (disp_refr->inv_area_joined[i] == 0) + { + flush_ver = (disp_refr->inv_areas[i].y2 + 1 - disp_refr->inv_areas[i].y1); + flush_hor = (disp_refr->inv_areas[i].x2 + 1 - disp_refr->inv_areas[i].x1); + break; + } + } + /* Check if the current full screen refreshes */ + cur_status = ((flush_ver == drv->ver_res) && (flush_hor == drv->hor_res)) ? (FLUSH_STATUS_FULL) : (FLUSH_STATUS_PART); + + if (prev_status == FLUSH_STATUS_FULL) + { + if ((cur_status == FLUSH_STATUS_PART)) + { + probe_result = FLUSH_PROBE_FULL_COPY; + } + else + { + probe_result = FLUSH_PROBE_SKIP_COPY; + } + } + else + { + probe_result = FLUSH_PROBE_PART_COPY; + } + prev_status = cur_status; + + return probe_result; +} + +static inline void *flush_get_next_buf(LCD *lcd) +{ + return get_next_frame_buffer(lcd); +} + +/** + * @brief Copy dirty area + * + * @note This function is used to avoid tearing effect, and only work with LVGL direct-mode. + */ +static void flush_dirty_copy(void *dst, void *src, lv_port_dirty_area_t *dirty_area) +{ + lv_coord_t x_start, x_end, y_start, y_end; + for (int i = 0; i < dirty_area->inv_p; i++) + { + /* Refresh the unjoined areas*/ + if (dirty_area->inv_area_joined[i] == 0) + { + x_start = dirty_area->inv_areas[i].x1; + x_end = dirty_area->inv_areas[i].x2; + y_start = dirty_area->inv_areas[i].y1; + y_end = dirty_area->inv_areas[i].y2; + + rotate_copy_pixel( + (uint8_t *)src, (uint8_t *)dst, x_start, y_start, x_end, y_end, LV_HOR_RES, LV_VER_RES, + LVGL_PORT_ROTATION_DEGREE); + } + } +} + +static void flush_callback(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map) +{ + LCD *lcd = (LCD *)drv->user_data; + const int offsetx1 = area->x1; + const int offsetx2 = area->x2; + const int offsety1 = area->y1; + const int offsety2 = area->y2; + void *next_fb = NULL; + lv_port_flush_probe_t probe_result = FLUSH_PROBE_PART_COPY; + lv_disp_t *disp = lv_disp_get_default(); + + /* Action after last area refresh */ + if (lv_disp_flush_is_last(drv)) + { + /* Check if the `full_refresh` flag has been triggered */ + if (drv->full_refresh) + { + /* Reset flag */ + drv->full_refresh = 0; + + // Rotate and copy data from the whole screen LVGL's buffer to the next frame buffer + next_fb = flush_get_next_buf(lcd); + rotate_copy_pixel( + (uint8_t *)color_map, (uint8_t *)next_fb, offsetx1, offsety1, offsetx2, offsety2, + LV_HOR_RES, LV_VER_RES, LVGL_PORT_ROTATION_DEGREE); + + /* Switch the current LCD frame buffer to `next_fb` */ + lcd->switchFrameBufferTo(next_fb); + + /* Waiting for the current frame buffer to complete transmission */ + ulTaskNotifyValueClear(NULL, ULONG_MAX); + ulTaskNotifyTake(pdTRUE, portMAX_DELAY); + + /* Synchronously update the dirty area for another frame buffer */ + flush_dirty_copy(flush_get_next_buf(lcd), color_map, &dirty_area); + flush_get_next_buf(lcd); + } + else + { + /* Probe the copy method for the current dirty area */ + probe_result = flush_copy_probe(drv); + + if (probe_result == FLUSH_PROBE_FULL_COPY) + { + /* Save current dirty area for next frame buffer */ + flush_dirty_save(&dirty_area); + + /* Set LVGL full-refresh flag and set flush ready in advance */ + drv->full_refresh = 1; + disp->rendering_in_progress = false; + lv_disp_flush_ready(drv); + + /* Force to refresh whole screen, and will invoke `flush_callback` recursively */ + lv_refr_now(_lv_refr_get_disp_refreshing()); + } + else + { + /* Update current dirty area for next frame buffer */ + next_fb = flush_get_next_buf(lcd); + flush_dirty_save(&dirty_area); + flush_dirty_copy(next_fb, color_map, &dirty_area); + + /* Switch the current LCD frame buffer to `next_fb` */ + lcd->switchFrameBufferTo(next_fb); + + /* Waiting for the current frame buffer to complete transmission */ + ulTaskNotifyValueClear(NULL, ULONG_MAX); + ulTaskNotifyTake(pdTRUE, portMAX_DELAY); + + if (probe_result == FLUSH_PROBE_PART_COPY) + { + /* Synchronously update the dirty area for another frame buffer */ + flush_dirty_save(&dirty_area); + flush_dirty_copy(flush_get_next_buf(lcd), color_map, &dirty_area); + flush_get_next_buf(lcd); + } + } + } + } + + lv_disp_flush_ready(drv); +} + +#else + +static void flush_callback(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map) +{ + LCD *lcd = (LCD *)drv->user_data; + + /* Action after last area refresh */ + if (lv_disp_flush_is_last(drv)) + { + /* Switch the current LCD frame buffer to `color_map` */ + lcd->switchFrameBufferTo(color_map); + + /* Waiting for the last frame buffer to complete transmission */ + ulTaskNotifyValueClear(NULL, ULONG_MAX); + ulTaskNotifyTake(pdTRUE, portMAX_DELAY); + } + + lv_disp_flush_ready(drv); +} +#endif /* LVGL_PORT_ROTATION_DEGREE */ + +#elif LVGL_PORT_FULL_REFRESH && LVGL_PORT_DISP_BUFFER_NUM == 2 + +static void flush_callback(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map) +{ + LCD *lcd = (LCD *)drv->user_data; + + /* Switch the current LCD frame buffer to `color_map` */ + lcd->switchFrameBufferTo(color_map); + + /* Waiting for the last frame buffer to complete transmission */ + ulTaskNotifyValueClear(NULL, ULONG_MAX); + ulTaskNotifyTake(pdTRUE, portMAX_DELAY); + + lv_disp_flush_ready(drv); +} + +#elif LVGL_PORT_FULL_REFRESH && LVGL_PORT_DISP_BUFFER_NUM == 3 + +#if LVGL_PORT_ROTATION_DEGREE == 0 +static void *lvgl_port_lcd_last_buf = NULL; +static void *lvgl_port_lcd_next_buf = NULL; +static void *lvgl_port_flush_next_buf = NULL; +#endif + +void flush_callback(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map) +{ + LCD *lcd = (LCD *)drv->user_data; + +#if LVGL_PORT_ROTATION_DEGREE != 0 + const int offsetx1 = area->x1; + const int offsetx2 = area->x2; + const int offsety1 = area->y1; + const int offsety2 = area->y2; + void *next_fb = get_next_frame_buffer(lcd); + + /* Rotate and copy dirty area from the current LVGL's buffer to the next LCD frame buffer */ + rotate_copy_pixel( + (uint8_t *)color_map, (uint8_t *)next_fb, offsetx1, offsety1, offsetx2, offsety2, LV_HOR_RES, + LV_VER_RES, LVGL_PORT_ROTATION_DEGREE); + + /* Switch the current LCD frame buffer to `next_fb` */ + lcd->switchFrameBufferTo(next_fb); +#else + drv->draw_buf->buf1 = color_map; + drv->draw_buf->buf2 = lvgl_port_flush_next_buf; + lvgl_port_flush_next_buf = color_map; + + /* Switch the current LCD frame buffer to `color_map` */ + lcd->switchFrameBufferTo(color_map); + + lvgl_port_lcd_next_buf = color_map; +#endif + + lv_disp_flush_ready(drv); +} +#endif + +IRAM_ATTR bool onLcdVsyncCallback(void *user_data) +{ + BaseType_t need_yield = pdFALSE; +#if LVGL_PORT_FULL_REFRESH && (LVGL_PORT_DISP_BUFFER_NUM == 3) && (LVGL_PORT_ROTATION_DEGREE == 0) + if (lvgl_port_lcd_next_buf != lvgl_port_lcd_last_buf) + { + lvgl_port_flush_next_buf = lvgl_port_lcd_last_buf; + lvgl_port_lcd_last_buf = lvgl_port_lcd_next_buf; + } +#else + TaskHandle_t task_handle = (TaskHandle_t)user_data; + // Notify that the current LCD frame buffer has been transmitted + xTaskNotifyFromISR(task_handle, ULONG_MAX, eNoAction, &need_yield); +#endif + return (need_yield == pdTRUE); +} + +#else + +void flush_callback(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map) +{ + LCD *lcd = (LCD *)drv->user_data; + const int offsetx1 = area->x1; + const int offsetx2 = area->x2; + const int offsety1 = area->y1; + const int offsety2 = area->y2; + + lcd->drawBitmap(offsetx1, offsety1, offsetx2 - offsetx1 + 1, offsety2 - offsety1 + 1, (const uint8_t *)color_map); + // For RGB LCD, directly notify LVGL that the buffer is ready + if (lcd->getBus()->getBasicAttributes().type == ESP_PANEL_BUS_TYPE_RGB) + { + lv_disp_flush_ready(drv); + } +} + +static void update_callback(lv_disp_drv_t *drv) +{ + LCD *lcd = (LCD *)drv->user_data; + auto transformation = lcd->getTransformation(); + static bool disp_init_mirror_x = transformation.mirror_x; + static bool disp_init_mirror_y = transformation.mirror_y; + static bool disp_init_swap_xy = transformation.swap_xy; + + switch (drv->rotated) + { + case LV_DISP_ROT_NONE: + lcd->swapXY(disp_init_swap_xy); + lcd->mirrorX(disp_init_mirror_x); + lcd->mirrorY(disp_init_mirror_y); + break; + case LV_DISP_ROT_90: + lcd->swapXY(!disp_init_swap_xy); + lcd->mirrorX(disp_init_mirror_x); + lcd->mirrorY(!disp_init_mirror_y); + break; + case LV_DISP_ROT_180: + lcd->swapXY(disp_init_swap_xy); + lcd->mirrorX(!disp_init_mirror_x); + lcd->mirrorY(!disp_init_mirror_y); + break; + case LV_DISP_ROT_270: + lcd->swapXY(!disp_init_swap_xy); + lcd->mirrorX(!disp_init_mirror_x); + lcd->mirrorY(disp_init_mirror_y); + break; + } + + ESP_UTILS_LOGD("Update display rotation to %d", drv->rotated); + +#if ESP_UTILS_CONF_LOG_LEVEL == ESP_UTILS_LOG_LEVEL_DEBUG + transformation = lcd->getTransformation(); + disp_init_mirror_x = transformation.mirror_x; + disp_init_mirror_y = transformation.mirror_y; + disp_init_swap_xy = transformation.swap_xy; + ESP_UTILS_LOGD("Current mirror x: %d, mirror y: %d, swap xy: %d", disp_init_mirror_x, disp_init_mirror_y, disp_init_swap_xy); +#endif +} + +#endif /* LVGL_PORT_AVOID_TEAR */ + +void rounder_callback(lv_disp_drv_t *drv, lv_area_t *area) +{ + LCD *lcd = (LCD *)drv->user_data; + uint8_t x_align = lcd->getBasicAttributes().basic_bus_spec.x_coord_align; + uint8_t y_align = lcd->getBasicAttributes().basic_bus_spec.y_coord_align; + + if (x_align > 1) + { + // round the start of coordinate down to the nearest aligned value + area->x1 &= ~(x_align - 1); + // round the end of coordinate up to the nearest aligned value + area->x2 = (area->x2 & ~(x_align - 1)) + x_align - 1; + } + + if (y_align > 1) + { + // round the start of coordinate down to the nearest aligned value + area->y1 &= ~(y_align - 1); + // round the end of coordinate up to the nearest aligned value + area->y2 = (area->y2 & ~(y_align - 1)) + y_align - 1; + } +} + +static lv_disp_t *display_init(LCD *lcd) +{ + ESP_UTILS_CHECK_FALSE_RETURN(lcd != nullptr, nullptr, "Invalid LCD device"); + ESP_UTILS_CHECK_FALSE_RETURN(lcd->getRefreshPanelHandle() != nullptr, nullptr, "LCD device is not initialized"); + + static lv_disp_draw_buf_t disp_buf; + static lv_disp_drv_t disp_drv; + + // Alloc draw buffers used by LVGL + auto lcd_width = lcd->getFrameWidth(); + auto lcd_height = lcd->getFrameHeight(); + int buffer_size = 0; + + ESP_UTILS_LOGD("Malloc memory for LVGL buffer"); +#if !LVGL_PORT_AVOID_TEAR + // Avoid tearing function is disabled + buffer_size = lcd_width * LVGL_PORT_BUFFER_SIZE_HEIGHT; + for (int i = 0; (i < LVGL_PORT_BUFFER_NUM) && (i < LVGL_PORT_BUFFER_NUM_MAX); i++) + { + lvgl_buf[i] = heap_caps_malloc(buffer_size * sizeof(lv_color_t), LVGL_PORT_BUFFER_MALLOC_CAPS); + assert(lvgl_buf[i]); + ESP_UTILS_LOGD("Buffer[%d] address: %p, size: %d", i, lvgl_buf[i], buffer_size * sizeof(lv_color_t)); + } +#else + // To avoid the tearing effect, we should use at least two frame buffers: one for LVGL rendering and another for LCD refresh + buffer_size = lcd_width * lcd_height; +#if (LVGL_PORT_DISP_BUFFER_NUM >= 3) && (LVGL_PORT_ROTATION_DEGREE == 0) && LVGL_PORT_FULL_REFRESH + + // With the usage of three buffers and full-refresh, we always have one buffer available for rendering, + // eliminating the need to wait for the LCD's sync signal + lvgl_port_lcd_last_buf = lcd->getFrameBufferByIndex(0); + lvgl_buf[0] = lcd->getFrameBufferByIndex(1); + lvgl_buf[1] = lcd->getFrameBufferByIndex(2); + lvgl_port_lcd_next_buf = lvgl_port_lcd_last_buf; + lvgl_port_flush_next_buf = lvgl_buf[1]; + +#elif (LVGL_PORT_DISP_BUFFER_NUM >= 3) && (LVGL_PORT_ROTATION_DEGREE != 0) + + lvgl_buf[0] = lcd->getFrameBufferByIndex(2); + +#elif LVGL_PORT_DISP_BUFFER_NUM >= 2 + + for (int i = 0; (i < LVGL_PORT_DISP_BUFFER_NUM) && (i < LVGL_PORT_BUFFER_NUM_MAX); i++) + { + lvgl_buf[i] = lcd->getFrameBufferByIndex(i); + } + +#endif +#endif /* LVGL_PORT_AVOID_TEAR */ + + // initialize LVGL draw buffers + lv_disp_draw_buf_init(&disp_buf, lvgl_buf[0], lvgl_buf[1], buffer_size); + + ESP_UTILS_LOGD("Register display driver to LVGL"); + lv_disp_drv_init(&disp_drv); + disp_drv.flush_cb = flush_callback; +#if (LVGL_PORT_ROTATION_DEGREE == 90) || (LVGL_PORT_ROTATION_DEGREE == 270) + disp_drv.hor_res = lcd_height; + disp_drv.ver_res = lcd_width; +#else + disp_drv.hor_res = lcd_width; + disp_drv.ver_res = lcd_height; +#endif +#if LVGL_PORT_AVOID_TEAR // Only available when the tearing effect is enabled +#if LVGL_PORT_FULL_REFRESH + disp_drv.full_refresh = 1; +#elif LVGL_PORT_DIRECT_MODE + disp_drv.direct_mode = 1; +#endif +#else // Only available when the tearing effect is disabled + if (lcd->getBasicAttributes().basic_bus_spec.isFunctionValid(LCD::BasicBusSpecification::FUNC_SWAP_XY) && + lcd->getBasicAttributes().basic_bus_spec.isFunctionValid(LCD::BasicBusSpecification::FUNC_MIRROR_X) && + lcd->getBasicAttributes().basic_bus_spec.isFunctionValid(LCD::BasicBusSpecification::FUNC_MIRROR_Y)) + { + disp_drv.drv_update_cb = update_callback; + } + else + { + disp_drv.sw_rotate = 1; + } +#endif /* LVGL_PORT_AVOID_TEAR */ + disp_drv.draw_buf = &disp_buf; + disp_drv.user_data = (void *)lcd; + // Only available when the coordinate alignment is enabled + if ((lcd->getBasicAttributes().basic_bus_spec.x_coord_align > 1) || + (lcd->getBasicAttributes().basic_bus_spec.y_coord_align > 1)) + { + disp_drv.rounder_cb = rounder_callback; + } + + return lv_disp_drv_register(&disp_drv); +} + +static void touchpad_read(lv_indev_drv_t *indev_drv, lv_indev_data_t *data) +{ + Touch *tp = (Touch *)indev_drv->user_data; + TouchPoint point; + + /* Read data from touch controller */ + int read_touch_result = tp->readPoints(&point, 1, 0); + if (read_touch_result > 0) + { + data->point.x = point.x; + data->point.y = point.y; + data->state = LV_INDEV_STATE_PRESSED; + } + else + { + data->state = LV_INDEV_STATE_RELEASED; + } +} + +static lv_indev_t *indev_init(Touch *tp) +{ + ESP_UTILS_CHECK_FALSE_RETURN(tp != nullptr, nullptr, "Invalid touch device"); + ESP_UTILS_CHECK_FALSE_RETURN(tp->getPanelHandle() != nullptr, nullptr, "Touch device is not initialized"); + + static lv_indev_drv_t indev_drv_tp; + + ESP_UTILS_LOGD("Register input driver to LVGL"); + lv_indev_drv_init(&indev_drv_tp); + indev_drv_tp.type = LV_INDEV_TYPE_POINTER; + indev_drv_tp.read_cb = touchpad_read; + indev_drv_tp.user_data = (void *)tp; + + return lv_indev_drv_register(&indev_drv_tp); +} + +#if !LV_TICK_CUSTOM +static void tick_increment(void *arg) +{ + /* Tell LVGL how many milliseconds have elapsed */ + lv_tick_inc(LVGL_PORT_TICK_PERIOD_MS); +} + +static bool tick_init(void) +{ + // Tick interface for LVGL (using esp_timer to generate 2ms periodic event) + const esp_timer_create_args_t lvgl_tick_timer_args = { + .callback = &tick_increment, + .name = "LVGL tick"}; + ESP_UTILS_CHECK_ERROR_RETURN( + esp_timer_create(&lvgl_tick_timer_args, &lvgl_tick_timer), false, "Create LVGL tick timer failed"); + ESP_UTILS_CHECK_ERROR_RETURN( + esp_timer_start_periodic(lvgl_tick_timer, LVGL_PORT_TICK_PERIOD_MS * 1000), false, + "Start LVGL tick timer failed"); + + return true; +} + +static bool tick_deinit(void) +{ + ESP_UTILS_CHECK_ERROR_RETURN( + esp_timer_stop(lvgl_tick_timer), false, "Stop LVGL tick timer failed"); + ESP_UTILS_CHECK_ERROR_RETURN( + esp_timer_delete(lvgl_tick_timer), false, "Delete LVGL tick timer failed"); + return true; +} +#endif + +static void lvgl_port_task(void *arg) +{ + ESP_UTILS_LOGD("Starting LVGL task"); + + uint32_t task_delay_ms = LVGL_PORT_TASK_MAX_DELAY_MS; + while (1) + { + if (lvgl_port_lock(-1)) + { + task_delay_ms = lv_timer_handler(); + lvgl_port_unlock(); + } + if (task_delay_ms > LVGL_PORT_TASK_MAX_DELAY_MS) + { + task_delay_ms = LVGL_PORT_TASK_MAX_DELAY_MS; + } + else if (task_delay_ms < LVGL_PORT_TASK_MIN_DELAY_MS) + { + task_delay_ms = LVGL_PORT_TASK_MIN_DELAY_MS; + } + // printf("MS %i\n", task_delay_ms); + vTaskDelay(pdMS_TO_TICKS(task_delay_ms)); + } +} + +IRAM_ATTR bool onDrawBitmapFinishCallback(void *user_data) +{ + lv_disp_drv_t *drv = (lv_disp_drv_t *)user_data; + + lv_disp_flush_ready(drv); + + return false; +} + +bool lvgl_port_init(LCD *lcd, Touch *tp) +{ + ESP_UTILS_CHECK_FALSE_RETURN(lcd != nullptr, false, "Invalid LCD device"); + + auto bus_type = lcd->getBus()->getBasicAttributes().type; +#if LVGL_PORT_AVOID_TEAR + ESP_UTILS_CHECK_FALSE_RETURN( + (bus_type == ESP_PANEL_BUS_TYPE_RGB) || (bus_type == ESP_PANEL_BUS_TYPE_MIPI_DSI), false, + "Avoid tearing function only works with RGB/MIPI-DSI LCD now"); + ESP_UTILS_LOGI( + "Avoid tearing is enabled, mode: %d, rotation: %d", LVGL_PORT_AVOID_TEARING_MODE, LVGL_PORT_ROTATION_DEGREE); +#endif + + lv_disp_t *disp = nullptr; + lv_indev_t *indev = nullptr; + + lv_init(); +#if !LV_TICK_CUSTOM + ESP_UTILS_CHECK_FALSE_RETURN(tick_init(), false, "Initialize LVGL tick failed"); +#endif + + ESP_UTILS_LOGI("Initializing LVGL display driver"); + disp = display_init(lcd); + ESP_UTILS_CHECK_NULL_RETURN(disp, false, "Initialize LVGL display driver failed"); + // Record the initial rotation of the display + lv_disp_set_rotation(disp, LV_DISP_ROT_NONE); + + // For non-RGB LCD, need to notify LVGL that the buffer is ready when the refresh is finished + if (bus_type != ESP_PANEL_BUS_TYPE_RGB) + { + ESP_UTILS_LOGD("Attach refresh finish callback to LCD"); + lcd->attachDrawBitmapFinishCallback(onDrawBitmapFinishCallback, (void *)disp->driver); + } + + if (tp != nullptr) + { + ESP_UTILS_LOGD("Initialize LVGL input driver"); + indev = indev_init(tp); + ESP_UTILS_CHECK_NULL_RETURN(indev, false, "Initialize LVGL input driver failed"); + +#if LVGL_PORT_ROTATION_DEGREE != 0 + auto &transformation = tp->getTransformation(); +#if LVGL_PORT_ROTATION_DEGREE == 90 + tp->swapXY(!transformation.swap_xy); + tp->mirrorY(!transformation.mirror_y); +#elif LVGL_PORT_ROTATION_DEGREE == 180 + tp->mirrorX(!transformation.mirror_x); + tp->mirrorY(!transformation.mirror_y); +#elif LVGL_PORT_ROTATION_DEGREE == 270 + tp->swapXY(!transformation.swap_xy); + tp->mirrorX(!transformation.mirror_x); +#endif +#endif + } + + ESP_UTILS_LOGD("Create mutex for LVGL"); + lvgl_mux = xSemaphoreCreateRecursiveMutex(); + ESP_UTILS_CHECK_NULL_RETURN(lvgl_mux, false, "Create LVGL mutex failed"); + + ESP_UTILS_LOGD("Create LVGL task"); + BaseType_t core_id = 0; + BaseType_t ret = xTaskCreatePinnedToCore(lvgl_port_task, "lvgl", LVGL_PORT_TASK_STACK_SIZE, NULL, + LVGL_PORT_TASK_PRIORITY, &lvgl_task_handle, core_id); + ESP_UTILS_CHECK_FALSE_RETURN(ret == pdPASS, false, "Create LVGL task failed"); + +#if LVGL_PORT_AVOID_TEAR + lcd->attachRefreshFinishCallback(onLcdVsyncCallback, (void *)lvgl_task_handle); +#endif + + return true; +} + +bool lvgl_port_lock(int timeout_ms) +{ + ESP_UTILS_CHECK_NULL_RETURN(lvgl_mux, false, "LVGL mutex is not initialized"); + + const TickType_t timeout_ticks = (timeout_ms < 0) ? portMAX_DELAY : pdMS_TO_TICKS(timeout_ms); + return (xSemaphoreTakeRecursive(lvgl_mux, timeout_ticks) == pdTRUE); +} + +bool lvgl_port_unlock(void) +{ + ESP_UTILS_CHECK_NULL_RETURN(lvgl_mux, false, "LVGL mutex is not initialized"); + + xSemaphoreGiveRecursive(lvgl_mux); + + return true; +} + +bool lvgl_port_deinit(void) +{ +#if !LV_TICK_CUSTOM + ESP_UTILS_CHECK_FALSE_RETURN(tick_deinit(), false, "Deinitialize LVGL tick failed"); +#endif + + ESP_UTILS_CHECK_FALSE_RETURN(lvgl_port_lock(-1), false, "Lock LVGL failed"); + if (lvgl_task_handle != nullptr) + { + vTaskDelete(lvgl_task_handle); + lvgl_task_handle = nullptr; + } + ESP_UTILS_CHECK_FALSE_RETURN(lvgl_port_unlock(), false, "Unlock LVGL failed"); + +#if LV_ENABLE_GC || !LV_MEM_CUSTOM + lv_deinit(); +#else + ESP_UTILS_LOGW("LVGL memory is custom, `lv_deinit()` will not work"); +#endif +#if !LVGL_PORT_AVOID_TEAR + for (int i = 0; i < LVGL_PORT_BUFFER_NUM; i++) + { + if (lvgl_buf[i] != nullptr) + { + free(lvgl_buf[i]); + lvgl_buf[i] = nullptr; + } + } +#endif + if (lvgl_mux != nullptr) + { + vSemaphoreDelete(lvgl_mux); + lvgl_mux = nullptr; + } + + return true; +} + + +#endif diff --git a/src/driver/display/lvgl_v8_port.h b/src/driver/display/lvgl_v8_port.h new file mode 100644 index 0000000000..f00a4b1acc --- /dev/null +++ b/src/driver/display/lvgl_v8_port.h @@ -0,0 +1,175 @@ +/* + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: CC0-1.0 + */ +#pragma once + +#include "sdkconfig.h" +#ifdef CONFIG_ARDUINO_RUNNING_CORE +#include +#endif +#include "esp_display_panel.hpp" +#include "lvgl.h" + +// *INDENT-OFF* + +/** + * LVGL related parameters, can be adjusted by users + */ +#define LVGL_PORT_TICK_PERIOD_MS (2) // The period of the LVGL tick task, in milliseconds + +/** + * + * LVGL buffer related parameters, can be adjusted by users: + * + * (These parameters will be useless if the avoid tearing function is enabled) + * + * - Memory type for buffer allocation: + * - MALLOC_CAP_SPIRAM: Allocate LVGL buffer in PSRAM + * - MALLOC_CAP_INTERNAL: Allocate LVGL buffer in SRAM + * + * (The SRAM is faster than PSRAM, but the PSRAM has a larger capacity) + * (For SPI/QSPI LCD, it is recommended to allocate the buffer in SRAM, because the SPI DMA does not directly support PSRAM now) + * + * - The size (in bytes) and number of buffers: + * - Lager buffer size can improve FPS, but it will occupy more memory. Maximum buffer size is `width * height`. + * - The number of buffers should be 1 or 2. + */ +#define LVGL_PORT_BUFFER_MALLOC_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT) // Allocate LVGL buffer in SRAM +// #define LVGL_PORT_BUFFER_MALLOC_CAPS (MALLOC_CAP_SPIRAM) // Allocate LVGL buffer in PSRAM +#define LVGL_PORT_BUFFER_SIZE_HEIGHT (20) +#define LVGL_PORT_BUFFER_NUM (2) + +/** + * LVGL timer handle task related parameters, can be adjusted by users + */ +#define LVGL_PORT_TASK_MAX_DELAY_MS (500) // The maximum delay of the LVGL timer task, in milliseconds +#define LVGL_PORT_TASK_MIN_DELAY_MS (2) // The minimum delay of the LVGL timer task, in milliseconds +#define LVGL_PORT_TASK_STACK_SIZE (6 * 1024) // The stack size of the LVGL timer task, in bytes +#define LVGL_PORT_TASK_PRIORITY (2) // The priority of the LVGL timer task +#ifdef ARDUINO_RUNNING_CORE +#define LVGL_PORT_TASK_CORE (ARDUINO_RUNNING_CORE) // Valid if using Arduino +#else +#define LVGL_PORT_TASK_CORE (0) // Valid if using ESP-IDF +#endif +// The core of the LVGL timer task, `-1` means the don't specify the core +// Default is the same as the main core +// This can be set to `1` only if the SoCs support dual-core, +// otherwise it should be set to `-1` or `0` + +/** + * Avoid tering related configurations, can be adjusted by users. + * + * (Currently, This function only supports RGB LCD and the version of LVGL must be >= 8.3.9) + */ +/** + * Set the avoid tearing mode: + * - 0: Disable avoid tearing function + * - 1: LCD double-buffer & LVGL full-refresh + * - 2: LCD triple-buffer & LVGL full-refresh + * - 3: LCD double-buffer & LVGL direct-mode (recommended) + */ +#ifdef CONFIG_LVGL_PORT_AVOID_TEARING_MODE +#define LVGL_PORT_AVOID_TEARING_MODE (CONFIG_LVGL_PORT_AVOID_TEARING_MODE) +// Valid if using ESP-IDF +#else +#define LVGL_PORT_AVOID_TEARING_MODE (0) // Valid if using Arduino +#endif + +#if LVGL_PORT_AVOID_TEARING_MODE != 0 +/** + * When avoid tearing is enabled, the LVGL software rotation `lv_disp_set_rotation()` is not supported. + * But users can set the rotation degree(0/90/180/270) here, but this function will reduce FPS. + * + * Set the rotation degree: + * - 0: 0 degree + * - 90: 90 degree + * - 180: 180 degree + * - 270: 270 degree + */ +#ifdef CONFIG_LVGL_PORT_ROTATION_DEGREE +#define LVGL_PORT_ROTATION_DEGREE (CONFIG_LVGL_PORT_ROTATION_DEGREE) +// Valid if using ESP-IDF +#else +#define LVGL_PORT_ROTATION_DEGREE (0) // Valid if using Arduino +#endif + +/** + * Here, some important configurations will be set based on different anti-tearing modes and rotation angles. + * No modification is required here. + * + * Users should use `lcd_bus->configRgbFrameBufferNumber(LVGL_PORT_DISP_BUFFER_NUM);` to set the buffer number before. If screen drifting occurs, please refer to the Troubleshooting section in the README. + * initializing the LCD bus + */ +#define LVGL_PORT_AVOID_TEAR (1) +// Set the buffer number and refresh mode according to the different modes +#if LVGL_PORT_AVOID_TEARING_MODE == 1 +#define LVGL_PORT_DISP_BUFFER_NUM (2) +#define LVGL_PORT_FULL_REFRESH (1) +#elif LVGL_PORT_AVOID_TEARING_MODE == 2 +#define LVGL_PORT_DISP_BUFFER_NUM (3) +#define LVGL_PORT_FULL_REFRESH (1) +#elif LVGL_PORT_AVOID_TEARING_MODE == 3 +#define LVGL_PORT_DISP_BUFFER_NUM (2) +#define LVGL_PORT_DIRECT_MODE (1) +#else +#error "Invalid avoid tearing mode, please set macro `LVGL_PORT_AVOID_TEARING_MODE` to one of `LVGL_PORT_AVOID_TEARING_MODE_*`" +#endif +// Check rotation +#if (LVGL_PORT_ROTATION_DEGREE != 0) && (LVGL_PORT_ROTATION_DEGREE != 90) && (LVGL_PORT_ROTATION_DEGREE != 180) && \ + (LVGL_PORT_ROTATION_DEGREE != 270) +#error "Invalid rotation degree, please set to 0, 90, 180 or 270" +#elif LVGL_PORT_ROTATION_DEGREE != 0 +#ifdef LVGL_PORT_DISP_BUFFER_NUM +#undef LVGL_PORT_DISP_BUFFER_NUM +#define LVGL_PORT_DISP_BUFFER_NUM (3) +#endif +#endif +#endif /* LVGL_PORT_AVOID_TEARING_MODE */ + +// *INDENT-ON* + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * @brief Porting LVGL with LCD and touch panel. This function should be called after the initialization of the LCD and touch panel. + * + * @param lcd The pointer to the LCD panel device, mustn't be nullptr + * @param tp The pointer to the touch panel device, set to nullptr if is not used + * + * @return true if success, otherwise false + */ + bool lvgl_port_init(esp_panel::drivers::LCD *lcd, esp_panel::drivers::Touch *tp); + + /** + * @brief Deinitialize the LVGL porting. + * + * @return true if success, otherwise false + */ + bool lvgl_port_deinit(void); + + /** + * @brief Lock the LVGL mutex. This function should be called before calling any LVGL APIs when not in LVGL task, + * and the `lvgl_port_unlock()` function should be called later. + * + * @param timeout_ms The timeout of the mutex lock, in milliseconds. If the timeout is set to `-1`, it will wait indefinitely. + * + * @return true if success, otherwise false + */ + bool lvgl_port_lock(int timeout_ms); + + /** + * @brief Unlock the LVGL mutex. This function should be called after using LVGL APIs when not in LVGL task, and the + * `lvgl_port_lock()` function should be called before. + * + * @return true if success, otherwise false + */ + bool lvgl_port_unlock(void); + +#ifdef __cplusplus +} +#endif diff --git a/src/driver/drv_display_demo.cpp b/src/driver/drv_display_demo.cpp new file mode 100644 index 0000000000..0484149e5c --- /dev/null +++ b/src/driver/drv_display_demo.cpp @@ -0,0 +1,278 @@ +#include "../new_common.h" +#include "../new_pins.h" +#include "../new_cfg.h" +#include "../logging/logging.h" +#include "../hal/hal_pins.h" +#include "drv_display_shared.h" + +#if defined(PLATFORM_ESPIDF) && defined(ENABLE_DISPLAY) + +#include +#include "display/lvgl_v8_port.h" +#include "esp_heap_caps.h" +#include "esp_chip_info.h" + +static lv_obj_t *screen_main; +static lv_obj_t *msg_list; +static lv_obj_t *kb; +static lv_obj_t *mem_label; +static lv_obj_t *chart; +static lv_chart_series_t * ser; +static lv_obj_t * arc_thermo; +static lv_obj_t * label_thermo; +static int tick_count = 0; + +static void add_chat_bubble(const char * txt, bool is_user) { + lv_obj_t * wrapper = lv_obj_create(msg_list); + lv_obj_set_width(wrapper, lv_pct(100)); + lv_obj_set_height(wrapper, LV_SIZE_CONTENT); + lv_obj_set_style_bg_opa(wrapper, 0, 0); + lv_obj_set_style_border_width(wrapper, 0, 0); + lv_obj_set_style_pad_all(wrapper, 0, 0); + lv_obj_clear_flag(wrapper, LV_OBJ_FLAG_SCROLLABLE); + + lv_obj_t * msg_box = lv_obj_create(wrapper); + lv_obj_set_size(msg_box, LV_SIZE_CONTENT, LV_SIZE_CONTENT); + lv_obj_set_style_radius(msg_box, 15, 0); + lv_obj_set_style_border_width(msg_box, 0, 0); + lv_obj_set_style_pad_all(msg_box, 15, 0); + + lv_obj_t * label = lv_label_create(msg_box); + lv_label_set_text(label, txt); + lv_label_set_long_mode(label, LV_LABEL_LONG_WRAP); + lv_obj_set_width(label, 300); // fixed max width for wrap + + if(is_user) { + lv_obj_set_style_bg_color(msg_box, lv_color_hex(0x2196F3), 0); + lv_obj_set_style_text_color(label, lv_color_hex(0xFFFFFF), 0); + lv_obj_align(msg_box, LV_ALIGN_RIGHT_MID, -10, 0); + } else { + lv_obj_set_style_bg_color(msg_box, lv_color_hex(0xE0E0E0), 0); + lv_obj_set_style_text_color(label, lv_color_hex(0x333333), 0); + lv_obj_align(msg_box, LV_ALIGN_LEFT_MID, 10, 0); + } + lv_obj_scroll_to_view(wrapper, LV_ANIM_ON); +} + +static void ta_event_cb(lv_event_t * e) { + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * ta = lv_event_get_target(e); + if(code == LV_EVENT_FOCUSED) { + lv_keyboard_set_textarea(kb, ta); + lv_obj_clear_flag(kb, LV_OBJ_FLAG_HIDDEN); + lv_obj_move_foreground(kb); + } else if(code == LV_EVENT_DEFOCUSED) { + lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN); + } else if(code == LV_EVENT_READY) { + const char * txt = lv_textarea_get_text(ta); + if(strlen(txt) > 0) { + add_chat_bubble(txt, true); + // Simulate bot reply + add_chat_bubble("I am a demo bot! That's interesting.", false); + } + lv_textarea_set_text(ta, ""); + lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN); + lv_obj_clear_state(ta, LV_STATE_FOCUSED); + } +} + +static void thermo_anim_cb(void * var, int32_t v) { + lv_arc_set_value((lv_obj_t*)var, v); + char buf[16]; + snprintf(buf, sizeof(buf), "%d\xc2\xb0""C", (int)v); // UTF-8 degree symbol + lv_label_set_text(label_thermo, buf); +} + +static void gui_build_main_screen() { + screen_main = lv_obj_create(NULL); + lv_obj_set_style_bg_color(screen_main, lv_color_hex(0xF5F7FA), LV_PART_MAIN); + + // Left sidebar tab view for landscape Pro look + lv_obj_t * tabview = lv_tabview_create(screen_main, LV_DIR_LEFT, 100); + lv_obj_set_style_bg_color(tabview, lv_color_hex(0xF5F7FA), LV_PART_MAIN); + + lv_obj_t * tab_btns = lv_tabview_get_tab_btns(tabview); + lv_obj_set_style_bg_color(tab_btns, lv_color_hex(0xFFFFFF), LV_PART_MAIN); + lv_obj_set_style_text_color(tab_btns, lv_color_hex(0x888888), LV_PART_MAIN); + lv_obj_set_style_text_color(tab_btns, lv_color_hex(0x2196F3), (lv_style_selector_t)((int)LV_PART_ITEMS | (int)LV_STATE_CHECKED)); + lv_obj_set_style_border_width(tab_btns, 0, LV_PART_MAIN); + lv_obj_set_style_shadow_width(tab_btns, 15, LV_PART_MAIN); + lv_obj_set_style_shadow_color(tab_btns, lv_color_hex(0x000000), LV_PART_MAIN); + lv_obj_set_style_shadow_opa(tab_btns, 15, LV_PART_MAIN); + + lv_obj_t * tab1 = lv_tabview_add_tab(tabview, "\n" LV_SYMBOL_HOME "\nHome"); + lv_obj_t * tab2 = lv_tabview_add_tab(tabview, "\n" LV_SYMBOL_SETTINGS "\nCtrl"); + lv_obj_t * tab3 = lv_tabview_add_tab(tabview, "\n" LV_SYMBOL_BELL "\nChat"); + + // --- TAB 1: Home Dashboard --- + lv_obj_set_layout(tab1, LV_LAYOUT_FLEX); + lv_obj_set_flex_flow(tab1, LV_FLEX_FLOW_ROW_WRAP); + lv_obj_set_flex_align(tab1, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_set_style_pad_all(tab1, 20, 0); + + // Card 1: Thermostat + lv_obj_t * card1 = lv_obj_create(tab1); + lv_obj_set_size(card1, 280, 280); + lv_obj_set_style_radius(card1, 20, 0); + lv_obj_set_style_border_width(card1, 0, 0); + lv_obj_set_style_shadow_width(card1, 20, 0); + lv_obj_set_style_shadow_color(card1, lv_color_hex(0x000000), 0); + lv_obj_set_style_shadow_opa(card1, 10, 0); + + lv_obj_t * thermo_title = lv_label_create(card1); + lv_label_set_text(thermo_title, "Living Room"); + lv_obj_align(thermo_title, LV_ALIGN_TOP_MID, 0, 0); + lv_obj_set_style_text_color(thermo_title, lv_color_hex(0x888888), 0); + + arc_thermo = lv_arc_create(card1); + lv_obj_set_size(arc_thermo, 180, 180); + lv_obj_align(arc_thermo, LV_ALIGN_CENTER, 0, 15); + lv_arc_set_range(arc_thermo, 10, 35); + lv_arc_set_value(arc_thermo, 10); + lv_obj_set_style_arc_color(arc_thermo, lv_color_hex(0xE0E0E0), LV_PART_MAIN); + lv_obj_set_style_arc_color(arc_thermo, lv_color_hex(0xFF9800), LV_PART_INDICATOR); + lv_obj_set_style_arc_width(arc_thermo, 15, LV_PART_MAIN); + lv_obj_set_style_arc_width(arc_thermo, 15, LV_PART_INDICATOR); + lv_obj_remove_style(arc_thermo, NULL, LV_PART_KNOB); + + label_thermo = lv_label_create(card1); + lv_label_set_text(label_thermo, "10\xc2\xb0""C"); + lv_obj_align(label_thermo, LV_ALIGN_CENTER, 0, 15); + // Note: ensure font supports degree symbol, otherwise it may not show. We use default font. + + // Card 2: Power Chart + lv_obj_t * card2 = lv_obj_create(tab1); + lv_obj_set_size(card2, 340, 280); + lv_obj_set_style_radius(card2, 20, 0); + lv_obj_set_style_border_width(card2, 0, 0); + lv_obj_set_style_shadow_width(card2, 20, 0); + lv_obj_set_style_shadow_color(card2, lv_color_hex(0x000000), 0); + lv_obj_set_style_shadow_opa(card2, 10, 0); + + lv_obj_t * chart_title = lv_label_create(card2); + lv_label_set_text(chart_title, "Power Usage (W)"); + lv_obj_align(chart_title, LV_ALIGN_TOP_MID, 0, 0); + lv_obj_set_style_text_color(chart_title, lv_color_hex(0x888888), 0); + + chart = lv_chart_create(card2); + lv_obj_set_size(chart, 300, 180); + lv_obj_align(chart, LV_ALIGN_CENTER, 0, 15); + lv_chart_set_type(chart, LV_CHART_TYPE_LINE); + lv_obj_set_style_bg_opa(chart, 0, LV_PART_MAIN); + lv_obj_set_style_border_width(chart, 0, LV_PART_MAIN); + lv_obj_set_style_line_width(chart, 3, LV_PART_ITEMS); + lv_obj_set_style_line_color(chart, lv_color_hex(0x2196F3), LV_PART_ITEMS); + + ser = lv_chart_add_series(chart, lv_color_hex(0x2196F3), LV_CHART_AXIS_PRIMARY_Y); + for(int i = 0; i < 10; i++) { + lv_chart_set_next_value(chart, ser, lv_rand(100, 500)); + } + + // --- TAB 2: Controls --- + lv_obj_set_layout(tab2, LV_LAYOUT_FLEX); + lv_obj_set_flex_flow(tab2, LV_FLEX_FLOW_ROW_WRAP); + lv_obj_set_flex_align(tab2, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + + for(int i=0; i<6; i++) { + lv_obj_t * c_card = lv_obj_create(tab2); + lv_obj_set_size(c_card, 220, 120); + lv_obj_set_style_radius(c_card, 15, 0); + lv_obj_set_style_border_width(c_card, 0, 0); + lv_obj_set_style_shadow_width(c_card, 10, 0); + lv_obj_set_style_shadow_color(c_card, lv_color_hex(0x000000), 0); + lv_obj_set_style_shadow_opa(c_card, 10, 0); + + lv_obj_t * sw = lv_switch_create(c_card); + lv_obj_align(sw, LV_ALIGN_RIGHT_MID, -10, 0); + lv_obj_set_style_bg_color(sw, lv_color_hex(0x4CAF50), (lv_style_selector_t)((int)LV_PART_INDICATOR | (int)LV_STATE_CHECKED)); + + lv_obj_t * l = lv_label_create(c_card); + char lbuf[32]; + snprintf(lbuf, sizeof(lbuf), "Light %d", i+1); + lv_label_set_text(l, lbuf); + lv_obj_align(l, LV_ALIGN_LEFT_MID, 10, 0); + } + + // --- TAB 3: Fake Chat --- + lv_obj_t * chat_container = lv_obj_create(tab3); + lv_obj_set_size(chat_container, LV_PCT(100), LV_PCT(100)); + lv_obj_set_style_border_width(chat_container, 0, 0); + lv_obj_set_style_bg_opa(chat_container, 0, 0); + lv_obj_set_style_pad_all(chat_container, 0, 0); + lv_obj_set_layout(chat_container, LV_LAYOUT_FLEX); + lv_obj_set_flex_flow(chat_container, LV_FLEX_FLOW_COLUMN); + + msg_list = lv_obj_create(chat_container); + lv_obj_set_width(msg_list, LV_PCT(100)); + lv_obj_set_flex_grow(msg_list, 1); + lv_obj_set_style_border_width(msg_list, 0, 0); + lv_obj_set_style_bg_color(msg_list, lv_color_hex(0xF5F7FA), 0); + lv_obj_set_layout(msg_list, LV_LAYOUT_FLEX); + lv_obj_set_flex_flow(msg_list, LV_FLEX_FLOW_COLUMN); + + lv_obj_t * ta = lv_textarea_create(chat_container); + lv_textarea_set_one_line(ta, true); + lv_obj_set_width(ta, LV_PCT(100)); + lv_textarea_set_placeholder_text(ta, "Type a message..."); + lv_obj_add_event_cb(ta, ta_event_cb, LV_EVENT_ALL, NULL); + + // Global keyboard + kb = lv_keyboard_create(screen_main); + lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN); + + // Setup initial chat + add_chat_bubble("Hello! I'm your smart home assistant.", false); + + // System info in corner + mem_label = lv_label_create(screen_main); + lv_obj_align(mem_label, LV_ALIGN_BOTTOM_RIGHT, -10, -10); + lv_obj_set_style_text_color(mem_label, lv_color_hex(0xAAAAAA), 0); + + // Startup Animation for thermostat + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, arc_thermo); + lv_anim_set_exec_cb(&a, thermo_anim_cb); + lv_anim_set_time(&a, 1500); + lv_anim_set_values(&a, 10, 24); + lv_anim_start(&a); +} + +extern "C" void DisplayDemo_Init() { + if (!Display_PreInit()) { + return; + } + + lvgl_port_lock(-1); + gui_build_main_screen(); + lv_scr_load(screen_main); + lvgl_port_unlock(); + + Display_PostInit(); +} + +extern "C" void DisplayDemo_OnEverySecond() { + if(!g_display_ready) return; + tick_count++; + + char mbuf[64]; + size_t free_int = heap_caps_get_free_size(MALLOC_CAP_INTERNAL); + snprintf(mbuf, sizeof(mbuf), "Free Mem: %u B", (unsigned)free_int); + + lvgl_port_lock(-1); + if(mem_label) lv_label_set_text(mem_label, mbuf); + if(chart && ser) lv_chart_set_next_value(chart, ser, lv_rand(100, 500)); + lvgl_port_unlock(); +} + +extern "C" void DisplayDemo_Shutdown() { + Display_Shutdown(); +} + +#else + +extern "C" void DisplayDemo_Init() {} +extern "C" void DisplayDemo_OnEverySecond() {} +extern "C" void DisplayDemo_Shutdown() {} + +#endif diff --git a/src/driver/drv_display_hello.cpp b/src/driver/drv_display_hello.cpp new file mode 100644 index 0000000000..5e7892e76c --- /dev/null +++ b/src/driver/drv_display_hello.cpp @@ -0,0 +1,140 @@ +#include "../new_common.h" +#include "../new_pins.h" +#include "../new_cfg.h" +#include "../logging/logging.h" +#include "../hal/hal_pins.h" +#include "drv_display_shared.h" + +#if defined(PLATFORM_ESPIDF) && defined(ENABLE_DISPLAY) + +#include +#include "display/lvgl_v8_port.h" +#include "esp_heap_caps.h" +#include "esp_chip_info.h" + +static lv_obj_t *screen_main; +static lv_obj_t *counter_label; +static lv_obj_t *tick_label; +static lv_obj_t *mem_label; +static lv_obj_t *chip_label; +static int click_count = 0; +static int tick_count = 0; + +static void btn_event_cb(lv_event_t *e) { + click_count++; + char buf[64]; + snprintf(buf, sizeof(buf), "Clicks: %d", click_count); + lv_label_set_text(counter_label, buf); +} + +static void gui_build_main_screen() { + screen_main = lv_obj_create(NULL); + // White background + lv_obj_set_style_bg_color(screen_main, lv_color_hex(0xFFFFFF), LV_PART_MAIN); + + // Title label + lv_obj_t *title = lv_label_create(screen_main); + lv_label_set_text(title, "OpenBeken Display Hello"); + lv_obj_align(title, LV_ALIGN_TOP_MID, 0, 30); + lv_obj_set_style_text_color(title, lv_color_hex(0x333333), LV_PART_MAIN); + lv_obj_set_style_text_font(title, &lv_font_montserrat_14, LV_PART_MAIN); + + // Counter label + counter_label = lv_label_create(screen_main); + lv_label_set_text(counter_label, "Clicks: 0"); + lv_obj_align(counter_label, LV_ALIGN_CENTER, 0, -40); + lv_obj_set_style_text_color(counter_label, lv_color_hex(0x2196F3), LV_PART_MAIN); + lv_obj_set_style_text_font(counter_label, &lv_font_montserrat_14, LV_PART_MAIN); + + // Tick label + tick_label = lv_label_create(screen_main); + lv_label_set_text(tick_label, "Ticks: 0"); + lv_obj_align(tick_label, LV_ALIGN_CENTER, 0, -20); + lv_obj_set_style_text_color(tick_label, lv_color_hex(0x555555), LV_PART_MAIN); + lv_obj_set_style_text_font(tick_label, &lv_font_montserrat_14, LV_PART_MAIN); + + // Button + lv_obj_t *btn = lv_btn_create(screen_main); + lv_obj_set_size(btn, 200, 60); + lv_obj_align(btn, LV_ALIGN_CENTER, 0, 40); + lv_obj_set_style_bg_color(btn, lv_color_hex(0x2196F3), LV_PART_MAIN); + lv_obj_set_style_bg_color(btn, lv_color_hex(0x1976D2), (lv_style_selector_t)((int)LV_PART_MAIN | (int)LV_STATE_PRESSED)); + lv_obj_set_style_radius(btn, 10, LV_PART_MAIN); + lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_CLICKED, NULL); + + // Button label + lv_obj_t *btn_label = lv_label_create(btn); + lv_label_set_text(btn_label, "Click Me!"); + lv_obj_center(btn_label); + lv_obj_set_style_text_color(btn_label, lv_color_hex(0xFFFFFF), LV_PART_MAIN); + lv_obj_set_style_text_font(btn_label, &lv_font_montserrat_14, LV_PART_MAIN); + + // Memory Label (Bottom Right) + mem_label = lv_label_create(screen_main); + lv_label_set_text(mem_label, "Mem: --"); + lv_obj_align(mem_label, LV_ALIGN_BOTTOM_RIGHT, -10, -10); + lv_obj_set_style_text_color(mem_label, lv_color_hex(0x777777), LV_PART_MAIN); + lv_obj_set_style_text_font(mem_label, &lv_font_montserrat_14, LV_PART_MAIN); + + // Chip Info Label (Bottom Left) + chip_label = lv_label_create(screen_main); + esp_chip_info_t chip_info; + esp_chip_info(&chip_info); + char cbuf[128]; + snprintf(cbuf, sizeof(cbuf), "Cores: %d, Rev: %d", chip_info.cores, chip_info.revision); + lv_label_set_text(chip_label, cbuf); + lv_obj_align(chip_label, LV_ALIGN_BOTTOM_LEFT, 10, -10); + lv_obj_set_style_text_color(chip_label, lv_color_hex(0x777777), LV_PART_MAIN); + lv_obj_set_style_text_font(chip_label, &lv_font_montserrat_14, LV_PART_MAIN); +} + +extern "C" void DisplayHello_Init() { + if (!Display_PreInit()) { + return; + } + + lvgl_port_lock(-1); + gui_build_main_screen(); + lv_scr_load(screen_main); + lvgl_port_unlock(); + + Display_PostInit(); +} + +extern "C" void DisplayHello_OnEverySecond() { + if(!g_display_ready) return; + + tick_count++; + char buf[64]; + snprintf(buf, sizeof(buf), "Ticks: %d", tick_count); + + char mbuf[128]; + size_t free_int = heap_caps_get_free_size(MALLOC_CAP_INTERNAL); + size_t max_int = heap_caps_get_largest_free_block(MALLOC_CAP_INTERNAL); + size_t free_spi = heap_caps_get_free_size(MALLOC_CAP_SPIRAM); + size_t max_spi = heap_caps_get_largest_free_block(MALLOC_CAP_SPIRAM); + snprintf(mbuf, sizeof(mbuf), "INT: %u (%u max)\nSPI: %u (%u max)", + (unsigned)free_int, (unsigned)max_int, (unsigned)free_spi, (unsigned)max_spi); + + // Properly use LVGL locks as this is called from the main OBK task, not the LVGL task! + lvgl_port_lock(-1); + if(tick_label) { + lv_label_set_text(tick_label, buf); + } + if(mem_label) { + lv_label_set_text(mem_label, mbuf); + } + lvgl_port_unlock(); +} + +extern "C" void DisplayHello_Shutdown() { + Display_Shutdown(); +} + +#else + +extern "C" void DisplayHello_Init() {} +extern "C" void DisplayHello_OnEverySecond() {} +extern "C" void DisplayHello_Shutdown() {} + +#endif diff --git a/src/driver/drv_display_shared.cpp b/src/driver/drv_display_shared.cpp new file mode 100644 index 0000000000..65cdd87279 --- /dev/null +++ b/src/driver/drv_display_shared.cpp @@ -0,0 +1,95 @@ +#include "../new_common.h" +#include "../new_pins.h" +#include "../new_cfg.h" +#include "../logging/logging.h" +#include "../hal/hal_pins.h" +#include "drv_display_shared.h" + +#if defined(PLATFORM_ESPIDF) && defined(ENABLE_DISPLAY) + +#include +#include +#include "display/lvgl_v8_port.h" +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +using namespace esp_panel::drivers; +using namespace esp_panel::board; + +bool g_display_ready = false; +static TaskHandle_t g_lvgl_task_handle = NULL; +static Board *g_board = NULL; + +static void lvgl_task(void *arg) { + ADDLOG_INFO(LOG_FEATURE_DRV, "LVGL task started"); + while(1) { + lvgl_port_lock(-1); + lv_timer_handler(); + lvgl_port_unlock(); + vTaskDelay(pdMS_TO_TICKS(10)); + } +} + +extern "C" bool Display_PreInit() { + ADDLOG_INFO(LOG_FEATURE_DRV, "Initializing Display Board..."); + + // Initialize Board and Display + g_board = new Board(); + ADDLOG_INFO(LOG_FEATURE_DRV, "Board created, calling init()..."); + g_board->init(); + + ADDLOG_INFO(LOG_FEATURE_DRV, "Board init() done, calling begin()..."); + esp_log_level_set("*", ESP_LOG_VERBOSE); + if(!g_board->begin()) { + ADDLOG_ERROR(LOG_FEATURE_DRV, "Board begin() failed!"); + delete g_board; + g_board = NULL; + return false; + } + ADDLOG_INFO(LOG_FEATURE_DRV, "Board begin() OK!"); + + LCD *lcd = g_board->getLCD(); + Touch *tp = g_board->getTouch(); + ADDLOG_INFO(LOG_FEATURE_DRV, "LCD=%p Touch=%p", lcd, tp); + + ADDLOG_INFO(LOG_FEATURE_DRV, "Initializing LVGL Port..."); + if(!lvgl_port_init(lcd, tp)) { + ADDLOG_ERROR(LOG_FEATURE_DRV, "lvgl_port_init failed!"); + delete g_board; + g_board = NULL; + return false; + } + ADDLOG_INFO(LOG_FEATURE_DRV, "LVGL Port initialized OK!"); + + return true; +} + +extern "C" void Display_PostInit() { + // Spawn dedicated LVGL task with 8KB stack + xTaskCreate(lvgl_task, "lvgl", 8192, NULL, 5, &g_lvgl_task_handle); + + g_display_ready = true; + ADDLOG_INFO(LOG_FEATURE_DRV, "Display driver ready!"); +} + +extern "C" void Display_Shutdown() { + if (g_lvgl_task_handle != NULL) { + vTaskDelete(g_lvgl_task_handle); + g_lvgl_task_handle = NULL; + } + g_display_ready = false; + if (g_board) { + delete g_board; + g_board = NULL; + } + ADDLOG_INFO(LOG_FEATURE_DRV, "Display driver shut down!"); +} + +#else + +extern "C" bool Display_PreInit() { return false; } +extern "C" void Display_PostInit() {} +extern "C" void Display_Shutdown() {} + +#endif diff --git a/src/driver/drv_display_shared.h b/src/driver/drv_display_shared.h new file mode 100644 index 0000000000..bd4dc8897e --- /dev/null +++ b/src/driver/drv_display_shared.h @@ -0,0 +1,17 @@ +#ifndef __DRV_DISPLAY_SHARED_H__ +#define __DRV_DISPLAY_SHARED_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +bool Display_PreInit(); +void Display_PostInit(); +void Display_Shutdown(); +extern bool g_display_ready; + +#ifdef __cplusplus +} +#endif + +#endif // __DRV_DISPLAY_SHARED_H__ diff --git a/src/driver/drv_main.c b/src/driver/drv_main.c index 215a13dbf4..7f8960dee1 100644 --- a/src/driver/drv_main.c +++ b/src/driver/drv_main.c @@ -24,6 +24,14 @@ #include "drv_hlw8112.h" #include "drv_DCF77.h" +void DisplayHello_Init(); +void DisplayHello_OnEverySecond(); +void DisplayHello_Shutdown(); + +void DisplayDemo_Init(); +void DisplayDemo_OnEverySecond(); +void DisplayDemo_Shutdown(); + void DRV_MQTTServer_Init(); void DRV_MQTTServer_AppendInformationToHTTPIndexPage(http_request_t *request, int bPreState); void DRV_MQTTServer_RunEverySecond(); @@ -1520,9 +1528,31 @@ static driver_t g_drivers[] = { NULL, // onChannelChanged NULL, // onHassDiscovery false, // loaded - } + }, #endif //{ "", NULL, NULL, NULL, NULL, NULL, NULL, NULL, false }, +#if ENABLE_DRIVER_DISPLAY + { "DisplayHello", // Driver Name + DisplayHello_Init, // Init + DisplayHello_OnEverySecond, // onEverySecond + NULL, // appendInformationToHTTPIndexPage + NULL, // runQuickTick + DisplayHello_Shutdown, // stopFunction + NULL, // onChannelChanged + NULL, // onHassDiscovery + false, // loaded + }, + { "DisplayDemo", // Driver Name + DisplayDemo_Init, // Init + DisplayDemo_OnEverySecond, // onEverySecond + NULL, // appendInformationToHTTPIndexPage + NULL, // runQuickTick + DisplayDemo_Shutdown, // stopFunction + NULL, // onChannelChanged + NULL, // onHassDiscovery + false, // loaded + }, +#endif }; diff --git a/src/logging/logging.h b/src/logging/logging.h index 3d73c7a1ad..c4d96a9eb4 100644 --- a/src/logging/logging.h +++ b/src/logging/logging.h @@ -14,9 +14,17 @@ #ifndef _OBK_LOGGING_H #define _OBK_LOGGING_H +#ifdef __cplusplus +extern "C" { +#endif + void addLogAdv(int level, int feature, const char *fmt, ...); void LOG_SetRawSocketCallback(int newFD); +#ifdef __cplusplus +} +#endif + #define ADDLOG_ERROR(x, fmt, ...) addLogAdv(LOG_ERROR, x, fmt, ##__VA_ARGS__) #define ADDLOG_WARN(x, fmt, ...) addLogAdv(LOG_WARN, x, fmt, ##__VA_ARGS__) #define ADDLOG_INFO(x, fmt, ...) addLogAdv(LOG_INFO, x, fmt, ##__VA_ARGS__) diff --git a/src/obk_config.h b/src/obk_config.h index 95304b56bf..8ec235c146 100644 --- a/src/obk_config.h +++ b/src/obk_config.h @@ -493,6 +493,7 @@ #define ENABLE_DRIVER_SM16703P 1 #define ENABLE_DRIVER_PIXELANIM 1 #define ENABLE_DRIVER_TINYIR_NEC 1 +#define ENABLE_DRIVER_DISPLAY 1 #if (OBK_VARIANT == OBK_VARIANT_ESP4M || OBK_VARIANT == OBK_VARIANT_ESP2M_BERRY) #define ENABLE_OBK_BERRY 1