← Documents Documentation/input/devices/iforce-protocol.rst GitHub 원문 ↗

Linux 6.18.37 · Input

Iforce Protocol

I-Force 2.0 force-feedback 장치의 직렬·USB 프레임, 효과 매개변수와 초기 질의 프로토콜을 설명합니다.

Source pathDocumentation/input/devices/iforce-protocol.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약·해설

iforce-protocol.rst:1-381

I-Force 프로토콜 문서는 공식 명세가 아닌 관찰 기반 역공학 기록입니다. 효과 정의는 작은 opcode 패킷과 장치 RAM의 parameter block을 연결하며, 전송 프레이밍과 패킷 내부 little-endian 값을 구분하는 것이 핵심입니다.

문서 개요
항목내용
SourceDocumentation/input/devices/iforce-protocol.rst
분량381 source lines
전송RS-232 `2B OP LEN DATA CS`, USB `OP DATA`
장치 보고입력 상태 `OP=01/03`, 효과 상태 `OP=02`
효과정의 `OP=01`, parameter `OP=02`~`05`, control `OP=41`
초기화QUERY `OP=ff`, control `40`, state `42`, gain `43`
주의비공식 역공학 문서, 장치별 차이 가능

프로토콜의 주요 방향과 명령군을 요약합니다.

효과 생성 전체 흐름
장치 식별·RAM·동시 효과 수 질의장치 open과 model-specific control 설정parameter memory에 필요한 블록 업로드Force effect에서 channel·waveform·주소 연결전역 force feedback와 gain 활성화`OP=41`로 채널 시작·반복 제어

기능 질의부터 효과 재생까지의 순서입니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
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.
382

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

역공학 문서의 한계와 전송 프레임

1-53

이 문서는 Johann Deneux가 작성하고 Vojtech Pavlik가 내용을 보탠 I-Force 프로토콜 역공학 기록입니다. 보관된 프로젝트 홈페이지 링크와 저자 연락처는 원문에 보존되어 있습니다.

I-Force 2.0 장치에 force effect를 지정하는 프로토콜을 관찰해 정리한 것이며 Immerse가 제공한 공식 정보가 아닙니다. 이해를 돕기 위한 문서일 뿐 참조 명세가 아니므로, 내용에 근거해 장치로 데이터를 전송하다 발생하는 손상이나 위해에 저자는 책임지지 않는다고 경고합니다.

표시된 값은 모두 16진수이고 문서 표기 자체는 MSB가 왼쪽인 big-endian입니다. 그러나 패킷 내부의 다중 바이트 값은 little-endian으로 인코딩됩니다. 역할을 모르는 바이트는 `???`, 추가 조사가 필요한 정보는 `(?)`로 표시합니다.

I-Force 전송 프레임
전송필드설명
RS-232`2B OP LEN DATA CS``2B` 시작, opcode, 길이, 데이터, checksum
USB`OP DATA`opcode와 데이터만 전송

RS-232와 USB에서 같은 명령이 감싸지는 방식을 비교합니다.

RS-232의 `CS`는 모든 바이트를 exclusive OR한 checksum입니다. USB에서는 `2B`, `LEN`, `CS`가 사라지는데, USB가 프레임을 처리하고 데이터 손상도 전송 계층에서 처리하거나 중요하지 않기 때문으로 추정합니다.

전송별 패킷 구성
논리 `OP`와 `DATA` 구성USB이면 그대로 `OP DATA` 전송RS-232이면 `LEN` 계산선두 `2B`와 모든 바이트 XOR `CS` 추가수신 측에서 전송 방식에 맞게 프레임 제거 후 같은 명령 해석

논리 명령을 직렬 또는 USB 프레임으로 만드는 차이입니다.

===============
Iforce Protocol
===============

:Author: Johann Deneux <johann.deneux@gmail.com>

Home page at `<http://web.archive.org/web/*/http://www.esil.univ-mrs.fr>`_

:Additions: by Vojtech Pavlik.


Introduction
============

