]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - Documentation/input/iforce-protocol.txt
[PATCH] USB: yealink: fix htons usage, documentation updates
[mirror_ubuntu-bionic-kernel.git] / Documentation / input / iforce-protocol.txt
CommitLineData
1da177e4
LT
1** Introduction\r
2This document describes what I managed to discover about the protocol used to\r
3specify force effects to I-Force 2.0 devices. None of this information comes\r
4from Immerse. That's why you should not trust what is written in this\r
5document. This document is intended to help understanding the protocol.\r
6This is not a reference. Comments and corrections are welcome. To contact me,\r
7send an email to: deneux@ifrance.com\r
8\r
9** WARNING **\r
10I may not be held responsible for any dammage or harm caused if you try to\r
11send data to your I-Force device based on what you read in this document.\r
12\r
13** Preliminary Notes:\r
14All values are hexadecimal with big-endian encoding (msb on the left). Beware,\r
15values inside packets are encoded using little-endian. Bytes whose roles are\r
16unknown are marked ??? Information that needs deeper inspection is marked (?)\r
17\r
18** General form of a packet **\r
19This is how packets look when the device uses the rs232 to communicate.\r
202B OP LEN DATA CS\r
21CS is the checksum. It is equal to the exclusive or of all bytes.\r
22\r
23When using USB:\r
24OP DATA\r
25The 2B, LEN and CS fields have disappeared, probably because USB handles frames and\r
26data corruption is handled or unsignificant.\r
27\r
28First, I describe effects that are sent by the device to the computer\r
29\r
30** Device input state\r
31This packet is used to indicate the state of each button and the value of each\r
32axis\r
33OP= 01 for a joystick, 03 for a wheel\r
34LEN= Varies from device to device\r
3500 X-Axis lsb\r
3601 X-Axis msb\r
3702 Y-Axis lsb, or gas pedal for a wheel\r
3803 Y-Axis msb, or brake pedal for a wheel\r
3904 Throttle\r
4005 Buttons\r
4106 Lower 4 bits: Buttons\r
42 Upper 4 bits: Hat\r
4307 Rudder\r
44\r
45** Device effects states\r
46OP= 02\r
47LEN= Varies\r
4800 ? Bit 1 (Value 2) is the value of the deadman switch\r
4901 Bit 8 is set if the effect is playing. Bits 0 to 7 are the effect id.\r
5002 ??\r
5103 Address of parameter block changed (lsb)\r
5204 Address of parameter block changed (msb)\r
5305 Address of second parameter block changed (lsb)\r
54... depending on the number of parameter blocks updated\r
55\r
56** Force effect **\r
57OP= 01\r
58LEN= 0e\r
5900 Channel (when playing several effects at the same time, each must be assigned a channel)\r
6001 Wave form\r
61 Val 00 Constant\r
62 Val 20 Square\r
63 Val 21 Triangle\r
64 Val 22 Sine\r
65 Val 23 Sawtooth up\r
66 Val 24 Sawtooth down\r
67 Val 40 Spring (Force = f(pos))\r
68 Val 41 Friction (Force = f(velocity)) and Inertia (Force = f(acceleration))\r
69\r
70 \r
7102 Axes affected and trigger\r
72 Bits 4-7: Val 2 = effect along one axis. Byte 05 indicates direction\r
73 Val 4 = X axis only. Byte 05 must contain 5a\r
74 Val 8 = Y axis only. Byte 05 must contain b4\r
75 Val c = X and Y axes. Bytes 05 must contain 60\r
76 Bits 0-3: Val 0 = No trigger\r
77 Val x+1 = Button x triggers the effect\r
78 When the whole byte is 0, cancel the previously set trigger\r
79\r
8003-04 Duration of effect (little endian encoding, in ms)\r
81\r
8205 Direction of effect, if applicable. Else, see 02 for value to assign.\r
83\r
8406-07 Minimum time between triggering.\r
85\r
8608-09 Address of periodicity or magnitude parameters\r
870a-0b Address of attack and fade parameters, or ffff if none.\r
88*or*\r
8908-09 Address of interactive parameters for X-axis, or ffff if not applicable\r
900a-0b Address of interactive parameters for Y-axis, or ffff if not applicable\r
91\r
920c-0d Delay before execution of effect (little endian encoding, in ms)\r
93\r
94\r
95** Time based parameters **\r
96\r
97*** Attack and fade ***\r
98OP= 02\r
99LEN= 08\r
10000-01 Address where to store the parameteres\r
10102-03 Duration of attack (little endian encoding, in ms)\r
10204 Level at end of attack. Signed byte.\r
10305-06 Duration of fade.\r
10407 Level at end of fade.\r
105\r
106*** Magnitude ***\r
107OP= 03\r
108LEN= 03\r
10900-01 Address\r
11002 Level. Signed byte.\r
111\r
112*** Periodicity ***\r
113OP= 04\r
114LEN= 07\r
11500-01 Address\r
11602 Magnitude. Signed byte.\r
11703 Offset. Signed byte.\r
11804 Phase. Val 00 = 0 deg, Val 40 = 90 degs.\r
11905-06 Period (little endian encoding, in ms)\r
120\r
121** Interactive parameters **\r
122OP= 05\r
123LEN= 0a\r
12400-01 Address\r
12502 Positive Coeff\r
12603 Negative Coeff\r
12704+05 Offset (center)\r
12806+07 Dead band (Val 01F4 = 5000 (decimal))\r
12908 Positive saturation (Val 0a = 1000 (decimal) Val 64 = 10000 (decimal))\r
13009 Negative saturation\r
131\r
132The encoding is a bit funny here: For coeffs, these are signed values. The\r
133maximum value is 64 (100 decimal), the min is 9c.\r
134For the offset, the minimum value is FE0C, the maximum value is 01F4.\r
135For the deadband, the minimum value is 0, the max is 03E8.\r
136\r
137** Controls **\r
138OP= 41\r
139LEN= 03\r
14000 Channel\r
14101 Start/Stop\r
142 Val 00: Stop\r
143 Val 01: Start and play once.\r
144 Val 41: Start and play n times (See byte 02 below)\r
14502 Number of iterations n.\r
146\r
147** Init **\r
148\r
149*** Querying features ***\r
150OP= ff\r
151Query command. Length varies according to the query type.\r
152The general format of this packet is:\r
153ff 01 QUERY [INDEX] CHECKSUM\r
154reponses are of the same form:\r
155FF LEN QUERY VALUE_QUERIED CHECKSUM2\r
156where LEN = 1 + length(VALUE_QUERIED)\r
157\r
158**** Query ram size ****\r
159QUERY = 42 ('B'uffer size)\r
160The device should reply with the same packet plus two additionnal bytes\r
161containing the size of the memory:\r
162ff 03 42 03 e8 CS would mean that the device has 1000 bytes of ram available.\r
163\r
164**** Query number of effects ****\r
165QUERY = 4e ('N'umber of effects)\r
166The device should respond by sending the number of effects that can be played\r
167at the same time (one byte)\r
168ff 02 4e 14 CS would stand for 20 effects.\r
169\r
170**** Vendor's id ****\r
171QUERY = 4d ('M'anufacturer)\r
172Query the vendors'id (2 bytes)\r
173\r
174**** Product id *****\r
175QUERY = 50 ('P'roduct)\r
176Query the product id (2 bytes)\r
177\r
178**** Open device ****\r
179QUERY = 4f ('O'pen) \r
180No data returned.\r
181\r
182**** Close device *****\r
183QUERY = 43 ('C')lose\r
184No data returned.\r
185\r
186**** Query effect ****\r
187QUERY = 45 ('E') \r
188Send effect type.\r
189Returns nonzero if supported (2 bytes)\r
190\r
191**** Firmware Version ****\r
192QUERY = 56 ('V'ersion)\r
193Sends back 3 bytes - major, minor, subminor\r
194\r
195*** Initialisation of the device ***\r
196\r
197**** Set Control ****\r
198!!! Device dependent, can be different on different models !!!\r
199OP= 40 <idx> <val> [<val>]\r
200LEN= 2 or 3\r
20100 Idx\r
202 Idx 00 Set dead zone (0..2048) \r
203 Idx 01 Ignore Deadman sensor (0..1) \r
204 Idx 02 Enable comm watchdog (0..1) \r
205 Idx 03 Set the strength of the spring (0..100) \r
206 Idx 04 Enable or disable the spring (0/1)\r
207 Idx 05 Set axis saturation threshold (0..2048) \r
208\r
209**** Set Effect State ****\r
210OP= 42 <val>\r
211LEN= 1\r
21200 State\r
213 Bit 3 Pause force feedback\r
214 Bit 2 Enable force feedback\r
215 Bit 0 Stop all effects\r
216\r
217**** Set overall gain ****\r
218OP= 43 <val>\r
219LEN= 1\r
22000 Gain\r
221 Val 00 = 0%\r
222 Val 40 = 50%\r
223 Val 80 = 100%\r
224\r
225** Parameter memory **\r
226\r
227Each device has a certain amount of memory to store parameters of effects.\r
228The amount of RAM may vary, I encountered values from 200 to 1000 bytes. Below\r
229is the amount of memory apparently needed for every set of parameters:\r
230 - period : 0c\r
231 - magnitude : 02\r
232 - attack and fade : 0e\r
233 - interactive : 08\r
234\r
235** Appendix: How to study the protocol ? **\r
236\r
2371. 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)\r
2382. Start a soft spying RS232 or USB (depending on where you connected your joystick/wheel). I used ComPortSpy from fCoder (alpha version!)\r
2393. Play the effect, and watch what happens on the spy screen.\r
240\r
241A few words about ComPortSpy:\r
242At first glance, this soft seems, hum, well... buggy. In fact, data appear with a few seconds latency. Personnaly, I restart it every time I play an effect.\r
243Remember it's free (as in free beer) and alpha!\r
244\r
245** URLS **\r
246Check www.immerse.com for Immersion Studio, and www.fcoder.com for ComPortSpy.\r
247\r
248** Author of this document **\r
249Johann Deneux <deneux@ifrance.com>\r
250Home page at http://www.esil.univ-mrs.fr/~jdeneux/projects/ff/\r
251\r
252Additions by Vojtech Pavlik.\r
253\r
254I-Force is trademark of Immersion Corp.\r