UMBRA-3: Add DeviceSpecs for the classic DeathAdder line (9 pre-V2 PIDs) #10

Merged
David merged 1 commit from feat/classic-deathadder-devicespecs-UMBRA-3 into main 2026-06-06 03:03:14 +02:00
Owner

UMBRA-3: Add DeviceSpecs for the classic DeathAdder line (9 pre-V2 PIDs)

Registers the classic (pre-V2) DeathAdder PIDs from OpenRazer's driver/razermouse_driver.h that umbra did not recognize, each as its own DeviceSpec under crates/umbra-hid/src/models/. Every transaction ID, poll-rate set, DPI path, and lighting surface was read branch-by-branch from razermouse_driver.c (fetched from upstream openrazer/openrazer@master), not assumed.

Specs added (7)

PID Model DPI Lighting
0x0037 Razer DeathAdder 2013 None (legacy 1-byte) None (classic on/off LEDs)
0x0038 Razer DeathAdder 1800 None (legacy 1-byte) None
0x0043 Razer DeathAdder Chroma 10,000 (txn 0xFF) None (classic-LED Chroma path)
0x004F Razer DeathAdder 2000 2000 (txn 0xFF) None
0x0054 Razer DeathAdder 3500 3500 (txn 0xFF) None (classic on/off LEDs)
0x0071 Razer DeathAdder Essential White Edition 6400 (txn 0xFF) Logo + Scroll ext-matrix (txn 0x3f)
0x0098 Razer DeathAdder Essential 2021 6400 (txn 0xFF) Logo + Scroll ext-matrix (txn 0x3f)

firmware/serial/poll are txn 0xFF on all seven (poll rates 125/500/1000). The two Essential siblings mirror the already-supported Essential (0x006E). Modelled DPI maxima are sensor-derived assumptions documented in each file's doc comment; the driver itself does not clamp DPI.

3.5G PIDs intentionally omitted (2)

0x0016 (DeathAdder 3.5G) and 0x0029 (3.5G Black) are NOT registered. The driver drives them only through razer_send_control_msg_old_device (a bespoke USB control transfer against the da3_5g struct) for every command class - firmware is hardcoded, serial is cached, and DPI/poll/LED go through deathadder3_5g_* helpers. There is no razer_report feature-report surface umbra speaks, so a spec would be a dead entry that falsely claims firmware/serial work on some transaction ID. This is the explicit fallback the issue's "Assumption (3.5G PIDs)" authorizes, and the AC permits recording the omission decision in lieu of a spec.

Features declared None

Per the naga_2012.rs precedent, anything umbra has no command builder for is None with a doc comment: the 2013/1800 legacy 1-byte DPI path, and the classic on/off + classic-LED Chroma lighting paths on 2013/1800/2000/3500/Chroma.

Verification

  • cargo fmt --check, cargo clippy --all-targets --all-features, and cargo test --package umbra-hid --no-default-features all pass clean (20 + 1 doctest).
  • New every_classic_deathadder_pid_is_registered test asserts the 7 registrations, the two Essential siblings' Logo+Scroll/0x3f lighting, the 2013/1800 None-DPI and Chroma None-lighting decisions, and that 0x0016/0x0029 are absent.
  • README "Supported devices" table lists all 7 new models.

Closes UMBRA-3.