This document describes what I managed to discover about the protocol used to
specify force effects to I-Force 2.0 devices.  None of this information comes
from Immerse. That's why you should not trust what is written in this
document. This document is intended to help understanding the protocol.
This is not a reference. Comments and corrections are welcome.  To contact me,
send an email to: johann.deneux@gmail.com

.. warning::

    I shall not be held responsible for any damage or harm caused if you try to
    send data to your I-Force device based on what you read in this document.

Preliminary Notes
=================

All values are hexadecimal with big-endian encoding (msb on the left). Beware,
values inside packets are encoded using little-endian.  Bytes whose roles are
unknown are marked ???  Information that needs deeper inspection is marked (?)

General form of a packet
------------------------

This is how packets look when the device uses the rs232 to communicate.

== == === ==== ==
2B OP LEN DATA CS
== == === ==== ==

CS is the checksum. It is equal to the exclusive or of all bytes.

When using USB:

== ====
OP DATA
== ====

The 2B, LEN and CS fields have disappeared, probably because USB handles
frames and data corruption is handled or insignificant.

장치 입력과 효과 상태 보고

54-88

먼저 장치가 컴퓨터로 보내는 보고를 설명합니다. Device input state 패킷은 각 버튼 상태와 각 축 값을 전달합니다. `OP=01`은 조이스틱, `OP=03`은 휠이며 길이는 장치마다 다릅니다.

Device input state 데이터
오프셋필드의미
00X-Axis LSBX축 하위 바이트
01X-Axis MSBX축 상위 바이트
02Y-Axis LSB / gas조이스틱 Y 하위 또는 휠 가속 페달
03Y-Axis MSB / brake조이스틱 Y 상위 또는 휠 브레이크 페달
04Throttle스로틀
05Buttons버튼 비트
06 lower 4Buttons추가 버튼
06 upper 4HatHat 방향
07Rudder러더

조이스틱·휠 입력 보고의 바이트 오프셋입니다.

Device effects states는 `OP=02`이고 길이는 갱신된 매개변수 블록 수에 따라 달라집니다.

Device effects states 데이터
오프셋내용
00미상. bit 1, 값 2는 deadman switch 값
01bit 8이 재생 중 표식, bits 0~7이 effect ID
02미상
03변경된 parameter block 주소 LSB
04변경된 parameter block 주소 MSB
05 이후둘째 이후 변경 parameter block의 LSB/MSB가 필요한 만큼 반복

효과 재생 상태와 변경된 parameter block 주소입니다.

장치에서 호스트로 오는 보고
`OP=01`이면 joystick 입력 축·버튼 해석`OP=03`이면 wheel 축을 gas·brake로 해석`OP=02`이면 deadman·effect ID·재생 상태 해석남은 주소 쌍으로 변경 parameter block 식별

입력 상태와 효과 상태 opcode를 구분하는 흐름입니다.

First, I describe effects that are sent by the device to the computer

Device input state
==================

This packet is used to indicate the state of each button and the value of each
axis::

    OP= 01 for a joystick, 03 for a wheel
    LEN= Varies from device to device
    00 X-Axis lsb
    01 X-Axis msb
    02 Y-Axis lsb, or gas pedal for a wheel
    03 Y-Axis msb, or brake pedal for a wheel
    04 Throttle
    05 Buttons
    06 Lower 4 bits: Buttons
       Upper 4 bits: Hat
    07 Rudder

Device effects states
=====================

::

    OP= 02
    LEN= Varies
    00 ? Bit 1 (Value 2) is the value of the deadman switch
    01 Bit 8 is set if the effect is playing. Bits 0 to 7 are the effect id.
    02 ??
    03 Address of parameter block changed (lsb)
    04 Address of parameter block changed (msb)
    05 Address of second parameter block changed (lsb)
    ... depending on the number of parameter blocks updated

Force effect 정의 패킷

89-135

Force effect 명령은 `OP=01`, `LEN=0e`입니다. 여러 효과를 동시에 재생할 때 각각 채널을 배정하고, 파형·적용 축·트리거·지속시간·방향·재트리거 간격·매개변수 주소·실행 지연을 지정합니다.

