Skip to content

Commit 35cc1a5

Browse files
author
mescon
committed
docs: record native-mode TrueForce verification (compat no longer required)
SDK-driven game TrueForce under Proton was packet-confirmed on the RS50 in native mode (046d:c276) driving AC EVO on 2026-07-08: Wine's HID backend opened interface 2 on the native PID and the SDK streamed ~2 kHz of type-0x01 packets (239k OUT / 120s) on ep 0x03, and it was felt. This disproves the earlier assumption that the SDK requires the G PRO compat PID (c272). Update every place that stated or implied compat mode is required for TrueForce: the two setup recipes (README + GETTING_STARTED) now mark the compat-mode switch optional with native as the verified default, the protocol doc and sdk README record both modes verified, the udev comment drops the "borrows the PID so the SDK accepts it" rationale, and the README "State of the driver" stamp moves to v0.11.0 / 2026-07-08.
1 parent 2220285 commit 35cc1a5

6 files changed

Lines changed: 46 additions & 24 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@ the contract is "it works on RS50 and G Pro as listed here".
1010
35 commits since the `v0.10.0` tag on 2026-07-03. The TrueForce force
1111
path was reworked from TF4ALL protocol findings and feel-verified on
1212
RS50 hardware (clean texture route, host-alive force unaffected by
13-
texture playback, response-curve upload/reset confirmed).
13+
texture playback, response-curve upload/reset confirmed). SDK-driven
14+
game TrueForce under Proton was additionally packet-confirmed in the
15+
RS50's **native mode** (`046d:c276`, AC EVO, ~2 kHz type-0x01 stream on
16+
ep 0x03), so native mode no longer trades away game TrueForce for its
17+
full 2700 range.
1418

1519
### TrueForce stream reworked from TF4ALL cross-pollination
1620

README.md

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,12 @@ owner to validate · - not applicable.
117117
| Centre calibration || 🟢 |
118118
| Mode / profile switching || 🟢 |
119119

