Close

Firmware 0.8.0: the second board arrived, and V1.1 now works

A project log for EvilKey: I Needed a FIDO2 Key. Then the Maker Brain Took Over.

ESP32-S3 FIDO2 prototype: touch AMOLED, microSD apps, HID scripts, USB/BLE AirMouse and an IMU BLE Gamepad. A key that got carried away.

michal-wojciechowskiMichal Wojciechowski • 10/13/2026 at 23:22•0 Comments

The V1.1 board I ordered has arrived. EvilKey now runs on it as well as my original V1.0 prototype. Apparently even “finish the firmware” can produce another menu: this time, at least, it asks which board I actually have.

Confirmed V1.1 firmware compatibility starts with 0.8.0. The public release contains a separate image for each revision, with matching build information and checksums.

Same device idea, different startup details

V1.1 needed its own hardware profile. The display chip-select moved, and display and touch share a reset line. Startup now handles that shared reset before probing touch, rather than resetting the display again after touch has started. The original V1 profile keeps its existing sequence.

EvilKey.cmd asks for the PCB revision before building or flashing, then uses the corresponding profile and image. This keeps both boards in the same source tree without making a builder edit pin definitions by hand.

Updating a key and starting with a fresh module

The first installation on a new module is a different job from updating an EvilKey that already holds data. A factory or unsupported partition table cannot simply be treated as an existing EvilKey layout.

The uploader checks that situation and offers initialization. It requires typing ERASE before clearing the entire internal flash and installing the bootloader, EvilKey partition table and selected firmware. Credentials and settings in internal flash are deleted on that path. Cancelling stops the operation.

For a supported existing EvilKey installation, the guarded update preserves protected storage and verifies it after writing. I used that path to install the final 0.8.0 images on both boards; write verification passed and the existing data remained available.

The hardware check

After reset, the interface, FIDO/PIN and the functions I normally use worked on both revisions. IMU steering also worked in the V1.1 Gamepad after the BLE host connection was established. A practical reminder: PAIR ON HOST means there is no connected host yet. Connect until BLE CONNECTED, keep the board still for calibration, then try tilting it.

This confirms firmware compatibility on my two boards. The photographed case is still the fitted V1 enclosure; V1.1 case fit and V2 support remain unverified.

The rest of the project

ABI v4/v5 apps, shared SIMD drawing and app-owned models on microSD remain supported. Manager stays at 1.1.6, and the USB Tool examples keep their original scripts. This remains development firmware; the planned key-storage protection and Secure Boot phase is still ahead.

Firmware 0.8.0, both board images and SDK · Manager source snapshot · microSD examples

If you build one on V1.1, what would make the setup clearer?

Discussions