I-Force 파형 값
효과
`00`Constant
`20`Square
`21`Triangle
`22`Sine
`23`Sawtooth up
`24`Sawtooth down
`40`Spring: `Force = f(position)`
`41`Friction: `Force = f(velocity)` 및 Inertia: `Force = f(acceleration)`

Force effect 바이트 01의 waveform 코드입니다.

적용 축과 트리거 바이트 02
영역/값의미byte 05 방향
bits 4~7 = `2`한 축, byte 05가 방향 결정사용자 방향
bits 4~7 = `4`X축만`5a`
bits 4~7 = `8`Y축만`b4`
bits 4~7 = `c`X와 Y축`60`
bits 0~3 = `0`트리거 없음-
bits 0~3 = `x+1`버튼 x가 효과 트리거-
전체 byte = `0`이전에 설정한 트리거 취소-

상위 nibble은 축, 하위 nibble은 버튼 트리거입니다.

Force effect `OP=01 LEN=0e`
오프셋필드인코딩/의미
00Channel동시 효과별 채널
01Wave form파형 코드
02Axes and trigger상위 축, 하위 버튼 트리거
03-04Durationlittle-endian ms
05Direction해당 시 방향; 아니면 축 코드별 고정값
06-07Retrigger interval트리거 사이 최소 시간
08-09Periodic/magnitude address또는 X축 interactive address, 미적용 시 `ffff`
0a-0bAttack/fade address또는 Y축 interactive address, 없으면 `ffff`
0c-0dExecution delaylittle-endian ms

14바이트 데이터의 전체 필드입니다.

주기·크기 효과에서는 08~09가 periodicity 또는 magnitude 매개변수 주소이고 0a~0b가 attack/fade 주소입니다. Interactive 효과에서는 같은 위치가 X축과 Y축 interactive 매개변수 주소가 되며 해당하지 않으면 `ffff`를 사용합니다.

Force effect 업로드
효과를 동시 재생할 channel 선택waveform과 적용 축·trigger 구성duration·direction·minimum retrigger interval 설정periodic/magnitude 또는 interactive X 주소 연결attack/fade 또는 interactive Y 주소 연결execution delay를 little-endian ms로 설정

효과 정의가 별도 parameter block과 연결되는 방식입니다.

Force effect
------------

::

    OP=  01
    LEN= 0e
    00 Channel (when playing several effects at the same time, each must
                be assigned a channel)
    01 Wave form
            Val 00 Constant
            Val 20 Square
            Val 21 Triangle
            Val 22 Sine
            Val 23 Sawtooth up
            Val 24 Sawtooth down
            Val 40 Spring (Force = f(pos))
            Val 41 Friction (Force = f(velocity)) and Inertia
                   (Force = f(acceleration))


    02 Axes affected and trigger
            Bits 4-7: Val 2 = effect along one axis. Byte 05 indicates direction
                    Val 4 = X axis only. Byte 05 must contain 5a
                    Val 8 = Y axis only. Byte 05 must contain b4
                    Val c = X and Y axes. Bytes 05 must contain 60
            Bits 0-3: Val 0 = No trigger
                    Val x+1 = Button x triggers the effect
            When the whole byte is 0, cancel the previously set trigger

    03-04 Duration of effect (little endian encoding, in ms)

    05 Direction of effect, if applicable. Else, see 02 for value to assign.

    06-07 Minimum time between triggering.

    08-09 Address of periodicity or magnitude parameters
    0a-0b Address of attack and fade parameters, or ffff if none.
    *or*
    08-09 Address of interactive parameters for X-axis,
          or ffff if not applicable
    0a-0b Address of interactive parameters for Y-axis,
          or ffff if not applicable

    0c-0d Delay before execution of effect (little endian encoding, in ms)

시간·상호작용 매개변수와 재생 제어

136-208
Attack and fade `OP=02 LEN=08`
오프셋내용
00-01저장할 parameter address
02-03attack duration, little-endian ms
04attack 끝 level, signed byte
05-06fade duration
07fade 끝 level

효과 시작·종료 엔벌로프 매개변수입니다.

Magnitude `OP=03 LEN=03`
오프셋내용
00-01Address
02Level, signed byte

정적 크기 parameter block입니다.

