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

TOMOYO Linux Cross Reference
Linux/Documentation/input/ff.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 ] ~

Diff markup

Differences between /Documentation/input/ff.rst (Version linux-6.11.5) and /Documentation/input/ff.rst (Version linux-5.6.19)


  1 ========================                            1 ========================
  2 Force feedback for Linux                            2 Force feedback for Linux
  3 ========================                            3 ========================
  4                                                     4 
  5 :Author: Johann Deneux <johann.deneux@gmail.com      5 :Author: Johann Deneux <johann.deneux@gmail.com> on 2001/04/22.
  6 :Updated: Anssi Hannula <anssi.hannula@gmail.co      6 :Updated: Anssi Hannula <anssi.hannula@gmail.com> on 2006/04/09.
  7                                                     7 
  8 You may redistribute this file. Please remembe      8 You may redistribute this file. Please remember to include shape.svg and
  9 interactive.svg as well.                            9 interactive.svg as well.
 10                                                    10 
 11 Introduction                                       11 Introduction
 12 ~~~~~~~~~~~~                                       12 ~~~~~~~~~~~~
 13                                                    13 
 14 This document describes how to use force feedb     14 This document describes how to use force feedback devices under Linux. The
 15 goal is not to support these devices as if the     15 goal is not to support these devices as if they were simple input-only devices
 16 (as it is already the case), but to really ena     16 (as it is already the case), but to really enable the rendering of force
 17 effects.                                           17 effects.
 18 This document only describes the force feedbac     18 This document only describes the force feedback part of the Linux input
 19 interface. Please read joydev/joystick.rst and !!  19 interface. Please read joystick.txt and input.txt before reading further this
 20 this document.                                 !!  20 document.
 21                                                    21 
 22 Instructions to the user                           22 Instructions to the user
 23 ~~~~~~~~~~~~~~~~~~~~~~~~                           23 ~~~~~~~~~~~~~~~~~~~~~~~~
 24                                                    24 
 25 To enable force feedback, you have to:             25 To enable force feedback, you have to:
 26                                                    26 
 27 1. have your kernel configured with evdev and      27 1. have your kernel configured with evdev and a driver that supports your
 28    device.                                         28    device.
 29 2. make sure evdev module is loaded and /dev/i     29 2. make sure evdev module is loaded and /dev/input/event* device files are
 30    created.                                        30    created.
 31                                                    31 
 32 Before you start, let me WARN you that some de     32 Before you start, let me WARN you that some devices shake violently during the
 33 initialisation phase. This happens for example     33 initialisation phase. This happens for example with my "AVB Top Shot Pegasus".
 34 To stop this annoying behaviour, move your joy     34 To stop this annoying behaviour, move your joystick to its limits. Anyway, you
 35 should keep a hand on your device, in order to     35 should keep a hand on your device, in order to avoid it to break down if
 36 something goes wrong.                              36 something goes wrong.
 37                                                    37 
 38 If you have a serial iforce device, you need t     38 If you have a serial iforce device, you need to start inputattach. See
 39 joydev/joystick.rst for details.               !!  39 joystick.txt for details.
 40                                                    40 
 41 Does it work ?                                     41 Does it work ?
 42 --------------                                     42 --------------
 43                                                    43 
 44 There is an utility called fftest that will al     44 There is an utility called fftest that will allow you to test the driver::
 45                                                    45 
 46     % fftest /dev/input/eventXX                    46     % fftest /dev/input/eventXX
 47                                                    47 
 48 Instructions to the developer                      48 Instructions to the developer
 49 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                      49 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 50                                                    50 
 51 All interactions are done using the event API.     51 All interactions are done using the event API. That is, you can use ioctl()
 52 and write() on /dev/input/eventXX.                 52 and write() on /dev/input/eventXX.
 53 This information is subject to change.             53 This information is subject to change.
 54                                                    54 
 55 Querying device capabilities                       55 Querying device capabilities
 56 ----------------------------                       56 ----------------------------
 57                                                    57 
 58 ::                                                 58 ::
 59                                                    59 
 60     #include <linux/input.h>                       60     #include <linux/input.h>
 61     #include <sys/ioctl.h>                         61     #include <sys/ioctl.h>
 62                                                    62 
 63     #define BITS_TO_LONGS(x) \                     63     #define BITS_TO_LONGS(x) \
 64             (((x) + 8 * sizeof (unsigned long)     64             (((x) + 8 * sizeof (unsigned long) - 1) / (8 * sizeof (unsigned long)))
 65     unsigned long features[BITS_TO_LONGS(FF_CN     65     unsigned long features[BITS_TO_LONGS(FF_CNT)];
 66     int ioctl(int file_descriptor, int request     66     int ioctl(int file_descriptor, int request, unsigned long *features);
 67                                                    67 
 68 "request" must be EVIOCGBIT(EV_FF, size of fea     68 "request" must be EVIOCGBIT(EV_FF, size of features array in bytes )
 69                                                    69 
 70 Returns the features supported by the device.      70 Returns the features supported by the device. features is a bitfield with the
 71 following bits:                                    71 following bits:
 72                                                    72 
 73 - FF_CONSTANT   can render constant force effe     73 - FF_CONSTANT   can render constant force effects
 74 - FF_PERIODIC   can render periodic effects wi     74 - FF_PERIODIC   can render periodic effects with the following waveforms:
 75                                                    75 
 76   - FF_SQUARE     square waveform                  76   - FF_SQUARE     square waveform
 77   - FF_TRIANGLE   triangle waveform                77   - FF_TRIANGLE   triangle waveform
 78   - FF_SINE       sine waveform                    78   - FF_SINE       sine waveform
 79   - FF_SAW_UP     sawtooth up waveform             79   - FF_SAW_UP     sawtooth up waveform
 80   - FF_SAW_DOWN   sawtooth down waveform           80   - FF_SAW_DOWN   sawtooth down waveform
 81   - FF_CUSTOM     custom waveform                  81   - FF_CUSTOM     custom waveform
 82                                                    82 
 83 - FF_RAMP       can render ramp effects            83 - FF_RAMP       can render ramp effects
 84 - FF_SPRING     can simulate the presence of a     84 - FF_SPRING     can simulate the presence of a spring
 85 - FF_FRICTION   can simulate friction              85 - FF_FRICTION   can simulate friction
 86 - FF_DAMPER     can simulate damper effects        86 - FF_DAMPER     can simulate damper effects
 87 - FF_RUMBLE     rumble effects                     87 - FF_RUMBLE     rumble effects
 88 - FF_INERTIA    can simulate inertia               88 - FF_INERTIA    can simulate inertia
 89 - FF_GAIN       gain is adjustable                 89 - FF_GAIN       gain is adjustable
 90 - FF_AUTOCENTER autocenter is adjustable           90 - FF_AUTOCENTER autocenter is adjustable
 91                                                    91 
 92 .. note::                                          92 .. note::
 93                                                    93 
 94     - In most cases you should use FF_PERIODIC     94     - In most cases you should use FF_PERIODIC instead of FF_RUMBLE. All
 95       devices that support FF_RUMBLE support F     95       devices that support FF_RUMBLE support FF_PERIODIC (square, triangle,
 96       sine) and the other way around.              96       sine) and the other way around.
 97                                                    97 
 98     - The exact syntax FF_CUSTOM is undefined      98     - The exact syntax FF_CUSTOM is undefined for the time being as no driver
 99       supports it yet.                             99       supports it yet.
100                                                   100 
101 ::                                                101 ::
102                                                   102 
103     int ioctl(int fd, EVIOCGEFFECTS, int *n);     103     int ioctl(int fd, EVIOCGEFFECTS, int *n);
104                                                   104 
105 Returns the number of effects the device can k    105 Returns the number of effects the device can keep in its memory.
106                                                   106 
107 Uploading effects to the device                   107 Uploading effects to the device
108 -------------------------------                   108 -------------------------------
109                                                   109 
110 ::                                                110 ::
111                                                   111 
112     #include <linux/input.h>                      112     #include <linux/input.h>
113     #include <sys/ioctl.h>                        113     #include <sys/ioctl.h>
114                                                   114 
115     int ioctl(int file_descriptor, int request    115     int ioctl(int file_descriptor, int request, struct ff_effect *effect);
116                                                   116 
117 "request" must be EVIOCSFF.                       117 "request" must be EVIOCSFF.
118                                                   118 
119 "effect" points to a structure describing the     119 "effect" points to a structure describing the effect to upload. The effect is
120 uploaded, but not played.                         120 uploaded, but not played.
121 The content of effect may be modified. In part    121 The content of effect may be modified. In particular, its field "id" is set
122 to the unique id assigned by the driver. This     122 to the unique id assigned by the driver. This data is required for performing
123 some operations (removing an effect, controlli    123 some operations (removing an effect, controlling the playback).
124 The "id" field must be set to -1 by the user i    124 The "id" field must be set to -1 by the user in order to tell the driver to
125 allocate a new effect.                            125 allocate a new effect.
126                                                   126 
127 Effects are file descriptor specific.             127 Effects are file descriptor specific.
128                                                   128 
129 See <uapi/linux/input.h> for a description of     129 See <uapi/linux/input.h> for a description of the ff_effect struct.  You
130 should also find help in a few sketches, conta    130 should also find help in a few sketches, contained in files shape.svg
131 and interactive.svg:                              131 and interactive.svg:
132                                                   132 
133 .. kernel-figure:: shape.svg                      133 .. kernel-figure:: shape.svg
134                                                   134 
135     Shape                                         135     Shape
136                                                   136 
137 .. kernel-figure:: interactive.svg                137 .. kernel-figure:: interactive.svg
138                                                   138 
139     Interactive                                   139     Interactive
140                                                   140 
141                                                   141 
142 Removing an effect from the device                142 Removing an effect from the device
143 ----------------------------------                143 ----------------------------------
144                                                   144 
145 ::                                                145 ::
146                                                   146 
147     int ioctl(int fd, EVIOCRMFF, effect.id);      147     int ioctl(int fd, EVIOCRMFF, effect.id);
148                                                   148 
149 This makes room for new effects in the device'    149 This makes room for new effects in the device's memory. Note that this also
150 stops the effect if it was playing.               150 stops the effect if it was playing.
151                                                   151 
152 Controlling the playback of effects               152 Controlling the playback of effects
153 -----------------------------------               153 -----------------------------------
154                                                   154 
155 Control of playing is done with write(). Below    155 Control of playing is done with write(). Below is an example:
156                                                   156 
157 ::                                                157 ::
158                                                   158 
159     #include <linux/input.h>                      159     #include <linux/input.h>
160     #include <unistd.h>                           160     #include <unistd.h>
161                                                   161 
162         struct input_event play;                  162         struct input_event play;
163         struct input_event stop;                  163         struct input_event stop;
164         struct ff_effect effect;                  164         struct ff_effect effect;
165         int fd;                                   165         int fd;
166    ...                                            166    ...
167         fd = open("/dev/input/eventXX", O_RDWR    167         fd = open("/dev/input/eventXX", O_RDWR);
168    ...                                            168    ...
169         /* Play three times */                    169         /* Play three times */
170         play.type = EV_FF;                        170         play.type = EV_FF;
171         play.code = effect.id;                    171         play.code = effect.id;
172         play.value = 3;                           172         play.value = 3;
173                                                   173 
174         write(fd, (const void*) &play, sizeof(    174         write(fd, (const void*) &play, sizeof(play));
175    ...                                            175    ...
176         /* Stop an effect */                      176         /* Stop an effect */
177         stop.type = EV_FF;                        177         stop.type = EV_FF;
178         stop.code = effect.id;                    178         stop.code = effect.id;
179         stop.value = 0;                           179         stop.value = 0;
180                                                   180 
181         write(fd, (const void*) &stop, sizeof(    181         write(fd, (const void*) &stop, sizeof(stop));
182                                                   182 
183 Setting the gain                                  183 Setting the gain
184 ----------------                                  184 ----------------
185                                                   185 
186 Not all devices have the same strength. Theref    186 Not all devices have the same strength. Therefore, users should set a gain
187 factor depending on how strong they want effec    187 factor depending on how strong they want effects to be. This setting is
188 persistent across access to the driver.           188 persistent across access to the driver.
189                                                   189 
190 ::                                                190 ::
191                                                   191 
192     /* Set the gain of the device                 192     /* Set the gain of the device
193     int gain;           /* between 0 and 100 *    193     int gain;           /* between 0 and 100 */
194     struct input_event ie;      /* structure u    194     struct input_event ie;      /* structure used to communicate with the driver */
195                                                   195 
196     ie.type = EV_FF;                              196     ie.type = EV_FF;
197     ie.code = FF_GAIN;                            197     ie.code = FF_GAIN;
198     ie.value = 0xFFFFUL * gain / 100;             198     ie.value = 0xFFFFUL * gain / 100;
199                                                   199 
200     if (write(fd, &ie, sizeof(ie)) == -1)         200     if (write(fd, &ie, sizeof(ie)) == -1)
201         perror("set gain");                       201         perror("set gain");
202                                                   202 
203 Enabling/Disabling autocenter                     203 Enabling/Disabling autocenter
204 -----------------------------                     204 -----------------------------
205                                                   205 
206 The autocenter feature quite disturbs the rend    206 The autocenter feature quite disturbs the rendering of effects in my opinion,
207 and I think it should be an effect, which comp    207 and I think it should be an effect, which computation depends on the game
208 type. But you can enable it if you want.          208 type. But you can enable it if you want.
209                                                   209 
210 ::                                                210 ::
211                                                   211 
212     int autocenter;             /* between 0 a    212     int autocenter;             /* between 0 and 100 */
213     struct input_event ie;                        213     struct input_event ie;
214                                                   214 
215     ie.type = EV_FF;                              215     ie.type = EV_FF;
216     ie.code = FF_AUTOCENTER;                      216     ie.code = FF_AUTOCENTER;
217     ie.value = 0xFFFFUL * autocenter / 100;       217     ie.value = 0xFFFFUL * autocenter / 100;
218                                                   218 
219     if (write(fd, &ie, sizeof(ie)) == -1)         219     if (write(fd, &ie, sizeof(ie)) == -1)
220         perror("set auto-center");                220         perror("set auto-center");
221                                                   221 
222 A value of 0 means "no auto-center".              222 A value of 0 means "no auto-center".
223                                                   223 
224 Dynamic update of an effect                       224 Dynamic update of an effect
225 ---------------------------                       225 ---------------------------
226                                                   226 
227 Proceed as if you wanted to upload a new effec    227 Proceed as if you wanted to upload a new effect, except that instead of
228 setting the id field to -1, you set it to the     228 setting the id field to -1, you set it to the wanted effect id.
229 Normally, the effect is not stopped and restar    229 Normally, the effect is not stopped and restarted. However, depending on the
230 type of device, not all parameters can be dyna    230 type of device, not all parameters can be dynamically updated. For example,
231 the direction of an effect cannot be updated w    231 the direction of an effect cannot be updated with iforce devices. In this
232 case, the driver stops the effect, up-load it,    232 case, the driver stops the effect, up-load it, and restart it.
233                                                   233 
234 Therefore it is recommended to dynamically cha    234 Therefore it is recommended to dynamically change direction while the effect
235 is playing only when it is ok to restart the e    235 is playing only when it is ok to restart the effect with a replay count of 1.
236                                                   236 
237 Information about the status of effects           237 Information about the status of effects
238 ---------------------------------------           238 ---------------------------------------
239                                                   239 
240 Every time the status of an effect is changed,    240 Every time the status of an effect is changed, an event is sent. The values
241 and meanings of the fields of the event are as    241 and meanings of the fields of the event are as follows::
242                                                   242 
243     struct input_event {                          243     struct input_event {
244     /* When the status of the effect changed *    244     /* When the status of the effect changed */
245             struct timeval time;                  245             struct timeval time;
246                                                   246 
247     /* Set to EV_FF_STATUS */                     247     /* Set to EV_FF_STATUS */
248             unsigned short type;                  248             unsigned short type;
249                                                   249 
250     /* Contains the id of the effect */           250     /* Contains the id of the effect */
251             unsigned short code;                  251             unsigned short code;
252                                                   252 
253     /* Indicates the status */                    253     /* Indicates the status */
254             unsigned int value;                   254             unsigned int value;
255     };                                            255     };
256                                                   256 
257     FF_STATUS_STOPPED   The effect stopped pla    257     FF_STATUS_STOPPED   The effect stopped playing
258     FF_STATUS_PLAYING   The effect started to     258     FF_STATUS_PLAYING   The effect started to play
259                                                   259 
260 .. note::                                         260 .. note::
261                                                   261 
262     - Status feedback is only supported by ifo    262     - Status feedback is only supported by iforce driver. If you have
263       a really good reason to use this, please    263       a really good reason to use this, please contact
264       linux-joystick@atrey.karlin.mff.cuni.cz     264       linux-joystick@atrey.karlin.mff.cuni.cz or anssi.hannula@gmail.com
265       so that support for it can be added to t    265       so that support for it can be added to the rest of the drivers.
                                                      

~ [ 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