diff --git a/espidfcode/.clangd b/espidfcode/.clangd new file mode 100644 index 0000000..437f255 --- /dev/null +++ b/espidfcode/.clangd @@ -0,0 +1,2 @@ +CompileFlags: + Remove: [-f*, -m*] diff --git a/espidfcode/.devcontainer/Dockerfile b/espidfcode/.devcontainer/Dockerfile new file mode 100644 index 0000000..dafb8ad --- /dev/null +++ b/espidfcode/.devcontainer/Dockerfile @@ -0,0 +1,13 @@ +ARG DOCKER_TAG=latest +FROM espressif/idf:${DOCKER_TAG} + +ENV LC_ALL=C.UTF-8 +ENV LANG=C.UTF-8 + +RUN apt-get update -y && apt-get install udev -y + +RUN echo "source /opt/esp/idf/export.sh > /dev/null 2>&1" >> ~/.bashrc + +ENTRYPOINT [ "/opt/esp/entrypoint.sh" ] + +CMD ["/bin/bash", "-c"] \ No newline at end of file diff --git a/espidfcode/.devcontainer/devcontainer.json b/espidfcode/.devcontainer/devcontainer.json new file mode 100644 index 0000000..b801786 --- /dev/null +++ b/espidfcode/.devcontainer/devcontainer.json @@ -0,0 +1,21 @@ +{ + "name": "ESP-IDF QEMU", + "build": { + "dockerfile": "Dockerfile" + }, + "customizations": { + "vscode": { + "settings": { + "terminal.integrated.defaultProfile.linux": "bash", + "idf.espIdfPath": "/opt/esp/idf", + "idf.toolsPath": "/opt/esp", + "idf.gitPath": "/usr/bin/git" + }, + "extensions": [ + "espressif.esp-idf-extension", + "espressif.esp-idf-web" + ] + } + }, + "runArgs": ["--privileged"] +} \ No newline at end of file diff --git a/espidfcode/.gitignore b/espidfcode/.gitignore new file mode 100644 index 0000000..7805557 --- /dev/null +++ b/espidfcode/.gitignore @@ -0,0 +1,78 @@ +# macOS +.DS_Store +.AppleDouble +.LSOverride + +# Directory metadata +.directory + +# Temporary files +*~ +*.swp +*.swo +*.bak +*.tmp + +# Log files +*.log + +# Build artifacts and directories +**/build/ +build/ +*.o +*.a +*.out +*.exe # For any host-side utilities compiled on Windows + +# ESP-IDF specific build outputs +*.bin +*.elf +*.map +flasher_args.json # Generated in build directory +sdkconfig.old +sdkconfig + +# ESP-IDF dependencies +# For older versions or manual component management +/components/.idf/ +**/components/.idf/ +# For modern ESP-IDF component manager +managed_components/ +# If ESP-IDF tools are installed/referenced locally to the project +.espressif/ + +# CMake generated files +CMakeCache.txt +CMakeFiles/ +cmake_install.cmake +install_manifest.txt +CTestTestfile.cmake + +# Python environment files +*.pyc +*.pyo +*.pyd +__pycache__/ +*.egg-info/ +dist/ + +# Virtual environment folders +venv/ +.venv/ +env/ + +# Language Servers +.clangd/ +.ccls-cache/ +compile_commands.json + +# Windows specific +Thumbs.db +ehthumbs.db +Desktop.ini + +# User-specific configuration files +*.user +*.workspace # General workspace files, can be from various tools +*.suo # Visual Studio Solution User Options +*.sln.docstates # Visual Studio diff --git a/espidfcode/.vscode/c_cpp_properties.json b/espidfcode/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..48fa5bb --- /dev/null +++ b/espidfcode/.vscode/c_cpp_properties.json @@ -0,0 +1,23 @@ +{ + "configurations": [ + { + "name": "ESP-IDF", + "compilerPath": "${config:idf.toolsPathWin}\\tools\\xtensa-esp-elf\\esp-14.2.0_20251107\\xtensa-esp-elf\\bin\\xtensa-esp32-elf-gcc.exe", + "compileCommands": "${config:idf.buildPath}/compile_commands.json", + "includePath": [ + "${config:idf.espIdfPath}/components/**", + "${config:idf.espIdfPathWin}/components/**", + "${workspaceFolder}/**" + ], + "browse": { + "path": [ + "${config:idf.espIdfPath}/components", + "${config:idf.espIdfPathWin}/components", + "${workspaceFolder}" + ], + "limitSymbolsToIncludedHeaders": true + } + } + ], + "version": 4 +} diff --git a/espidfcode/.vscode/launch.json b/espidfcode/.vscode/launch.json new file mode 100644 index 0000000..2511a38 --- /dev/null +++ b/espidfcode/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "gdbtarget", + "request": "attach", + "name": "Eclipse CDT GDB Adapter" + }, + { + "type": "espidf", + "name": "Launch", + "request": "launch" + } + ] +} \ No newline at end of file diff --git a/espidfcode/.vscode/settings.json b/espidfcode/.vscode/settings.json new file mode 100644 index 0000000..0fae262 --- /dev/null +++ b/espidfcode/.vscode/settings.json @@ -0,0 +1,20 @@ +{ + "C_Cpp.intelliSenseEngine": "default", + "idf.espIdfPathWin": "C:\\Users\\wuwen\\esp\\v5.5.2\\esp-idf", + "idf.pythonInstallPath": "C:\\Espressif\\tools\\idf-python\\3.11.2\\python.exe", + "idf.openOcdConfigs": [ + "board/esp32c3-builtin.cfg" + ], + "idf.toolsPathWin": "C:\\Espressif", + "idf.customExtraVars": { + "IDF_TARGET": "esp32c3" + }, + "clangd.path": "C:\\Espressif\\tools\\esp-clang\\esp-19.1.2_20250312\\esp-clang\\bin\\clangd.exe", + "clangd.arguments": [ + "--background-index", + "--query-driver=**", + "--compile-commands-dir=c:\\Users\\wuwen\\Documents\\prj\\hantai_project\\espidfcode\\build" + ], + "idf.flashType": "UART", + "idf.portWin": "COM4" +} diff --git a/espidfcode/CMakeLists.txt b/espidfcode/CMakeLists.txt new file mode 100644 index 0000000..8a392ee --- /dev/null +++ b/espidfcode/CMakeLists.txt @@ -0,0 +1,8 @@ +# The following lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +idf_build_set_property(MINIMAL_BUILD ON) +project(espidfcode) diff --git a/espidfcode/README.md b/espidfcode/README.md new file mode 100644 index 0000000..f3aa0c5 --- /dev/null +++ b/espidfcode/README.md @@ -0,0 +1,53 @@ +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-H21 | ESP32-H4 | ESP32-P4 | ESP32-S2 | ESP32-S3 | Linux | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | --------- | -------- | -------- | -------- | -------- | ----- | + +# Hello World Example + +Starts a FreeRTOS task to print "Hello World". + +(See the README.md file in the upper level 'examples' directory for more information about examples.) + +## How to use example + +Follow detailed instructions provided specifically for this example. + +Select the instructions depending on Espressif chip installed on your development board: + +- [ESP32 Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/stable/get-started/index.html) +- [ESP32-S2 Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/get-started/index.html) + + +## Example folder contents + +The project **hello_world** contains one source file in C language [hello_world_main.c](main/hello_world_main.c). The file is located in folder [main](main). + +ESP-IDF projects are built using CMake. The project build configuration is contained in `CMakeLists.txt` files that provide set of directives and instructions describing the project's source files and targets (executable, library, or both). + +Below is short explanation of remaining files in the project folder. + +``` +├── CMakeLists.txt +├── pytest_hello_world.py Python script used for automated testing +├── main +│ ├── CMakeLists.txt +│ └── hello_world_main.c +└── README.md This is the file you are currently reading +``` + +For more information on structure and contents of ESP-IDF projects, please refer to Section [Build System](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html) of the ESP-IDF Programming Guide. + +## Troubleshooting + +* Program upload failure + + * Hardware connection is not correct: run `idf.py -p PORT monitor`, and reboot your board to see if there are any output logs. + * The baud rate for downloading is too high: lower your baud rate in the `menuconfig` menu, and try again. + +## Technical support and feedback + +Please use the following feedback channels: + +* For technical queries, go to the [esp32.com](https://esp32.com/) forum +* For a feature request or bug report, create a [GitHub issue](https://github.com/espressif/esp-idf/issues) + +We will get back to you as soon as possible. diff --git a/espidfcode/main/CMakeLists.txt b/espidfcode/main/CMakeLists.txt new file mode 100644 index 0000000..5e7bd11 --- /dev/null +++ b/espidfcode/main/CMakeLists.txt @@ -0,0 +1,6 @@ +# 收集当前目录下所有 .c 文件 +file(GLOB_RECURSE SRC_LIST "*.c") + +idf_component_register(SRCS ${SRC_LIST} + PRIV_REQUIRES spi_flash esp_driver_spi esp_driver_gpio + INCLUDE_DIRS "") diff --git a/espidfcode/main/spi.c b/espidfcode/main/spi.c new file mode 100644 index 0000000..023c5de --- /dev/null +++ b/espidfcode/main/spi.c @@ -0,0 +1,62 @@ +#include "spi.h" + + +#include "driver/spi_master.h" +#include "esp_log.h" + +#define VSPI_MISO -1 //接收引脚不使用,仅发送 +#define VSPI_MOSI 3 +#define VSPI_SCLK 2 + +#define LCD_CS 7 +#define LCD_DS 6 + +static const char *TAG = "SPI_2"; + +spi_device_handle_t lcd_spi; + +void spi_init() +{ + ESP_LOGI(TAG,"初始化SPI IO总线"); + esp_err_t ret; + + // 1. SPI 总线配置 + spi_bus_config_t buscfg = { + .miso_io_num = VSPI_MISO, // MISO 引脚 + .mosi_io_num = VSPI_MOSI, // MOSI 引脚 + .sclk_io_num = VSPI_SCLK, // 时钟引脚 + .quadwp_io_num = -1, // 不使用 QWP + .quadhd_io_num = -1, // 不使用 QHD + .max_transfer_sz = 4096, // 最大传输大小 + }; + + // 2. 初始化 SPI 总线 + ret = spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "SPI2 IO总线初始化失败"); + return; + } + + ESP_LOGI(TAG,"SPI IO总线初始化成功"); + + ESP_LOGI(TAG,"挂载设备片选IO"); + + spi_device_interface_config_t devcfg = { + .mode = 0, // SPI 模式 0 + .clock_speed_hz = 80 * 1000 * 1000, // + .spics_io_num = LCD_CS, + .queue_size = 7, // 队列深度 + .command_bits = 8, // 命令 8 位 + .address_bits = 8, + }; + + ret = spi_bus_add_device(SPI2_HOST, &devcfg, &lcd_spi); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "挂载设备片选IO失败"); + return; + } + +} + + + diff --git a/espidfcode/main/spi.h b/espidfcode/main/spi.h new file mode 100644 index 0000000..c01e258 --- /dev/null +++ b/espidfcode/main/spi.h @@ -0,0 +1,6 @@ +#ifndef SPI_H +#define SPI_H + +void spi_init(); + +#endif /* SPI_H */ \ No newline at end of file diff --git a/espidfcode/main/the_main.c b/espidfcode/main/the_main.c new file mode 100644 index 0000000..573950b --- /dev/null +++ b/espidfcode/main/the_main.c @@ -0,0 +1,60 @@ +/* + * SPDX-FileCopyrightText: 2010-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: CC0-1.0 + */ + +#include +#include +#include "sdkconfig.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_chip_info.h" +#include "esp_flash.h" +#include "esp_system.h" +#include "esp_log.h" + +#include "spi.h" + +static const char *TAG = "SYS"; + +void app_main(void) +{ + ESP_LOGI(TAG,"Hello world!\n"); + + /* Print chip information */ + esp_chip_info_t chip_info; + uint32_t flash_size; + esp_chip_info(&chip_info); + ESP_LOGI(TAG,"This is %s chip with %d CPU core(s), %s%s%s%s, ", + CONFIG_IDF_TARGET, + chip_info.cores, + (chip_info.features & CHIP_FEATURE_WIFI_BGN) ? "WiFi/" : "", + (chip_info.features & CHIP_FEATURE_BT) ? "BT" : "", + (chip_info.features & CHIP_FEATURE_BLE) ? "BLE" : "", + (chip_info.features & CHIP_FEATURE_IEEE802154) ? ", 802.15.4 (Zigbee/Thread)" : ""); + + unsigned major_rev = chip_info.revision / 100; + unsigned minor_rev = chip_info.revision % 100; + ESP_LOGI(TAG,"silicon revision v%d.%d, ", major_rev, minor_rev); + if(esp_flash_get_size(NULL, &flash_size) != ESP_OK) { + ESP_LOGE(TAG,"Get flash size failed"); + return; + } + + ESP_LOGI(TAG,"%" PRIu32 "MB %s flash\n", flash_size / (uint32_t)(1024 * 1024), + (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external"); + + ESP_LOGI(TAG,"Minimum free heap size: %" PRIu32 " bytes\n", esp_get_minimum_free_heap_size()); + + ESP_LOGI(TAG,"复位原因: %d\n", esp_reset_reason()); + + spi_init(); + + while(1){ + + vTaskDelay(1); // 必须让出CPU + } + + +} diff --git a/espidfcode/pytest_hello_world.py b/espidfcode/pytest_hello_world.py new file mode 100644 index 0000000..eb02bd7 --- /dev/null +++ b/espidfcode/pytest_hello_world.py @@ -0,0 +1,55 @@ +# SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 +import hashlib +import logging +from typing import Callable + +import pytest +from pytest_embedded_idf.dut import IdfDut +from pytest_embedded_idf.utils import idf_parametrize +from pytest_embedded_qemu.app import QemuApp +from pytest_embedded_qemu.dut import QemuDut + + +@pytest.mark.generic +@idf_parametrize('target', ['supported_targets', 'preview_targets'], indirect=['target']) +def test_hello_world(dut: IdfDut, log_minimum_free_heap_size: Callable[..., None]) -> None: + dut.expect('Hello world!') + log_minimum_free_heap_size() + + +@pytest.mark.host_test +@idf_parametrize('target', ['linux'], indirect=['target']) +def test_hello_world_linux(dut: IdfDut) -> None: + dut.expect('Hello world!') + + +@pytest.mark.host_test +@pytest.mark.macos_shell +@idf_parametrize('target', ['linux'], indirect=['target']) +def test_hello_world_macos(dut: IdfDut) -> None: + dut.expect('Hello world!') + + +def verify_elf_sha256_embedding(app: QemuApp, sha256_reported: str) -> None: + sha256 = hashlib.sha256() + with open(app.elf_file, 'rb') as f: + sha256.update(f.read()) + sha256_expected = sha256.hexdigest() + + logging.info(f'ELF file SHA256: {sha256_expected}') + logging.info(f'ELF file SHA256 (reported by the app): {sha256_reported}') + + # the app reports only the first several hex characters of the SHA256, check that they match + if not sha256_expected.startswith(sha256_reported): + raise ValueError('ELF file SHA256 mismatch') + + +@pytest.mark.host_test +@pytest.mark.qemu +@idf_parametrize('target', ['esp32', 'esp32c3'], indirect=['target']) +def test_hello_world_host(app: QemuApp, dut: QemuDut) -> None: + sha256_reported = dut.expect(r'ELF file SHA256:\s+([a-f0-9]+)').group(1).decode('utf-8') + verify_elf_sha256_embedding(app, sha256_reported) + + dut.expect('Hello world!') diff --git a/espidfcode/sdkconfig.ci b/espidfcode/sdkconfig.ci new file mode 100644 index 0000000..e69de29 diff --git a/lichuang_pcb/debug.log b/lichuang_pcb/debug.log index 74d1c5d..b8695ad 100644 --- a/lichuang_pcb/debug.log +++ b/lichuang_pcb/debug.log @@ -1 +1,2 @@ [1217/195831.250:ERROR:gpu\command_buffer\service\shared_image\shared_image_manager.cc:401] SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox. +[1230/230046.279:ERROR:ui\gl\direct_composition_support.cc:615] AMD VideoProcessorGetOutputExtension failed: The parameter is incorrect. (0x80070057) diff --git a/lvglui/lvglui/.gitignore b/lvglui/lvglui/.gitignore new file mode 100644 index 0000000..73e1e58 --- /dev/null +++ b/lvglui/lvglui/.gitignore @@ -0,0 +1,2 @@ +preview-build +preview-bin \ No newline at end of file diff --git a/lvglui/lvglui/CMakeLists.txt b/lvglui/lvglui/CMakeLists.txt new file mode 100644 index 0000000..c362a8b --- /dev/null +++ b/lvglui/lvglui/CMakeLists.txt @@ -0,0 +1,37 @@ +# This basic file is used to compile the runtime for the Editor preview. +# It is also intended for you to customize it for your own target/project. + +# Only set project if this is the top-level CMakeLists.txt +if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) + cmake_minimum_required(VERSION 3.10) + # can be customized + project(LVGLProject) + set(IS_TOP_LEVEL TRUE) +else() + set(IS_TOP_LEVEL FALSE) +endif() + +# This includes the generated list of .c files +include(${CMAKE_CURRENT_LIST_DIR}/file_list_gen.cmake) + +# Create the UI sources as a library +add_library(lib-ui ${PROJECT_SOURCES}) + +# Add the root project folder as include folder +target_include_directories(lib-ui PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + +# You may use this check to add configuration when compiling for the Editor preview, +# or for your target. +if (LV_EDITOR_PREVIEW) + # things for the Preview +else () + # things for your target + + # set your include directories here, don't forget LVGL! +endif () + +if (IS_TOP_LEVEL) + # Do something when this is your top level cmakelists.txt +else() + # Do something else if it's not your top level cmakelists.txt +endif() \ No newline at end of file diff --git a/lvglui/lvglui/components/README.md b/lvglui/lvglui/components/README.md new file mode 100644 index 0000000..c44ff7a --- /dev/null +++ b/lvglui/lvglui/components/README.md @@ -0,0 +1 @@ +Create XML files here that start with a `` tag diff --git a/lvglui/lvglui/fonts/README.md b/lvglui/lvglui/fonts/README.md new file mode 100644 index 0000000..104d732 --- /dev/null +++ b/lvglui/lvglui/fonts/README.md @@ -0,0 +1 @@ +Place ttf or woff files here diff --git a/lvglui/lvglui/globals.xml b/lvglui/lvglui/globals.xml new file mode 100644 index 0000000..5a2a08f --- /dev/null +++ b/lvglui/lvglui/globals.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lvglui/lvglui/images/README.md b/lvglui/lvglui/images/README.md new file mode 100644 index 0000000..10807df --- /dev/null +++ b/lvglui/lvglui/images/README.md @@ -0,0 +1 @@ +Place PNG images here diff --git a/lvglui/lvglui/project.xml b/lvglui/lvglui/project.xml new file mode 100644 index 0000000..b8f6d88 --- /dev/null +++ b/lvglui/lvglui/project.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/lvglui/lvglui/screens/README.md b/lvglui/lvglui/screens/README.md new file mode 100644 index 0000000..b49cf42 --- /dev/null +++ b/lvglui/lvglui/screens/README.md @@ -0,0 +1 @@ +Create XML files here that start with a `` tag diff --git a/lvglui/lvglui/widgets/README.md b/lvglui/lvglui/widgets/README.md new file mode 100644 index 0000000..bff1fef --- /dev/null +++ b/lvglui/lvglui/widgets/README.md @@ -0,0 +1 @@ +Create folders here for each widget and place an XML in each with a `` tag