Periodicity `OP=04 LEN=07`
오프셋내용
00-01Address
02Magnitude, signed byte
03Offset, signed byte
04Phase: `00`=0도, `40`=90도
05-06Period, little-endian ms

주기 효과의 크기·오프셋·위상·주기입니다.

Interactive parameters `OP=05 LEN=0a`
오프셋내용
00-01Address
02Positive coefficient
03Negative coefficient
04-05Offset / center
06-07Dead band; `01F4`는 원문 표기상 decimal 5000
08Positive saturation; `0a`=decimal 1000, `64`=decimal 10000
09Negative saturation

위치·속도·가속도 기반 효과 함수의 계수와 범위입니다.

Interactive 인코딩은 특이합니다. 계수는 signed이고 최대 `64`(decimal 100), 최소 `9c`입니다. Offset 범위는 `FE0C`~`01F4`, deadband 범위는 0~`03E8`입니다. 원문의 예시 숫자와 설명은 그대로 보존합니다.

Controls `OP=41 LEN=03`
오프셋동작
00Channel제어할 효과 채널
01`00`Stop
01`01`Start and play once
01`41`Start and play n times
02n반복 횟수

채널별 효과 시작·정지와 반복 횟수입니다.

효과 매개변수와 재생
필요한 attack/fade, magnitude, periodic, interactive block 작성각 block의 memory address 확보Force effect 패킷에서 주소 연결`OP=41`에 channel과 start mode 지정반복 모드면 byte 02에 iteration 수 설정

parameter memory에 블록을 올리고 채널을 시작하는 순서입니다.

Time based parameters
---------------------

Attack and fade
^^^^^^^^^^^^^^^

::

    OP=  02
    LEN= 08
    00-01 Address where to store the parameters
    02-03 Duration of attack (little endian encoding, in ms)
    04 Level at end of attack. Signed byte.
    05-06 Duration of fade.
    07 Level at end of fade.

Magnitude
^^^^^^^^^

::

    OP=  03
    LEN= 03
    00-01 Address
    02 Level. Signed byte.

Periodicity
^^^^^^^^^^^

::

    OP=  04
    LEN= 07
    00-01 Address
    02 Magnitude. Signed byte.
    03 Offset. Signed byte.
    04 Phase. Val 00 = 0 deg, Val 40 = 90 degs.
    05-06 Period (little endian encoding, in ms)

Interactive parameters
----------------------

::

    OP=  05
    LEN= 0a
    00-01 Address
    02 Positive Coeff
    03 Negative Coeff
    04+05 Offset (center)
    06+07 Dead band (Val 01F4 = 5000 (decimal))
    08 Positive saturation (Val 0a = 1000 (decimal) Val 64 = 10000 (decimal))
    09 Negative saturation

The encoding is a bit funny here: For coeffs, these are signed values. The
maximum value is 64 (100 decimal), the min is 9c.
For the offset, the minimum value is FE0C, the maximum value is 01F4.
For the deadband, the minimum value is 0, the max is 03E8.

Controls
--------

::

    OP=  41
    LEN= 03
    00 Channel
    01 Start/Stop
            Val 00: Stop
            Val 01: Start and play once.
            Val 41: Start and play n times (See byte 02 below)
    02 Number of iterations n.

초기 기능 질의 명령

209-301

기능 질의는 `OP=ff`를 사용하고 길이는 질의 종류에 따라 달라집니다. 일반 RS-232 요청은 `ff 01 QUERY [INDEX] CHECKSUM`, 응답은 `FF LEN QUERY VALUE_QUERIED CHECKSUM2`이며 `LEN = 1 + length(VALUE_QUERIED)`입니다.

I-Force QUERY 코드
QUERY문자대상반환
`42`BBuffer / RAM size2바이트 memory size
`4e`N동시 재생 effect 수1바이트
`4d`MManufacturervendor ID 2바이트
`50`PProductproduct ID 2바이트
`4f`OOpen device데이터 없음
`43`CClose device데이터 없음
`45`EEffect type 지원지원 시 nonzero 2바이트
`56`VFirmware versionmajor, minor, subminor 3바이트

초기화 중 사용할 수 있는 질의와 반환 데이터입니다.

