Community-maintained QMK firmware for the Epomaker TIDE 75 mechanical keyboard (tri-mode: USB / Bluetooth / 2.4GHz wireless).
This firmware fixes three critical bugs in the stock Epomaker firmware. All fixes have been submitted as pull requests to the official repository, but remain unmerged as of March 2026. This repo provides a pre-compiled binary so you can flash the fixes immediately without setting up a build environment.
- Download
epomaker_tide75_default.binfrom the latest release - Enter bootloader mode — hold Escape while plugging in USB
- Flash using QMK Toolbox — select the
.binfile, click Flash - Done — unplug and reconnect. All three fixes are now active.
Note: Holding Escape while connecting will also reset your keyboard settings (RGB mode, etc.) to defaults. If you want to preserve settings, use the Fn+RShift+Esc method instead (see Flashing below).
Upstream PR: Epomaker/tide75#4
Symptom: Keyboard becomes completely unresponsive after the host computer wakes from sleep/hibernate while connected via USB. Requires unplugging and reconnecting.
Root cause: suspend_power_down() is called when the host suspends, but suspend_wakeup_init() is never called on resume, leaving the keyboard in a suspended state.
Fix: Track the USB suspend state and properly call suspend_wakeup_init() when the host resumes.
Upstream PR: Epomaker/tide75#5
Symptom: Intermittent double key registrations — pressing a key once occasionally types the character twice.
Root cause: The stock firmware has no explicit debounce configuration, defaulting to an inadequate value for mechanical switches. Additionally, force_nkro is enabled, which can cause compatibility issues with certain hosts and KVM switches.
Fix: Set explicit debounce of 8ms (matching QMK recommended defaults) and disabled force_nkro.
Upstream PR: Epomaker/tide75#6
Symptom: After the keyboard wakes from idle sleep in wireless mode (2.4GHz or Bluetooth), modifier keys are dropped and the first character typed is lost. For example:
- Cmd+Shift+4 registers as
$(Shift+4, with Cmd lost) instead of triggering macOS screenshot - Cmd+C does nothing (Cmd lost, just types 'c')
- Typing "hello" after idle produces "ello" (first character lost)
Root cause: Two independent issues compound:
-
Modifier destruction: The low-power wakeup callback (
lpwr_wakeup_cb) callssuspend_wakeup_init()which invokesclear_mods()approximately 200ms after the MCU wakes. By that point, the main loop has already scanned the wake-up keys and registered their modifiers.clear_mods()destroys that state, and because held keys aren't re-processed by the matrix debouncer (it sees them as already pressed), the modifiers are never re-registered. -
Cold radio link: The 2.4GHz radio link is cold after sleep. The first HID report is sent before the radio re-establishes, so it is lost over the air.
Fix (multi-layered, developed over 15 iterations of debugging):
- Override
lpwr_wakeup_cb()to skip the destructiveclear_mods()call — the keyboard only sleeps after 1 minute of idle (no keys held), so there is no stale state to clear - Prime the radio module on wakeup via
wireless_devs_change()to begin re-establishing the link immediately - Post-sleep resync: re-deliver keyboard state at 15ms intervals for 1200ms after wake, ensuring the first keypress is delivered once the radio warms up (~60-80ms)
- Skip NKRO overflow messages during resync to prevent a modifier race condition between 6KRO and NKRO radio packets
- Periodic keepalive (1000ms) to prevent the radio link and dongle USB from entering power-saving modes
- Dedup cache invalidation API added to QMK core for resync support
| Method | How | Notes |
|---|---|---|
| Reset switch | Hold the Reset switch on the bottom of the PCB while connecting USB | Requires physical access to PCB |
| Escape key | Hold Escape while connecting USB | Resets keyboard settings to defaults |
| Key combo | Press Fn + Right Shift + Escape | Works with default keymap, preserves settings |
Option A — QMK Toolbox (recommended for most users)
- Download and install QMK Toolbox
- Open QMK Toolbox, select
epomaker_tide75_default.bin - Put the keyboard in bootloader mode
- Click Flash
Option B — Command line
wb32-dfu-updater_cli -t -s 0x08000000 epomaker_tide75_default.bin| Property | Value |
|---|---|
| File | epomaker_tide75_default.bin |
| Size | 61,152 bytes |
| SHA256 | a663a89c0ba7df5d15286d9b089900ccbec1009827b4a94e55735a13ccd83ea4 |
shasum -a 256 epomaker_tide75_default.bin
# Should output: a663a89c0ba7df5d15286d9b089900ccbec1009827b4a94e55735a13ccd83ea4For advanced users who want to modify or rebuild the firmware.
- QMK CLI installed and configured
- ARM GCC toolchain (
arm-none-eabi-gcc)
-
Clone the Epomaker QMK fork:
git clone https://github.com/hangshengkeji/qmk_firmware.git cd qmk_firmware git checkout tri-mode git submodule update --init --recursive -
Overlay the patched source files:
# Keyboard source (into keyboards/epomaker/tide75/) cp -r /path/to/tide75-firmware/src/tide75/* keyboards/epomaker/tide75/ # QMK core patches cp src/quantum/action_util.c quantum/action_util.c cp src/quantum/action_util.h quantum/action_util.h
-
Compile:
qmk compile -kb epomaker/tide75 -km default
-
The output binary will be at
.build/epomaker_tide75_default.bin
| Property | Value |
|---|---|
| Keyboard | Epomaker TIDE 75 |
| Connectivity | USB / Bluetooth / 2.4GHz wireless |
| Processor | WB32FQ95 (ARM Cortex-M3) |
| Bootloader | wb32-dfu |
| Firmware base | QMK (Epomaker fork) |
| Matrix | 6 rows x 15 columns |
| RGB | WS2812 (per-key RGB matrix) |
| Encoder | 1 rotary encoder |
All fixes have been submitted to the official Epomaker repository. As of March 2026, none have been merged:
| PR | Fix | Status |
|---|---|---|
| #4 | USB wake from sleep | Open |
| #5 | Debounce / double keypress | Open |
| #6 | Wireless modifier + first-character drops | Open |
If and when these PRs are merged upstream, this repository may be archived.
This project is licensed under the GNU General Public License v2.0, consistent with the upstream QMK firmware and Epomaker source code.
- Epomaker — Original TIDE 75 firmware and hardware
- QMK Firmware — Open-source keyboard firmware framework
- @jkquickstar — Bug investigation, fixes, and community firmware