UMBRA-4: Add DeviceSpecs for the modern DeathAdder line (V2/V3/V4, 12 PIDs) #13

Merged
David merged 1 commit from feat/modern-deathadder-devicespecs-UMBRA-4 into main 2026-06-06 12:34:01 +02:00
Owner

UMBRA-4: Add DeviceSpecs for the modern DeathAdder line (V2/V3/V4, 12 PIDs)

Resolves UMBRA-4.

Summary

Adds the twelve modern DeathAdder PIDs (V2/V3/V4) that OpenRazer's driver/razermouse_driver.h defines but umbra did not yet recognize. Each is a DeviceSpec in its own crates/umbra-hid/src/models/<model>.rs, registered in the SUPPORTED table and resolved by models::lookup(vid, pid).

PID Model Lighting Battery/Idle Poll
0x008C DeathAdder V2 Mini Logo (1 zone) @0x3f no 0x3f
0x009C DeathAdder V2 X HyperSpeed none 0x1f 0x1f
0x00A1 DeathAdder V2 Lite Logo (1 zone) @0x1f no 0x1f
0x00B2 DeathAdder V3 none no None (rate2)
0x00B6 DeathAdder V3 Pro (Wired) none 0x1f 0x1f
0x00B7 DeathAdder V3 Pro (Wireless) none 0x1f 0x1f
0x00C2 DeathAdder V3 Pro (Wired, alt PID) none 0x1f 0x1f
0x00C3 DeathAdder V3 Pro (Wireless, alt PID) none 0x1f 0x1f
0x00C4 DeathAdder V3 HyperSpeed (Wired) none 0x1f 0x1f
0x00C5 DeathAdder V3 HyperSpeed (Wireless) none 0x1f 0x1f
0x00BE DeathAdder V4 Pro (Wired) none 0x1f None (rate2)
0x00BF DeathAdder V4 Pro (Wireless) none 0x1f None (rate2)

Provenance

Every Features field's transaction ID, poll rates, lighting zones, and effect kinds were read off the matching razermouse_driver.c branch (firmware, serial, poll read/write, dpi, the per-LED effect _common functions, charge level/status, idle, and the razer_mouse_probe attribute groups), not assumed.

  • Firmware/serial/dpi/poll run on 0x3f for the V2 Mini and on 0x1f for the rest of the line.
  • V2 Mini and V2 Lite are wired single-zone Chroma: the driver registers a LOGO led plus the per-LED logo effect path (static/spectrum/reactive/breath/none), so they carry the full standard effect set on a single LOGO zone. The V3/V4 esports mice appear in no lighting function, so lighting is None.
  • The V2 X HyperSpeed, V3 Pro pair (+ alt PIDs) and V3 HyperSpeed pair carry battery + idle on 0x1f (probe registers charge_* and device_idle_time).
  • V3 (plain) and the V4 Pro pair drive polling through the set_polling_rate2 / get_polling_rate2 path that umbra does not build, so poll_rate is declared None with a doc comment, matching the existing HyperPolling-dongle convention. Rates above 1000 Hz are out of scope until that builder lands.
  • The alt PIDs (0x00C2/0x00C3) are alternate USB enumerations of the same V3 Pro hardware; the driver groups them with the primary PIDs in every switch arm, so their feature content matches and each gets its own file per the one-file-per-PID convention.

DPI maxima are sensor-derived assumptions documented in each file's doc comment (Focus Pro 30K for the V3 generation, Focus Pro 45K for the V4 Pro, and the 8500/14000 V2 sensors); the driver does not clamp DPI.

Tests

  • New every_modern_deathadder_pid_is_registered unit test over models::lookup covers registration, the 0x3f/0x1f txn split, lighting presence/zones, battery+idle txns, the poll_rate = None rate2 devices, and the V4 Pro 45K DPI max.
  • README "Supported devices" table lists all twelve models with VID:PID, DPI max, polling, lighting, and battery columns.
  • cargo fmt --check, cargo clippy --all-targets --all-features, and cargo test --package umbra-hid --no-default-features all pass clean.

🤖 Generated with Claude Code

