OpenDisplay

Reference firmware variants

Both trees speak the same GATT command set over service 0x2446. This page lists where main Firmware (ESP32 / nRF52840) and Firmware-silabs-bg22 differ.

Capability matrix

Capability Main Firmware BG22 firmware
GATT service 0x2446 Yes Yes
Flex config 0x00400x0042 Yes Yes (+ NFC / flash packets parsed)
AES-CCM 0x0050 Yes Yes
Direct write 0x00700x0072 Yes Yes
Streaming decompression (streaming_decompression + zip bits) Yes Yes (only compression mode)
Legacy large-window zlib (32 KB DEFLATE window) v1.x ESP32/nRF only — removed in firmware v2 Never supported (512 B window only)
Partial region 0x0076 Yes (1 bpp panels) Not implemented
LED 0x0073 / 0x0075 Yes Yes
Buzzer 0x0077 Yes No
NFC 0x0082 No Yes
Wi‑Fi / LAN TCP port 2446 ESP32 only No
Multi-display Up to 4 panels Display [0] only
Max pipe payload (BLE) ~230 B typical (MTU 512) 244 B
DFU 0x0051 Platform-specific Yes

Sender guidance

New senders must not use legacy large-window zlib. Read Flex transmission_modes from config (or presets). If streaming_decompression and zip are both set, compress with window_bits = 9 (512-byte DEFLATE window). Otherwise send an uncompressed direct write — do not fall back to legacy compression.

Firmware version 1.x (high byte of 0x0043) on existing ESP32/nRF builds still accepts legacy streams for backward compatibility. Version 2 drops that path entirely.

Wire protocol details: Communication protocol.

Source code entry points

  • Main: Firmware/src/communication.cpp, display_service.cpp, structs.h
  • BG22: Firmware-silabs-bg22/opendisplay_pipe.c, opendisplay_display.cpp, opendisplay_structs.h
  • Shared config schema: web/firmware/toolbox/config.yaml