~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/input/devices/iforce-protocol.rst

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php