kevin_c3_board.cc 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include "wifi_board.h"
  2. #include "codecs/es8311_audio_codec.h"
  3. #include "application.h"
  4. #include "button.h"
  5. #include "config.h"
  6. #include "led/circular_strip.h"
  7. #include "led_strip_control.h"
  8. #include <wifi_station.h>
  9. #include <esp_log.h>
  10. #include <esp_efuse_table.h>
  11. #include <driver/i2c_master.h>
  12. #define TAG "KevinBoxBoard"
  13. class KevinBoxBoard : public WifiBoard {
  14. private:
  15. i2c_master_bus_handle_t codec_i2c_bus_;
  16. Button boot_button_;
  17. CircularStrip* led_strip_;
  18. void InitializeCodecI2c() {
  19. // Initialize I2C peripheral
  20. i2c_master_bus_config_t i2c_bus_cfg = {
  21. .i2c_port = I2C_NUM_0,
  22. .sda_io_num = AUDIO_CODEC_I2C_SDA_PIN,
  23. .scl_io_num = AUDIO_CODEC_I2C_SCL_PIN,
  24. .clk_source = I2C_CLK_SRC_DEFAULT,
  25. .glitch_ignore_cnt = 7,
  26. .intr_priority = 0,
  27. .trans_queue_depth = 0,
  28. .flags = {
  29. .enable_internal_pullup = 1,
  30. },
  31. };
  32. ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_bus_cfg, &codec_i2c_bus_));
  33. // Print I2C bus info
  34. if (i2c_master_probe(codec_i2c_bus_, 0x18, 1000) != ESP_OK) {
  35. while (true) {
  36. ESP_LOGE(TAG, "Failed to probe I2C bus, please check if you have installed the correct firmware");
  37. vTaskDelay(1000 / portTICK_PERIOD_MS);
  38. }
  39. }
  40. }
  41. void InitializeButtons() {
  42. boot_button_.OnClick([this]() {
  43. auto& app = Application::GetInstance();
  44. if (app.GetDeviceState() == kDeviceStateStarting && !WifiStation::GetInstance().IsConnected()) {
  45. ResetWifiConfiguration();
  46. }
  47. });
  48. boot_button_.OnPressDown([this]() {
  49. Application::GetInstance().StartListening();
  50. });
  51. boot_button_.OnPressUp([this]() {
  52. Application::GetInstance().StopListening();
  53. });
  54. }
  55. // 物联网初始化,添加对 AI 可见设备
  56. void InitializeTools() {
  57. led_strip_ = new CircularStrip(BUILTIN_LED_GPIO, 8);
  58. new LedStripControl(led_strip_);
  59. }
  60. public:
  61. KevinBoxBoard() : boot_button_(BOOT_BUTTON_GPIO) {
  62. InitializeCodecI2c();
  63. InitializeButtons();
  64. InitializeTools();
  65. // 把 ESP32C3 的 VDD SPI 引脚作为普通 GPIO 口使用
  66. esp_efuse_write_field_bit(ESP_EFUSE_VDD_SPI_AS_GPIO);
  67. }
  68. virtual Led* GetLed() override {
  69. return led_strip_;
  70. }
  71. virtual AudioCodec* GetAudioCodec() override {
  72. static Es8311AudioCodec audio_codec(codec_i2c_bus_, I2C_NUM_0, AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE,
  73. AUDIO_I2S_GPIO_MCLK, AUDIO_I2S_GPIO_BCLK, AUDIO_I2S_GPIO_WS, AUDIO_I2S_GPIO_DOUT, AUDIO_I2S_GPIO_DIN,
  74. AUDIO_CODEC_PA_PIN, AUDIO_CODEC_ES8311_ADDR);
  75. return &audio_codec;
  76. }
  77. };
  78. DECLARE_BOARD(KevinBoxBoard);