kevin_yuying_313lcd.cc 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #include "wifi_board.h"
  2. #include "audio_codecs/es8311_audio_codec.h"
  3. #include "display/lcd_display.h"
  4. #include "application.h"
  5. #include "button.h"
  6. #include "pin_config.h"
  7. #include "config.h"
  8. #include "iot/thing_manager.h"
  9. #include <wifi_station.h>
  10. #include <esp_log.h>
  11. #include <driver/i2c_master.h>
  12. #include "esp_lcd_gc9503.h"
  13. #include <esp_lcd_panel_io.h>
  14. #include <esp_lcd_panel_ops.h>
  15. #include <esp_lcd_panel_io_additions.h>
  16. #define TAG "Yuying_313lcd"
  17. LV_FONT_DECLARE(font_puhui_30_4);
  18. LV_FONT_DECLARE(font_awesome_30_4);
  19. class Yuying_313lcd : public WifiBoard {
  20. private:
  21. i2c_master_bus_handle_t codec_i2c_bus_;
  22. Button boot_button_;
  23. LcdDisplay* display_;
  24. void InitializeRGB_GC9503V_Display() {
  25. ESP_LOGI(TAG, "Init GC9503V");
  26. esp_lcd_panel_io_handle_t panel_io = nullptr;
  27. ESP_LOGI(TAG, "Install 3-wire SPI panel IO");
  28. spi_line_config_t line_config = {
  29. .cs_io_type = IO_TYPE_GPIO,
  30. .cs_gpio_num = GC9503V_LCD_IO_SPI_CS_1,
  31. .scl_io_type = IO_TYPE_GPIO,
  32. .scl_gpio_num = GC9503V_LCD_IO_SPI_SCL_1,
  33. .sda_io_type = IO_TYPE_GPIO,
  34. .sda_gpio_num = GC9503V_LCD_IO_SPI_SDO_1,
  35. .io_expander = NULL,
  36. };
  37. esp_lcd_panel_io_3wire_spi_config_t io_config = GC9503_PANEL_IO_3WIRE_SPI_CONFIG(line_config, 0);
  38. (esp_lcd_new_panel_io_3wire_spi(&io_config, &panel_io));
  39. ESP_LOGI(TAG, "Install RGB LCD panel driver");
  40. esp_lcd_panel_handle_t panel_handle = NULL;
  41. esp_lcd_rgb_panel_config_t rgb_config = {
  42. .clk_src = LCD_CLK_SRC_PLL160M,
  43. .timings = GC9503_376_960_PANEL_60HZ_RGB_TIMING(),
  44. .data_width = 16, // RGB565 in parallel mode, thus 16bit in width
  45. .bits_per_pixel = 16,
  46. .num_fbs = GC9503V_LCD_RGB_BUFFER_NUMS,
  47. .bounce_buffer_size_px = GC9503V_LCD_H_RES * GC9503V_LCD_RGB_BOUNCE_BUFFER_HEIGHT,
  48. .dma_burst_size = 64,
  49. .hsync_gpio_num = GC9503V_PIN_NUM_HSYNC,
  50. .vsync_gpio_num = GC9503V_PIN_NUM_VSYNC,
  51. .de_gpio_num = GC9503V_PIN_NUM_DE,
  52. .pclk_gpio_num = GC9503V_PIN_NUM_PCLK,
  53. .disp_gpio_num = GC9503V_PIN_NUM_DISP_EN,
  54. .data_gpio_nums = {
  55. GC9503V_PIN_NUM_DATA0,
  56. GC9503V_PIN_NUM_DATA1,
  57. GC9503V_PIN_NUM_DATA2,
  58. GC9503V_PIN_NUM_DATA3,
  59. GC9503V_PIN_NUM_DATA4,
  60. GC9503V_PIN_NUM_DATA5,
  61. GC9503V_PIN_NUM_DATA6,
  62. GC9503V_PIN_NUM_DATA7,
  63. GC9503V_PIN_NUM_DATA8,
  64. GC9503V_PIN_NUM_DATA9,
  65. GC9503V_PIN_NUM_DATA10,
  66. GC9503V_PIN_NUM_DATA11,
  67. GC9503V_PIN_NUM_DATA12,
  68. GC9503V_PIN_NUM_DATA13,
  69. GC9503V_PIN_NUM_DATA14,
  70. GC9503V_PIN_NUM_DATA15,
  71. },
  72. .flags= {
  73. .fb_in_psram = true, // allocate frame buffer in PSRAM
  74. }
  75. };
  76. ESP_LOGI(TAG, "Initialize RGB LCD panel");
  77. gc9503_vendor_config_t vendor_config = {
  78. .rgb_config = &rgb_config,
  79. .flags = {
  80. .mirror_by_cmd = 0,
  81. .auto_del_panel_io = 1,
  82. },
  83. };
  84. const esp_lcd_panel_dev_config_t panel_config = {
  85. .reset_gpio_num = -1,
  86. .rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB,
  87. .bits_per_pixel = 16,
  88. .vendor_config = &vendor_config,
  89. };
  90. (esp_lcd_new_panel_gc9503(panel_io, &panel_config, &panel_handle));
  91. (esp_lcd_panel_reset(panel_handle));
  92. (esp_lcd_panel_init(panel_handle));
  93. display_ = new RgbLcdDisplay(panel_io, panel_handle,
  94. DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X,
  95. DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY,
  96. {
  97. .text_font = &font_puhui_30_4,
  98. .icon_font = &font_awesome_30_4,
  99. .emoji_font = font_emoji_64_init(),
  100. });
  101. }
  102. void InitializeCodecI2c() {
  103. // Initialize I2C peripheral
  104. i2c_master_bus_config_t i2c_bus_cfg = {
  105. .i2c_port = I2C_NUM_0,
  106. .sda_io_num = AUDIO_CODEC_I2C_SDA_PIN,
  107. .scl_io_num = AUDIO_CODEC_I2C_SCL_PIN,
  108. .clk_source = I2C_CLK_SRC_DEFAULT,
  109. .glitch_ignore_cnt = 7,
  110. .intr_priority = 0,
  111. .trans_queue_depth = 0,
  112. .flags = {
  113. .enable_internal_pullup = 1,
  114. },
  115. };
  116. ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_bus_cfg, &codec_i2c_bus_));
  117. }
  118. void InitializeButtons() {
  119. boot_button_.OnClick([this]() {
  120. auto& app = Application::GetInstance();
  121. if (app.GetDeviceState() == kDeviceStateStarting && !WifiStation::GetInstance().IsConnected()) {
  122. ResetWifiConfiguration();
  123. }
  124. });
  125. boot_button_.OnPressDown([this]() {
  126. Application::GetInstance().StartListening();
  127. });
  128. boot_button_.OnPressUp([this]() {
  129. Application::GetInstance().StopListening();
  130. });
  131. }
  132. // 物联网初始化,添加对 AI 可见设备
  133. void InitializeIot() {
  134. auto& thing_manager = iot::ThingManager::GetInstance();
  135. thing_manager.AddThing(iot::CreateThing("Speaker"));
  136. thing_manager.AddThing(iot::CreateThing("Screen"));
  137. }
  138. public:
  139. Yuying_313lcd() : boot_button_(BOOT_BUTTON_GPIO) {
  140. InitializeCodecI2c();
  141. InitializeButtons();
  142. InitializeIot();
  143. InitializeRGB_GC9503V_Display();
  144. GetBacklight()->RestoreBrightness();
  145. }
  146. virtual AudioCodec* GetAudioCodec() override {
  147. static Es8311AudioCodec audio_codec(codec_i2c_bus_, I2C_NUM_0, AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE,
  148. AUDIO_I2S_GPIO_MCLK, AUDIO_I2S_GPIO_BCLK, AUDIO_I2S_GPIO_WS, AUDIO_I2S_GPIO_DOUT, AUDIO_I2S_GPIO_DIN,
  149. AUDIO_CODEC_PA_PIN, AUDIO_CODEC_ES8311_ADDR);
  150. return &audio_codec;
  151. }
  152. virtual Display* GetDisplay() override {
  153. return display_;
  154. }
  155. virtual Backlight* GetBacklight() override {
  156. static PwmBacklight backlight(DISPLAY_BACKLIGHT_PIN, DISPLAY_BACKLIGHT_OUTPUT_INVERT);
  157. return &backlight;
  158. }
  159. };
  160. DECLARE_BOARD(Yuying_313lcd);