Skip to content

ESP32S3-8048S043C Board Support Package (BSP)

ESP32S3-8048S043C Board Support Package (BSP)

Section titled “ESP32S3-8048S043C Board Support Package (BSP)”

The esp32s3_8048s043c_bsp module is the hardware abstraction layer for the ESP32S3-8048S043C board — a 4.3-inch 800 × 480 capacitive-touch display panel driven by an ST7262 controller over a 16-bit RGB parallel interface. It initialises every hardware peripheral needed by the pendant firmware, wires LVGL to the RGB panel and the GT911 touch controller, implements pixel-clock throttling for safe filesystem access, and registers board-specific custom control events consumed by the UI layer.

This board is the 800 × 480 (4.3-inch) sibling of the 5-inch esp32s3_8048s050c and 7-inch esp32s3_8048s070c variants. It shares the same ST7262 RGB pipeline, VSYNC semaphore pattern, and bsp_accessFs/bsp_releaseFs filesystem-clock patch. Unlike the 7-inch esp32s3_8048_touch_lcd_7, SD card chip-select is routed through a direct GPIO rather than a CH422G I²C IO expander. The parent board module is documented in esp32s3_8048s043c.


  1. Module Overview
  2. Hardware Specifications
  3. Architecture
  4. Component Breakdown
  5. Initialization Flow
  6. Display Subsystem
  7. Touch Subsystem
  8. Filesystem Access Pixel-Clock Patch
  9. Custom Control Events
  10. Public API
  11. Compile-Time Feature Flags
  12. Sibling Modules and References

ItemValue
Board nameESP32S3-8048S043C
MCUESP32-S3
DisplayST7262, 16-bit RGB565 parallel, 800 × 480 px, 4.3 inch
TouchGoodix GT911, capacitive, I²C
IO ExpanderNone — SD card CS routed via direct GPIO
Physical controlsNone (encoder, buttons, switch, potentiometer are NC)
Source directoryboards/esp32s3_8048s043c/components/bsp/
Key source filesboard_init.c, control_types.c
Key header filesboard_init.h, board_config.h, control_event.h, control_types.h, tasks_def.h, disp_st7262_def.h, touch_gt911_def.h, disp_backlight_def.h

The BSP is the only place in the firmware where hardware I/O details live for this board. The rest of the firmware (UI, GCode host, communication transports) is hardware-agnostic and addresses the board solely through the public API exposed by board_init.h and the LVGL handles returned by this module.


ParameterValue
ControllerST7262 (RGB parallel)
Interface16-bit RGB565 parallel (no SPI)
Physical size4.3 inch
Resolution800 × 480 px
Pixel clock (normal)DISPLAY_PCLK_FREQ_HZ (defined in board_config.h)
Pixel clock (FS access)DISPLAY_PATCH_FS_FREQ_HZ (reduced for SD/flash safety)
Color formatRGB565
Byte swapControlled by DISPLAY_SWAP_COLOR_FLAG
Frame buffer locationPSRAM (fb_in_psram = true)
LVGL draw bufferSingle or double, allocated in SPIRAM (MALLOC_CAP_SPIRAM)
LVGL render modeLV_DISPLAY_RENDER_MODE_PARTIAL
ParameterValue
ControlPWM (LEDC)
Default levelBACKLIGHT_DEFAULT_LEVEL_PCT (defined in board_config.h)
Startup sequenceSet to 0 before display init; restored to default after LVGL init
ParameterValue
ControllerGT911 (capacitive)
InterfaceI²C
I²C busDedicated (no expander sharing on this board)
Read interval10 ms (LVGL indev timer period)
Coordinate mappingraw_x × DISPLAY_WIDTH_PX / gt911_get_x_max()

All physical control GPIOs are set to GPIO_NUM_NC. There are no physical buttons, encoder, switch, or potentiometer on this board. The control events framework is retained so upper UI layers (shared across all boards) compile without modification and handle emulated input through the touch UI.


UI_Framework

Core_Platform

ESP-IDF / FreeRTOS

Hardware_Peripheral_Drivers

esp32s3_8048s043c_bsp

configures

configures

uses

configures

registers VSYNC callback

creates tick timer

allocates buffers from

calls

logs via

snapshot hook in flush

creates lv_display_t

creates lv_indev_t

registers custom events

acquires lock, calls lv_timer_handler

calls board_init

board_init.c

