Skip to main content

Boards & custom hardware

Everything Kog knows about your hardware lives in one declarative file: board.yaml. It describes the chip, memory, display, touch controller, and pins — and it drives flashing, pin safety, the simulator's display shape, and (if you ever need it) custom firmware builds.

Blessed boards

For boards we test and host prebuilt images for, board.yaml is one line of identity:

extends: waveshare-esp32-s3-touch-lcd-1.46b

Current blessed boards:

BoardChipDisplayFlash target
Waveshare ESP32-S3-Touch-LCD-1.46BESP32-S3 (PSRAM)round touch LCDwaveshare-1.46b
ESP32-2432S028R "Cheap Yellow Display"ESP32SPI 320×240, resistive touchcyd
ESP32-2432S028R, classic panelESP32same board, ILI9341-generation glass (BGR + mirrored scan)cyd-classic
Which CYD do I have?

The CYD ships two panel generations behind the same silkscreen, and they can't be told apart by looking at the board (or over USB — both are plain ESP32). Flash the standard cyd image first. If the screen comes up left/right mirrored with orange buttons where the UI should be blue, your unit is the classic generation — reflash with kog flash --board cyd-classic (the browser flasher offers the same choice). Touch works identically on both.

Any board with known controllers — still no compiling

If your board's display and touch controllers are in Kog's compiled-in driver set (common controllers over SPI, i80, RGB, QSPI, and MIPI-DSI buses), you write a full board.yaml and Kog runs it on a generic prebuilt image — your board description is flashed alongside as a configuration blob, read at boot:

schema: kog/board@1
id: my-custom-panel
soc: { chip: esp32s3, flash_mb: 16, psram: { type: octal, size_mb: 8 } }
display:
controller: st7789
bus: spi
width: 240
height: 320
bus_config: { sclk: 14, mosi: 13, cs: 15, dc: 2, rst: -1, freq_hz: 40000000 }
backlight: { pin: 27, active: high }
touch:
controller: cst816s
bus: i2c
i2c: { sda: 33, scl: 32, freq_hz: 400000 }
int: 21
inputs:
buttons: [{ id: boot, pin: 0, active: low }]

kog board validate checks it against the published schema (your editor gets autocomplete from the JSON Schema too).

Fully custom: kog firmware build

If you need an unsupported controller, custom native code, or non-standard system config, the CLI compiles a runtime for you, from the same board.yaml:

npx kog firmware build

The first run installs a pinned, managed copy of the embedded toolchain into ~/.kog/toolchains — you don't install or configure anything yourself, and your project doesn't change shape. A native/ directory of custom components (drivers, native modules) is linked in automatically if present.

All three paths — blessed, generic, custom — use the identical kog dev / kog flash workflow. The tier is an implementation detail the CLI resolves and reports:

✔ board.yaml → waveshare-esp32-s3-touch-lcd-1.46b (blessed, prebuilt runtime v1.0)