120-
The RS50 is the development hardware, so its column is verified directly.
121-
A real G PRO runs the **same `hidpp_dd_ff_*` code path** as an RS50 in G PRO
122-
compatibility mode (which *is* verified), so it is expected to work; we
123-
just do not have one to confirm against. **G920 / G923** keep working as
120+
The RS50 is the development hardware, so its column is verified directly
121+
in both native (`046d:c276`) and G PRO compatibility (`046d:c272`) modes,
122+
including SDK game TrueForce under Proton in each. A real G PRO runs the
123+
**same `hidpp_dd_ff_*` code path** as an RS50 in G PRO compatibility mode,
124+
so it is expected to work; we just do not have one to confirm against.
125+
**G920 / G923** keep working as
124126
a drop-in through the inherited upstream HID++ `0x8123` FFB path; the
125127
RS50/G-PRO-specific `wheel_*` settings do not apply to them. The **G923**
126128
speaks the same TrueForce stream protocol as the DD wheels (confirmed on
@@ -178,14 +180,17 @@ All effects are routed to the wheel's single direct-drive motor
178180
> after the driver was reloaded while Steam ran: **restart Steam
179181
> fully** - its device list goes stale across driver reloads.
180182
181-
### State of the driver (v0.10.0, 2026-07-03)
183+
### State of the driver (v0.11.0, 2026-07-08)
182184

183185
An honest calibration of what "supported" means today:
184186

185-
**Verified on hardware** (one RS50, G PRO compatibility mode, plus
186-
extensive USB-capture cross-checks): everything marked with a check in
187-
the matrix above, including full-lap gameplay in ACC and AC EVO with
188-
simultaneous steering FFB and TrueForce.
187+
**Verified on hardware** (one RS50, in **both** G PRO compatibility and
188+
native `046d:c276` modes, plus extensive USB-capture cross-checks):
189+
everything marked with a check in the matrix above, including full-lap
190+
gameplay in ACC and AC EVO with simultaneous steering FFB and TrueForce.
191+
SDK-driven TrueForce under Proton is now packet-confirmed in native mode
192+
as well (AC EVO, 2026-07-08), so native mode gets the full 2700 range
193+
without giving up game TrueForce.
189194

190195
**Expected but awaiting independent confirmation:**
191196
- A **real G PRO Racing Wheel** runs the identical code path and
@@ -404,13 +409,19 @@ signed SDK DLLs running unmodified under Proton. The same recipe is
404409
expected to work for the other Logitech-SDK-aware sims (Le Mans
405410
Ultimate, AMS2, Assetto Corsa, rFactor 2, iRacing). The recipe
406411
applies to both the RS50 and the G PRO Racing
407-
Wheel for Xbox/PC. Step 1 is RS50-only.
408-
409-
1. **(RS50 only)** Switch the wheel into "G PRO compatibility" mode
410-
via the OLED menu. The wheel reboots and reappears as
411-
`046d:c272`, which is the PID ACC's TrueForce check accepts.
412-
2. Set the wheel's steering angle. The compat-mode factory default
413-
is 90°, much too small to drive with. Two equivalent paths:
412+
Wheel for Xbox/PC. Step 1 is RS50-only and optional.
413+
414+
1. **(RS50, optional)** You can switch the wheel into "G PRO
415+
compatibility" mode via the OLED menu (it reboots and reappears as
416+
`046d:c272`), but as of 2026-07-08 this is not required: the SDK
417+
also accepts the RS50's **native** PID `046d:c276`, verified
418+
end-to-end in AC EVO (usbmon-confirmed TrueForce stream). Native
419+
mode additionally unlocks the full 2700 range. Use compat mode only
420+
as a fallback if a specific game's SDK build does not recognise the
421+
native PID.
422+
2. Set the wheel's steering angle. The default range can be very small
423+
(compat mode's factory default is 90°), much too small to drive
424+
with. Two equivalent paths:
414425
- **From Linux (recommended)**: enter desktop mode and set the
415426
range live via sysfs:
416427
```bash

docs/GETTING_STARTED.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,14 @@ For each sim, in Steam:
118118
this game, so the game sees the wheel directly instead of a
119119
virtual gamepad.
120120

121-
**(RS50 only)** switch the wheel into "G PRO compatibility" mode via
122-
its OLED menu first - the SDK's device check accepts that identity.
121+
**(RS50, optional)** you can switch the wheel into "G PRO compatibility"
122+
mode via its OLED menu, but as of 2026-07-08 this is no longer required:
123+
the SDK also accepts the RS50's **native** identity (`046d:c276`), verified
124+
end-to-end in AC EVO (usbmon-confirmed TrueForce stream). Native mode
125+
additionally unlocks the full 2700 range. Compat mode remains a safe
126+
fallback if a particular game's SDK build does not recognise the native
127+
PID; if TrueForce does not engage in native, try compat and please open
128+
an issue noting the game.
123129

124130
## 4. Set your steering range, then race
125131

docs/TRUEFORCE_PROTOCOL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
> **Status**: the kernel driver leaves interface 2's hidraw node open for userspace. Two userspace paths consume that node:
44
>
5-
> - **Proton sims (verified working)**: `tools/install-tf-shim.sh` copies Logitech's own Authenticode-signed SDK DLLs (`trueforce_sdk_x64.dll`, `logi_steering_wheel_x64.dll`) into each Wine prefix and registers the CLSIDs. The unmodified DLLs run inside Wine and write to the wheel via Wine's HID stack, which reaches our kernel driver. No shim, no IAT hooks, no certificate spoofing. End-to-end verified against **Assetto Corsa Competizione** and **Assetto Corsa EVO** on RS50 in G PRO compatibility mode (both 2026-04-26 / 2026-04-29).
5+
> - **Proton sims (verified working)**: `tools/install-tf-shim.sh` copies Logitech's own Authenticode-signed SDK DLLs (`trueforce_sdk_x64.dll`, `logi_steering_wheel_x64.dll`) into each Wine prefix and registers the CLSIDs. The unmodified DLLs run inside Wine and write to the wheel via Wine's HID stack, which reaches our kernel driver. No shim, no IAT hooks, no certificate spoofing. End-to-end verified against **Assetto Corsa Competizione** and **Assetto Corsa EVO** under Proton on RS50 in **both modes**: G PRO compatibility mode (`046d:c272`, 2026-04-26 / 2026-04-29) and **native mode** (`046d:c276`, AC EVO, 2026-07-08). The native run was usbmon-confirmed: Wine's HID backend opened interface 2 on the native PID and the SDK streamed ~2 kHz of type-0x01 packets (239k OUT over ~120 s) on ep 0x03. The SDK DLLs open and drive the wheel identically at either PID, so compat mode is not required for TrueForce.
66
> - **Native Linux apps**: `userspace/libtrueforce/` is a native C reimplementation of the same protocol described below. Useful for Linux apps that want to drive TrueForce directly (telemetry-driven haptic generators, custom test rigs, etc.).
77
>
88
> Originally reverse-engineered from [issue #5](https://github.com/mescon/logitech-trueforce-linux-driver/issues/5) captures (BeamNG.drive + G Pro, contributed by [@SandSeppel](https://github.com/SandSeppel)) and re-verified 2026-04-21 against an RS50 + ACC capture on the same host. The two wheels use byte-for-byte identical init and streaming packets.

sdk/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ Both channels coexist at runtime: the SDK sets both KF (slow, steering feel) and
105105

106106
### How we use this in practice
107107

108-
- The Proton recipe in the project README installs the unmodified, Logitech-signed Trueforce DLL into each Wine prefix and registers its CLSID. The DLL talks to Wine's HID stack rather than the (nonexistent on Linux) G HUB Agent named pipe; Wine's HID stack reaches our kernel driver. End-to-end verified against ACC. See `tools/install-tf-shim.sh`.
108+
- The Proton recipe in the project README installs the unmodified, Logitech-signed Trueforce DLL into each Wine prefix and registers its CLSID. The DLL talks to Wine's HID stack rather than the (nonexistent on Linux) G HUB Agent named pipe; Wine's HID stack reaches our kernel driver. End-to-end verified against ACC and AC EVO, on RS50 in both G PRO compatibility mode and native mode (`046d:c276`, AC EVO 2026-07-08, usbmon-confirmed). See `tools/install-tf-shim.sh`.
109109
- For native Linux apps that want to drive Trueforce directly (no Wine in the loop), `userspace/libtrueforce/` is a from-scratch C reimplementation of the same protocol; `include/trueforce.h` mirrors the 62 named exports of the Windows DLL.
110110
- `logiTrueForceSetStreamTF` suggested a bulk-upload path in addition to per-sample. libtrueforce supports streaming writes via `write(2)` on the wheel's interface-2 hidraw node rather than a single ioctl per sample, matching the wire-level format.
111111

udev/70-logitech-trueforce.rules

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@
1616
# Direct-drive TrueForce wheels (this driver's primary targets):
1717
# C276 RS50 Direct Drive - NATIVE mode (full sysfs surface)
1818
# C272 G PRO Racing Wheel (Xbox/PC) - ALSO the RS50 in G PRO
19-
# COMPATIBILITY mode (the RS50 borrows this PID so the SDK's
20-
# device check accepts it; the driver tells the two apart by
21-
# USB product string)
19+
# COMPATIBILITY mode (the RS50 can present this PID; the
20+
# driver tells the two apart by USB product string). The SDK
21+
# also accepts the RS50's native C276, so compat mode is not
22+
# required for TrueForce.
2223
# C268 G PRO Racing Wheel (PlayStation/PC)
2324
#
2425
# Gear-driven, but same TrueForce stream protocol - access is purely

0 commit comments

Comments
 (0)