xref: /openbmc/linux/Documentation/input/devices/iforce-protocol.rst (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1b08c118cSDmitry Torokhov===============
2b08c118cSDmitry TorokhovIforce Protocol
3b08c118cSDmitry Torokhov===============
4b08c118cSDmitry Torokhov
5b08c118cSDmitry Torokhov:Author: Johann Deneux <johann.deneux@gmail.com>
6b08c118cSDmitry Torokhov
7b08c118cSDmitry TorokhovHome page at `<http://web.archive.org/web/*/http://www.esil.univ-mrs.fr>`_
8b08c118cSDmitry Torokhov
9b08c118cSDmitry Torokhov:Additions: by Vojtech Pavlik.
10b08c118cSDmitry Torokhov
11b08c118cSDmitry Torokhov
12b08c118cSDmitry TorokhovIntroduction
13b08c118cSDmitry Torokhov============
14b08c118cSDmitry Torokhov
15b08c118cSDmitry TorokhovThis document describes what I managed to discover about the protocol used to
16b08c118cSDmitry Torokhovspecify force effects to I-Force 2.0 devices.  None of this information comes
17b08c118cSDmitry Torokhovfrom Immerse. That's why you should not trust what is written in this
18b08c118cSDmitry Torokhovdocument. This document is intended to help understanding the protocol.
19b08c118cSDmitry TorokhovThis is not a reference. Comments and corrections are welcome.  To contact me,
20b08c118cSDmitry Torokhovsend an email to: johann.deneux@gmail.com
21b08c118cSDmitry Torokhov
22b08c118cSDmitry Torokhov.. warning::
23b08c118cSDmitry Torokhov
24b08c118cSDmitry Torokhov    I shall not be held responsible for any damage or harm caused if you try to
25b08c118cSDmitry Torokhov    send data to your I-Force device based on what you read in this document.
26b08c118cSDmitry Torokhov
27b08c118cSDmitry TorokhovPreliminary Notes
28b08c118cSDmitry Torokhov=================
29b08c118cSDmitry Torokhov
30b08c118cSDmitry TorokhovAll values are hexadecimal with big-endian encoding (msb on the left). Beware,
31b08c118cSDmitry Torokhovvalues inside packets are encoded using little-endian.  Bytes whose roles are
32b08c118cSDmitry Torokhovunknown are marked ???  Information that needs deeper inspection is marked (?)
33b08c118cSDmitry Torokhov
34b08c118cSDmitry TorokhovGeneral form of a packet
35b08c118cSDmitry Torokhov------------------------
36b08c118cSDmitry Torokhov
37b08c118cSDmitry TorokhovThis is how packets look when the device uses the rs232 to communicate.
38b08c118cSDmitry Torokhov
39b08c118cSDmitry Torokhov== == === ==== ==
40b08c118cSDmitry Torokhov2B OP LEN DATA CS
41b08c118cSDmitry Torokhov== == === ==== ==
42b08c118cSDmitry Torokhov
43b08c118cSDmitry TorokhovCS is the checksum. It is equal to the exclusive or of all bytes.
44b08c118cSDmitry Torokhov
45b08c118cSDmitry TorokhovWhen using USB:
46b08c118cSDmitry Torokhov
47b08c118cSDmitry Torokhov== ====
48b08c118cSDmitry TorokhovOP DATA
49b08c118cSDmitry Torokhov== ====
50b08c118cSDmitry Torokhov
51b08c118cSDmitry TorokhovThe 2B, LEN and CS fields have disappeared, probably because USB handles
52*d56b699dSBjorn Helgaasframes and data corruption is handled or insignificant.
53b08c118cSDmitry Torokhov
54b08c118cSDmitry TorokhovFirst, I describe effects that are sent by the device to the computer
55b08c118cSDmitry Torokhov
56b08c118cSDmitry TorokhovDevice input state
57b08c118cSDmitry Torokhov==================
58b08c118cSDmitry Torokhov
59b08c118cSDmitry TorokhovThis packet is used to indicate the state of each button and the value of each
60b08c118cSDmitry Torokhovaxis::
61b08c118cSDmitry Torokhov
62b08c118cSDmitry Torokhov    OP= 01 for a joystick, 03 for a wheel
63b08c118cSDmitry Torokhov    LEN= Varies from device to device
64b08c118cSDmitry Torokhov    00 X-Axis lsb
65b08c118cSDmitry Torokhov    01 X-Axis msb
66b08c118cSDmitry Torokhov    02 Y-Axis lsb, or gas pedal for a wheel
67b08c118cSDmitry Torokhov    03 Y-Axis msb, or brake pedal for a wheel
68b08c118cSDmitry Torokhov    04 Throttle
69b08c118cSDmitry Torokhov    05 Buttons
70b08c118cSDmitry Torokhov    06 Lower 4 bits: Buttons
71b08c118cSDmitry Torokhov       Upper 4 bits: Hat
72b08c118cSDmitry Torokhov    07 Rudder
73b08c118cSDmitry Torokhov
74b08c118cSDmitry TorokhovDevice effects states
75b08c118cSDmitry Torokhov=====================
76b08c118cSDmitry Torokhov
77b08c118cSDmitry Torokhov::
78b08c118cSDmitry Torokhov
79b08c118cSDmitry Torokhov    OP= 02
80b08c118cSDmitry Torokhov    LEN= Varies
81b08c118cSDmitry Torokhov    00 ? Bit 1 (Value 2) is the value of the deadman switch
82b08c118cSDmitry Torokhov    01 Bit 8 is set if the effect is playing. Bits 0 to 7 are the effect id.
83b08c118cSDmitry Torokhov    02 ??
84b08c118cSDmitry Torokhov    03 Address of parameter block changed (lsb)
85b08c118cSDmitry Torokhov    04 Address of parameter block changed (msb)
86b08c118cSDmitry Torokhov    05 Address of second parameter block changed (lsb)
87b08c118cSDmitry Torokhov    ... depending on the number of parameter blocks updated
88b08c118cSDmitry Torokhov
89b08c118cSDmitry TorokhovForce effect
90b08c118cSDmitry Torokhov------------
91b08c118cSDmitry Torokhov
92b08c118cSDmitry Torokhov::
93b08c118cSDmitry Torokhov
94b08c118cSDmitry Torokhov    OP=  01
95b08c118cSDmitry Torokhov    LEN= 0e
96b08c118cSDmitry Torokhov    00 Channel (when playing several effects at the same time, each must
97b08c118cSDmitry Torokhov                be assigned a channel)
98b08c118cSDmitry Torokhov    01 Wave form
99b08c118cSDmitry Torokhov	    Val 00 Constant
100b08c118cSDmitry Torokhov	    Val 20 Square
101b08c118cSDmitry Torokhov	    Val 21 Triangle
102b08c118cSDmitry Torokhov	    Val 22 Sine
103b08c118cSDmitry Torokhov	    Val 23 Sawtooth up
104b08c118cSDmitry Torokhov	    Val 24 Sawtooth down
105b08c118cSDmitry Torokhov	    Val 40 Spring (Force = f(pos))
106b08c118cSDmitry Torokhov	    Val 41 Friction (Force = f(velocity)) and Inertia
107b08c118cSDmitry Torokhov	           (Force = f(acceleration))
108b08c118cSDmitry Torokhov
109b08c118cSDmitry Torokhov
110b08c118cSDmitry Torokhov    02 Axes affected and trigger
111b08c118cSDmitry Torokhov	    Bits 4-7: Val 2 = effect along one axis. Byte 05 indicates direction
112b08c118cSDmitry Torokhov		    Val 4 = X axis only. Byte 05 must contain 5a
113b08c118cSDmitry Torokhov		    Val 8 = Y axis only. Byte 05 must contain b4
114b08c118cSDmitry Torokhov		    Val c = X and Y axes. Bytes 05 must contain 60
115b08c118cSDmitry Torokhov	    Bits 0-3: Val 0 = No trigger
116b08c118cSDmitry Torokhov		    Val x+1 = Button x triggers the effect
117b08c118cSDmitry Torokhov	    When the whole byte is 0, cancel the previously set trigger
118b08c118cSDmitry Torokhov
119b08c118cSDmitry Torokhov    03-04 Duration of effect (little endian encoding, in ms)
120b08c118cSDmitry Torokhov
121b08c118cSDmitry Torokhov    05 Direction of effect, if applicable. Else, see 02 for value to assign.
122b08c118cSDmitry Torokhov
123b08c118cSDmitry Torokhov    06-07 Minimum time between triggering.
124b08c118cSDmitry Torokhov
125b08c118cSDmitry Torokhov    08-09 Address of periodicity or magnitude parameters
126b08c118cSDmitry Torokhov    0a-0b Address of attack and fade parameters, or ffff if none.
127b08c118cSDmitry Torokhov    *or*
128b08c118cSDmitry Torokhov    08-09 Address of interactive parameters for X-axis,
129b08c118cSDmitry Torokhov          or ffff if not applicable
130b08c118cSDmitry Torokhov    0a-0b Address of interactive parameters for Y-axis,
131b08c118cSDmitry Torokhov	  or ffff if not applicable
132b08c118cSDmitry Torokhov
133b08c118cSDmitry Torokhov    0c-0d Delay before execution of effect (little endian encoding, in ms)
134b08c118cSDmitry Torokhov
135b08c118cSDmitry Torokhov
136b08c118cSDmitry TorokhovTime based parameters
137b08c118cSDmitry Torokhov---------------------
138b08c118cSDmitry Torokhov
139b08c118cSDmitry TorokhovAttack and fade
140b08c118cSDmitry Torokhov^^^^^^^^^^^^^^^
141b08c118cSDmitry Torokhov
142b08c118cSDmitry Torokhov::
143b08c118cSDmitry Torokhov
144b08c118cSDmitry Torokhov    OP=  02
145b08c118cSDmitry Torokhov    LEN= 08
146b08c118cSDmitry Torokhov    00-01 Address where to store the parameters
147b08c118cSDmitry Torokhov    02-03 Duration of attack (little endian encoding, in ms)
148b08c118cSDmitry Torokhov    04 Level at end of attack. Signed byte.
149b08c118cSDmitry Torokhov    05-06 Duration of fade.
150b08c118cSDmitry Torokhov    07 Level at end of fade.
151b08c118cSDmitry Torokhov
152b08c118cSDmitry TorokhovMagnitude
153b08c118cSDmitry Torokhov^^^^^^^^^
154b08c118cSDmitry Torokhov
155b08c118cSDmitry Torokhov::
156b08c118cSDmitry Torokhov
157b08c118cSDmitry Torokhov    OP=  03
158b08c118cSDmitry Torokhov    LEN= 03
159b08c118cSDmitry Torokhov    00-01 Address
160b08c118cSDmitry Torokhov    02 Level. Signed byte.
161b08c118cSDmitry Torokhov
162b08c118cSDmitry TorokhovPeriodicity
163b08c118cSDmitry Torokhov^^^^^^^^^^^
164b08c118cSDmitry Torokhov
165b08c118cSDmitry Torokhov::
166b08c118cSDmitry Torokhov
167b08c118cSDmitry Torokhov    OP=  04
168b08c118cSDmitry Torokhov    LEN= 07
169b08c118cSDmitry Torokhov    00-01 Address
170b08c118cSDmitry Torokhov    02 Magnitude. Signed byte.
171b08c118cSDmitry Torokhov    03 Offset. Signed byte.
172b08c118cSDmitry Torokhov    04 Phase. Val 00 = 0 deg, Val 40 = 90 degs.
173b08c118cSDmitry Torokhov    05-06 Period (little endian encoding, in ms)
174b08c118cSDmitry Torokhov
175b08c118cSDmitry TorokhovInteractive parameters
176b08c118cSDmitry Torokhov----------------------
177b08c118cSDmitry Torokhov
178b08c118cSDmitry Torokhov::
179b08c118cSDmitry Torokhov
180b08c118cSDmitry Torokhov    OP=  05
181b08c118cSDmitry Torokhov    LEN= 0a
182b08c118cSDmitry Torokhov    00-01 Address
183b08c118cSDmitry Torokhov    02 Positive Coeff
184b08c118cSDmitry Torokhov    03 Negative Coeff
185b08c118cSDmitry Torokhov    04+05 Offset (center)
186b08c118cSDmitry Torokhov    06+07 Dead band (Val 01F4 = 5000 (decimal))
187b08c118cSDmitry Torokhov    08 Positive saturation (Val 0a = 1000 (decimal) Val 64 = 10000 (decimal))
188b08c118cSDmitry Torokhov    09 Negative saturation
189b08c118cSDmitry Torokhov
190b08c118cSDmitry TorokhovThe encoding is a bit funny here: For coeffs, these are signed values. The
191b08c118cSDmitry Torokhovmaximum value is 64 (100 decimal), the min is 9c.
192b08c118cSDmitry TorokhovFor the offset, the minimum value is FE0C, the maximum value is 01F4.
193b08c118cSDmitry TorokhovFor the deadband, the minimum value is 0, the max is 03E8.
194b08c118cSDmitry Torokhov
195b08c118cSDmitry TorokhovControls
196b08c118cSDmitry Torokhov--------
197b08c118cSDmitry Torokhov
198b08c118cSDmitry Torokhov::
199b08c118cSDmitry Torokhov
200b08c118cSDmitry Torokhov    OP=  41
201b08c118cSDmitry Torokhov    LEN= 03
202b08c118cSDmitry Torokhov    00 Channel
203b08c118cSDmitry Torokhov    01 Start/Stop
204b08c118cSDmitry Torokhov	    Val 00: Stop
205b08c118cSDmitry Torokhov	    Val 01: Start and play once.
206b08c118cSDmitry Torokhov	    Val 41: Start and play n times (See byte 02 below)
207b08c118cSDmitry Torokhov    02 Number of iterations n.
208b08c118cSDmitry Torokhov
209b08c118cSDmitry TorokhovInit
210b08c118cSDmitry Torokhov----
211b08c118cSDmitry Torokhov
212b08c118cSDmitry Torokhov
213b08c118cSDmitry TorokhovQuerying features
214b08c118cSDmitry Torokhov^^^^^^^^^^^^^^^^^
215b08c118cSDmitry Torokhov::
216b08c118cSDmitry Torokhov
217b08c118cSDmitry Torokhov    OP=  ff
218b08c118cSDmitry Torokhov    Query command. Length varies according to the query type.
219b08c118cSDmitry Torokhov    The general format of this packet is:
220b08c118cSDmitry Torokhov    ff 01 QUERY [INDEX] CHECKSUM
221b08c118cSDmitry Torokhov    responses are of the same form:
222b08c118cSDmitry Torokhov    FF LEN QUERY VALUE_QUERIED CHECKSUM2
223b08c118cSDmitry Torokhov    where LEN = 1 + length(VALUE_QUERIED)
224b08c118cSDmitry Torokhov
225b08c118cSDmitry TorokhovQuery ram size
226b08c118cSDmitry Torokhov~~~~~~~~~~~~~~
227b08c118cSDmitry Torokhov
228b08c118cSDmitry Torokhov::
229b08c118cSDmitry Torokhov
230b08c118cSDmitry Torokhov    QUERY = 42 ('B'uffer size)
231b08c118cSDmitry Torokhov
232b08c118cSDmitry TorokhovThe device should reply with the same packet plus two additional bytes
233b08c118cSDmitry Torokhovcontaining the size of the memory:
234b08c118cSDmitry Torokhovff 03 42 03 e8 CS would mean that the device has 1000 bytes of ram available.
235b08c118cSDmitry Torokhov
236b08c118cSDmitry TorokhovQuery number of effects
237b08c118cSDmitry Torokhov~~~~~~~~~~~~~~~~~~~~~~~
238b08c118cSDmitry Torokhov
239b08c118cSDmitry Torokhov::
240b08c118cSDmitry Torokhov
241b08c118cSDmitry Torokhov    QUERY = 4e ('N'umber of effects)
242b08c118cSDmitry Torokhov
243b08c118cSDmitry TorokhovThe device should respond by sending the number of effects that can be played
244b08c118cSDmitry Torokhovat the same time (one byte)
245b08c118cSDmitry Torokhovff 02 4e 14 CS would stand for 20 effects.
246b08c118cSDmitry Torokhov
247b08c118cSDmitry TorokhovVendor's id
248b08c118cSDmitry Torokhov~~~~~~~~~~~
249b08c118cSDmitry Torokhov
250b08c118cSDmitry Torokhov::
251b08c118cSDmitry Torokhov
252b08c118cSDmitry Torokhov    QUERY = 4d ('M'anufacturer)
253b08c118cSDmitry Torokhov
254b08c118cSDmitry TorokhovQuery the vendors'id (2 bytes)
255b08c118cSDmitry Torokhov
256b08c118cSDmitry TorokhovProduct id
257b08c118cSDmitry Torokhov~~~~~~~~~~
258b08c118cSDmitry Torokhov
259b08c118cSDmitry Torokhov::
260b08c118cSDmitry Torokhov
261b08c118cSDmitry Torokhov    QUERY = 50 ('P'roduct)
262b08c118cSDmitry Torokhov
263b08c118cSDmitry TorokhovQuery the product id (2 bytes)
264b08c118cSDmitry Torokhov
265b08c118cSDmitry TorokhovOpen device
266b08c118cSDmitry Torokhov~~~~~~~~~~~
267b08c118cSDmitry Torokhov
268b08c118cSDmitry Torokhov::
269b08c118cSDmitry Torokhov
270b08c118cSDmitry Torokhov    QUERY = 4f ('O'pen)
271b08c118cSDmitry Torokhov
272b08c118cSDmitry TorokhovNo data returned.
273b08c118cSDmitry Torokhov
274b08c118cSDmitry TorokhovClose device
275b08c118cSDmitry Torokhov~~~~~~~~~~~~
276b08c118cSDmitry Torokhov
277b08c118cSDmitry Torokhov::
278b08c118cSDmitry Torokhov
279b08c118cSDmitry Torokhov    QUERY = 43 ('C')lose
280b08c118cSDmitry Torokhov
281b08c118cSDmitry TorokhovNo data returned.
282b08c118cSDmitry Torokhov
283b08c118cSDmitry TorokhovQuery effect
284b08c118cSDmitry Torokhov~~~~~~~~~~~~
285b08c118cSDmitry Torokhov
286b08c118cSDmitry Torokhov::
287b08c118cSDmitry Torokhov
288b08c118cSDmitry Torokhov    QUERY = 45 ('E')
289b08c118cSDmitry Torokhov
290b08c118cSDmitry TorokhovSend effect type.
291b08c118cSDmitry TorokhovReturns nonzero if supported (2 bytes)
292b08c118cSDmitry Torokhov
293b08c118cSDmitry TorokhovFirmware Version
294b08c118cSDmitry Torokhov~~~~~~~~~~~~~~~~
295b08c118cSDmitry Torokhov
296b08c118cSDmitry Torokhov::
297b08c118cSDmitry Torokhov
298b08c118cSDmitry Torokhov    QUERY = 56 ('V'ersion)
299b08c118cSDmitry Torokhov
300b08c118cSDmitry TorokhovSends back 3 bytes - major, minor, subminor
301b08c118cSDmitry Torokhov
302b08c118cSDmitry TorokhovInitialisation of the device
303b08c118cSDmitry Torokhov^^^^^^^^^^^^^^^^^^^^^^^^^^^^
304b08c118cSDmitry Torokhov
305b08c118cSDmitry TorokhovSet Control
306b08c118cSDmitry Torokhov~~~~~~~~~~~
307b08c118cSDmitry Torokhov
308b08c118cSDmitry Torokhov.. note::
309b08c118cSDmitry Torokhov    Device dependent, can be different on different models!
310b08c118cSDmitry Torokhov
311b08c118cSDmitry Torokhov::
312b08c118cSDmitry Torokhov
313b08c118cSDmitry Torokhov    OP=  40 <idx> <val> [<val>]
314b08c118cSDmitry Torokhov    LEN= 2 or 3
315b08c118cSDmitry Torokhov    00 Idx
316b08c118cSDmitry Torokhov       Idx 00 Set dead zone (0..2048)
317b08c118cSDmitry Torokhov       Idx 01 Ignore Deadman sensor (0..1)
318b08c118cSDmitry Torokhov       Idx 02 Enable comm watchdog (0..1)
319b08c118cSDmitry Torokhov       Idx 03 Set the strength of the spring (0..100)
320b08c118cSDmitry Torokhov       Idx 04 Enable or disable the spring (0/1)
321b08c118cSDmitry Torokhov       Idx 05 Set axis saturation threshold (0..2048)
322b08c118cSDmitry Torokhov
323b08c118cSDmitry TorokhovSet Effect State
324b08c118cSDmitry Torokhov~~~~~~~~~~~~~~~~
325b08c118cSDmitry Torokhov
326b08c118cSDmitry Torokhov::
327b08c118cSDmitry Torokhov
328b08c118cSDmitry Torokhov    OP=  42 <val>
329b08c118cSDmitry Torokhov    LEN= 1
330b08c118cSDmitry Torokhov    00 State
331b08c118cSDmitry Torokhov       Bit 3 Pause force feedback
332b08c118cSDmitry Torokhov       Bit 2 Enable force feedback
333b08c118cSDmitry Torokhov       Bit 0 Stop all effects
334b08c118cSDmitry Torokhov
335b08c118cSDmitry TorokhovSet overall
336b08c118cSDmitry Torokhov~~~~~~~~~~~
337b08c118cSDmitry Torokhov
338b08c118cSDmitry Torokhov::
339b08c118cSDmitry Torokhov
340b08c118cSDmitry Torokhov    OP=  43 <val>
341b08c118cSDmitry Torokhov    LEN= 1
342b08c118cSDmitry Torokhov    00 Gain
343b08c118cSDmitry Torokhov       Val 00 = 0%
344b08c118cSDmitry Torokhov       Val 40 = 50%
345b08c118cSDmitry Torokhov       Val 80 = 100%
346b08c118cSDmitry Torokhov
347b08c118cSDmitry TorokhovParameter memory
348b08c118cSDmitry Torokhov----------------
349b08c118cSDmitry Torokhov
350b08c118cSDmitry TorokhovEach device has a certain amount of memory to store parameters of effects.
351b08c118cSDmitry TorokhovThe amount of RAM may vary, I encountered values from 200 to 1000 bytes. Below
352b08c118cSDmitry Torokhovis the amount of memory apparently needed for every set of parameters:
353b08c118cSDmitry Torokhov
354b08c118cSDmitry Torokhov - period : 0c
355b08c118cSDmitry Torokhov - magnitude : 02
356b08c118cSDmitry Torokhov - attack and fade : 0e
357b08c118cSDmitry Torokhov - interactive : 08
358b08c118cSDmitry Torokhov
359b08c118cSDmitry TorokhovAppendix: How to study the protocol?
360b08c118cSDmitry Torokhov====================================
361b08c118cSDmitry Torokhov
362b08c118cSDmitry Torokhov1. Generate effects using the force editor provided with the DirectX SDK, or
363b08c118cSDmitry Torokhovuse Immersion Studio (freely available at their web site in the developer section:
364b08c118cSDmitry Torokhovwww.immersion.com)
365b08c118cSDmitry Torokhov2. Start a soft spying RS232 or USB (depending on where you connected your
366b08c118cSDmitry Torokhovjoystick/wheel). I used ComPortSpy from fCoder (alpha version!)
367b08c118cSDmitry Torokhov3. Play the effect, and watch what happens on the spy screen.
368b08c118cSDmitry Torokhov
369b08c118cSDmitry TorokhovA few words about ComPortSpy:
370b08c118cSDmitry TorokhovAt first glance, this software seems, hum, well... buggy. In fact, data appear with a
371b08c118cSDmitry Torokhovfew seconds latency. Personally, I restart it every time I play an effect.
372b08c118cSDmitry TorokhovRemember it's free (as in free beer) and alpha!
373b08c118cSDmitry Torokhov
374b08c118cSDmitry TorokhovURLS
375b08c118cSDmitry Torokhov====
376b08c118cSDmitry Torokhov
377b08c118cSDmitry TorokhovCheck http://www.immerse.com for Immersion Studio,
378b08c118cSDmitry Torokhovand http://www.fcoder.com for ComPortSpy.
379b08c118cSDmitry Torokhov
380b08c118cSDmitry Torokhov
381b08c118cSDmitry TorokhovI-Force is trademark of Immersion Corp.
382