From 314edc5c51aafc3309da4acfb09942f638be6ec8 Mon Sep 17 00:00:00 2001 From: ggc <1648371663@q.com> Date: Thu, 2 Apr 2026 16:12:55 +0800 Subject: [PATCH] content: add ESP32-S3-CAM-OVxxxx --- main/CMakeLists.txt | 6 + main/Kconfig.projbuild | 22 ++ main/boards/waveshare/esp32-s3-cam/README.md | 6 + main/boards/waveshare/esp32-s3-cam/config.h | 115 +++++++ .../boards/waveshare/esp32-s3-cam/config.json | 38 +++ .../esp32-s3-cam/esp32-s3-cam-xxxx.cc | 282 ++++++++++++++++++ xiaozhi-esp32 | 1 + 7 files changed, 470 insertions(+) create mode 100644 main/boards/waveshare/esp32-s3-cam/README.md create mode 100644 main/boards/waveshare/esp32-s3-cam/config.h create mode 100644 main/boards/waveshare/esp32-s3-cam/config.json create mode 100644 main/boards/waveshare/esp32-s3-cam/esp32-s3-cam-xxxx.cc create mode 160000 xiaozhi-esp32 diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 2853a08..0c0702d 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -273,6 +273,12 @@ elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_TOUCH_LCD_3_5) set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) +elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_CAM_XXXX) + set(MANUFACTURER "waveshare") + set(BOARD_TYPE "esp32-s3-cam") + set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) + set(BUILTIN_ICON_FONT font_awesome_16_4) + set(DEFAULT_EMOJI_COLLECTION twemoji_64) elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_AUDIO_BOARD) set(MANUFACTURER "waveshare") set(BOARD_TYPE "esp32-s3-audio-board") diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index a426f5d..fc1869b 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -269,6 +269,9 @@ choice BOARD_TYPE config BOARD_TYPE_WAVESHARE_ESP32_TOUCH_LCD_3_5 bool "Waveshare ESP32-Touch-LCD-3.5" depends on IDF_TARGET_ESP32 + config BOARD_TYPE_WAVESHARE_ESP32_S3_CAM_XXXX + bool "Waveshare ESP32-S3-CAM" + depends on IDF_TARGET_ESP32S3 config BOARD_TYPE_WAVESHARE_ESP32_S3_AUDIO_BOARD bool "Waveshare ESP32-S3-Audio-Board" depends on IDF_TARGET_ESP32S3 @@ -634,6 +637,25 @@ choice DISPLAY_ESP32S3_KORVO2_V3 bool "ILI9341 240*320" endchoice +choice DISPLAY_ESP32S3_CAM_XXXX + depends on BOARD_TYPE_WAVESHARE_ESP32_S3_CAM_XXXX + prompt "ESP32S3_CAM LCD Type" + default BSP_LCD_SIZE_2INCH + help + LCD Display Type + config BSP_LCD_SIZE_2INCH + bool "2inch Touch LCD Module" + + config BSP_LCD_SIZE_2_8INCH + bool "2.8inch Touch LCD Module" + + config BSP_LCD_SIZE_3_5INCH + bool "3.5inch Touch LCD Module" + + config BSP_LCD_SIZE_1_83INCH + bool "1.83inch Touch LCD Module" +endchoice + choice DISPLAY_ESP32S3_AUDIO_BOARD depends on BOARD_TYPE_WAVESHARE_ESP32_S3_AUDIO_BOARD prompt "ESP32S3_AUDIO_BOARD LCD Type" diff --git a/main/boards/waveshare/esp32-s3-cam/README.md b/main/boards/waveshare/esp32-s3-cam/README.md new file mode 100644 index 0000000..caaa761 --- /dev/null +++ b/main/boards/waveshare/esp32-s3-cam/README.md @@ -0,0 +1,6 @@ +新增 微雪 开发板: ESP32-S3-CAM-XXXX +产品链接: +https://www.waveshare.net/shop/ESP32-S3-CAM-OV5640.htm +https://www.waveshare.net/shop/ESP32-S3-CAM-OV3660.htm +https://www.waveshare.net/shop/ESP32-S3-CAM-GC2145.htm +https://www.waveshare.net/shop/ESP32-S3-CAM-GC0308.htm \ No newline at end of file diff --git a/main/boards/waveshare/esp32-s3-cam/config.h b/main/boards/waveshare/esp32-s3-cam/config.h new file mode 100644 index 0000000..5576bc8 --- /dev/null +++ b/main/boards/waveshare/esp32-s3-cam/config.h @@ -0,0 +1,115 @@ +#ifndef _BOARD_CONFIG_H_ +#define _BOARD_CONFIG_H_ + +#include +#include + +#define AUDIO_INPUT_SAMPLE_RATE 24000 +#define AUDIO_OUTPUT_SAMPLE_RATE 24000 + +#define BOOT_BUTTON_GPIO GPIO_NUM_0 + +#define AUDIO_I2S_GPIO_MCLK GPIO_NUM_10 +#define AUDIO_I2S_GPIO_BCLK GPIO_NUM_11 +#define AUDIO_I2S_GPIO_WS GPIO_NUM_12 +#define AUDIO_I2S_GPIO_DIN GPIO_NUM_13 +#define AUDIO_I2S_GPIO_DOUT GPIO_NUM_14 +#define AUDIO_CODEC_PA_PIN GPIO_NUM_NC +#define AUDIO_INPUT_REFERENCE true +#define AUDIO_CODEC_ES8311_ADDR ES8311_CODEC_DEFAULT_ADDR +#define AUDIO_CODEC_ES7210_ADDR ES7210_CODEC_DEFAULT_ADDR + +#define I2C_SCL_IO GPIO_NUM_7 +#define I2C_SDA_IO GPIO_NUM_8 + +#define BSP_IO_EXPANDER_I2C_ADDRESS CUSTOM_IO_EXPANDER_I2C_CH32V003_ADDRESS + +#define DISPLAY_SDA_PIN I2C_SDA_IO +#define DISPLAY_SCL_PIN I2C_SCL_IO + +#define DISPLAY_MISO_PIN GPIO_NUM_2 +#define DISPLAY_MOSI_PIN GPIO_NUM_1 +#define DISPLAY_SCLK_PIN GPIO_NUM_5 +#define DISPLAY_CS_PIN GPIO_NUM_6 +#define DISPLAY_DC_PIN GPIO_NUM_3 +#define DISPLAY_RESET_PIN GPIO_NUM_NC +#define DISPLAY_BACKLIGHT_PIN GPIO_NUM_NC +#define DISPLAY_SPI_SCLK_HZ (40 * 1000 * 1000) + + +/* Camera pins */ +#define CAMERA_PIN_PWDN GPIO_NUM_NC +#define CAMERA_PIN_RESET GPIO_NUM_NC +#define CAMERA_PIN_XCLK GPIO_NUM_38 +#define CAMERA_PIN_SIOD GPIO_NUM_NC +#define CAMERA_PIN_SIOC GPIO_NUM_NC + +#define CAMERA_PIN_D7 GPIO_NUM_21 +#define CAMERA_PIN_D6 GPIO_NUM_39 +#define CAMERA_PIN_D5 GPIO_NUM_40 +#define CAMERA_PIN_D4 GPIO_NUM_42 +#define CAMERA_PIN_D3 GPIO_NUM_46 +#define CAMERA_PIN_D2 GPIO_NUM_48 +#define CAMERA_PIN_D1 GPIO_NUM_47 +#define CAMERA_PIN_D0 GPIO_NUM_45 +#define CAMERA_PIN_VSYNC GPIO_NUM_17 +#define CAMERA_PIN_HREF GPIO_NUM_18 +#define CAMERA_PIN_PCLK GPIO_NUM_41 + +#define XCLK_FREQ_HZ 20000000 + + + +#ifdef CONFIG_BSP_LCD_SIZE_2INCH +#define DISPLAY_WIDTH 240 +#define DISPLAY_HEIGHT 320 + +#define DISPLAY_SWAP_XY false +#define DISPLAY_MIRROR_X false +#define DISPLAY_MIRROR_Y false +#define DISPLAY_INVERT_COLOR true +#define BACKLIGHT_INVERT false +#define DISPLAY_OFFSET_X 0 +#define DISPLAY_OFFSET_Y 0 +#endif + +#ifdef CONFIG_BSP_LCD_SIZE_2_8INCH +#define DISPLAY_WIDTH 240 +#define DISPLAY_HEIGHT 320 + +#define DISPLAY_SWAP_XY false +#define DISPLAY_MIRROR_X false +#define DISPLAY_MIRROR_Y false +#define DISPLAY_INVERT_COLOR true +#define BACKLIGHT_INVERT false +#define DISPLAY_OFFSET_X 0 +#define DISPLAY_OFFSET_Y 0 +#endif + +#ifdef CONFIG_BSP_LCD_SIZE_3_5INCH +#define DISPLAY_WIDTH 320 +#define DISPLAY_HEIGHT 480 + +#define DISPLAY_SWAP_XY false +#define DISPLAY_MIRROR_X true +#define DISPLAY_MIRROR_Y false +#define DISPLAY_INVERT_COLOR true +#define BACKLIGHT_INVERT false +#define DISPLAY_OFFSET_X 0 +#define DISPLAY_OFFSET_Y 0 +#endif + +#ifdef CONFIG_BSP_LCD_SIZE_1_83INCH +#define DISPLAY_WIDTH 240 +#define DISPLAY_HEIGHT 284 + +#define DISPLAY_SWAP_XY false +#define DISPLAY_MIRROR_X false +#define DISPLAY_MIRROR_Y false +#define DISPLAY_INVERT_COLOR true +#define BACKLIGHT_INVERT false +#define DISPLAY_OFFSET_X 0 +#define DISPLAY_OFFSET_Y 0 +#endif + +#endif // _BOARD_CONFIG_H_ \ No newline at end of file diff --git a/main/boards/waveshare/esp32-s3-cam/config.json b/main/boards/waveshare/esp32-s3-cam/config.json new file mode 100644 index 0000000..14a539a --- /dev/null +++ b/main/boards/waveshare/esp32-s3-cam/config.json @@ -0,0 +1,38 @@ +{ +"manufacturer": "waveshare", +"target": "esp32s3", +"builds": [ + { + "name": "esp32-s3-cam-2", + "sdkconfig_append": [ + "CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_CAM_XXXX=y", + "CONFIG_USE_DEVICE_AEC=y", + "CONFIG_BSP_LCD_SIZE_2INCH=y" + ] + }, + { + "name": "esp32-s3-cam-2.8", + "sdkconfig_append": [ + "CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_CAM_XXXX=y", + "CONFIG_USE_DEVICE_AEC=y", + "CONFIG_BSP_LCD_SIZE_2_8INCH=y" + ] + }, + { + "name": "esp32-s3-cam-3.5", + "sdkconfig_append": [ + "CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_CAM_XXXX=y", + "CONFIG_USE_DEVICE_AEC=y", + "CONFIG_BSP_LCD_SIZE_3_5INCH=y" + ] + }, + { + "name": "esp32-s3-cam-1.83", + "sdkconfig_append": [ + "CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_CAM_XXXX=y", + "CONFIG_USE_DEVICE_AEC=y", + "CONFIG_BSP_LCD_SIZE_1_83INCH=y" + ] + } +] +} \ No newline at end of file diff --git a/main/boards/waveshare/esp32-s3-cam/esp32-s3-cam-xxxx.cc b/main/boards/waveshare/esp32-s3-cam/esp32-s3-cam-xxxx.cc new file mode 100644 index 0000000..615ed93 --- /dev/null +++ b/main/boards/waveshare/esp32-s3-cam/esp32-s3-cam-xxxx.cc @@ -0,0 +1,282 @@ +#include "wifi_board.h" +#include "codecs/box_audio_codec.h" +#include "display/lcd_display.h" +#include "system_reset.h" +#include "application.h" +#include "button.h" +#include "config.h" + +#include +#include "i2c_device.h" +#include +#include +#include +#include +#include +#include +#include "esp32_camera.h" + +#include "esp_lcd_panel_vendor.h" +#include "custom_io_expander_ch32v003.h" +#include "esp_lcd_st7796.h" +#include "esp_ota_ops.h" + +#define TAG "waveshare_s3_cam_xxxx" + +#define LCD_OPCODE_WRITE_CMD (0x02ULL) +#define LCD_OPCODE_READ_CMD (0x0BULL) +#define LCD_OPCODE_WRITE_COLOR (0x32ULL) + +void switch_to_main(void) +{ + const esp_partition_t *factory_part = + esp_partition_find_first(ESP_PARTITION_TYPE_APP, + ESP_PARTITION_SUBTYPE_APP_FACTORY, + NULL); + if (!factory_part) { + ESP_LOGE("APP_SWITCH", "未找到 factory 分区"); + return; + } + + esp_err_t err = esp_ota_set_boot_partition(factory_part); + if (err == ESP_OK) { + ESP_LOGI("APP_SWITCH", "已设置 factory 为启动分区,重启回到主程序"); + esp_restart(); + } else { + ESP_LOGE("APP_SWITCH", "设置启动分区失败: %s", esp_err_to_name(err)); + } +} + +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 CustomBoard : public WifiBoard { +private: + Button boot_button_; + i2c_master_bus_handle_t i2c_bus_; + LcdDisplay* display_; + Esp32Camera* camera_; + esp_io_expander_handle_t io_expander = NULL; + CustomBacklight *backlight_; + + void InitializeI2c() { + // Initialize I2C peripheral + i2c_master_bus_config_t i2c_bus_cfg = { + .i2c_port = (i2c_port_t)1, + .sda_io_num = I2C_SDA_IO, + .scl_io_num = I2C_SCL_IO, + .clk_source = I2C_CLK_SRC_DEFAULT, + }; + ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_bus_cfg, &i2c_bus_)); + } + + void Initialize_Expander(void) + { + + custom_io_expander_new_i2c_ch32v003(i2c_bus_, BSP_IO_EXPANDER_I2C_ADDRESS, &io_expander); + esp_io_expander_set_dir(io_expander, IO_EXPANDER_PIN_NUM_0 | IO_EXPANDER_PIN_NUM_1 | IO_EXPANDER_PIN_NUM_4 | IO_EXPANDER_PIN_NUM_6, IO_EXPANDER_OUTPUT); + + esp_io_expander_set_level(io_expander, IO_EXPANDER_PIN_NUM_0 | IO_EXPANDER_PIN_NUM_1 , 1); + vTaskDelay(pdMS_TO_TICKS(10)); + esp_io_expander_set_level(io_expander, IO_EXPANDER_PIN_NUM_0 | IO_EXPANDER_PIN_NUM_1 , 0); + vTaskDelay(pdMS_TO_TICKS(10)); + esp_io_expander_set_level(io_expander, IO_EXPANDER_PIN_NUM_0 | IO_EXPANDER_PIN_NUM_1 , 1); + vTaskDelay(pdMS_TO_TICKS(10)); + + esp_io_expander_set_level(io_expander, IO_EXPANDER_PIN_NUM_4 | IO_EXPANDER_PIN_NUM_6 , 1); + + //custom_io_expander_set_pwm(io_expander,100); + } + + void InitializeSpi() { + spi_bus_config_t buscfg = {}; + buscfg.mosi_io_num = DISPLAY_MOSI_PIN; + buscfg.miso_io_num = GPIO_NUM_NC; + buscfg.sclk_io_num = DISPLAY_SCLK_PIN; + buscfg.quadwp_io_num = GPIO_NUM_NC; + buscfg.quadhd_io_num = GPIO_NUM_NC; + buscfg.max_transfer_sz = DISPLAY_WIDTH * DISPLAY_HEIGHT * sizeof(uint16_t); + ESP_ERROR_CHECK(spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO)); + } + + void InitializeSt7789Display() { + esp_lcd_panel_io_handle_t panel_io = nullptr; + esp_lcd_panel_handle_t panel = nullptr; + // 液晶屏控制IO初始化 + ESP_LOGD(TAG, "Install panel IO"); + esp_lcd_panel_io_spi_config_t io_config = {}; + io_config.cs_gpio_num = DISPLAY_CS_PIN; + io_config.dc_gpio_num = DISPLAY_DC_PIN; + io_config.spi_mode = 0; + io_config.pclk_hz = DISPLAY_SPI_SCLK_HZ; + io_config.trans_queue_depth = 10; + io_config.lcd_cmd_bits = 8; + io_config.lcd_param_bits = 8; + ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi(SPI2_HOST, &io_config, &panel_io)); + + // 初始化液晶屏驱动芯片ST7789 + ESP_LOGD(TAG, "Install LCD driver"); + esp_lcd_panel_dev_config_t panel_config = {}; + panel_config.reset_gpio_num = GPIO_NUM_NC; + panel_config.rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB; + panel_config.bits_per_pixel = 16; + ESP_ERROR_CHECK(esp_lcd_new_panel_st7789(panel_io, &panel_config, &panel)); + ESP_ERROR_CHECK(esp_lcd_panel_reset(panel)); + ESP_ERROR_CHECK(esp_lcd_panel_init(panel)); + ESP_ERROR_CHECK(esp_lcd_panel_swap_xy(panel, DISPLAY_SWAP_XY)); + ESP_ERROR_CHECK(esp_lcd_panel_mirror(panel, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y)); + ESP_ERROR_CHECK(esp_lcd_panel_invert_color(panel, DISPLAY_INVERT_COLOR)); + ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel,true)); + display_ = new SpiLcdDisplay(panel_io, panel, + DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY); + backlight_ = new CustomBacklight(io_expander); + backlight_->RestoreBrightness(); + } + + void InitializeSt7796Display() { + esp_lcd_panel_io_handle_t panel_io = nullptr; + esp_lcd_panel_handle_t panel = nullptr; + // 液晶屏控制IO初始化 + ESP_LOGD(TAG, "Install panel IO"); + esp_lcd_panel_io_spi_config_t io_config = {}; + io_config.cs_gpio_num = DISPLAY_CS_PIN; + io_config.dc_gpio_num = DISPLAY_DC_PIN; + io_config.spi_mode = 0; + io_config.pclk_hz = DISPLAY_SPI_SCLK_HZ; + io_config.trans_queue_depth = 10; + io_config.lcd_cmd_bits = 8; + io_config.lcd_param_bits = 8; + ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi(SPI2_HOST, &io_config, &panel_io)); + + // 初始化液晶屏驱动芯片ST7789 + ESP_LOGD(TAG, "Install LCD driver"); + esp_lcd_panel_dev_config_t panel_config = {}; + panel_config.reset_gpio_num = GPIO_NUM_NC; + panel_config.rgb_ele_order = LCD_RGB_ELEMENT_ORDER_BGR; + panel_config.bits_per_pixel = 16; + ESP_ERROR_CHECK(esp_lcd_new_panel_st7796(panel_io, &panel_config, &panel)); + ESP_ERROR_CHECK(esp_lcd_panel_reset(panel)); + ESP_ERROR_CHECK(esp_lcd_panel_init(panel)); + ESP_ERROR_CHECK(esp_lcd_panel_swap_xy(panel, DISPLAY_SWAP_XY)); + ESP_ERROR_CHECK(esp_lcd_panel_mirror(panel, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y)); + ESP_ERROR_CHECK(esp_lcd_panel_invert_color(panel, DISPLAY_INVERT_COLOR)); + ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel,true)); + display_ = new SpiLcdDisplay(panel_io, panel, + DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY); + backlight_ = new CustomBacklight(io_expander); + backlight_->RestoreBrightness(); + } + + void InitializeButtons() { + boot_button_.OnClick([this]() { + auto& app = Application::GetInstance(); + if (app.GetDeviceState() == kDeviceStateStarting) { + EnterWifiConfigMode(); + return; + } + app.ToggleChatState(); + }); + boot_button_.OnLongPress([this]() { + auto& app = Application::GetInstance(); + switch_to_main(); + }); + +#if CONFIG_USE_DEVICE_AEC + boot_button_.OnDoubleClick([this]() { + auto& app = Application::GetInstance(); + if (app.GetDeviceState() == kDeviceStateIdle) { + app.SetAecMode(app.GetAecMode() == kAecOff ? kAecOnDeviceSide : kAecOff); + } + }); +#endif + } + + + void InitializeCamera() { + camera_config_t camera_config = { + .pin_pwdn = CAMERA_PIN_PWDN, + .pin_reset = CAMERA_PIN_RESET, + .pin_xclk = CAMERA_PIN_XCLK, + .pin_sccb_sda = -1, // Use initialized I2C + .pin_sccb_scl = -1, + .pin_d7 = CAMERA_PIN_D7, + .pin_d6 = CAMERA_PIN_D6, + .pin_d5 = CAMERA_PIN_D5, + .pin_d4 = CAMERA_PIN_D4, + .pin_d3 = CAMERA_PIN_D3, + .pin_d2 = CAMERA_PIN_D2, + .pin_d1 = CAMERA_PIN_D1, + .pin_d0 = CAMERA_PIN_D0, + .pin_vsync = CAMERA_PIN_VSYNC, + .pin_href = CAMERA_PIN_HREF, + .pin_pclk = CAMERA_PIN_PCLK, + + .xclk_freq_hz = XCLK_FREQ_HZ, + .ledc_timer = LEDC_TIMER_0, + .ledc_channel = LEDC_CHANNEL_0, + + .pixel_format = PIXFORMAT_RGB565, + .frame_size = FRAMESIZE_QVGA, + .jpeg_quality = 12, + .fb_count = 2, + .fb_location = CAMERA_FB_IN_PSRAM, + .grab_mode = CAMERA_GRAB_WHEN_EMPTY, + .sccb_i2c_port = (i2c_port_t)1, + }; + + camera_ = new Esp32Camera(camera_config); + if (camera_ != nullptr) { + camera_->SetVFlip(true); + } + } +public: + CustomBoard() : + boot_button_(BOOT_BUTTON_GPIO) { + InitializeI2c(); + Initialize_Expander(); + InitializeSpi(); + InitializeButtons(); + #ifdef CONFIG_BSP_LCD_SIZE_2INCH + InitializeSt7789Display(); + #elif CONFIG_BSP_LCD_SIZE_2_8INCH + InitializeSt7789Display(); + #elif CONFIG_BSP_LCD_SIZE_1_83INCH + InitializeSt7789Display(); + #elif CONFIG_BSP_LCD_SIZE_3_5INCH + InitializeSt7796Display(); + #endif + + InitializeCamera(); + + } + + virtual AudioCodec* GetAudioCodec() override { + static BoxAudioCodec audio_codec(i2c_bus_, AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, + AUDIO_I2S_GPIO_MCLK, AUDIO_I2S_GPIO_BCLK, AUDIO_I2S_GPIO_WS, AUDIO_I2S_GPIO_DOUT, AUDIO_I2S_GPIO_DIN, AUDIO_CODEC_PA_PIN, AUDIO_CODEC_ES8311_ADDR, AUDIO_CODEC_ES7210_ADDR, AUDIO_INPUT_REFERENCE); + return &audio_codec; + } + + virtual Display* GetDisplay() override { + return display_; + } + + virtual Camera* GetCamera() override { + return camera_; + } +}; + +DECLARE_BOARD(CustomBoard); diff --git a/xiaozhi-esp32 b/xiaozhi-esp32 new file mode 160000 index 0000000..8fde7f3 --- /dev/null +++ b/xiaozhi-esp32 @@ -0,0 +1 @@ +Subproject commit 8fde7f3c62780af9420ff1a11ac8c2ba37499aa2