Logitech Force Feedback Protocol V1.5
Logitech Force Feedback Protocol V1.5
Force Feedback
Protocol
V1.5 - December 21, 2015
Logitech Force Feedback Protocol V1.5 Page 1 of 35
Table of Contents
1 License Agreement 3
2 Introduction 4
2.1 Revision History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.3 Capabilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.3.1 Classic Force Feedback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.3.2 HID++ Force Feedback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3 Classic Format 5
3.1 Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.1.1 CMD 0x00 Download Force . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.1.2 CMD 0x01 Download and Play Force . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.1.3 CMD 0x02 Play Force . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.1.4 CMD 0x03 Stop Force . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.1.5 CMD 0x04 Default Spring On . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.1.6 CMD 0x05 Default Spring O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.1.7 CMD 0x08 Normal Mode / Extended Command . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.1.8 CMD 0x09 Set LED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.1.9 CMD 0x0a Set Watchdog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.1.10 CMD 0x0b Raw Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.1.11 CMD 0x0c Refresh Force . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.1.12 CMD 0x0d Fixed Time Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.1.13 CMD 0x0e Set Default Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.1.14 CMD 0x0f Set Dead Band . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2 Force Types and Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2.1 FORCE_TYPE 0x00 Constant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2.2 FORCE_TYPE 0x01 Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2.3 FORCE_TYPE 0x02 Damper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2.4 FORCE_TYPE 0x03 Auto-Centering Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2.5 FORCE_TYPE 0x04 Sawtooth Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2.6 FORCE_TYPE 0x05 Sawtooth Down . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2.7 FORCE_TYPE 0x06 Trapezoid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.2.8 FORCE_TYPE 0x07 Rectangle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.2.9 FORCE_TYPE 0x08 Variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2.10 FORCE_TYPE 0x09 Ramp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.2.11 FORCE_TYPE 0x0a Square Wave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2.12 FORCE_TYPE 0x0b High-Resolution Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2.13 FORCE_TYPE 0x0c High-Resolution Damper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.2.14 FORCE_TYPE 0x0d High-Resolution Auto-Centering Spring . . . . . . . . . . . . . . . . . . . . . 20
3.2.15 FORCE_TYPE 0x0e Friction (only select devices) . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.3 Extended Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.3.1 EXT_CMD 0x01 Change Mode to Driving Force Pro . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.3.2 EXT_CMD 0x02 Change Wheel Range to 200 Degrees . . . . . . . . . . . . . . . . . . . . . . . . 22
3.3.3 EXT_CMD 0x03 Change Wheel Range to 900 Degrees . . . . . . . . . . . . . . . . . . . . . . . . 22
3.3.4 EXT_CMD 0x09 Change Device Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.3.5 EXT_CMD 0x0a Revert Identity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.3.6 EXT_CMD 0x10 Switch to G25 with USB Detach . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.3.7 EXT_CMD 0x11 Switch to G25 without USB Detach . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.3.8 EXT_CMD 0x12 Set RPM LEDs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.3.9 EXT_CMD 0x81 Wheel Range Change . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Logitech Force Feedback Protocol V1.5 Page 2 of 35
A Appendix 34
A.1 Classic Compatibility Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
A.2 Xbox Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Logitech Force Feedback Protocol V1.5 Page 3 of 35
1 License Agreement
6.30.2014
1. License
Logitech Europe S.A. (Logitech) grants to Licensee a non-exclusive, royalty-free, non-sublicensable, nontransferable,
personal, worldwide license in the Technical Documentation and to copy the Technical Documentation. All right,
title and interest and any and all intellectual property rights to the Technical Documentation shall remain with
Logitech.
2. Warranties
Licensee shall make no representation or warranty to third parties on behalf of Logitech.
3. DISCLAIMERS
THE TECHNICAL DOCUMENTATION, LICENSED SPECIFICATION(S) AND ALL INTELLECTUAL PROPERTY
MADE AVAILABLE AND/OR LICENSED UNDER THIS AGREEMENT ARE PROVIDED "AS IS" WITHOUT
WARRANTY OF ANY KIND. LOGITECH DISCLAIMS ALL WARRANTIES, DUTIES AND CONDITIONS, EX-
PRESS, IMPLIED OR STATUTORY WITH RESPECT TO SUCH MATERIALS, INCLUDING ANY WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE OR NON-INFRINGEMENT.
4. Limitation of Liability
LOGITECH WILL NOT BE LIABLE FOR ANY DAMAGES ARISING FROM OR OTHERWISE RELATED TO
THIS AGREEMENT, WHETHER DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR SPE-
CIAL DAMAGES, EVEN IF LOGITECH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES IN
ADVANCE.
5. Miscellaneous
(a) No Partnership
This Agreement does not create a partnership, joint venture or agency relationship between the parties.
(e) Assignment
Licensee may not transfer or assign this Agreement, or any rights or obligations hereunder, whether by operation
of contract, law, change of Control or otherwise. Any attempted assignment by Licensee in violation of this
Section is void.
(f ) Entire Agreement
This Agreement constitutes the entire agreement between the parties with respect to its subject matter, and
merges all prior and contemporaneous communications.
Logitech Force Feedback Protocol V1.5 Page 4 of 35
2 Introduction
This document denes parts of the Logitech Force Feedback protocol. Some commands used for testing/debugging and
other purposes have been omitted from this document. However, the given information should be sucient to implement
a fully functional open-source force feedback driver.
Rbosa, July 2014: Second release, incorporated clarications and feedback from Edwin Velds; added EXT_CMD 0x0a,
EXT_CMD 0x10, EXT_CMD 0x11 and EXT_CMD 0x12; V1.1
Rbosa, July 2014: Added appendix listing all known wheels and their bcdVersion in the various modes; added table to
list supported commands to switch identity; V1.2
Rbosa, July 2014: Corrected Edwin's name; added G27 to Table 57; xed some spelling mistakes; claried spring
coecient swapping rule for older devices; added illustration of force position reporting vs. force location; V1.3
Rbosa, July/August 2015: Converted to PdfTex; added distinction between Classic Force Protocol and the new HID++
Force Protocol; xed many typos and consistency issues; V1.4
Rbosa, December 2015: Added new HID++ Force eect types; V1.5
2.2 Scope
The rst protocol (Classic) described in this document has been used in almost all force feedback-enabled devices that
Logitech has produced. It is used for joysticks and wheels. Each device may slightly deviate from the protocol by not
implementing certain commands or using slight variations of a command.
The second protocol (HID++) is only used for the G920 Driving Force Racing Wheel for Xbox One at the time of this
writing.
2.3 Capabilities
Internally, each force-axis position is encoded in 8 bits, even if that axis is reported in a dierent size to the host.
Each axis can be driven with two eects and a default spring for joysticks. For wheels, four eects and two default
springs can be combined.
For joysticks, the two axes are completely independent. In order to play a force at a 45 degree angle, it is up to the
host to separate it into an X and Y component.
There are many force eect slots, each of which can be assigned to any axis.
All parameters are given as 16-bit numbers (signed and unsigned, varying on the parameter). Internally, most forces
are calculated with float precision.
Logitech Force Feedback Protocol V1.5 Page 5 of 35
3 Classic Format
Commands are sent to the device via HID Output Reports. These are sent from the host through either an Interrupt Out
endpoint (usually EP1) or the default pipe (EP0). HID Output Reports sent over EP0 always use the rst byte for the
Report ID. This means the available space for the command and its parameters is seven bytes. The seven bytes are dened
as vendor-specic data in the HID descriptor. The command payload has the following format:
F0...F3 0/1 Each bit indicates to which force slot the command applies to
CMD see Table 3 One of the commands listed in section 3.1
FORCE_TYPE see Table 23 One of the force types listed in section 3.2
CMD_PARAM see Table 52 One of the command parameters listed in section 3.3
3.1 Commands
CMD Command
Table 3: Commands
Logitech Force Feedback Protocol V1.5 Page 6 of 35
If all the F0...F3 bits are one, this command is an extended command (see chapter 3.3).
Raw Mode is required to get the actual, uncalibrated axis values for exact position tracking for springs and to improve the
calibration algorithms implemented in rmware. However, each device denes a unique form of raw data report. These
reports will very likely not t into the elds described by the HID descriptor of the device. Therefore, the data sent from
the device needs to be intercepted before it reaches HID and appropriately modied.
After receiving this command, the force continues on from its most recent level. If this command is executed with a
dierent force type than the one that is already playing, the result is undened (and may cause undesired side-eects).
FIXED_LOOP 0x00 Fixed loop mode o (main loop runs as fast as possible).
0x01 Fixed loop mode on (main loop updates forces every 2ms).
Wheels report the wheel position with 0 on the left side and 255 on the right side:
Logitech Force Feedback Protocol V1.5 Page 10 of 35
Force levels are generally indicated with a single byte according to the encoding below:
Level Denition
FORCE_TYPE Force
0x00 Constant
0x01 Spring
0x02 Damper
0x03 Auto-Centering Spring
0x04 Sawtooth Up
Logitech Force Feedback Protocol V1.5 Page 11 of 35
FORCE_TYPE Force
The spring constants K1 and K2 dene the spring coecient (slope) according to Table 27. The oset is dened as the
dierence of the current position and the nearest dead band limit.
Note that for the following devices, the coecient table entries 5 and 6 are swapped and follow Table 28 instead:
K2 force multipliers use the same scale encoding as a spring force (see previous section). K1 is applied when moving to
the left/pushing, while K2 is applied when moving right/pulling. If the S1 or S2 parameter is 0, then the force generated
opposes the movement (standard damper action). If it is 1, the force generated accentuates the movement (i.e., a negative
damper or ice eect).
D1, D2 0...255 Deadband on the negative and positive side of the spring.
K1, K2 0...15 Linear slope with 0 being the weakest force and 15 being the strongest.
The actual coecient factor is device dependent.
S1, S2 0/1 Sign of the slope parameter.
Logitech Driving Force Pro (PID_C298) introduced a variation of this force with an additional 3 bits of precision for the
deadbands for a total of 11 bit precision. It is backward compatible with older implementations of this force in that the
additional low order bits are located in otherwise-ignored bit elds.
Logitech Driving Force Pro (PID_C298) introduced an additional CLIP parameter to this force. It is backward compatible
with older implementations of the force in that the additional parameter is encoded in an otherwise-unused byte eld.
Extended Commands provide device-specic functionality. They are used to switch modes of newer devices, which start in
a compatibility mode. They are also used to change the amount of wheel rotation of some wheel devices.
EXT_CMD Command
In order to instruct a device to NOT revert identity upon reset, the host needs to set the ag to 0.
A HID++ command has a 4-byte header, which includes the HID REPORT_ID, the device index (only used for HID++
hub devices; specify 0xff for the G920), the index of the feature, the index of the method, and a session identier. After
the header are the payload bytes of the specic method. The following description only lists the payload content for the
requests and the responses.
The HID++ Feature x8123 implements multi-axis force feedback control. The feature has the following methods and
notications:
Index Name
0 getInfo
1 resetAll
2 downloadEect
3 setEectState
4 destroyEect
5 getAperture
6 setAperture
7 getGlobalGains
8 setGlobalGains
0 forceHasFinished
SLOT_COUNT 0...255 Indicates the number of available force eect slots on the device.
ACTUATOR_MASK 0...255 A bitmask that indicates which axes have force feedback control.
The axes of a device are assigned according to their prominence for the user and are generally device-specic. For the
Logitech G920 wheel in particular, there is just one axis (the main wheel axis), hence the ACTUATOR_MASK value being
0x01.
Each slot controls an eect for a given axis. There are no restrictions on how many slots are assigned to any axis, as long
as the total number does not exceed SLOT_COUNT.
EFFECT_ID 0...SLOT_COUNT 0x00: Create new eect and return allocated eect id.
0x01...SLOT_COUNT: indicates id of eect slot to update.
START 0/1 1: immediately start this eect, 0: only create/update the eect, do not start playing.
AXIS 0...7 The index of the axis, for which this force is applicable.
EFFECT_TYPE see table 72 One of the eect types listed below.
Depending on the Eect Type, the header is followed by one of three dierent parameter formats.
7 DAMPER
8 FRICTION1
9 INERTIA1
10 RAMP1 Ramp Parameters
DURATION 0...65535 Duration of the eect in milliseconds, does not include START_DELAY.
Specify 0x0000 for innite duration.
START_DELAY 0...65535 Initial delay before the eect starts, measured in milliseconds.
LEVEL -32767...32767 Signed magnitude of the constant force.
ATTACK_LEVEL 0...255 Initial start level, as a fraction of MAX_FORCE, LEVEL.
with the same sign as
ATTACK_DELAY 0...65535 Duration of the envelope attack phase, where the force changes from ATTACK_LEVEL to LEVEL.
FADE_LEVEL 0...255 Final end level, as a fraction of MAX_FORCE, with the same sign as LEVEL.
FADE_DELAY 0...65535 Duration of the envelope decay phase, where the force changes from LEVEL to FADE_LEVEL.
1 FRICTION, INERTIA and RAMP are only supported on Logitech G920 with rmware V96.2.48 or later.
Logitech Force Feedback Protocol V1.5 Page 29 of 35
DURATION 0...65535 Duration of the eect in milliseconds. Does not include START_DELAY.
Specify 0x0000 for innite duration.
START_DELAY 0...65535 Initial delay, before the eect starts. Unit is in milliseconds.
LEVEL -32767...32767 Signed magnitude of the periodic force.
OFFSET -32767...32767 Signed oset for the periodic force.
WAVELENGTH 1...65535 Duration in milliseconds of one full period.
PHASE -32767...32767 Signed phase of the periodic force.
ATTACK_LEVEL 0...255 Initial start level, as a fraction of MAX_FORCE, LEVEL.
with the same sign as
ATTACK_DELAY 0...65535 Duration of the envelope attack phase, where the force changes from ATTACK_LEVEL to LEVEL.
FADE_LEVEL 0...255 Final end level, as a fraction of MAX_FORCE, with the same sign as LEVEL.
FADE_DELAY 0...65535 Duration of the envelope decay phase, where the force changes from LEVEL to FADE_LEVEL.
DURATION 0...65535 Duration of the eect in milliseconds. Does not include START_DELAY.
Specify 0x0000 for innite duration.
START_DELAY 0...65535 Initial delay, before the eect starts. Unit is in milliseconds.
NEG_SATURATION 0...65535 Magnitude of the maximum saturation on the negative side of the condition.
This is an unsigned value. To achieve negative saturations change the sign of NEG_SLOPE.
NEG_SLOPE -32767...32767 Signed slope for the negative side of the condition.
DEADZONE -32767...32767 Signed deadzone for the center area of the condition.
A negative value will make the slopes intersect.
OFFSET -32767...32767 Signed oset of the condition.
POS_SLOPE 0...65535 Signed slope for the positive side of the condition.
POS_SATURATION 0...65535 Magnitude of the maximum saturation on the positive side of the condition.
This is an unsigned value. To achieve negative saturations change the sign of POS_SLOPE.
Table 78: Condition Force Parameters
DURATION 0...65535 Duration of the eect in milliseconds, does not include START_DELAY.
Specify 0x0000 for innite duration.
START_DELAY 0...65535 Initial delay before the eect starts, measured in milliseconds.
START_LEVEL -32767...32767 Signed magnitude of the start level of the ramp force.
END_LEVEL -32767...32767 Signed magnitude of the end level of the ramp force.
ATTACK_LEVEL 0...255 Initial start level, as a fraction of MAX_FORCE, with the same sign as LEVEL.
Logitech Force Feedback Protocol V1.5 Page 31 of 35
ATTACK_DELAY 0...65535 Duration of the envelope attack phase, where the force changes from ATTACK_LEVEL to LEVEL.
FADE_LEVEL 0...255 Final end level, as a fraction of MAX_FORCE, with the same sign as LEVEL.
FADE_DELAY 0...65535 Duration of the envelope decay phase, where the force changes from LEVEL to FADE_LEVEL.
Typically, the GAIN value is from the application/game. The BOOST value is controlled by the user via some value-add
software (for example, on Windows, this is controlled by Logitech Gaming Software).
A Appendix
A.1 Classic Compatibility Mode
In order to support older console games, most Logitech Force Feedback steering wheels connect initially in a compatibility
mode. Typically, this mode equals a Logitech Driving Force, but in some circumstances it may also look like a G25 or
Driving Force Pro.
The table below lists the checks required to identify a particular wheel, when it is in compatibility mode. The checks
should be done in the order listed, as they become progressively less specic.
Once a wheel has been identied, it can be switched to its native mode using the appropriate switch command. The
following table lists the supported commands for each wheel. The Logitech Driving Force GT (PID_C29A) and Log-
itech G27 Racing Wheel (PID_C29B) also support the RevertIdentity command, so that subsequent USB resets will not
have to change mode again the wheel will come up in native mode right-away.
The Logitech G920 wheel starts out by default in Xbox Force Feedback Mode. To switch to HID++ Mode, issue the
following byte sequence as an output report:
Logitech G920 0f 00 01 01 42
Table 96: G920 Mode Switch Command