add esp32-s3-touch-lcd-4.3c (#1691)

* add esp32-s3-touch-lcd-4.3c

Add clang-format (#1694)

-文件.clang-format配置基于Google C++风格指南,并做了适当调整
1.使用4空格缩进
2.行宽限制为100字符
3.采用风格的大括号和空格规则

-编写code_style.m
1.针对不同开发平台(windows/Linux/macOs)
2.举例进行整体项目格式化(建议owner择机进行)
3.举例单文件格式化、格式检查
4.举例如何跳过特定代码段的格式化(待补充指定跳过文件格式化)
5.IDE集成说明

Co-authored-by: CaptainBarker <1350989027@qq.com>

add 征辰科技 AI camera wifi board and 4G board(26 Resubmit) (#1689)

add esp32-s3-touch-lcd-4.3c

* add esp32-s3-touch-lcd-4.3c

* add esp32-s3-touch-lcd-4.3c

* add esp32-s3-touch-lcd-4.3c
This commit is contained in:
ws-hsw
2026-01-30 01:08:05 +08:00
committed by GitHub
parent d9f7682b2d
commit 7d515a8345
8 changed files with 3706 additions and 1 deletions

View File

@@ -280,6 +280,11 @@ elseif(CONFIG_BOARD_TYPE_WAVESHARE_S3_TOUCH_LCD_4B)
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_S3_TOUCH_LCD_4_3C)
set(BOARD_TYPE "waveshare-s3-touch-lcd-4.3c")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_S3_TOUCH_AMOLED_1_75)
set(BOARD_TYPE "waveshare-s3-touch-amoled-1.75")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)

View File

@@ -275,6 +275,9 @@ choice BOARD_TYPE
config BOARD_TYPE_WAVESHARE_S3_TOUCH_LCD_4B
bool "Waveshare ESP32-S3-Touch-LCD-4B"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_WAVESHARE_S3_TOUCH_LCD_4_3C
bool "Waveshare ESP32-S3-Touch-LCD-4.3C"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_WAVESHARE_S3_TOUCH_LCD_1_85C
bool "Waveshare ESP32-S3-Touch-LCD-1.85C"
depends on IDF_TARGET_ESP32S3
@@ -688,7 +691,8 @@ config USE_DEVICE_AEC
|| BOARD_TYPE_LICHUANG_DEV_S3 || BOARD_TYPE_ESP_KORVO2_V3 || BOARD_TYPE_WAVESHARE_S3_TOUCH_AMOLED_1_75 || BOARD_TYPE_WAVESHARE_S3_TOUCH_LCD_1_83\
|| BOARD_TYPE_WAVESHARE_S3_TOUCH_AMOLED_2_06 || BOARD_TYPE_WAVESHARE_S3_TOUCH_LCD_4B || BOARD_TYPE_WAVESHARE_P4_WIFI6_TOUCH_LCD_4B || BOARD_TYPE_WAVESHARE_P4_WIFI6_TOUCH_LCD_7B \
|| BOARD_TYPE_WAVESHARE_P4_WIFI6_TOUCH_LCD_XC || BOARD_TYPE_ESP_S3_LCD_EV_Board_2 || BOARD_TYPE_YUNLIAO_S3 \
|| BOARD_TYPE_ECHOEAR || BOARD_TYPE_WAVESHARE_S3_TOUCH_LCD_3_49 || BOARD_TYPE_WAVESHARE_S3_RLCD_4_2 || BOARD_TYPE_ZHENGCHEN_CAM || BOARD_TYPE_ZHENGCHEN_CAM_ML307)
|| BOARD_TYPE_ECHOEAR || BOARD_TYPE_WAVESHARE_S3_TOUCH_LCD_3_49 || BOARD_TYPE_WAVESHARE_S3_RLCD_4_2 || BOARD_TYPE_ZHENGCHEN_CAM || BOARD_TYPE_ZHENGCHEN_CAM_ML307 \
|| BOARD_TYPE_WAVESHARE_S3_TOUCH_LCD_4_3C)
help
To work properly, device-side AEC requires a clean output reference path from the speaker signal and physical acoustic isolation between the microphone and speaker.

