This repo documents the HD-WF4 control card hardware as it exists in the real world (and as shipped), with a focus on:
- Using it as a cheap ESP32-S3 dev board (even with no LED panels attached).
- Using it as a 4x HUB75E output board (X1..X4), including the WF4-specific latch/enable behaviour.
Not WF2 / Not WF1. This is specifically for HD-WF4 boards (example shown: silkscreen
HD-WF4 v7.0.1-1).
According to the HD-WF4 specifications, WF4 is a Wi-Fi control card with 4x HUB75E interfaces, supports updating programs via Wi-Fi and U-disk, and is designed for LED signage use. LED Designer
Key spec highlights (from the WF4 spec PDFs):
- 4x HUB75E ports on board LED Designer
- Flash: 8 MB Huidu
- Update/program transfer via Wi-Fi and U-disk Huidu
- Control range listed as 768×128 (max width 1280; max height 256) Huidu
- Power: 5V (terminal block power input; some docs mention micro-USB as a power method depending on revision/doc version) Huidu
This board has two board-level enable pins that gate HUB75 output:
- GPIO45 must be driven HIGH to enable the X1/X2 side
- GPIO14 must be driven HIGH to enable the X3/X4 side
This is not a panel feature — it’s WF4 board hardware. If these aren’t high, you can toggle HUB75 signals in firmware and see nothing on the connectors.
This section documents the actual chips present on the HD‑WF4 board, based on board inspection and behaviour in use. This is intentionally practical (what they do, why they matter), not marketing-level.
- The main MCU is an Espressif ESP32‑S3.
- Provides dual-core Xtensa LX7 CPU, Wi‑Fi, USB Serial/JTAG, and sufficient GPIO for HUB75 driving.
- USB D+/D− are wired to the USB connector, enabling native USB flashing and debugging (no USB‑UART bridge).
- The board uses a cFeon QH64A‑104HIP SPI NOR flash.
- Capacity: 8 MB.
- This flash requires DIO mode for reliable operation.
When using PlatformIO, the following is required:
board_build.flash_mode = dio
If qio is used, the filesystem may fail to mount or behave unreliably. With dio, the flash and FS behave correctly.
This is a board-specific requirement and not an ESP32-S3 limitation.
- The board uses four 74HC573 octal transparent latches.
- These are used on the HUB75 data/address/control paths.
What they do in practice:
- Isolate the ESP32 GPIOs from the HUB75 connectors.
- Two ICs marked DP245C are present on the board.
- No public datasheet has been found at the time of writing.
Based on placement and routing, they are likely used for:
- Bus buffering or signal conditioning
- Possibly direction-controlled data buffering between the ESP32 and HUB75 latch stages
These parts appear to be board-internal glue logic and do not require any direct firmware interaction.
This repo treats them as a hardware implementation detail unless further reverse-engineering proves otherwise.
- The board includes a BM8563 CMOS RTC.
- A coin-cell battery holder is present, providing time retention across power loss.
Practical implications:
- Timekeeping continues when the board is powered off.
- Useful for signage schedules, timestamps, or standalone operation without NTP.
The BM8563 is an I²C RTC and can be accessed from user firmware if desired.
- Main input power: 5 V (terminal block).
- USB provides data connectivity; power behaviour depends on board revision and load.
- RTC has its own battery-backed domain.
Detailed power-path reverse engineering is intentionally left for a later section once fully confirmed across revisions.
The HD‑WF4 is not just an ESP32-S3 breakout:
- External latches and glue logic shape HUB75 timing.
- Flash configuration matters (
diois required). - RTC + battery enables real standalone behaviour.
Treating it as a generic ESP32-S3 board without acknowledging these parts is the root cause of most WF4 bring-up issues.
The ESP32-S3 has built-in USB Serial/JTAG, so a single USB connection to the D+/D- pins is enough for flashing/debugging on boards that wire USB correctly. Espressif Systems
On HD-WF4, the USB socket is wired for USB data, so you can flash over USB (no external USB-UART required).
For the very first time flashing your own firmware:
- Press S1 (the only button on the board) and keep it pressed before powering on.
If the board won’t accept uploads:
- Put jumpers on P2 and S4 at the same time
This forces the board into a “load mode” so you can upload again via USB.
(These two behaviours are based on hands-on WF4 use and should be treated as “field notes”, not vendor spec.)
On macOS / PlatformIO, the board shows up as a USB serial/JTAG device, e.g.:
The 303A:1001 identifier corresponds to Espressif’s USB JTAG debug unit USB ID. GitHub
-
img/
Board photos + the pinout images (all created from/for a real WF4 board). -
hd_wf4_pins.h
A practical pin definition header for the HD-WF4 that matches the pinout image and includes:wf4_init()– enables both WF4 latch/enable pins (GPIO45 + GPIO14)wf4_disable_outputs()– disables all HUB75 outputs- convenience macros for typical HUB75 pin-struct initializers
Include it and call wf4_init() before any HUB75 driver init:
#include "hd_wf4_pins.h"
void setup() {
wf4_init(); // REQUIRED on WF4 before driving any HUB75 connector
// ... your HUB75 init here ...
}This repo is intentionally docs-first. It’s meant to be correct and useful even before any full driver exists.
Drivers and examples can live:
- here later, or
- in separate driver repos that link back here as the canonical hardware reference.
- WF4 spec PDF (V6.0.1) Huidu
- WF4 spec PDF (V7.0) LED Designer
- ESP-IDF documentation: ESP32-S3 built-in USB Serial/JTAG Espressif Systems
- Espressif Windows driver INF showing VID/PID 303A:1001 “USB JTAG debug unit” GitHub