control_types.c

control_event.h

disp_st7262

(RGB panel driver)

disp_backlight

(PWM backlight)

touch_gt911

(I2C touch)

bus_i2c

(I2C bus)

esp_lcd_rgb_panel

esp_timer

LEDC / PWM

I2C driver

heap_caps (SPIRAM)

activity_manager

esp3d_log

esp3d_snapshot (optional)

LVGL

UIManager / tft_ui_task

Semaphores

LVGL Task - Core 1

ISR Context (VSYNC)

Take sem_gui_ready

Give sem_vsync_end

Give sem_gui_ready

Wait sem_vsync_end

esp_lcd_panel_draw_bitmap

lv_tick_inc every LVGL_TICK_PERIOD_MS

touch_gt911_read

activity_process_event

disp_on_vsync_event

lvgl_flush_cb

increase_lvgl_tick

touch_read_cb

sem_gui_ready

sem_vsync_end

RGB Panel DMA

LVGL core timer

GT911 driver

activity_manager


The central initialisation source file. Contains all module-level state variables and all callback functions needed to drive LVGL on this board.

VariableTypePurpose
lvgl_api_lock_lock_tMutex protecting LVGL API calls from concurrent access
lvgl_displaylv_display_t *LVGL display handle
lvgl_buf1lv_color16_t *Primary LVGL draw buffer (SPIRAM)
lvgl_buf2lv_color16_t *Secondary draw buffer (SPIRAM, double-buffer mode only)
lvgl_tick_timeresp_timer_handle_tPeriodic timer driving lv_tick_inc()
touch_indevlv_indev_t *LVGL input device handle for the GT911
disp_panelesp_lcd_panel_handle_tESP-LCD RGB panel handle
sem_vsync_endSemaphoreHandle_tBinary semaphore: VSYNC ISR releases the flush pipeline
sem_gui_readySemaphoreHandle_tBinary semaphore: flush signals readiness to the VSYNC ISR
FunctionScopeDescription
board_init()PublicTop-level entry: initialises activity manager, backlight, ST7262, I²C bus, GT911, LVGL, and control events
init_lvgl()StaticCreates LVGL display, allocates SPIRAM draw buffers, registers flush callback, starts tick timer, creates touch indev
init_touch_controller()StaticInitialises I²C bus, then configures GT911
lvgl_flush_cb()StaticLVGL flush callback: optional snapshot write → optional color swap → VSYNC sync → draw_bitmap → flush_ready
disp_on_vsync_event()Static (ISR)RGB panel VSYNC ISR — synchronises with lvgl_flush_cb via the semaphore pair
touch_read_cb()StaticLVGL indev read callback — reads GT911, maps coordinates, handles wake-up touch suppression
increase_lvgl_tick()Staticesp_timer callback — calls lv_tick_inc(LVGL_TICK_PERIOD_MS)
bsp_accessFs()Public (conditional)Reduces pixel clock to DISPLAY_PATCH_FS_FREQ_HZ before flash/SD I/O
bsp_releaseFs()Public (conditional)Restores pixel clock to DISPLAY_PCLK_FREQ_HZ after flash/SD I/O
get_lvgl_display()PublicReturns lvgl_display handle for use by ESP3DXUi
get_lvgl_lock()PublicReturns &lvgl_api_lock for thread-safe LVGL access
get_touch_indev()PublicReturns touch_indev handle
board_get_name()PublicReturns board name string (BOARD_NAME_STR)
board_get_version()PublicReturns board version string (BOARD_VERSION_STR)

Defines the control_event_t structure — the common payload dispatched through the LVGL event system for all hardware input events on this board.

typedef struct {
lv_indev_t *indev; // LVGL input device that generated the event
uint32_t btn_id; // Button / control index
lv_indev_type_t type; // LVGL indev type (pointer, button, encoder…)
control_family_t family_id; // Which hardware family generated the event
int32_t steps; // Encoder step count (signed)
uint32_t press_duration; // How long the control was held (ms)
} control_event_t;

Because all physical control GPIOs are GPIO_NUM_NC on this board, events with non-touch family IDs are only generated by emulated virtual controls in the upper UI layer. Screens receive control_event_t * via lv_event_get_param().

Declares and registers three custom LVGL event codes beyond the built-in set. These are assigned real IDs by lv_event_register_id() inside control_events_init(), which board_init() calls at the tail of its sequence — after lv_init() has run inside init_lvgl().