QUERY 응답 예시
패킷의미
`ff 03 42 03 e8 CS`RAM 1000바이트 사용 가능
`ff 02 4e 14 CS`동시에 20개 효과 재생 가능

원문의 RAM과 동시 효과 수 예시를 해석합니다.

Effect 질의 `45`에는 효과 유형을 보내고 지원하면 0이 아닌 2바이트를 반환합니다. Open과 Close는 반환 데이터가 없습니다. Firmware 질의는 major, minor, subminor 세 바이트를 돌려줍니다.

장치 기능 탐색
`4d`와 `50`으로 vendor/product 식별`56`으로 firmware 세 버전 바이트 확인`42`로 parameter RAM 크기 확인`4e`로 동시 effect channel 수 확인`45`와 effect type으로 지원 여부 조사`4f`로 장치를 열어 초기화 계속

초기화 전에 식별과 자원을 확인하는 권장 질의 흐름입니다.

Init
----


Querying features
^^^^^^^^^^^^^^^^^
::

    OP=  ff
    Query command. Length varies according to the query type.
    The general format of this packet is:
    ff 01 QUERY [INDEX] CHECKSUM
    responses are of the same form:
    FF LEN QUERY VALUE_QUERIED CHECKSUM2
    where LEN = 1 + length(VALUE_QUERIED)

Query ram size
~~~~~~~~~~~~~~

::

    QUERY = 42 ('B'uffer size)

The device should reply with the same packet plus two additional bytes
containing the size of the memory:
ff 03 42 03 e8 CS would mean that the device has 1000 bytes of ram available.

Query number of effects
~~~~~~~~~~~~~~~~~~~~~~~

::

    QUERY = 4e ('N'umber of effects)

The device should respond by sending the number of effects that can be played
at the same time (one byte)
ff 02 4e 14 CS would stand for 20 effects.

Vendor's id
~~~~~~~~~~~

::

    QUERY = 4d ('M'anufacturer)

Query the vendors'id (2 bytes)

Product id
~~~~~~~~~~

::

    QUERY = 50 ('P'roduct)

Query the product id (2 bytes)

Open device
~~~~~~~~~~~

::

    QUERY = 4f ('O'pen)

No data returned.

Close device
~~~~~~~~~~~~

::

    QUERY = 43 ('C')lose

No data returned.

Query effect
~~~~~~~~~~~~

::

    QUERY = 45 ('E')

Send effect type.
Returns nonzero if supported (2 bytes)

Firmware Version
~~~~~~~~~~~~~~~~

::

    QUERY = 56 ('V'ersion)

Sends back 3 bytes - major, minor, subminor

장치 제어 초기화와 매개변수 메모리

302-358

Set Control은 장치 모델마다 다를 수 있으므로 값의 의미를 장치별로 확인해야 합니다. 형식은 `OP=40 <idx> <val> [<val>]`, `LEN=2` 또는 `3`입니다.

Set Control `OP=40` index
Idx제어범위
`00`Dead zone0~2048
`01`Deadman sensor 무시0~1
`02`Communication watchdog 활성화0~1
`03`Spring strength0~100
`04`Spring 활성/비활성0/1
`05`Axis saturation threshold0~2048

문서에 알려진 장치 제어 index와 범위입니다.

Set Effect State `OP=42 LEN=1`
비트동작
bit 3Force feedback 일시 정지
bit 2Force feedback 활성화
bit 0모든 효과 정지

상태 바이트의 force feedback 제어 비트입니다.

Set overall `OP=43 LEN=1`
Gain
`00`0%
`40`50%
`80`100%

전체 gain 값과 백분율의 대응입니다.

각 장치는 효과 parameter를 저장할 RAM을 가지며 관찰된 크기는 200~1000바이트입니다. 업로드 전에 `QUERY=42`로 실제 크기를 확인해야 합니다.

Parameter block 메모리 사용량
블록크기
Period`0c`
Magnitude`02`
Attack and fade`0e`
Interactive`08`

각 매개변수 세트에 필요한 것으로 관찰된 바이트 수입니다.

