# ESP LCD ST77916 QSPI 圆屏组件

本地 ST77916 QSPI 圆屏驱动组件，统一管理 1.8 寸与 2.1 寸 360x360 圆屏的初始化表，仅保留 ESP32-S3 QSPI 使用路径。

| 屏型号 | 控制器 | 分辨率 | 接口 | 初始化表符号 |
| :---: | :---: | :---: | :---: | :--- |
| 1.8 寸 BOE | ST77916 | 360x360 | QSPI | `st77916_1_8in_boe_init_cmds` |
| 2.1 寸 BOE | GC9B72 | 360x360 | QSPI | `st77916_2_1in_boe_init_cmds` |

> 2.1 寸屏控制器虽为 GC9B72，但 QSPI 命令封装与 ST77916 完全一致，可复用同一份 panel 驱动。
> 两种屏的 QSPI 引脚、CS、PCLK、RST、背光、触摸引脚定义完全相同，切换屏型号无需改硬件接线。

本组件从 Espressif `esp_lcd_st77916` v2.0.2 精简而来，只保留本项目需要的 QSPI 路径：

- `ST77916_PANEL_BUS_QSPI_CONFIG`
- `ST77916_PANEL_IO_QSPI_CONFIG`
- `esp_lcd_new_panel_st77916`
- 1.8 寸 BOE 初始化表 `esp_lcd_st77916_1_8in.h`
- 2.1 寸 BOE 初始化表 `esp_lcd_st77916_2_1in.h`

## 选择目标屏型号

在 `main/boards/esp32s3_hl_audio/config.h` 中修改宏 `BOARD_PANEL_2_1IN`：

```c
/* 屏型号选择：0 = 1.8寸 ST77916 BOE，1 = 2.1寸 GC9B72 BOE */
#define BOARD_PANEL_2_1IN       0
```

`esp32s3_hl_audio` 板级实现直接包含本组件的 `esp_lcd_st77916_1_8in.h` 和
`esp_lcd_st77916_2_1in.h`，不再维护板级目录内的重复初始化表。改完保存重新
`idf.py build && idf.py flash` 即可。

## 初始化示例

```c
#include "esp_lcd_st77916.h"

#if BOARD_PANEL_2_1IN
#include "esp_lcd_st77916_2_1in.h"
#define INIT_CMDS       st77916_2_1in_boe_init_cmds
#define INIT_CMDS_SIZE  ST77916_2_1IN_BOE_INIT_CMDS_SIZE
#else
#include "esp_lcd_st77916_1_8in.h"
#define INIT_CMDS       st77916_1_8in_boe_init_cmds
#define INIT_CMDS_SIZE  ST77916_1_8IN_BOE_INIT_CMDS_SIZE
#endif

const spi_bus_config_t bus_cfg = ST77916_PANEL_BUS_QSPI_CONFIG(
    LCD_PIN_PCLK,
    LCD_PIN_DATA0,
    LCD_PIN_DATA1,
    LCD_PIN_DATA2,
    LCD_PIN_DATA3,
    LCD_H_RES * LCD_V_RES * sizeof(uint16_t)
);
ESP_ERROR_CHECK(spi_bus_initialize(LCD_SPI_HOST, &bus_cfg, SPI_DMA_CH_AUTO));

const esp_lcd_panel_io_spi_config_t io_cfg =
    ST77916_PANEL_IO_QSPI_CONFIG(LCD_PIN_CS, NULL, NULL);

esp_lcd_panel_io_handle_t io_handle = NULL;
ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)LCD_SPI_HOST,
                                         &io_cfg,
                                         &io_handle));

const st77916_vendor_config_t vendor_cfg = {
    .init_cmds = INIT_CMDS,
    .init_cmds_size = INIT_CMDS_SIZE,
};

const esp_lcd_panel_dev_config_t panel_cfg = {
    .reset_gpio_num = LCD_PIN_RST,
    .rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB,
    .bits_per_pixel = 16,
    .vendor_config = (void *)&vendor_cfg,
};

esp_lcd_panel_handle_t panel_handle = NULL;
ESP_ERROR_CHECK(esp_lcd_new_panel_st77916(io_handle, &panel_cfg, &panel_handle));
ESP_ERROR_CHECK(esp_lcd_panel_reset(panel_handle));
ESP_ERROR_CHECK(esp_lcd_panel_init(panel_handle));
ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_handle, true));
```

## 添加新屏型号

如需新增其它 ST77916/GC9B72 系列屏，可仿照 `esp_lcd_st77916_2_1in.c` 添加初始化数据文件，
然后在 main 程序里把宏开关扩展成多分支即可（或改用 enum/Kconfig）。