EventPurpose
LV_EVENT_SWITCH_PRESSEDPhysical 4-position switch moved to a new position
LV_EVENT_SWITCH_RELEASEDPhysical 4-position switch released
LV_EVENT_POTENTIOMETER_CHANGEDAnalog potentiometer value changed

All three are initialised to the sentinel LV_EVENT_ALL at file scope and receive valid IDs only after control_events_init() runs. Calling it before lv_init() would cause all three IDs to collide at LV_EVENT_ALL.

All hardware constants are separated into dedicated *_def.h headers so that board_init.c remains free of magic numbers.

HeaderContents
board_config.hAll GPIO assignments, pixel clock frequencies, display resolution, I²C pins and frequency, SD pins — single authoritative pin-map for this board
tasks_def.hFreeRTOS task stack sizes, core affinities, priorities, LVGL_TICK_PERIOD_MS
disp_st7262_def.hComplete disp_st7262_config_t wired from board_config.h, including RGB timing parameters
touch_gt911_def.hComplete touch_gt911_config_t wired from board_config.h, including axis swap/mirror flags
disp_backlight_def.hbacklight_config_t wired from board_config.h, PWM timer/channel/frequency/resolution

control_events_init()init_lvgl()touch_gt911_configure()bus_i2c_init()init_touch_controller()disp_st7262_configure()backlightactivity_managerboard_init()app_main / ESP3DX::begin()control_events_init()init_lvgl()touch_gt911_configure()bus_i2c_init()init_touch_controller()disp_st7262_configure()backlightactivity_managerboard_init()app_main / ESP3DX::begin()board_init()activity_manager_init()ESP_OKbacklight_configure(&backlight_cfg)ESP_OKbacklight_set(0) ← screen off during initdisp_st7262_configure(&config, &disp_panel)disp_panel handleinit_touch_controller()bus_i2c_init(I2C_PORT_IDX, SDA, SCL, freq)ESP_OKtouch_gt911_configure(&touch_gt911_default_config)ESP_OKESP_OKinit_lvgl()lv_init()xSemaphoreCreateBinary × 2register disp_on_vsync_event callbacklv_display_create(800, 480)heap_caps_malloc(SPIRAM) - buf1 [+ buf2]lv_display_set_buffers / flush_cb / color_formatesp_timer_start_periodic (lvgl_tick)lv_indev_create(POINTER) + touch_read_cb, 10 ms periodESP_OKbacklight_set(BACKLIGHT_DEFAULT_LEVEL_PCT) ← screen oncontrol_events_init()event IDs registeredESP_OK

Failure handling: Every sub-step returns esp_err_t. board_init() returns on the first non-ESP_OK result and logs the failing subsystem via esp3d_log_e. LVGL semaphore and buffer allocations are individually checked — a partial allocation frees what was already allocated before returning ESP_ERR_NO_MEM.


The ST7262 panel is driven over the ESP32-S3 RGB parallel interface (esp_lcd_rgb_panel). Unlike SPI panels, the RGB DMA engine streams pixel data continuously from a framebuffer in PSRAM. The full pipeline from LVGL rendering to panel output is:

yes

no

yes

no

unblocks at safe VSYNC boundary

LVGL renders partial area

(Core 1 - LVGL task)

lvgl_flush_cb() invoked

with area rect + px_map

ESP3D_SNAPSHOT_FEATURE?

Write pixels to snapshot file

(120-byte chunks via fwrite)

DISPLAY_SWAP_COLOR_FLAG?

lv_draw_sw_rgb565_swap()

swap R/B byte order in-place

xSemaphoreGive(sem_gui_ready)

signal readiness to VSYNC ISR

xSemaphoreTake(sem_vsync_end, MAX)

block until VSYNC fires

esp_lcd_panel_draw_bitmap()

push buffer to panel DMA

lv_display_flush_ready()

notify LVGL - render next area

disp_on_vsync_event() [ISR]

xSemaphoreTake(sem_gui_ready)

xSemaphoreGive(sem_vsync_end)

RGB panels on the ESP32-S3 stream pixel data from a single shared framebuffer. If LVGL writes new pixel data while a scanline is being output, tearing is visible. The BSP avoids this with a binary semaphore pair:

