From e4ebcb0b4ac76e4d802ecca713a0b6fbe6923cc3 Mon Sep 17 00:00:00 2001 From: MakerM0 Date: Sat, 21 Dec 2024 11:13:32 +0800 Subject: [PATCH] add board magiclick v2.4 --- main/CMakeLists.txt | 2 + main/Kconfig.projbuild | 2 + main/boards/magiclick-2p4/config.h | 47 ++++++ .../magiclick-2p4/magiclick_2p4_board.cc | 135 ++++++++++++++++++ 4 files changed, 186 insertions(+) create mode 100644 main/boards/magiclick-2p4/config.h create mode 100644 main/boards/magiclick-2p4/magiclick_2p4_board.cc diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index ad69202a..2d93cc45 100755 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -52,6 +52,8 @@ elseif(CONFIG_BOARD_TYPE_LICHUANG_DEV) set(BOARD_TYPE "lichuang-dev") elseif(CONFIG_BOARD_TYPE_TERRENCE_C3_DEV) set(BOARD_TYPE "terrence-c3-dev") +elseif(CONFIG_BOARD_TYPE_MAGICLICK_2P4) + set(BOARD_TYPE "magiclick-2p4") endif() file(GLOB BOARD_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/boards/${BOARD_TYPE}/*.cc) list(APPEND SOURCES ${BOARD_SOURCES}) diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index 76eb8cf9..a03751e4 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -50,6 +50,8 @@ choice BOARD_TYPE bool "Kevin C3" config BOARD_TYPE_LICHUANG_DEV bool "立创开发板" + config BOARD_TYPE_MAGICLICK_2P4 + bool "神奇按钮Magiclick_2.4" endchoice endmenu diff --git a/main/boards/magiclick-2p4/config.h b/main/boards/magiclick-2p4/config.h new file mode 100644 index 00000000..602cc99e --- /dev/null +++ b/main/boards/magiclick-2p4/config.h @@ -0,0 +1,47 @@ +#ifndef _BOARD_CONFIG_H_ +#define _BOARD_CONFIG_H_ + +#include + +#define AUDIO_INPUT_SAMPLE_RATE 24000 +#define AUDIO_OUTPUT_SAMPLE_RATE 24000 + +#define AUDIO_I2S_GPIO_MCLK GPIO_NUM_8 +#define AUDIO_I2S_GPIO_WS GPIO_NUM_11 +#define AUDIO_I2S_GPIO_BCLK GPIO_NUM_9 +#define AUDIO_I2S_GPIO_DIN GPIO_NUM_10 +#define AUDIO_I2S_GPIO_DOUT GPIO_NUM_12 + +#define AUDIO_CODEC_PA_PIN GPIO_NUM_4 // pcb v2.4不起作用,适用于2.4A +#define AUDIO_CODEC_I2C_SDA_PIN GPIO_NUM_5 +#define AUDIO_CODEC_I2C_SCL_PIN GPIO_NUM_6 +#define AUDIO_CODEC_ES8311_ADDR ES8311_CODEC_DEFAULT_ADDR + +//led power +#define BUILTIN_LED_POWER GPIO_NUM_39 // 低电平有效 +#define BUILTIN_LED_POWER_OUTPUT_INVERT true + +#define BUILTIN_LED_NUM 2 +#define BUILTIN_LED_GPIO GPIO_NUM_38 +#define BOOT_BUTTON_GPIO GPIO_NUM_21 + +// display +#define DISPLAY_SDA_PIN GPIO_NUM_15 +#define DISPLAY_SCL_PIN GPIO_NUM_16 +#define DISPLAY_CS_PIN GPIO_NUM_17 +#define DISPLAY_DC_PIN GPIO_NUM_18 +#define DISPLAY_RST_PIN GPIO_NUM_14 + +#define DISPLAY_WIDTH 128 +#define DISPLAY_HEIGHT 128 +#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_13 +#define DISPLAY_BACKLIGHT_OUTPUT_INVERT false + +#endif // _BOARD_CONFIG_H_ diff --git a/main/boards/magiclick-2p4/magiclick_2p4_board.cc b/main/boards/magiclick-2p4/magiclick_2p4_board.cc new file mode 100644 index 00000000..2f0a0a56 --- /dev/null +++ b/main/boards/magiclick-2p4/magiclick_2p4_board.cc @@ -0,0 +1,135 @@ +#include "wifi_board.h" +#include "display/st7789_display.h" +#include "audio_codecs/es8311_audio_codec.h" +#include "application.h" +#include "button.h" +#include "led.h" +#include "config.h" +#include +#include +#include +#include +#include + +#define TAG "magiclick_2p4" + +class magiclick_2p4 : public WifiBoard { +private: + i2c_master_bus_handle_t codec_i2c_bus_; + Button boot_button_; + St7789Display* display_; + + void InitializeCodecI2c() { + // Initialize I2C peripheral + i2c_master_bus_config_t i2c_bus_cfg = { + .i2c_port = I2C_NUM_0, + .sda_io_num = AUDIO_CODEC_I2C_SDA_PIN, + .scl_io_num = AUDIO_CODEC_I2C_SCL_PIN, + .clk_source = I2C_CLK_SRC_DEFAULT, + .glitch_ignore_cnt = 7, + .intr_priority = 0, + .trans_queue_depth = 0, + .flags = { + .enable_internal_pullup = 1, + }, + }; + ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_bus_cfg, &codec_i2c_bus_)); + } + + void InitializeButtons() { + boot_button_.OnClick([this]() { + auto& app = Application::GetInstance(); + if (app.GetChatState() == kChatStateUnknown && !WifiStation::GetInstance().IsConnected()) { + ResetWifiConfiguration(); + } + }); + boot_button_.OnPressDown([this]() { + Application::GetInstance().StartListening(); + }); + boot_button_.OnPressUp([this]() { + Application::GetInstance().StopListening(); + }); + } + + void InitializeLedPower() { + // 设置GPIO模式 + gpio_reset_pin(BUILTIN_LED_POWER); + gpio_set_direction(BUILTIN_LED_POWER, GPIO_MODE_OUTPUT); + gpio_set_level(BUILTIN_LED_POWER, BUILTIN_LED_POWER_OUTPUT_INVERT?0:1); + } + void InitializeSpi() { + spi_bus_config_t buscfg = {}; + buscfg.mosi_io_num = DISPLAY_SDA_PIN; + buscfg.miso_io_num = GPIO_NUM_NC; + buscfg.sclk_io_num = DISPLAY_SCL_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(SPI3_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 = 2; + io_config.pclk_hz = 20 * 1000 * 1000; + 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(SPI3_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 = DISPLAY_RST_PIN; + 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_lcd_panel_reset(panel); + + + esp_lcd_panel_init(panel); + esp_lcd_panel_invert_color(panel, true); + esp_lcd_panel_swap_xy(panel, DISPLAY_SWAP_XY); + esp_lcd_panel_mirror(panel, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y); + display_ = new St7789Display(panel_io, panel, DISPLAY_BACKLIGHT_PIN, DISPLAY_BACKLIGHT_OUTPUT_INVERT, + DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY); + } +public: + magiclick_2p4() : + boot_button_(BOOT_BUTTON_GPIO) { + + + InitializeCodecI2c(); + InitializeButtons(); + InitializeLedPower(); + InitializeSpi(); + InitializeSt7789Display(); + + + } + + virtual Led* GetBuiltinLed() override { + // static Led led(BUILTIN_LED_GPIO,BUILTIN_LED_NUM); + static Led led(BUILTIN_LED_GPIO); + + return &led; + } + + virtual AudioCodec* GetAudioCodec() override { + static Es8311AudioCodec audio_codec(codec_i2c_bus_, I2C_NUM_0, 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); + return &audio_codec; + } +}; + +DECLARE_BOARD(magiclick_2p4);