Skip to content

Commit d36c5ea

Browse files
author
mescon
committed
docs: version bumps, revision history, session-scoped 0x0e findings, changelog
Bring every document current with tonight's verified state: the spec moves to 6.4 with revision rows for the 07-02/07-03 work, the sysfs reference is re-dated, the TrueForce protocol doc records the two firmware behaviours discovered during the auto-restore reproduction (type-0x0e only acts inside an initialised session; an idle session's range change is firmware-reverted after about a minute) plus the auto-restore cross-reference, and the changelog gets the 90-degree closure and profile-slot entries.
1 parent 7247166 commit d36c5ea

4 files changed

Lines changed: 47 additions & 6 deletions

File tree

CHANGELOG.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,30 @@ Over one hundred commits since the `v0.9-pre-simplification` tag on
1212
by theme. See `git log v0.9-pre-simplification..HEAD` for the full
1313
chronology.
1414

15+
### The 90-degree saga closed; profile slots done right (2026-07-03)
16+
17+
- **Launch-time 90-degree reset: root-caused and fixed.** A usbmon
18+
capture of an AC EVO launch showed the game's SDK session pushing an
19+
operating range of 90 degrees in a TrueForce interface-2 packet
20+
(type 0x0e - previously misdocumented as a frequency config; its
21+
canonical init value 2700.0 is the wheel's max range). The new
22+
`wheel_range_restore` (default on) restores the pre-reset range
23+
automatically - detection to restore measured under 100 ms against
24+
a faithful replay of the game traffic - behind safety gates:
25+
external-and-exactly-90 only, desktop mode only, wheel stationary,
26+
widen-only, three strikes per session, explicit writes supersede.
27+
Game-side alternative documented: AC EVO's "Steering lock" setting
28+
pushes its configured value once touched and re-applied.
29+
- **Profile slot select settled against the wheel's OLED**: fn2 SET is
30+
the plain profile index (a capture-note misparse had briefly
31+
suggested a [mode_class, slot] encoding; writing that switches to
32+
profile 2), fn1 GET returns [profile, mode], and fn3 returns each
33+
slot's user-assigned NAME - exposed as the new read-only
34+
`wheel_profile_names` attribute.
35+
- Firmware behaviours documented from the reproduction work: type-0x0e
36+
is session-scoped, and an idle TF session's range change is
37+
reverted by the firmware itself after about a minute.
38+
1539
### Hardening, identity, and protocol resolutions (2026-07-02, later)
1640

1741
- **Ten review findings fixed** (commit `c2b3a65`) after an adversarial

docs/RS50_PROTOCOL_SPECIFICATION.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Logitech RS50 Protocol Specification
22

3-
**Document Version**: 6.3
4-
**Date**: 2026-07-02
3+
**Document Version**: 6.4
4+
**Date**: 2026-07-03
55
**Author**: Verified from USB capture analysis
66
**Status**: Protocol reference for Linux driver development
77

@@ -1554,3 +1554,5 @@ This returns the PAGE ID at each index. G Hub queries indices 0x00 through ~0x1F
15541554
| 6.0 | 2026-02-04 | Verified feature table, SW_ID behaviour, LIGHTSYNC two-feature architecture |
15551555
| 6.1 | 2026-04-21 | 8-way D-pad, G Pro coverage, per-feature SET fn numbers (damping fn=1, TRUEFORCE fn=3), FFB filter flags bitfield, centre calibration (feature 0x812C, G Pro sub-device 0x05), `wheel_calibrate` sysfs attribute |
15561556
| 6.2 | 2026-06-29 | Corrected the D-pad section: the hat is a standard HID Hat Switch (value 0 = Up, clockwise) decoded natively by the kernel, not a custom byte-0 decode. The previous direction table and the `rs50_process_dpad()`/`RS50_DPAD_*` references were the removed, scrambled implementation (issue #22) |
1557+
| 6.3 | 2026-07-02 | Resolved the three unknown features (0x80A4 axis response curves, 0x1BC0 ReportHidUsages, compat 0x15 = Brake Force); compat catalog identical to native; sub-device map (5.3); HID++ error packets, SW_ID and 0x12-report semantics from Logitech's official specs; DeviceInfo identity decode; LIGHTSYNC official lineage (9.10); registry cross-checks |
1558+
| 6.4 | 2026-07-03 | Profile feature settled live against the OLED: fn2 SET = plain [profile,0,0], fn1 GET = [profile, mode], fn3 = per-slot profile names; catalog rows 0x02/0x03 corrected (DeviceInfo / DeviceNameType); launch-time 90-degree reset root-caused to the SDK's type-0x0e operating-range push (see TRUEFORCE_PROTOCOL.md) |

docs/SYSFS_API.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
- Logitech RS50 Direct Drive Wheel Base (USB `046d:c276`)
66
- Logitech G Pro Racing Wheel (USB `046d:c272` Xbox/PC, `046d:c268` PS/PC)
77

8-
**Version**: 2026-04-29
8+
**Version**: 2026-07-03
99

1010
Most of the attributes documented here are shared between the RS50 and G Pro (the two wheels share the settings code path). Attributes that are currently G Pro-only or RS50-only are called out inline.
1111

docs/TRUEFORCE_PROTOCOL.md

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,24 @@ why the launch-time range reset never produced a HID++ broadcast: it
163163
does not go through the HID++ range feature at all. Games push their
164164
configured steering rotation here at session start; a game whose
165165
rotation setting is 90 (or defaulted) locks the wheel to 90 degrees.
166-
The kernel driver's 20 s range poll detects the change and updates
167-
`wheel_range`; re-applying the desired range via HID++ afterwards
168-
sticks (the SDK write is one-shot at session init).
166+
The kernel driver's 20 s range poll detects the change and, by
167+
default, restores the pre-reset range automatically (the
168+
`wheel_range_restore` sysfs attribute; verified end-to-end with a
169+
detection-to-restore latency of ~60 ms against a faithful replay of
170+
the game traffic). Re-applying a range via HID++ sticks - the SDK
171+
write is one-shot at session init.
172+
173+
Two firmware behaviours discovered while reproducing this
174+
(2026-07-03, live wheel):
175+
176+
- **Type-`0x0e` is session-scoped**: a bare `0x0e` packet on an
177+
otherwise idle interface is ignored; the range write only takes
178+
effect inside an initialised TF session (init sequence sent).
179+
- **Idle revert**: if a TF session goes quiet (no stream packets,
180+
roughly a minute) the firmware reverts the session's range change
181+
on its own and broadcasts the restored value over HID++. A running
182+
game keeps its session alive, which is why real launch-time resets
183+
persist.
169184

170185
AC EVO's init also differs from the canonical G Hub init in two more
171186
packets: a type-`0x0b` with float `1.0` (purpose unknown) and a

0 commit comments

Comments
 (0)