SemaphoreDirectionRole
sem_gui_readyflush → ISRSignals that the LVGL buffer contains new data ready for DMA transfer
sem_vsync_endISR → flushSignals that the VSYNC blanking window has opened — safe to transfer

lvgl_flush_cb gives sem_gui_ready, then blocks on sem_vsync_end. The VSYNC ISR (disp_on_vsync_event) takes sem_gui_ready and gives sem_vsync_end, releasing the flush exactly at the blanking window. This ensures every DMA write-back starts on a scanline boundary, eliminating tearing.

ISR constraint: disp_on_vsync_event runs in interrupt context. It uses xSemaphoreTakeFromISR / xSemaphoreGiveFromISR and returns the high_task_awoken flag so FreeRTOS can reschedule if a higher-priority task was unblocked. The ISR body contains no blocking calls and no logging.

Both draw buffers are allocated from SPIRAM (MALLOC_CAP_SPIRAM) to preserve the scarce internal DRAM for FreeRTOS stacks and the LVGL object heap.

Build flagBuffer countBehaviour
DISPLAY_USE_DOUBLE_BUFFER_FLAG = 01 × DISP_BUF_SIZE_BYTESSingle buffer — simpler, lower PSRAM usage
DISPLAY_USE_DOUBLE_BUFFER_FLAG = 12 × DISP_BUF_SIZE_BYTESDouble buffer — LVGL can render next area while DMA is active

Both modes use LV_DISPLAY_RENDER_MODE_PARTIAL. LVGL divides the display into horizontal strips and calls lvgl_flush_cb once per strip. DISP_BUF_SIZE_BYTES is defined in board_config.h.

Memory rule: Never call heap_caps_malloc from within lvgl_flush_cb or touch_read_cb. See docs/guides/esp32_memory_constraints.md.

When ESP3D_SNAPSHOT_FEATURE is enabled, lvgl_flush_cb intercepts each partial-buffer flush and appends raw pixel data to an open file (g_snapshot.file), building a full-screen raw RGB565 capture strip by strip.

Key implementation details:

  • Writes are done in 120-byte chunks to avoid large stack allocations under memory pressure
  • The global g_snapshot.mutex is taken non-blocking — if unavailable, the flush proceeds without capturing that strip
  • g_snapshot.captured_pixels is compared against g_snapshot.expected_pixels; capture ends automatically when equal
  • Any fwrite error sets g_snapshot.error = true and clears g_snapshot.ongoing
  • fflush() is called after each successful write for durability
  • The snapshot path runs before the VSYNC semaphore exchange — byte-swap and DMA transfer proceed normally after the capture write

For the snapshot_state_t type and the snapshot controller, see main/display/esp3d_snapshot.h (ui_core).


The GT911 capacitive touch controller is configured via touch_gt911_configure() using the board-specific touch_gt911_default_config struct from touch_gt911_def.h. Key properties:

  • I²C address: Auto-detected by probing the candidate address list (typically {0x5D, 0x14, 0})
  • Resolution: Auto-read from GT911 firmware via touch_gt911_get_x_max() / touch_gt911_get_y_max() — not hardcoded
  • Axis mapping: swap_xy, invert_x, invert_y set per board wiring in board_config.h

In touch_read_cb, raw GT911 coordinates are mapped to the logical display resolution at read time:

uint16_t x = touch_data.x * DISPLAY_WIDTH_PX / touch_gt911_get_x_max();
uint16_t y = touch_data.y * DISPLAY_HEIGHT_PX / touch_gt911_get_y_max();

The LVGL indev read timer period is set to 10 ms via lv_timer_set_period(lv_indev_get_read_timer(touch_indev), 10).

The touch callback integrates with the activity_manager to implement screen-wake-from-sleep behaviour. The first touch event after an idle period wakes the screen but is not forwarded to LVGL widgets, preventing accidental button activations on wake-up.

Yes

Yes

Yes

No

No held

No

Yes

No

No

Yes

Yes

No

LVGL indev timer fires (10 ms)

touch_read_cb()

touch_gt911_read()

is_pressed?

first press?

last_pressed_state == false

activity_process_event()

returns true?

screen already awake

touch_consumed_for_wakeup = false

Map coords → state = PRESSED

touch_consumed_for_wakeup = true

state = RELEASED

(wake-up suppressed)

touch_consumed_for_wakeup?

Update coords → state = PRESSED

state = RELEASED

(drag suppressed)

last_pressed_state == true?

state = RELEASED

