#include "wifi_board.h" #include "codecs/box_audio_codec.h" #include "display/lcd_display.h" #include "system_reset.h" #include "application.h" #include "button.h" #include "config.h" #include #include "i2c_device.h" #include #include #include #include #include #include #include #include "esp_io_expander_tca9554.h" #include "esp_lcd_axs15231b.h" #include "custom_lcd_display.h" #include #define TAG "waveshare_lcd_3_39" static const axs15231b_lcd_init_cmd_t lcd_init_cmds[] = { {0x11, (uint8_t []){0x00}, 0, 100}, {0x29, (uint8_t []){0x00}, 0, 100}, }; class CustomBoard : public WifiBoard { private: Button boot_button_; Button pwr_button_; i2c_master_bus_handle_t i2c_bus_; esp_io_expander_handle_t io_expander = NULL; LcdDisplay* display_; i2c_master_dev_handle_t disp_touch_dev_handle = NULL; lv_indev_t *touch_indev = NULL; //touch bool is_PwrControlEn = false; void InitializeI2c() { // Initialize I2C peripheral i2c_master_bus_config_t i2c_bus_cfg = { .i2c_port = (i2c_port_t)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, &i2c_bus_)); } void InitializeTca9554(void) { esp_err_t ret = esp_io_expander_new_i2c_tca9554(i2c_bus_, ESP_IO_EXPANDER_I2C_TCA9554_ADDRESS_000, &io_expander); if(ret != ESP_OK) ESP_LOGE(TAG, "TCA9554 create returned error"); ret = esp_io_expander_set_dir(io_expander, IO_EXPANDER_PIN_NUM_7 | IO_EXPANDER_PIN_NUM_6, IO_EXPANDER_OUTPUT); ESP_ERROR_CHECK(ret); vTaskDelay(pdMS_TO_TICKS(100)); ret = esp_io_expander_set_level(io_expander, IO_EXPANDER_PIN_NUM_7 | IO_EXPANDER_PIN_NUM_6, 1); ESP_ERROR_CHECK(ret); } void InitializeSpi() { ESP_LOGI(TAG, "Initialize QSPI bus"); spi_bus_config_t buscfg = {}; buscfg.data0_io_num = LCD_D0; buscfg.data1_io_num = LCD_D1; buscfg.data2_io_num = LCD_D2; buscfg.data3_io_num = LCD_D3; buscfg.sclk_io_num = LCD_PCLK; buscfg.max_transfer_sz = LVGL_DMA_BUFF_LEN; ESP_ERROR_CHECK(spi_bus_initialize(SPI3_HOST, &buscfg, SPI_DMA_CH_AUTO)); } void InitializeLcdDisplay() { esp_lcd_panel_io_handle_t panel_io = nullptr; esp_lcd_panel_handle_t panel = nullptr; // RESET PIN INIT gpio_config_t gpio_conf = {}; gpio_conf.intr_type = GPIO_INTR_DISABLE; gpio_conf.mode = GPIO_MODE_OUTPUT; gpio_conf.pin_bit_mask = ((uint64_t)0x01<0 && buff[1]<5) { indevData->state = LV_INDEV_STATE_PRESSED; if(pointX > DISPLAY_WIDTH) pointX = DISPLAY_WIDTH; if(pointY > DISPLAY_HEIGHT) pointY = DISPLAY_HEIGHT; indevData->point.x = pointY; indevData->point.y = (DISPLAY_HEIGHT-pointX); ESP_LOGE("Touch","(%ld,%ld)",indevData->point.x,indevData->point.y); } else { indevData->state = LV_INDEV_STATE_RELEASED; } } void GetPwrCurrentState() { if(gpio_get_level(PWR_BUTTON_GPIO)) { is_PwrControlEn = true; } } public: CustomBoard() : boot_button_(BOOT_BUTTON_GPIO), pwr_button_(PWR_BUTTON_GPIO) { InitializeI2c(); InitializeTca9554(); InitializeSpi(); InitializeLcdDisplay(); InitializeButtons(); InitializeTouch(); GetPwrCurrentState(); GetBacklight()->RestoreBrightness(); } virtual AudioCodec* GetAudioCodec() override { static BoxAudioCodec audio_codec( i2c_bus_, 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, AUDIO_CODEC_ES7210_ADDR, AUDIO_INPUT_REFERENCE); return &audio_codec; } virtual Display* GetDisplay() override { return display_; } virtual Backlight* GetBacklight() override { static PwmBacklight backlight(DISPLAY_BACKLIGHT_PIN, DISPLAY_BACKLIGHT_OUTPUT_INVERT); return &backlight; } }; DECLARE_BOARD(CustomBoard);