atommatrix_echo_base.cc 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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 "i2c_device.h"
  7. #include <esp_log.h>
  8. #include <driver/i2c_master.h>
  9. #include <wifi_station.h>
  10. #include "led/circular_strip.h"
  11. #define TAG "XX+EchoBase"
  12. #define PI4IOE_ADDR 0x43
  13. #define PI4IOE_REG_CTRL 0x00
  14. #define PI4IOE_REG_IO_PP 0x07
  15. #define PI4IOE_REG_IO_DIR 0x03
  16. #define PI4IOE_REG_IO_OUT 0x05
  17. #define PI4IOE_REG_IO_PULLUP 0x0D
  18. class Pi4ioe : public I2cDevice {
  19. public:
  20. Pi4ioe(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c_bus, addr) {
  21. WriteReg(PI4IOE_REG_IO_PP, 0x00); // Set to high-impedance
  22. WriteReg(PI4IOE_REG_IO_PULLUP, 0xFF); // Enable pull-up
  23. WriteReg(PI4IOE_REG_IO_DIR, 0x6E); // Set input=0, output=1
  24. WriteReg(PI4IOE_REG_IO_OUT, 0xFF); // Set outputs to 1
  25. }
  26. void SetSpeakerMute(bool mute) {
  27. WriteReg(PI4IOE_REG_IO_OUT, mute ? 0x00 : 0xFF);
  28. }
  29. };
  30. class AtomMatrixEchoBaseBoard : public WifiBoard {
  31. private:
  32. i2c_master_bus_handle_t i2c_bus_;
  33. Pi4ioe* pi4ioe_;
  34. Button face_button_;
  35. void InitializeI2c() {
  36. // Initialize I2C peripheral
  37. i2c_master_bus_config_t i2c_bus_cfg = {
  38. .i2c_port = I2C_NUM_1,
  39. .sda_io_num = AUDIO_CODEC_I2C_SDA_PIN,
  40. .scl_io_num = AUDIO_CODEC_I2C_SCL_PIN,
  41. .clk_source = I2C_CLK_SRC_DEFAULT,
  42. .glitch_ignore_cnt = 7,
  43. .intr_priority = 0,
  44. .trans_queue_depth = 0,
  45. .flags = {
  46. .enable_internal_pullup = 1,
  47. },
  48. };
  49. ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_bus_cfg, &i2c_bus_));
  50. }
  51. void I2cDetect() {
  52. uint8_t address;
  53. printf(" 0 1 2 3 4 5 6 7 8 9 a b c d e f\r\n");
  54. for (int i = 0; i < 128; i += 16) {
  55. printf("%02x: ", i);
  56. for (int j = 0; j < 16; j++) {
  57. fflush(stdout);
  58. address = i + j;
  59. esp_err_t ret = i2c_master_probe(i2c_bus_, address, pdMS_TO_TICKS(200));
  60. if (ret == ESP_OK) {
  61. printf("%02x ", address);
  62. } else if (ret == ESP_ERR_TIMEOUT) {
  63. printf("UU ");
  64. } else {
  65. printf("-- ");
  66. }
  67. }
  68. printf("\r\n");
  69. }
  70. }
  71. void InitializePi4ioe() {
  72. ESP_LOGI(TAG, "Init PI4IOE");
  73. pi4ioe_ = new Pi4ioe(i2c_bus_, PI4IOE_ADDR);
  74. pi4ioe_->SetSpeakerMute(false);
  75. }
  76. void InitializeButtons() {
  77. face_button_.OnClick([this]() {
  78. ESP_LOGI(TAG, " ===>>> face_button_.OnClick ");
  79. auto& app = Application::GetInstance();
  80. if (app.GetDeviceState() == kDeviceStateStarting && !WifiStation::GetInstance().IsConnected()) {
  81. ResetWifiConfiguration();
  82. }
  83. app.ToggleChatState();
  84. });
  85. }
  86. public:
  87. AtomMatrixEchoBaseBoard() : face_button_(BOOT_BUTTON_GPIO) {
  88. InitializeI2c();
  89. I2cDetect();
  90. InitializePi4ioe();
  91. InitializeButtons();
  92. }
  93. virtual Led* GetLed() override {
  94. static CircularStrip led(BUILTIN_LED_GPIO, 25);
  95. return &led;
  96. }
  97. virtual AudioCodec* GetAudioCodec() override {
  98. static Es8311AudioCodec audio_codec(
  99. i2c_bus_,
  100. I2C_NUM_1,
  101. AUDIO_INPUT_SAMPLE_RATE,
  102. AUDIO_OUTPUT_SAMPLE_RATE,
  103. AUDIO_I2S_GPIO_MCLK,
  104. AUDIO_I2S_GPIO_BCLK,
  105. AUDIO_I2S_GPIO_WS,
  106. AUDIO_I2S_GPIO_DOUT,
  107. AUDIO_I2S_GPIO_DIN,
  108. AUDIO_CODEC_GPIO_PA,
  109. AUDIO_CODEC_ES8311_ADDR,
  110. false);
  111. return &audio_codec;
  112. }
  113. };
  114. DECLARE_BOARD(AtomMatrixEchoBaseBoard);