touch_consumed_for_wakeup?

Clear flag

last_pressed_state = false

state = RELEASED

activity_process_event()

last_pressed_state = false

state = RELEASED

Wake-up isolation: touch_consumed_for_wakeup is set on the first press that woke the screen. While the flag is set, both press and drag events are reported as RELEASED to LVGL, so the waking gesture cannot trigger any UI action. The flag clears on finger lift.

For ActivitySubscriber and activity_manager_init(), see bsp_board_initialization.


On ESP32-S3 boards with RGB parallel displays, simultaneous SD/flash SPI DMA and the RGB pixel-clock signal can interfere at the memory bus level, causing a visible vertical drift artifact on the display or SPI read errors. The BSP implements a pixel-clock throttle gated by ESP3D_PATCH_FS_ACCESS_RELEASE.

esp_lcd_rgb_panelBSPFilesystem Layer\n(ESP3DFlash::accessFS / ESP3DSd::accessFS)esp_lcd_rgb_panelBSPFilesystem Layer\n(ESP3DFlash::accessFS / ESP3DSd::accessFS)bsp_accessFs()esp_lcd_rgb_panel_set_pclk(DISPLAY_PATCH_FS_FREQ_HZ)vTaskDelay(DISPLAY_PATCH_FS_DELAY_MS)ESP_OKSD / flash read or writebsp_releaseFs()esp_lcd_rgb_panel_set_pclk(DISPLAY_PCLK_FREQ_HZ)vTaskDelay(DISPLAY_PATCH_FS_DELAY_MS)ESP_OK

The delay allows the RGB panel PLL to stabilise and the DMA pipeline to flush before normal display operation resumes. Both functions guard against a NULL panel handle and return ESP_OK immediately if the display was not initialized.

See docs/architecture/display_drivers.md and docs/guides/esp32_memory_constraints.md for the full rationale and recommended clock values.


control_types.c registers three board-level custom LVGL event codes, allowing the application to dispatch hardware input events through the standard LVGL lv_event_send() / lv_obj_add_event_cb() API.

family_id

control_event_t

+lv_indev_t* indev

+uint32_t btn_id

+lv_indev_type_t type

+control_family_t family_id

+int32_t steps

+uint32_t press_duration

«enumeration»

control_family_t

CONTROL_FAMILY_BUTTONS = 0

CONTROL_FAMILY_SWITCH

CONTROL_FAMILY_TOUCH

CONTROL_FAMILY_ENCODER

CONTROL_FAMILY_POTENTIOMETER

Global variableTrigger
LV_EVENT_SWITCH_PRESSEDDispatched when a 4-position switch moves to a new position
LV_EVENT_SWITCH_RELEASEDDispatched when the switch is released
LV_EVENT_POTENTIOMETER_CHANGEDDispatched when an analog potentiometer value changes

All three are initialised to LV_EVENT_ALL (invalid sentinel) at file scope and receive valid IDs from lv_event_register_id() when control_events_init() is called — which board_init() does at the tail of its sequence, after lv_init() has run.

Because this board has no physical switch or potentiometer, these events are defined for API compatibility with shared upper-layer code and will not be generated by hardware interrupts.


All symbols below are declared in board_init.h.

esp_err_t board_init(void);

Top-level board initialisation. Orchestrates the full hardware bringup in dependency order: activity manager → backlight → ST7262 → I²C → GT911 → LVGL → control events. Must be called once before any LVGL or hardware API is used. Returns ESP_OK on success, or the first failing subsystem’s error code.


esp_err_t bsp_accessFs(void);
esp_err_t bsp_releaseFs(void);

Throttle and restore the RGB pixel clock around filesystem I/O. Called by ESP3DFlash::accessFS() and ESP3DSd::accessFS(). Only compiled when ESP3D_PATCH_FS_ACCESS_RELEASE is enabled. bsp_releaseFs() must be paired with every bsp_accessFs() call.


lv_display_t *get_lvgl_display(void);

Returns the LVGL display handle created during board_init(). Used by tft_ui_task in the UI Framework. Returns NULL when ESP3D_DISPLAY_FEATURE is disabled.


_lock_t *get_lvgl_lock(void);

Returns a pointer to the LVGL API mutex. The UI task acquires this lock around all lv_* API calls to protect against concurrent access from other tasks. Returns NULL when ESP3D_DISPLAY_FEATURE is disabled.