# UMBRA-4: Add DeviceSpecs for the modern DeathAdder line (V2/V3/V4, 12 PIDs) Resolves UMBRA-4. ## Summary Adds the twelve modern DeathAdder PIDs (V2/V3/V4) that OpenRazer's `driver/razermouse_driver.h` defines but `umbra` did not yet recognize. Each is a `DeviceSpec` in its own `crates/umbra-hid/src/models/<model>.rs`, registered in the `SUPPORTED` table and resolved by `models::lookup(vid, pid)`. | PID | Model | Lighting | Battery/Idle | Poll | |--------|--------------------------------------------|--------------------|--------------|------| | 0x008C | DeathAdder V2 Mini | Logo (1 zone) @0x3f | no | 0x3f | | 0x009C | DeathAdder V2 X HyperSpeed | none | 0x1f | 0x1f | | 0x00A1 | DeathAdder V2 Lite | Logo (1 zone) @0x1f | no | 0x1f | | 0x00B2 | DeathAdder V3 | none | no | None (rate2) | | 0x00B6 | DeathAdder V3 Pro (Wired) | none | 0x1f | 0x1f | | 0x00B7 | DeathAdder V3 Pro (Wireless) | none | 0x1f | 0x1f | | 0x00C2 | DeathAdder V3 Pro (Wired, alt PID) | none | 0x1f | 0x1f | | 0x00C3 | DeathAdder V3 Pro (Wireless, alt PID) | none | 0x1f | 0x1f | | 0x00C4 | DeathAdder V3 HyperSpeed (Wired) | none | 0x1f | 0x1f | | 0x00C5 | DeathAdder V3 HyperSpeed (Wireless) | none | 0x1f | 0x1f | | 0x00BE | DeathAdder V4 Pro (Wired) | none | 0x1f | None (rate2) | | 0x00BF | DeathAdder V4 Pro (Wireless) | none | 0x1f | None (rate2) | ## Provenance Every `Features` field's transaction ID, poll rates, lighting zones, and effect kinds were read off the matching `razermouse_driver.c` branch (firmware, serial, poll read/write, dpi, the per-LED effect `_common` functions, charge level/status, idle, and the `razer_mouse_probe` attribute groups), not assumed. - Firmware/serial/dpi/poll run on `0x3f` for the V2 Mini and on `0x1f` for the rest of the line. - V2 Mini and V2 Lite are wired single-zone Chroma: the driver registers a LOGO led plus the per-LED logo effect path (static/spectrum/reactive/breath/none), so they carry the full standard effect set on a single LOGO zone. The V3/V4 esports mice appear in no lighting function, so `lighting` is `None`. - The V2 X HyperSpeed, V3 Pro pair (+ alt PIDs) and V3 HyperSpeed pair carry battery + idle on `0x1f` (probe registers `charge_*` and `device_idle_time`). - V3 (plain) and the V4 Pro pair drive polling through the `set_polling_rate2` / `get_polling_rate2` path that `umbra` does not build, so `poll_rate` is declared `None` with a doc comment, matching the existing HyperPolling-dongle convention. Rates above 1000 Hz are out of scope until that builder lands. - The alt PIDs (0x00C2/0x00C3) are alternate USB enumerations of the same V3 Pro hardware; the driver groups them with the primary PIDs in every switch arm, so their feature content matches and each gets its own file per the one-file-per-PID convention. DPI maxima are sensor-derived assumptions documented in each file's doc comment (Focus Pro 30K for the V3 generation, Focus Pro 45K for the V4 Pro, and the 8500/14000 V2 sensors); the driver does not clamp DPI. ## Tests - New `every_modern_deathadder_pid_is_registered` unit test over `models::lookup` covers registration, the 0x3f/0x1f txn split, lighting presence/zones, battery+idle txns, the `poll_rate = None` rate2 devices, and the V4 Pro 45K DPI max. - README "Supported devices" table lists all twelve models with VID:PID, DPI max, polling, lighting, and battery columns. - `cargo fmt --check`, `cargo clippy --all-targets --all-features`, and `cargo test --package umbra-hid --no-default-features` all pass clean. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(umbra-hid): add DeviceSpecs for the modern DeathAdder line
Some checks failed
Check / fmt + clippy + build + tests (pull_request) Failing after 4s
Create release / Create release from merged PR (pull_request) Has been skipped
e6753208a2
Add the twelve modern DeathAdder PIDs (V2/V3/V4) that razermouse_driver.h defines but umbra did not yet recognize, one DeviceSpec file per PID registered in the SUPPORTED table: V2 Mini (0x008C), V2 X HyperSpeed (0x009C), V2 Lite (0x00A1), V3 (0x00B2), V3 Pro Wired/Wireless (0x00B6/0x00B7), V3 Pro Wired/Wireless alt PIDs (0x00C2/0x00C3), V3 HyperSpeed Wired/Wireless (0x00C4/0x00C5), and V4 Pro Wired/Wireless (0x00BE/0x00BF).

Every Features field is read off the matching razermouse_driver.c branch rather than assumed. Firmware/serial/dpi/poll run on 0x3f for the V2 Mini and on 0x1f for the rest. V2 Mini and V2 Lite are wired single-zone Chroma (LOGO zone, full standard effects via the per-LED logo path); the V3/V4 esports mice expose no onboard lighting. The V2 X HyperSpeed, V3 Pro pair (plus alt PIDs) and V3 HyperSpeed pair carry battery + idle on 0x1f. V3 (plain) and the V4 Pro pair drive polling through the set_polling_rate2 path umbra does not build, so poll_rate is declared None with a doc comment.

DPI maxima are sensor-derived assumptions documented per file (Focus Pro 30K for the V3 generation, Focus Pro 45K for the V4 Pro, 8500/14000 for the V2 models); the driver does not clamp DPI. Registration is covered by a new every_modern_deathadder_pid_is_registered test over models::lookup, and the README "Supported devices" table lists all twelve models.

#UMBRA-4
David merged commit 79271f6da9 into main 2026-06-06 12:34:01 +02:00
David deleted branch feat/modern-deathadder-devicespecs-UMBRA-4 2026-06-06 12:34:02 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
pandoras-box/umbra!13
No description provided.