View File

@@ -0,0 +1,43 @@
# 使用说明
* [ESP32-S3-Touch-LCD-4.3C docs](https://www.waveshare.com/esp32-s3-touch-lcd-4.3c.htm)
## 快速体验
下载编译好的 [固件](https://files.waveshare.com/wiki/ESP32-S3-Touch-LCD-4.3C/ESP32-S3-Touch-LCD-4.3C-Xiaozhi.bin)
```shell
esptool.py --chip esp32s3 -p /dev/ttyACM0 -b 460800 --before=default_reset --after=hard_reset write_flash --flash_mode dio --flash_freq 80m --flash_size 16MB 0x00 ESP32-S3-Touch-LCD-4.3C-Xiaozhi.bin
```
## 基础使用
* idf version: v5.5-dev
1. 设置编译目标为 esp32s3
```shell
idf.py set-target esp32s3
```
2. 修改配置
```shell
cp main/boards/waveshare-s3-touch-lcd-4.3c/sdkconfig.4_3c sdkconfig
```
3. 编译烧录程序
```shell
idf.py build flash monitor
```
## log
@2025/05/17 测试问题
1. 返回应用界面时,需要存在此分区,否则无效
2.
3.
## TODO

View File

@@ -0,0 +1,89 @@
#ifndef _BOARD_CONFIG_H_
#define _BOARD_CONFIG_H_
#include <driver/gpio.h>
#include "custom_io_expander_ch32v003.h"
#define AUDIO_INPUT_SAMPLE_RATE 24000
#define AUDIO_OUTPUT_SAMPLE_RATE 24000
#define AUDIO_INPUT_REFERENCE true
#define BSP_I2S_SCLK (GPIO_NUM_44)
#define BSP_I2S_MCLK (GPIO_NUM_6)
#define BSP_I2S_LCLK (GPIO_NUM_16)
#define BSP_I2S_DOUT (GPIO_NUM_15) // To Codec ES8311
#define BSP_I2S_DSIN (GPIO_NUM_43) // From ADC ES7210
#define BSP_POWER_AMP_IO (IO_EXPANDER_PIN_NUM_3)
#define BSP_PA_PIN (GPIO_NUM_NC)
#define BSP_I2C_SCL (GPIO_NUM_9)
#define BSP_I2C_SDA (GPIO_NUM_8)
#define BSP_CODEC_ES8311_ADDR ES8311_CODEC_DEFAULT_ADDR
#define BSP_CODEC_ES7210_ADDR ES7210_CODEC_DEFAULT_ADDR
#define BSP_IO_EXPANDER_I2C_ADDRESS CUSTOM_IO_EXPANDER_I2C_CH32V003_ADDRESS
#define BOOT_BUTTON_GPIO GPIO_NUM_0
/* Display */
#define BSP_LCD_VSYNC (GPIO_NUM_3)
#define BSP_LCD_HSYNC (GPIO_NUM_46)
#define BSP_LCD_DE (GPIO_NUM_5)
#define BSP_LCD_PCLK (GPIO_NUM_7)
#define BSP_LCD_DISP (GPIO_NUM_NC)
// Blue data signals
#define BSP_LCD_DATA0 (GPIO_NUM_14) ///< B3
#define BSP_LCD_DATA1 (GPIO_NUM_38) ///< B4
#define BSP_LCD_DATA2 (GPIO_NUM_18) ///< B5
#define BSP_LCD_DATA3 (GPIO_NUM_17) ///< B6
#define BSP_LCD_DATA4 (GPIO_NUM_10) ///< B7
// Green data signals
#define BSP_LCD_DATA5 (GPIO_NUM_39) ///< G2
#define BSP_LCD_DATA6 (GPIO_NUM_0) ///< G3
#define BSP_LCD_DATA7 (GPIO_NUM_45) ///< G4
#define BSP_LCD_DATA8 (GPIO_NUM_48) ///< G5
#define BSP_LCD_DATA9 (GPIO_NUM_47) ///< G6
#define BSP_LCD_DATA10 (GPIO_NUM_21) ///< G7
// Red data signals
#define BSP_LCD_DATA11 (GPIO_NUM_1) ///< R3
#define BSP_LCD_DATA12 (GPIO_NUM_2) ///< R4
#define BSP_LCD_DATA13 (GPIO_NUM_42) ///< R5
#define BSP_LCD_DATA14 (GPIO_NUM_41) ///< R6
#define BSP_LCD_DATA15 (GPIO_NUM_40) ///< R7
#define BSP_LCD_BACKLIGHT (IO_EXPANDER_PIN_NUM_2)
#define BSP_LCD_RST (GPIO_NUM_NC)
#define BSP_LCD_TOUCH_RST (IO_EXPANDER_PIN_NUM_1)
#define BSP_LCD_TOUCH_INT (GPIO_NUM_4)
/* LCD display color format */
#define BSP_LCD_COLOR_FORMAT (ESP_LCD_COLOR_FORMAT_RGB565)
/* LCD display color bytes endianess */
#define BSP_LCD_BIGENDIAN (1)
/* LCD display color bits */
#define BSP_LCD_BITS_PER_PIXEL (16)
#define BSP_LCD_BIT_PER_PIXEL (18)
#define BSP_RGB_DATA_WIDTH (16)
/* LCD display definition */
#define BSP_LCD_H_RES (800)
#define BSP_LCD_V_RES (480)
#define DISPLAY_MIRROR_X false
#define DISPLAY_MIRROR_Y false
#define DISPLAY_SWAP_XY false
#define DISPLAY_OFFSET_X 0
#define DISPLAY_OFFSET_Y 0
#define DISPLAY_BACKLIGHT_PIN GPIO_NUM_NC
#define DISPLAY_BACKLIGHT_OUTPUT_INVERT true
#endif // _BOARD_CONFIG_H_

View File

@@ -0,0 +1,14 @@
{
"target": "esp32s3",
"builds": [
{
"name": "waveshare-s3-touch-lcd-4.3c",
"sdkconfig_append": [
"CONFIG_BOARD_TYPE_ESP32S3_Touch_LCD_4_3C=y",
"CONFIG_USE_DEVICE_AEC=y",
"CONFIG_SPIRAM_FETCH_INSTRUCTIONS=y",
"CONFIG_SPIRAM_RODATA=y"
]
}
]
}

View File

@@ -0,0 +1,243 @@
#include "wifi_board.h"
#include "display/lcd_display.h"
#include "codecs/box_audio_codec.h"
#include "application.h"
#include "button.h"
#include "mcp_server.h"
#include "config.h"
#include "power_save_timer.h"
#include "i2c_device.h"
#include <esp_log.h>
#include <esp_lcd_panel_vendor.h>
#include <driver/i2c_master.h>
#include <esp_lcd_touch_gt911.h>
#include <esp_lvgl_port.h>
#include <lvgl.h>
#include <esp_lcd_panel_io.h>
#include <esp_lcd_panel_ops.h>
#include <esp_lcd_panel_rgb.h>
#define TAG "WaveshareEsp32s3TouchLCD43c"
class CustomBacklight : public Backlight {
public:
CustomBacklight(esp_io_expander_handle_t io_handle)
: Backlight(), io_handle_(io_handle) {}
protected:
esp_io_expander_handle_t io_handle_;
virtual void SetBrightnessImpl(uint8_t brightness) override {
if (brightness > 100) brightness = 100;
int flipped_brightness = 100 - brightness;
custom_io_expander_set_pwm(io_handle_, flipped_brightness * 255 / 100);
}
};
class WaveshareEsp32s3TouchLCD43c : public WifiBoard {
private:
i2c_master_bus_handle_t i2c_bus_;
LcdDisplay* display_;
esp_io_expander_handle_t io_expander = NULL;
PowerSaveTimer* power_save_timer_;
CustomBacklight *backlight_;
void InitializePowerSaveTimer() {
power_save_timer_ = new PowerSaveTimer(-1, 60, 300);
power_save_timer_->OnEnterSleepMode([this]() {
GetDisplay()->SetPowerSaveMode(true);
GetBacklight()->SetBrightness(10); });
power_save_timer_->OnExitSleepMode([this]() {
GetDisplay()->SetPowerSaveMode(false);
GetBacklight()->RestoreBrightness();});
power_save_timer_->SetEnabled(true);
}
void InitializeGpio() {
// Zero-initialize the GPIO configuration structure
gpio_config_t io_conf = {};
io_conf.intr_type = GPIO_INTR_DISABLE; // Disable interrupts for this pin
io_conf.pin_bit_mask = 1ULL << BSP_LCD_TOUCH_INT; // Select the GPIO pin using a bitmask
io_conf.mode = GPIO_MODE_OUTPUT; // Set pin as output
io_conf.pull_up_en = GPIO_PULLUP_DISABLE; // Disable pull-up
gpio_config(&io_conf); // Apply the configuration
}
void InitializeCodecI2c() {
// Initialize I2C peripheral
i2c_master_bus_config_t i2c_bus_cfg = {
.i2c_port = I2C_NUM_0,
.sda_io_num = BSP_I2C_SDA,
.scl_io_num = BSP_I2C_SCL,
.clk_source = I2C_CLK_SRC_DEFAULT,
.glitch_ignore_cnt = 7,
.trans_queue_depth = 0,
.flags = {
.enable_internal_pullup = 1,
},
};
ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_bus_cfg, &i2c_bus_));
}
void InitializeCustomio(void) {
custom_io_expander_new_i2c_ch32v003(i2c_bus_, BSP_IO_EXPANDER_I2C_ADDRESS, &io_expander);
esp_io_expander_set_dir(io_expander, BSP_POWER_AMP_IO | BSP_LCD_BACKLIGHT | BSP_LCD_TOUCH_RST , IO_EXPANDER_OUTPUT);
esp_io_expander_set_level(io_expander, BSP_POWER_AMP_IO | BSP_LCD_BACKLIGHT | BSP_LCD_TOUCH_RST , 1);
esp_io_expander_set_level(io_expander, BSP_LCD_TOUCH_RST, 0);
vTaskDelay(pdMS_TO_TICKS(200));
gpio_set_level(BSP_LCD_TOUCH_INT, 0);
vTaskDelay(pdMS_TO_TICKS(200));
esp_io_expander_set_level(io_expander, BSP_LCD_TOUCH_RST, 1);
vTaskDelay(pdMS_TO_TICKS(200));
}
void InitializeRGB() {
esp_lcd_panel_io_handle_t panel_io = nullptr;
esp_lcd_panel_handle_t panel_handle = nullptr;
esp_lcd_rgb_panel_config_t rgb_config = {
.clk_src = LCD_CLK_SRC_DEFAULT,
.timings = {
.pclk_hz = 16 * 1000 * 1000,
.h_res = BSP_LCD_H_RES,
.v_res = BSP_LCD_V_RES,
.hsync_pulse_width = 4,
.hsync_back_porch = 4,
.hsync_front_porch = 8,
.vsync_pulse_width = 4,
.vsync_back_porch = 4,
.vsync_front_porch = 8,
.flags = {
.pclk_active_neg = true
}
},
.data_width = 16,
.bits_per_pixel = 16,
.num_fbs = 2,
.bounce_buffer_size_px = BSP_LCD_H_RES * 10,
.psram_trans_align = 64,
.hsync_gpio_num = BSP_LCD_HSYNC,
.vsync_gpio_num = BSP_LCD_VSYNC,
.de_gpio_num = BSP_LCD_DE,
.pclk_gpio_num = BSP_LCD_PCLK,
.disp_gpio_num = BSP_LCD_DISP,
.data_gpio_nums = {
BSP_LCD_DATA0, BSP_LCD_DATA1, BSP_LCD_DATA2, BSP_LCD_DATA3,
BSP_LCD_DATA4, BSP_LCD_DATA5, BSP_LCD_DATA6, BSP_LCD_DATA7,
BSP_LCD_DATA8, BSP_LCD_DATA9, BSP_LCD_DATA10, BSP_LCD_DATA11,
BSP_LCD_DATA12, BSP_LCD_DATA13, BSP_LCD_DATA14, BSP_LCD_DATA15
},
.flags = {
.fb_in_psram = 1,
},
};
ESP_ERROR_CHECK(esp_lcd_new_rgb_panel(&rgb_config, &panel_handle));
ESP_ERROR_CHECK(esp_lcd_panel_init(panel_handle));
display_ = new RgbLcdDisplay(panel_io, panel_handle,
BSP_LCD_H_RES, BSP_LCD_V_RES, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X,
DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY);
backlight_ = new CustomBacklight(io_expander);
backlight_->RestoreBrightness();
}
void InitializeTouch() {
esp_lcd_touch_handle_t tp;
esp_lcd_touch_config_t tp_cfg = {
.x_max = BSP_LCD_H_RES - 1,
.y_max = BSP_LCD_V_RES - 1,
.rst_gpio_num = GPIO_NUM_NC,
.int_gpio_num = GPIO_NUM_NC,
.levels = {
.reset = 0,
.interrupt = 0,
},
.flags = {
.swap_xy = 0,
.mirror_x = 0,
.mirror_y = 0,
},
};
esp_lcd_panel_io_handle_t tp_io_handle = NULL;
esp_lcd_panel_io_i2c_config_t tp_io_config = ESP_LCD_TOUCH_IO_I2C_GT911_CONFIG();
tp_io_config.scl_speed_hz = 400 * 1000;
esp_lcd_new_panel_io_i2c(i2c_bus_, &tp_io_config, &tp_io_handle);
ESP_LOGI(TAG, "Initialize touch controller");
ESP_ERROR_CHECK(esp_lcd_touch_new_i2c_gt911(tp_io_handle, &tp_cfg, &tp));
const lvgl_port_touch_cfg_t touch_cfg = {
.disp = lv_display_get_default(),
.handle = tp,
};
lvgl_port_add_touch(&touch_cfg);
ESP_LOGI(TAG, "Touch panel initialized successfully");
}
// Initialization tool
void InitializeTools() {
auto &mcp_server = McpServer::GetInstance();
mcp_server.AddTool("self.system.reconfigure_wifi",
"Reboot the device and enter WiFi configuration mode.\n"
"**CAUTION** You must ask the user to confirm this action.",
PropertyList(), [this](const PropertyList& properties) {
EnterWifiConfigMode();
return true;
});
}
public:
WaveshareEsp32s3TouchLCD43c() {
InitializePowerSaveTimer();
InitializeGpio();
InitializeCodecI2c();
InitializeCustomio();
InitializeRGB();
InitializeTouch();
InitializeTools();
GetBacklight()->SetBrightness(100);
}
virtual AudioCodec* GetAudioCodec() override {
static BoxAudioCodec audio_codec(
i2c_bus_,
AUDIO_INPUT_SAMPLE_RATE,
AUDIO_OUTPUT_SAMPLE_RATE,
BSP_I2S_MCLK,
BSP_I2S_SCLK,
BSP_I2S_LCLK,
BSP_I2S_DOUT,
BSP_I2S_DSIN,
BSP_PA_PIN,
BSP_CODEC_ES8311_ADDR,
BSP_CODEC_ES7210_ADDR,
AUDIO_INPUT_REFERENCE);
return &audio_codec;
}
virtual Display* GetDisplay() override {
return display_;
}
virtual Backlight *GetBacklight() override {
return backlight_;
}
virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
if (level != PowerSaveLevel::LOW_POWER) {
power_save_timer_->WakeUp();
}
WifiBoard::SetPowerSaveLevel(level);
}
};
DECLARE_BOARD(WaveshareEsp32s3TouchLCD43c);

File diff suppressed because it is too large Load Diff

View File

@@ -16,6 +16,7 @@ dependencies:
- if: target in [esp32, esp32s2, esp32s3, esp32p4]
espressif/esp_lcd_spd2010: ==1.0.2
espressif/esp_io_expander_tca9554: ==2.0.0
waveshare/custom_io_expander_ch32v003: ^1.0.0
espressif/esp_lcd_panel_io_additions: ^1.0.1
78/esp_lcd_nv3023: ~1.0.0
78/esp-wifi-connect: ~3.0.2