lv_indev_t *get_touch_indev(void);

Returns the LVGL touch input device handle. Only compiled when ESP3D_TOUCH_FEATURE is enabled.


const char *board_get_name(void);
const char *board_get_version(void);

Return the board identification strings defined in board_config.h. Used in log output and system-info screens.


void control_events_init(void);

Registers the three custom LVGL event IDs. Called automatically by board_init() after lv_init() — do not call directly.


FlagEffect when enabled
ESP3D_DISPLAY_FEATUREEnables the full display + LVGL pipeline
ESP3D_TOUCH_FEATUREEnables GT911 init, lv_indev registration, and touch_read_cb
ESP3D_BRIGHTNESS_CONTROL_FEATUREEnables PWM backlight control via disp_backlight
ESP3D_PATCH_FS_ACCESS_RELEASEEnables pixel-clock throttle during filesystem I/O
ESP3D_SNAPSHOT_FEATUREEnables in-flush pixel capture to SD file
DISPLAY_USE_DOUBLE_BUFFER_FLAGAllocates a second SPIRAM draw buffer for LVGL
DISPLAY_SWAP_COLOR_FLAGAdds an RGB565 byte-swap pass in lvgl_flush_cb

Feature macros are defined via CMakeLists.txt OPTION() declarations and converted to C preprocessor defines by cmake/features.cmake. Mutual-exclusion rules are enforced in cmake/sanity_check.cmake.


Sub-moduleDocumentationPurpose
Factory Appesp32s3_8048s043c_factoryRecovery partition: OTA flashing, UI resources update, touch-navigable menu
Build Scriptsesp32s3_8048s043cVariant matrix, build automation, sdkconfig management
Section titled “Related BSP Modules (RGB Parallel Pipeline)”
BoardDisplaySizePanelDirect SD CSFS patchDoc
esp32s3_8048s043c800×4804.3”ST7262YesYes(this doc)
esp32s3_8048s050c800×4805”ST7262YesYesesp32s3_8048s050c
esp32s3_8048s070c800×4807”ST7262YesYesesp32s3_8048s070c
esp32s3_8048_touch_lcd_7800×4807”ST7262No (CH422G)Yesesp32s3_8048_touch_lcd_7_bsp
esp32s3_4827s043c480×2724.3”ILI9485YesYesesp32s3_4827s043c_bsp

Key distinction from esp32s3_8048_touch_lcd_7: That board routes SD CS through CH422G EXIO3 (I²C expander), requiring the expander to be initialised in init_touch_controller() before any SD access. This board uses a direct GPIO for SD CS and has no expander in the BSP layer.

ConsumerUses from this BSP
UI Framework — esp3d_x_ui.cppget_lvgl_display(), get_lvgl_lock(), get_touch_indev()
Storage Layer — ESP3DFlash, ESP3DSdbsp_accessFs(), bsp_releaseFs()
Core Platform — main.cppboard_init(), board_get_name(), board_get_version()
ModuleUsed by this BSP
display_drivers_rgbdisp_st7262 (RGB parallel driver)
bsp_board_initialization_displaydisp_backlight (PWM backlight)
touch_controllerstouch_gt911
bus_driversbus_i2c (I²C bus for GT911)
bsp_control_eventsCustom LVGL event framework
DocumentRelevance
docs/architecture/display_drivers.mdRGB parallel vs SPI driver architecture, swap_xy semantics, FS patch rationale
docs/architecture/screens_architecture.mdLVGL screen management built on top of this BSP
docs/guides/esp32_memory_constraints.mdSPIRAM, DRAM constraints, pixel-clock recommendations
docs/guides/esp3d_log_guide.mdesp3d_log / esp3d_log_e usage patterns in this module
docs/features/feature_resource_matrix.mdRAM budget and feature compatibility per SKU

components/bsp/lv_conf.h was regenerated from the LVGL 9.6.0 template (Configuration file for v9.6.0), and the sdkconfig files set CONFIG_LV_CONF_SKIP=n so this file is actually used (see Board_Support_Packages.md). The project values are kept (LV_MEM_SIZE 48 KB, monitors positions), LV_USE_COLOR_FILTER is 0 (color filters are not used: pressed feedback is a darker local style, see ui_components.md). LV_COLOR_DEPTH is no longer set in the file: LVGL takes CONFIG_LV_COLOR_DEPTH, or 16 by default.