kevin_yuying_313lcd.cc 6.1 KB

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