## UMBRA-3: Add DeviceSpecs for the classic DeathAdder line (9 pre-V2 PIDs) Registers the classic (pre-V2) DeathAdder PIDs from OpenRazer's `driver/razermouse_driver.h` that umbra did not recognize, each as its own `DeviceSpec` under `crates/umbra-hid/src/models/`. Every transaction ID, poll-rate set, DPI path, and lighting surface was read branch-by-branch from `razermouse_driver.c` (fetched from upstream `openrazer/openrazer@master`), not assumed. ### Specs added (7) | PID | Model | DPI | Lighting | |--------|------------------------------------------|-----------------------|-----------------------------------------| | 0x0037 | Razer DeathAdder 2013 | None (legacy 1-byte) | None (classic on/off LEDs) | | 0x0038 | Razer DeathAdder 1800 | None (legacy 1-byte) | None | | 0x0043 | Razer DeathAdder Chroma | 10,000 (txn 0xFF) | None (classic-LED Chroma path) | | 0x004F | Razer DeathAdder 2000 | 2000 (txn 0xFF) | None | | 0x0054 | Razer DeathAdder 3500 | 3500 (txn 0xFF) | None (classic on/off LEDs) | | 0x0071 | Razer DeathAdder Essential White Edition | 6400 (txn 0xFF) | Logo + Scroll ext-matrix (txn 0x3f) | | 0x0098 | Razer DeathAdder Essential 2021 | 6400 (txn 0xFF) | Logo + Scroll ext-matrix (txn 0x3f) | firmware/serial/poll are txn 0xFF on all seven (poll rates 125/500/1000). The two Essential siblings mirror the already-supported Essential (0x006E). Modelled DPI maxima are sensor-derived assumptions documented in each file's doc comment; the driver itself does not clamp DPI. ### 3.5G PIDs intentionally omitted (2) `0x0016` (DeathAdder 3.5G) and `0x0029` (3.5G Black) are NOT registered. The driver drives them only through `razer_send_control_msg_old_device` (a bespoke USB control transfer against the `da3_5g` struct) for every command class - firmware is hardcoded, serial is cached, and DPI/poll/LED go through `deathadder3_5g_*` helpers. There is no `razer_report` feature-report surface umbra speaks, so a spec would be a dead entry that falsely claims firmware/serial work on some transaction ID. This is the explicit fallback the issue's "Assumption (3.5G PIDs)" authorizes, and the AC permits recording the omission decision in lieu of a spec. ### Features declared `None` Per the `naga_2012.rs` precedent, anything umbra has no command builder for is `None` with a doc comment: the 2013/1800 legacy 1-byte DPI path, and the classic on/off + classic-LED Chroma lighting paths on 2013/1800/2000/3500/Chroma. ### Verification - `cargo fmt --check`, `cargo clippy --all-targets --all-features`, and `cargo test --package umbra-hid --no-default-features` all pass clean (20 + 1 doctest). - New `every_classic_deathadder_pid_is_registered` test asserts the 7 registrations, the two Essential siblings' Logo+Scroll/0x3f lighting, the 2013/1800 None-DPI and Chroma None-lighting decisions, and that 0x0016/0x0029 are absent. - README "Supported devices" table lists all 7 new models. Closes UMBRA-3.
feat(umbra-hid): add DeviceSpecs for the classic DeathAdder line
Some checks failed
Check / fmt + clippy + build + tests (pull_request) Failing after 17s
Create release / Create release from merged PR (pull_request) Has been skipped
64c739090c
Register the seven classic (pre-V2) DeathAdder PIDs from OpenRazer's driver/razermouse_driver.h that umbra previously did not recognize, each as its own DeviceSpec under crates/umbra-hid/src/models/. Per-command transaction IDs, poll rates, DPI paths, and lighting surfaces are read branch-by-branch from razermouse_driver.c, not assumed.

Added: DeathAdder 2013 (0x0037), 1800 (0x0038), Chroma (0x0043), 2000 (0x004F), 3500 (0x0054), Essential White Edition (0x0071), Essential 2021 (0x0098).

Features that have no umbra command builder are declared None with a doc comment, per the naga_2012 precedent: the 2013/1800 legacy 1-byte DPI path, and the classic on/off and classic-LED Chroma lighting paths on 2013/1800/2000/3500/Chroma. The two Essential siblings mirror the supported Essential (0x006E): Logo + Scroll extended-matrix lighting on txn 0x3f. Modelled DPI maxima are sensor-derived assumptions documented in each file's doc comment; the driver does not clamp DPI.

The 3.5G PIDs (0x0016, 0x0029) are intentionally omitted: the driver drives them solely through razer_send_control_msg_old_device, a bespoke USB control path with no razer_report surface umbra can build, so a spec would be dead. This matches the issue's stated assumption for the 3.5G PIDs.

Registration plus the lighting/DPI/omission decisions are covered by a new every_classic_deathadder_pid_is_registered test, and the README "Supported devices" table lists every newly added model.

#UMBRA-3
David merged commit a53ae5884c into main 2026-06-06 03:03:14 +02:00
David deleted branch feat/classic-deathadder-devicespecs-UMBRA-3 2026-06-06 03:03:14 +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!10
No description provided.