I-Force 초기화
기능 질의로 식별·RAM·효과 수 확인Open query 전송장치별 `OP=40` control index 설정`OP=42`로 force feedback 활성 상태 구성`OP=43`으로 전체 gain 설정RAM 범위 안에 parameter block 배치

장치를 열고 전역 제어와 효과 메모리를 준비하는 순서입니다.

Initialisation of the device
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Set Control
~~~~~~~~~~~

.. note::
    Device dependent, can be different on different models!

::

    OP=  40 <idx> <val> [<val>]
    LEN= 2 or 3
    00 Idx
       Idx 00 Set dead zone (0..2048)
       Idx 01 Ignore Deadman sensor (0..1)
       Idx 02 Enable comm watchdog (0..1)
       Idx 03 Set the strength of the spring (0..100)
       Idx 04 Enable or disable the spring (0/1)
       Idx 05 Set axis saturation threshold (0..2048)

Set Effect State
~~~~~~~~~~~~~~~~

::

    OP=  42 <val>
    LEN= 1
    00 State
       Bit 3 Pause force feedback
       Bit 2 Enable force feedback
       Bit 0 Stop all effects

Set overall
~~~~~~~~~~~

::

    OP=  43 <val>
    LEN= 1
    00 Gain
       Val 00 = 0%
       Val 40 = 50%
       Val 80 = 100%

Parameter memory
----------------

Each device has a certain amount of memory to store parameters of effects.
The amount of RAM may vary, I encountered values from 200 to 1000 bytes. Below
is the amount of memory apparently needed for every set of parameters:

 - period : 0c
 - magnitude : 02
 - attack and fade : 0e
 - interactive : 08

프로토콜 조사 절차와 도구

359-381

프로토콜을 조사하려면 DirectX SDK의 force editor 또는 Immersion Studio로 효과를 생성하고, 조이스틱이나 휠의 연결 방식에 따라 RS-232 또는 USB 소프트웨어 감시를 시작한 뒤 효과를 재생하면서 패킷을 관찰합니다.

역공학 조사 순서
단계작업
1DirectX SDK force editor 또는 Immersion Studio에서 효과 생성
2연결에 맞는 RS-232/USB 감시 시작; 저자는 fCoder의 alpha ComPortSpy 사용
3효과를 재생하고 spy 화면의 송수신 관찰

원문의 세 단계와 사용 도구입니다.

ComPortSpy는 처음에는 버그가 많은 것처럼 보이지만 실제로 데이터가 몇 초 늦게 나타납니다. 저자는 효과를 재생할 때마다 프로그램을 재시작했습니다. 무료이지만 alpha 버전이라는 점을 감안해야 합니다.

원문 도구 링크
도구주소
Immersion Studio`http://www.immerse.com`
ComPortSpy`http://www.fcoder.com`
초기 프로젝트 홈페이지 보관본`http://web.archive.org/web/*/http://www.esil.univ-mrs.fr`

프로토콜 조사 도구의 원문 주소입니다.

I-Force는 Immersion Corp.의 상표입니다.

관찰 패킷 검증
한 번에 하나의 알려진 효과 생성전송 계층에 맞는 감시 도구 연결재생 전후 패킷 차이를 캡처ComPortSpy 지연을 고려해 충분히 기다리거나 재시작OP·LEN·little-endian 필드와 장치 반응을 반복 비교

비공식 역공학 결과를 재현 가능하게 확인하는 흐름입니다.

Appendix: How to study the protocol?
====================================

1. Generate effects using the force editor provided with the DirectX SDK, or
use Immersion Studio (freely available at their web site in the developer section:
www.immersion.com)
2. Start a soft spying RS232 or USB (depending on where you connected your
joystick/wheel). I used ComPortSpy from fCoder (alpha version!)
3. Play the effect, and watch what happens on the spy screen.

A few words about ComPortSpy:
At first glance, this software seems, hum, well... buggy. In fact, data appear with a
few seconds latency. Personally, I restart it every time I play an effect.
Remember it's free (as in free beer) and alpha!

URLS
====

Check http://www.immerse.com for Immersion Studio,
and http://www.fcoder.com for ComPortSpy.


I-Force is trademark of Immersion Corp.