Skip to content

v1.2.0 — Camera QR Wi-Fi provisioning on both board revisions

Choose a tag to compare

@JFG3rd JFG3rd released this 07 Aug 14:21
· 50 commits to main since this release

Camera QR Wi-Fi provisioning now works end to end on both ESP32-P4 board
revisions — point the on-board camera at your router's Wi-Fi QR code and the
analyzer fills in the SSID and password for you.

On the newer ESP32-P4X (silicon rev 3.x) the camera had never streamed at all.
This release fixes that, along with a UI freeze, and adds optional front-panel
hardware keys.

Highlights

Camera QR provisioning works on rev-3 silicon. The scanner reached
VIDIOC_STREAMON and failed there on every P4X. Two independent causes:

  • esp_video 1.4.1 left esp_isp_awb_config_t.subwindow uninitialised and
    passed stack garbage to the ISP driver. Only chip revision ≥ 3.0 validates
    that field — rev < 3 warns and ignores it — so the bug was invisible on the
    older board and fatal on the newer one. Fixed by moving to esp_video 2.3.0
    (2.2.0 carries Espressif's fix).
  • The generated ISP tuning table was never actually linked. esp_ipa's
    prebuilt library ships a placeholder built from a dummy sensor config, and
    its build files let that placeholder win the link — so white-balance gains
    were never set for any sensor. The project build now strips it at CMake
    configure time.

The display no longer appears frozen after a scan. The camera's control bus
and the touch controller share the same two I2C pins. Starting the camera took
those pins, and teardown reset them outright, leaving touch and audio dead
until the next reboot while the screen kept drawing. The pins are now handed
back on teardown.

Real error messages. A failed scan used to report a bare "Scanner stopped"
— the actual reason was discarded before it could reach the screen. Each stage
now reports what to check, e.g. "No camera detected. Check the MIPI-CSI camera
module is connected and fully seated in its connector."

Optional front-panel keycaps. Support for up to two Seeed Grove-Mech
Keycaps — mechanical keys with RGB status LEDs, wired to the J1 header. They sit
on the GPIO matrix rather than the contended I2C bus, so they keep working while
touch is suspended for a camera scan.

  • Key 1 — cycles the colour theme; aborts a running QR scan instead; a 2 s
    hold restarts the board.
  • Key 2 — cycles the spectrum display mode.
  • Each LED shows the colour of what its key currently selects, so the panel
    reports state without waking the screen.

Wiring, pin rationale and a 3.3 V-only warning are in
hardware-setup.md. The feature compiles out cleanly if you
don't fit the hardware.

A bigger, undistorted QR preview — 640×420, aspect-preserved instead of
squashed, and the scanner no longer starves the UI or blocks it while stopping.
An idle scan now gives up after 45 seconds rather than holding the camera open.

Known limitation

The camera can only be started once per restart. esp_video 2.3.0's teardown
reports success but does not unregister the CSI video device, so a second scan
in the same session fails. The QR screen now detects this up front and tells you
to restart rather than opening a camera that cannot work. A scan that
successfully decodes a code reboots to join the network anyway, so the normal
path is unaffected.

Upgrade notes

  • espressif/esp_video moves 1.4.1 → 2.3.0, which also pulls
    esp_cam_sensor 2.3.0 and esp_ipa 2.2.0. Do not pin below esp_video 2.2.0
    on rev-3 silicon.
  • Sensor-format Kconfig keys were renamed upstream
    (CAMERA_SC2336_MIPI_RAW8_* → CAMERA_SC2336_MIPI_DEFAULT_FMT_RAW8_*). The
    effective capture format is unchanged.
  • Two build environments remain, one per silicon revision:
    pio run -e esp32-p4-evboard for the v1.5.2 board (chip rev 1.x) and
    pio run -e esp32-p4x-evboard for the P4X v1.6 board (chip rev 3.x).
    tools/check_chip_rev.py blocks flashing the wrong image.
  • No settings migration is required.

Housekeeping

Around 130 lines of dead code removed — leftovers from three earlier refactors
(SD noise-floor persistence, spectrum pinch-zoom, and a Phase-1 status-bar stub)
where the replacement landed but the old path was never deleted. No behaviour
change.

Full detail in CHANGELOG.md.