Firmware for using the JC3248W535EN 480×320 display (ESP32-S3 based board) together with AIDA64 using the OdoSpace (LCD) output mode. The goal of this project is not to be universal — it is tailored to this specific device and to the way AIDA64 sends frames.
- Connects ESP32-S3 to your Wi-Fi network.
- Opens a TCP server on port 38000 — the same port used by AIDA64 for OdoSpace LCD output.
- Receives PNG frames from AIDA64 and renders them to the 480×320 LCD on JC3248W535EN.
- Turns the screen on only when frames are coming.
- Turns the screen off after 5 seconds of no incoming frames.
- Reconnects to Wi-Fi automatically if the network disappears.
This repository was built specifically for JC3248W535EN. For other panels you will have to adjust at least the pins and the init sequence.
- Board: ESP32-S3 (the boards that ship with this display should all be ESP32-S3-based, so no extra notes here)
- Display: JC3248W535EN
- Resolution: 480 × 320
- Panel driver: bundled custom driver for this panel/controller
- Backlight: controlled from firmware
All pin assignments and display parameters are in:
// components/project_config/user_settings.h
#pragma once
#include "sdkconfig.h"
// Display geometry
#define DISPLAY_W 320
#define DISPLAY_H 480
// 0 - Off /1 - On
#define PANEL_MIRROR 0
// 0 = LE; 1 = BE
#define RGB565_ENDIAN_BE 1
// Auto-off timeout (ms) since last frame
#define AUTO_OFF_MS 5000
// Increase if the image is not fully rendered [1 - DISPLAY_H (e.g. 480px)]
#define LINES_PER_CALL 32
// Should be > DISPLAY_H/LINES_PER_CALL
#define QUEUE_DEPTH 20
#define TCP_PORT 38000
#define WIFI_SSID CONFIG_WIFI_SSID
#define WIFI_PSK CONFIG_WIFI_PSKSo the firmware expects 480×320 (or 320×480) frames.
- Open AIDA64 → Preferences → LCD.
- Choose OdoSpace (LCD) as the display type.
- Set the IP address of your ESP32-S3.
- Keep the port = 38000 (this project listens on that port).
- Enable the LCD output — AIDA64 will start pushing PNGs, ESP32 will wake up and show them.
No custom protocol tweaks are needed — the project uses the standard OdoSpace LCD behavior from AIDA64.
There are two supported ways.
If you build with ESP-IDF or PlatformIO (ESP-IDF mode):
idf.py menuconfigthen go to the project section and set:
CONFIG_WIFI_SSIDCONFIG_WIFI_PSK
The code later uses:
#define WIFI_SSID CONFIG_WIFI_SSID
#define WIFI_PSK CONFIG_WIFI_PSKso it picks up whatever you set in sdkconfig.
In the repo there is a sample config:
sdkconfig.esp32-s3-devkitc-1.example
Rename it to:
sdkconfig.esp32-s3-devkitc-1
(or just sdkconfig, depending on your build flow)
and edit Wi-Fi credentials inside. All other settings in that file are already tuned for this device.
The firmware contains logic to retry Wi-Fi connection endlessly, so if the router reboots or SSID becomes available again — ESP32 should come back online.
idf.py set-target esp32s3
idf.py build
idf.py flash
idf.py monitorMake sure you renamed the example sdkconfig or set Wi-Fi via menuconfig before flashing.
pio run -t menuconfig # set Wi-Fi
pio run
pio run -t upload
pio device monitor- On power-up the screen may stay dark — this is expected.
- The screen turns on when the first valid frame is received.
- If no frames are received for 5 seconds (
AUTO_OFF_MS 5000), the screen is turned off (backlight off / sleep). - TCP server continues to run and will wake the display again when AIDA64 sends the next frame.
This matches the intended usage: the display is only “alive” when the PC is actually sending data.
components/
backlight/ - backlight GPIO control
display/ - high-level display API (init, draw, sleep)
esp_lcd_axs15231b/ - panel driver for this display
img_decode/ - PNG decoding + RGB565 conversion + buffering
net_wifi/ - Wi-Fi STA with auto-reconnect
panel_init_axs15231b/ - init sequence for this exact panel
project_config/ - pins and user_settings.h
tcp_png/ - TCP server on port 38000, PNG framing
src/
main.c - startup, component init, task creation
Everything here is wired specifically for JC3248W535EN and for AIDA64’s way of sending images.