input: Introduce ff-memless-next as an improved replacement for ff-memless
Subsystems (4)
v4 cover input: Introduce ff-memless-next as an improved replacement for ff-memless
ff-memless-next (MLNX) is a largely improved version of the current ff-memless (FFML) driver. MLNX supports all force feedback effects currently available in the Linux force feedback userspace API. All effects are handled in accordance with Microsoft's DirectInput/XInput. Most notable changes include support for conditional effects, proper handling of all periodic waveforms and improved emulation of rumble effects through periodic effects. MLNX also uses its own kernel API to pass processed effects to hardware-specific drivers instead of abusing "ff_effect" struct. The API is documented in the respective header file.
MLNX has been expanded to be a direct replacement for FFML.
Support for FF_PERIODIC and FF_RAMP has been added to all devices that support FF_CONSTANT as a part of the port to the new API.
This patch series:
1) Adds "ff-memless-next" module [1]
2) Ports all hardware-specific drivers to MLNX's API [2-23]
3) Removes FFML and replaces it with MLNX [24]
v4:
- Add a summary of changes between MLNX and FFML to the last patch
- Remove a stale empty line in hid-sony.c
- Add "Tested-by: Elias Vanderstuyft <[email protected]>" to hid-lg4ff patch.
v3:
- Rebase against latest linux-next. Fixes conflict in hid-sony.c and max8997_haptic.c
- Updated documentation in ff-memless-next.h. The documentation now describes parameters of the callback function and specifically mentions that HW-specific drivers must not keep a reference to mlnx_effect_command struct to which a pointer is passed in the callback function.
- Fix a minor brace inconsistency in hid-lgff
I believe that all concerns regarding v2 have been resolved as false alarms.
v2:
- Add missing msecs to jiffies conversion in ff-memless-next
- lgff: Properly convert force on Y axis from MLNX to device range Support periodic effects for "joystick_ac" device class
- lg3ff: Properly convert forces from MLNX to device range
- Very minor coding style issues fixed
Michal Malý (24):
Add ff-memless-next module
Port arizona-haptics to ff-memless-next
Port twl4030-vibra to ff-memless-next
Port twl6040-vibra to ff-memless-next
Port max8997_haptic to ff-memless-next
Port pm8xxx-vibrator to ff-memless-next
Port hid-axff to ff-memless-next
Port hid-emsff to ff-memless-next
Port hid-dr to ff-memless-next
Port hid-gaff to ff-memless-next
Port hid-holtekff to ff-memless-next
Port hid-lgff to ff-memless-next
Port hid-lg3ff to ff-memless-next
Port hid-pl to ff-memless-next
Port hid-sjoy to ff-memless-next
Port hid-sony to ff-memless-next
Port hid-tmff to ff-memless-next
Port hid-wiimote-modules to ff-memless-next
Port hid-zpff to ff-memless-next
Port gamecon to ff-memless-next
Port xpad to ff-memless-next
Port hid-lg2ff to ff-memless-next
Port hid-lg4ff to ff-memless-next
Replace ff-memless with ff-memless-next
drivers/hid/Kconfig | 30 +- drivers/hid/hid-axff.c | 32 +- drivers/hid/hid-dr.c | 59 +- drivers/hid/hid-emsff.c | 38 +- drivers/hid/hid-gaff.c | 32 +- drivers/hid/hid-holtekff.c | 47 +- drivers/hid/hid-lg2ff.c | 65 ++- drivers/hid/hid-lg3ff.c | 60 +- drivers/hid/hid-lg4ff.c | 93 +-- drivers/hid/hid-lgff.c | 70 ++- drivers/hid/hid-pl.c | 38 +- drivers/hid/hid-sjoy.c | 35 +- drivers/hid/hid-sony.c | 23 +- drivers/hid/hid-tmff.c | 83 +-- drivers/hid/hid-wiimote-modules.c | 74 ++- drivers/hid/hid-zpff.c | 30 +- drivers/input/Kconfig | 4 +- drivers/input/Makefile | 2 +- drivers/input/ff-memless-next.c | 1037 +++++++++++++++++++++++++++++++++ drivers/input/ff-memless.c | 547 ----------------- drivers/input/joystick/Kconfig | 4 +- drivers/input/joystick/gamecon.c | 57 +- drivers/input/joystick/xpad.c | 125 ++-- drivers/input/misc/Kconfig | 10 +- drivers/input/misc/arizona-haptics.c | 39 +- drivers/input/misc/max8997_haptic.c | 25 +- drivers/input/misc/pm8xxx-vibrator.c | 28 +- drivers/input/misc/twl4030-vibra.c | 31 +- drivers/input/misc/twl6040-vibra.c | 27 +- include/linux/input.h | 3 - include/linux/input/ff-memless-next.h | 162 +++++ 31 files changed, 1951 insertions(+), 959 deletions(-) create mode 100644 drivers/input/ff-memless-next.c delete mode 100644 drivers/input/ff-memless.c create mode 100644 include/linux/input/ff-memless-next.h
Signature · 6 lines
1.9.2 -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v4 1/24 input: Add ff-memless-next module
Add ff-memless-next module
--- drivers/input/Kconfig | 11 + drivers/input/Makefile | 1 + drivers/input/ff-memless-next.c | 1037 +++++++++++++++++++++++++++++++++ include/linux/input/ff-memless-next.h | 162 +++++ 4 files changed, 1211 insertions(+) create mode 100644 drivers/input/ff-memless-next.c create mode 100644 include/linux/input/ff-memless-next.h
drivers/input/Kconfig +11 -0
@@ -38,6 +38,17 @@ config INPUT_FF_MEMLESS To compile this driver as a module, choose M here: the module will be called ff-memless. +config INPUT_FF_MEMLESS_NEXT + tristate "New version of support for memoryless force-feedback devices" + help + Say Y here to enable a new version of support for memoryless force + feedback devices. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called ff-memless-next. + config INPUT_POLLDEV tristate "Polled input device skeleton" help
drivers/input/Makefile +1 -0
@@ -8,6 +8,7 @@ obj-$(CONFIG_INPUT) += input-core.o input-core-y := input.o input-compat.o input-mt.o ff-core.o obj-$(CONFIG_INPUT_FF_MEMLESS) += ff-memless.o +obj-$(CONFIG_INPUT_FF_MEMLESS_NEXT) += ff-memless-next.o obj-$(CONFIG_INPUT_POLLDEV) += input-polldev.o obj-$(CONFIG_INPUT_SPARSEKMAP) += sparse-keymap.o obj-$(CONFIG_INPUT_MATRIXKMAP) += matrix-keymap.o
drivers/input/ff-memless-next.c new file +1037 -0
1,037 lines not on this page · raw message
include/linux/input/ff-memless-next.h new file +162 -0
162 lines not on this page · raw message
Signature · 6 lines
1.9.2 -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Dmitry Torokhov
maintainerRe: [PATCH v4 01/24] input: Add ff-memless-next module
Hi Michal,
Quoted 28 lines · Michal Malý
include/linux/input/ff-memless-next.h new file +28
-0+ +/** DEFINITION OF TERMS +* +* Combined effect - An effect whose force is a superposition of forces +* generated by all effects that can be added together. +* Only one combined effect can be playing at a time. +* Effects that can be added together to create a combined +* effect are FF_CONSTANT, FF_PERIODIC and FF_RAMP. +* Uncombinable effect - An effect that cannot be combined with another effect. +* All conditional effects - FF_DAMPER, FF_FRICTION, +* FF_INERTIA and FF_SPRING are uncombinable. +* Number of uncombinable effects playing simultaneously +* depends on the capabilities of the hardware. +* Rumble effect - An effect generated by device's rumble motors instead of +* force feedback actuators. +* +* +* HANDLING OF UNCOMBINABLE EFFECTS +* +* Uncombinable effects cannot be combined together into just one effect, at +* least not in a clear and obvious manner. Therefore these effects have to +* be handled individually by ff-memless-next. Handling of these effects is +* left entirely to the hardware-specific driver, ff-memless-next merely +* passes these effects to the hardware-specific driver at appropriate time. +* ff-memless-next provides the UPLOAD command to notify the hardware-specific +* driver that the userspace is about to request playback of an uncombinable +* effect. The hardware-specific driver shall take all steps needed to make +* the device ready to play the effect when it receives the UPLOAD command.
include/linux/input/ff-memless-next.h line 39
Quoted 10 lines
include/linux/input/ff-memless-next.h new file +10
-0+* The actual playback shall commence when START_UNCOMB command is received. +* Opposite to the UPLOAD command is the ERASE command which tells +* the hardware-specific driver that the playback has finished and that +* the effect will not be restarted. STOP_UNCOMB command tells +* the hardware-specific driver that the playback shall stop but the device +* shall still be ready to resume the playback immediately. +* +* In case it is not possible to make the device ready to play an uncombinable +* effect (all hardware effect slots are occupied), the hardware-specific +* driver may return an error when it receives an UPLOAD command. If the
This part concerns me. It seems to me that devices supporting "uncombinable" effects are in fact not memoryless devices and we should not be introducing this term here. If the goal is to work around limited number of effect slots in the devices by combining certain effects then it needs to be done at ff-core level as it will be potentially useful for all devices.
Quoted 18 lines
+ * hardware-specific driver returns 0, the upload is considered successful.
+ *START_UNCOMBandSTOP_UNCOMBcommands cannot fail and the device must always
+ * start the playback of the requested effect if the UPLOAD command of the
+ * respective effect has been successful. ff-memless-next will never send
+ * a START/STOP_UNCOMB command for an effect that has not been uploaded
+ * successfully, nor will it send an ERASE command for an effect that is
+ * playing (= has been started withSTART_UNCOMBcommand).+ */
include/linux/input/ff-memless-next.h new file +9
-0+ +enum mlnx_commands { +/* Start or update a combined effect. This command is sent whenever +* a FF_CONSTANT, FF_PERIODIC or FF_RAMP is started, stopped or +* updated by userspace, when the applied envelopes are recalculated +* or when periodic effects are recalculated. */ +MLNX_START_COMBINED , +/* Stop combined effect. This command is sent when all combinable +* effects are stopped. */
include/linux/input/ff-memless-next.h line 66
Quoted 10 lines
include/linux/input/ff-memless-next.h new file +10
-0+MLNX_STOP_COMBINED , +/* Start or update a rumble effect. This command is sent whenever +* a FF_RUMBLE effect is started or when its magnitudes or directions +* change. */ +MLNX_START_RUMBLE , +/* Stop a rumble effect. This command is sent when all FF_RUMBLE +* effects are stopped. */ + MLNX_STOP_RUMBLE, +/* Start or update an uncombinable effect. This command is sent +* whenever an uncombinable effect is started or updated. */
Why do we have make a distinction between rumble and all other effects?
Signature · 5 lines
Dmitry -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v4 01/24] input: Add ff-memless-next module
Hi Dmitry,
thank you for reviewing this.
Quoted 40 lines · On Tuesday 13 of May 2014 23:38:06 Dmitry Torokhov wrote:
Quoted 39 lines · Michal Malý
include/linux/input/ff-memless-next.h new file +7
-0+ +/** DEFINITION OF TERMS +* +* Combined effect - An effect whose force is a superposition of forces +* generated by all effects that can be added together. +* Only one combined effect can be playing at a time. +* Effects that can be added together to create a combined + * effect are
FF_CONSTANT,FF_PERIODICandFF_RAMP. + * Uncombinable effect - An effect that cannot be combined with
another effect. + * All conditional effects -FF_DAMPER,FF_FRICTION, + *FF_INERTIAandFF_SPRINGare uncombinable. + * Number of
uncombinable effects playing simultaneously + *
depends on the capabilities of the hardware. + * Rumble effect - An effect generated by device's rumble motors instead of + * force feedback actuators.
+ *
+ *
+ * HANDLING OF UNCOMBINABLE EFFECTS
+ *
+ * Uncombinable effects cannot be combined together into just one effect, at + * least not in a clear and obvious manner. Therefore these effects have to + * be handled individually by ff-memless-next. Handling of these effects is + * left entirely to the hardware-specific driver, ff-memless-next merely + * passes these effects to the hardware-specific driver at appropriate time. + * ff-memless-next provides the UPLOAD command to notify the hardware-specific + * driver that the userspace is about to request playback of an uncombinable + * effect. The hardware-specific driver shall take all steps needed to make + * the device ready to play the effect when it receives the UPLOAD command. + * The actual playback shall commence whenSTART_UNCOMBcommand is received.
+ * Opposite to the UPLOAD command is the ERASE command which tells + * the hardware-specific driver that the playback has finished and that + * the effect will not be restarted.STOP_UNCOMBcommand tells
+ * the hardware-specific driver that the playback shall stop but the device + * shall still be ready to resume the playback immediately.
+ *
+ * In case it is not possible to make the device ready to play an uncombinable + * effect (all hardware effect slots are occupied), the
Quoted 8 lines
Quoted 2 lines
hardware-specific + * driver may return an error when it receives an UPLOAD command. If the
This part concerns me. It seems to me that devices supporting "uncombinable" effects are in fact not memoryless devices and we should not be introducing this term here. If the goal is to work around limited number of effect slots in the devices by combining certain effects then it needs to be done at ff-core level as it will be potentially useful for all devices.
Force generated by a conditional effect (referred to as "uncombinable" within ff-memless-next to make the distinction clear) depends on a position of the device. For instance the more a device is deflected from a neutral position the greater force FF_SPRING generates. A truly memoryless device would have to report its position to the driver, have it calculate the appropriate force and send it back to the device. IMHO such a loop would require a very high USB polling rate to play conditional effects with acceptable quality.
We know for a fact that at least many (all?) Logitech devices that support conditional effects use this "semi-memoryless" approach where FF_CONSTANT and FF_PERIODIC are handled in the memoryless fashion and conditional effects are uploaded to the device (in a somewhat simplified form). The amount of effects that can be uploaded to a device is limited which is why ff-memless-next uses two steps (UPLOAD/ERASE and START/STOP) to handle these effects.
Conditional effects - even if they are of the same type - cannot be effectively combined into one because superposition doesn't seem to work here so they have to be processed one by one.
If we ever come across a really memoryless device it should not be particularly difficult to add another callback to ff-memless-next which would emulate conditional effects with constant force.
Quoted 23 lines
Quoted 23 lines
+ * hardware-specific driver returns 0, the upload is considered successful. + *
START_UNCOMBandSTOP_UNCOMBcommands cannot fail and the device must always + * start the playback of the requested effect if the UPLOAD command of the + * respective effect has been successful. ff-memless-next will never send + * a START/STOP_UNCOMB command for an effect that has not been uploaded + * successfully, nor will it send an ERASE command for an effect that is + * playing (= has been started withSTART_UNCOMBcommand).+ */
include/linux/input/ff-memless-next.h new file +13
-0+ +enum mlnx_commands { +/* Start or update a combined effect. This command is sent whenever +* a FF_CONSTANT, FF_PERIODIC or FF_RAMP is started, stopped or +* updated by userspace, when the applied envelopes are recalculated +* or when periodic effects are recalculated. */ +MLNX_START_COMBINED , +/* Stop combined effect. This command is sent when all combinable +* effects are stopped. */ +MLNX_STOP_COMBINED , +/* Start or update a rumble effect. This command is sent whenever +* a FF_RUMBLE effect is started or when its magnitudes or directions +* change. */
Quoted 8 lines
include/linux/input/ff-memless-next.h line 66
Quoted 6 lines
include/linux/input/ff-memless-next.h new file +6
-0+MLNX_START_RUMBLE , +/* Stop a rumble effect. This command is sent when all FF_RUMBLE +* effects are stopped. */ + MLNX_STOP_RUMBLE, +/* Start or update an uncombinable effect. This command is sent +* whenever an uncombinable effect is started or updated. */ Why do we have make a distinction between rumble and all other effects?
Because "combined" effect consists of two vectors pointing along X and Y axes whereas "rumble" effect is a rotation speed of a rumble motor and the direction of rotation. Naturally these effects have to be handled in a different fashion. It is also possible to have a device with both rumble motors and FF actuator. Having such a distinction also makes it easier to handle emulation of rumble effects through constant force and vice versa.
Michal
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v4 01/24] input: Add ff-memless-next module
Quoted 69 lines · Michal Malý
Hi Dmitry,
thank you for reviewing this.
Quoted 40 lines · On Tuesday 13 of May 2014 23:38:06 Dmitry Torokhov wrote:
Quoted 39 lines · Michal Malý
include/linux/input/ff-memless-next.h new file +7
-0+ +/** DEFINITION OF TERMS +* +* Combined effect - An effect whose force is a superposition of forces +* generated by all effects that can be added together. +* Only one combined effect can be playing at a time. +* Effects that can be added together to create a combined + * effect are
FF_CONSTANT,FF_PERIODICandFF_RAMP. + * Uncombinable effect - An effect that cannot be combined with
another effect. + * All conditional effects -FF_DAMPER,FF_FRICTION, + *FF_INERTIAandFF_SPRINGare uncombinable. + * Number of
uncombinable effects playing simultaneously + *
depends on the capabilities of the hardware. + * Rumble effect - An effect generated by device's rumble motors instead of + * force feedback actuators.
+ *
+ *
+ * HANDLING OF UNCOMBINABLE EFFECTS
+ *
+ * Uncombinable effects cannot be combined together into just one effect, at + * least not in a clear and obvious manner. Therefore these effects have to + * be handled individually by ff-memless-next. Handling of these effects is + * left entirely to the hardware-specific driver, ff-memless-next merely + * passes these effects to the hardware-specific driver at appropriate time. + * ff-memless-next provides the UPLOAD command to notify the hardware-specific + * driver that the userspace is about to request playback of an uncombinable + * effect. The hardware-specific driver shall take all steps needed to make + * the device ready to play the effect when it receives the UPLOAD command. + * The actual playback shall commence whenSTART_UNCOMBcommand is received.
+ * Opposite to the UPLOAD command is the ERASE command which tells + * the hardware-specific driver that the playback has finished and that + * the effect will not be restarted.STOP_UNCOMBcommand tells
+ * the hardware-specific driver that the playback shall stop but the device + * shall still be ready to resume the playback immediately.
+ *
+ * In case it is not possible to make the device ready to play an uncombinable + * effect (all hardware effect slots are occupied), theQuoted 8 lines
Quoted 2 lines
hardware-specific + * driver may return an error when it receives an UPLOAD command. If the
This part concerns me. It seems to me that devices supporting "uncombinable" effects are in fact not memoryless devices and we should not be introducing this term here. If the goal is to work around limited number of effect slots in the devices by combining certain effects then it needs to be done at ff-core level as it will be potentially useful for all devices.
Force generated by a conditional effect (referred to as "uncombinable" within ff-memless-next to make the distinction clear) depends on a position of the device. For instance the more a device is deflected from a neutral position the greater force
FF_SPRINGgenerates. A truly memoryless device would have to report its position to the driver, have it calculate the appropriate force and send it back to the device. IMHO such a loop would require a very high USB polling rate to play conditional effects with acceptable quality.We know for a fact that at least many (all?) Logitech devices that support conditional effects use this "semi-memoryless" approach where
FF_CONSTANTandFF_PERIODICare handled in the memoryless fashion and conditional effects are uploaded to the device (in a somewhat simplified form). The amount of effects that can be uploaded to a device is limited which is why ff-memless-next uses two steps (UPLOAD/ERASE and START/STOP) to handle these effects.
Quoted 7 lines
Conditional effects - even if they are of the same type - cannot be effectively combined into one because superposition doesn't seem to work here so they have to be processed one by one.
If we ever come across a really memoryless device it should not be particularly difficult to add another callback to ff-memless-next which would emulate conditional effects with constant force.
And I should add that even the conditional effects themselves are handled semi-memless by the Logitech devices:
the effects' time parameters are handled in a memless way: the scheduling has to be done by the driver, and is not uploaded to the device.
Compare this with a fully non-memless device, an example of a driver that handles such devices: "hid-pidff.c"
Here, all effect data is sent directly to the device, also the time-related parameters.
Elias
Re: [PATCH v4 01/24] input: Add ff-memless-next module
In reply to Michal MalýQuoted 4 lines
If we ever come across a really memoryless device it should not be particularly difficult to add another callback to ff-memless-next which would emulate conditional effects with constant force.
It should be noted that some (/many?) applications/games already use the CF with position feedback to emulate behaviour such as springs. The feed back loop is simply not fast enough to do emulation of friction/inertia.
I don't believe that the FF layer in the kernel should be 'tricked out' with lots of emulation features.
As a game designer (ok... tinkerer) it's a bit of a pain that devices lie about what they can really do - ie. gamepads claiming periodic ability when all they are doing is faking it with rumble.
Simon.
Dmitry Torokhov
maintainerRe: [PATCH v4 01/24] input: Add ff-memless-next module
Quoted 9 lines · On Wed, May 14, 2014 at 11:11:40AM -0400, [email protected] wrote:
Quoted 4 lines
If we ever come across a really memoryless device it should not be particularly difficult to add another callback to ff-memless-next which would emulate conditional effects with constant force.
It should be noted that some (/many?) applications/games already use the CF with position feedback to emulate behaviour such as springs. The feed back loop is simply not fast enough to do emulation of friction/inertia.
Quoted 6 lines
I don't believe that the FF layer in the kernel should be 'tricked out' with lots of emulation features.
As a game designer (ok... tinkerer) it's a bit of a pain that devices lie about what they can really do - ie. gamepads claiming periodic ability when all they are doing is faking it with rumble.
Would it help if kernel would indicate which effects are native and which are emulated?
Thanks.
Signature · 1 line
Dmitry
Dmitry Torokhov
maintainerRe: [PATCH v4 01/24] input: Add ff-memless-next module
In reply to Michal MalýQuoted 69 lines · Michal Malý
Hi Dmitry,
thank you for reviewing this.
Quoted 40 lines · On Tuesday 13 of May 2014 23:38:06 Dmitry Torokhov wrote:
Quoted 39 lines · Michal Malý
include/linux/input/ff-memless-next.h new file +7
-0+ +/** DEFINITION OF TERMS +* +* Combined effect - An effect whose force is a superposition of forces +* generated by all effects that can be added together. +* Only one combined effect can be playing at a time. +* Effects that can be added together to create a combined + * effect are
FF_CONSTANT,FF_PERIODICandFF_RAMP. + * Uncombinable effect - An effect that cannot be combined with
another effect. + * All conditional effects -FF_DAMPER,FF_FRICTION, + *FF_INERTIAandFF_SPRINGare uncombinable. + * Number of
uncombinable effects playing simultaneously + *
depends on the capabilities of the hardware. + * Rumble effect - An effect generated by device's rumble motors instead of + * force feedback actuators.
+ *
+ *
+ * HANDLING OF UNCOMBINABLE EFFECTS
+ *
+ * Uncombinable effects cannot be combined together into just one effect, at + * least not in a clear and obvious manner. Therefore these effects have to + * be handled individually by ff-memless-next. Handling of these effects is + * left entirely to the hardware-specific driver, ff-memless-next merely + * passes these effects to the hardware-specific driver at appropriate time. + * ff-memless-next provides the UPLOAD command to notify the hardware-specific + * driver that the userspace is about to request playback of an uncombinable + * effect. The hardware-specific driver shall take all steps needed to make + * the device ready to play the effect when it receives the UPLOAD command. + * The actual playback shall commence whenSTART_UNCOMBcommand is received.
+ * Opposite to the UPLOAD command is the ERASE command which tells + * the hardware-specific driver that the playback has finished and that + * the effect will not be restarted.STOP_UNCOMBcommand tells
+ * the hardware-specific driver that the playback shall stop but the device + * shall still be ready to resume the playback immediately.
+ *
+ * In case it is not possible to make the device ready to play an uncombinable + * effect (all hardware effect slots are occupied), theQuoted 8 lines
Quoted 2 lines
hardware-specific + * driver may return an error when it receives an UPLOAD command. If the
This part concerns me. It seems to me that devices supporting "uncombinable" effects are in fact not memoryless devices and we should not be introducing this term here. If the goal is to work around limited number of effect slots in the devices by combining certain effects then it needs to be done at ff-core level as it will be potentially useful for all devices.
Force generated by a conditional effect (referred to as "uncombinable" within ff-memless-next to make the distinction clear) depends on a position of the device. For instance the more a device is deflected from a neutral position the greater force
FF_SPRINGgenerates. A truly memoryless device would have to report its position to the driver, have it calculate the appropriate force and send it back to the device. IMHO such a loop would require a very high USB polling rate to play conditional effects with acceptable quality.We know for a fact that at least many (all?) Logitech devices that support conditional effects use this "semi-memoryless" approach where
FF_CONSTANTandFF_PERIODICare handled in the memoryless fashion and conditional effects are uploaded to the device (in a somewhat simplified form). The amount of effects that can be uploaded to a device is limited which is why ff-memless-next uses two steps (UPLOAD/ERASE and START/STOP) to handle these effects.
Quoted 7 lines
Conditional effects - even if they are of the same type - cannot be effectively combined into one because superposition doesn't seem to work here so they have to be processed one by one.
If we ever come across a really memoryless device it should not be particularly difficult to add another callback to ff-memless-next which would emulate conditional effects with constant force.
Thank you for the explanation. This further solidifies for me the idea that handling of such effects that are in fact uploaded to and managed by the device should not be handled by the memoryless core but rather by the driver itself. I.e. such drivers should implement their own play(), upload(), erase(), etc, and decide whether to use a hardware slot for the effect or handle effect in memoryless fashion (if possible). We can open ff-memless to allow such drivers to use parts of memoryless handling.
Thanks.
Signature · 5 lines
Dmitry -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v4 01/24] input: Add ff-memless-next module
Quoted 94 lines · On Wednesday 14 of May 2014 11:05:58 Dmitry Torokhov wrote:
Quoted 85 lines · Michal Malý
Hi Dmitry,
thank you for reviewing this.
Quoted 54 lines · On Tuesday 13 of May 2014 23:38:06 Dmitry Torokhov wrote:
Quoted 53 lines · Michal Malý
include/linux/input/ff-memless-next.h new file +4
-0+ +/** DEFINITION OF TERMS +* +* Combined effect - An effect whose force is a superposition of forces
+ * generated by all effects that can be added
together.
+ * Only one combined effect can be playing at a
time.
+ * Effects that can be added together to create a
combined + * effect areFF_CONSTANT,FF_PERIODICandFF_RAMP. + * Uncombinable effect - An effect that cannot be combined with
another effect. + * All conditional effects -FF_DAMPER,FF_FRICTION, + *FF_INERTIAandFF_SPRINGare uncombinable. + * Number of
uncombinable effects playing simultaneously + *
depends on the capabilities of the hardware. + * Rumble effect - An effect generated by device's rumble motors instead of + * force feedback actuators.
+ *
+ *
+ * HANDLING OF UNCOMBINABLE EFFECTS
+ *
+ * Uncombinable effects cannot be combined together into just one effect,
at + * least not in a clear and obvious manner. Therefore these effects
have to + * be handled individually by ff-memless-next. Handling of these
effects is + * left entirely to the hardware-specific driver, ff-memless-next merely + * passes these effects to the hardware-specific
driver at appropriate time. + * ff-memless-next provides the UPLOAD command to notify the hardware-specific + * driver that the userspace is
about to request playback of an uncombinable + * effect. The hardware-specific driver shall take all steps needed to make + * the device ready to play the effect when it receives the UPLOAD command. + *
The actual playback shall commence whenSTART_UNCOMBcommand is received.
+ * Opposite to the UPLOAD command is the ERASE command which tells + *
the hardware-specific driver that the playback has finished and that + *
the effect will not be restarted.STOP_UNCOMBcommand tells
+ * the hardware-specific driver that the playback shall stop but the device + * shall still be ready to resume the playback immediately.
+ *
+ * In case it is not possible to make the device ready to play an uncombinable + * effect (all hardware effect slots are occupied), the hardware-specific + * driver may return an error when it receives anQuoted 8 lines
Quoted 1 line
UPLOAD command. If the
This part concerns me. It seems to me that devices supporting "uncombinable" effects are in fact not memoryless devices and we should not be introducing this term here. If the goal is to work around limited number of effect slots in the devices by combining certain effects then it needs to be done at ff-core level as it will be potentially useful for all devices.
Force generated by a conditional effect (referred to as "uncombinable" within ff-memless-next to make the distinction clear) depends on a position of the device. For instance the more a device is deflected from a neutral position the greater force
FF_SPRINGgenerates. A truly memoryless device would have to report its position to the driver, have it calculate the appropriate force and send it back to the device. IMHO such a loop would require a very high USB polling rate to play conditional effects with acceptable quality.We know for a fact that at least many (all?) Logitech devices that support conditional effects use this "semi-memoryless" approach where
FF_CONSTANTandFF_PERIODICare handled in the memoryless fashion and conditional effects are uploaded to the device (in a somewhat simplified form). The amount of effects that can be uploaded to a device is limited which is why ff-memless-next uses two steps (UPLOAD/ERASE and START/STOP) to handle these effects.Quoted 7 lines
Conditional effects - even if they are of the same type - cannot be effectively combined into one because superposition doesn't seem to work here so they have to be processed one by one.
If we ever come across a really memoryless device it should not be particularly difficult to add another callback to ff-memless-next which would emulate conditional effects with constant force.
Quoted 8 lines
Thank you for the explanation. This further solidifies for me the idea that handling of such effects that are in fact uploaded to and managed by the device should not be handled by the memoryless core but rather by the driver itself. I.e. such drivers should implement their own
play(),upload(),erase(), etc, and decide whether to use a hardware slot for the effect or handle effect in memoryless fashion (if possible). We can open ff-memless to allow such drivers to use parts of memoryless handling.
Well, these effects are not exactly managed by the device. The only thing that is uploaded to the device are parameters of the force to be generated. Other parameters - such as timing - still have to be managed by the driver. Any driver supporting conditional effects would then have to reimplement at least the timing logic.
Another thing of concern is rate limiting. During our testing we have discovered that some games can fire off FF commands at a very fast rate - much faster than USB polling rate of a device. This eventually overfills the USB submit queue and messes everything up. A proper way to fix this would be to limit the rate at which the driver sends HW requests. We already have a few ideas as to how to implement this in ff-memless-next. If we had the driver use ff-memless-next to manage one category of effects and use its own logic to manage the rest it'd be next to impossible to do this properly.
It should also be noted that ff-memless-next almost passes the conditional
effects through to the HW-specific driver that then takes care of everything. A
practical example of how this works can be found in an experimental port of
"hid-lg4ff" driver to ff-memless-next by Edwin Velds (https://github.com/edwin-v/linux-hid-lg4ff-next). The only thing that ff-memless-next does is that it tells the HW-specific driver that such an effect such start or stop playing.
The reasoning above made me implement the support for conditional effects in the way I did. As much as I agree that we're not dealing with purely memoryless devices here, I believe that most more advanced FFB wheels/sticks are in fact "semi-memoryless" and will therefore benefit from the approach used in ff-memless-next.
Michal
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v4 01/24] input: Add ff-memless-next module
In reply to Dmitry TorokhovQuoted 103 lines · On Wednesday 14 of May 2014 11:05:58 Dmitry Torokhov wrote:
Quoted 85 lines · Michal Malý
Hi Dmitry,
thank you for reviewing this.
Quoted 54 lines · On Tuesday 13 of May 2014 23:38:06 Dmitry Torokhov wrote:
Quoted 53 lines · Michal Malý
include/linux/input/ff-memless-next.h new file +4
-0+ +/** DEFINITION OF TERMS +* +* Combined effect - An effect whose force is a superposition of forces
+ * generated by all effects that can be added
together.
+ * Only one combined effect can be playing at a
time.
+ * Effects that can be added together to create a
combined + * effect areFF_CONSTANT,FF_PERIODICandFF_RAMP. + * Uncombinable effect - An effect that cannot be combined with
another effect. + * All conditional effects -FF_DAMPER,FF_FRICTION, + *FF_INERTIAandFF_SPRINGare uncombinable. + * Number of
uncombinable effects playing simultaneously + *
depends on the capabilities of the hardware. + * Rumble effect - An effect generated by device's rumble motors instead of + * force feedback actuators.
+ *
+ *
+ * HANDLING OF UNCOMBINABLE EFFECTS
+ *
+ * Uncombinable effects cannot be combined together into just one effect,
at + * least not in a clear and obvious manner. Therefore these effects
have to + * be handled individually by ff-memless-next. Handling of these
effects is + * left entirely to the hardware-specific driver, ff-memless-next merely + * passes these effects to the hardware-specific
driver at appropriate time. + * ff-memless-next provides the UPLOAD command to notify the hardware-specific + * driver that the userspace is
about to request playback of an uncombinable + * effect. The hardware-specific driver shall take all steps needed to make + * the device ready to play the effect when it receives the UPLOAD command. + *
The actual playback shall commence whenSTART_UNCOMBcommand is received.
+ * Opposite to the UPLOAD command is the ERASE command which tells + *
the hardware-specific driver that the playback has finished and that + *
the effect will not be restarted.STOP_UNCOMBcommand tells
+ * the hardware-specific driver that the playback shall stop but the device + * shall still be ready to resume the playback immediately.
+ *
+ * In case it is not possible to make the device ready to play an uncombinable + * effect (all hardware effect slots are occupied), the hardware-specific + * driver may return an error when it receives anQuoted 8 lines
Quoted 1 line
UPLOAD command. If the
This part concerns me. It seems to me that devices supporting "uncombinable" effects are in fact not memoryless devices and we should not be introducing this term here. If the goal is to work around limited number of effect slots in the devices by combining certain effects then it needs to be done at ff-core level as it will be potentially useful for all devices.
Force generated by a conditional effect (referred to as "uncombinable" within ff-memless-next to make the distinction clear) depends on a position of the device. For instance the more a device is deflected from a neutral position the greater force
FF_SPRINGgenerates. A truly memoryless device would have to report its position to the driver, have it calculate the appropriate force and send it back to the device. IMHO such a loop would require a very high USB polling rate to play conditional effects with acceptable quality.We know for a fact that at least many (all?) Logitech devices that support conditional effects use this "semi-memoryless" approach where
FF_CONSTANTandFF_PERIODICare handled in the memoryless fashion and conditional effects are uploaded to the device (in a somewhat simplified form). The amount of effects that can be uploaded to a device is limited which is why ff-memless-next uses two steps (UPLOAD/ERASE and START/STOP) to handle these effects.Quoted 7 lines
Conditional effects - even if they are of the same type - cannot be effectively combined into one because superposition doesn't seem to work here so they have to be processed one by one.
If we ever come across a really memoryless device it should not be particularly difficult to add another callback to ff-memless-next which would emulate conditional effects with constant force.
Thank you for the explanation. This further solidifies for me the idea that handling of such effects that are in fact uploaded to and managed by the device should not be handled by the memoryless core but rather by the driver itself. I.e. such drivers should implement their own
play(),upload(),erase(), etc, and decide whether to use a hardware slot for the effect or handle effect in memoryless fashion (if possible). We can open ff-memless to allow such drivers to use parts of memoryless handling.
Quoted 1 line
Thanks.
To bring this to a conclusion we could go from, would this be an acceptable solution?
- Have the HW-specific driver talk directly to ff-core and reimplement upload(), play(), etc.
- Rewrite "ff-memless-next" so that it is not a self-contained module but a library of functions.
- Have the driver either:
- Upload an effect to a device directly if the device can fully manage the
effect by itself.
- Use provided timing functions to know when an effect should start, stop,
restart etc...
- Use provided timing AND processing functions to combine effects that can be
combined into one, calculate periodic waveforms etc?
I have no problem with throwing my current approach away but before I start working on a new one I'd like to know which way to go...
Thanks,
Michal
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v4 01/24] input: Add ff-memless-next module
Quoted 121 lines · Michal Malý
Quoted 103 lines · On Wednesday 14 of May 2014 11:05:58 Dmitry Torokhov wrote:
Quoted 85 lines · Michal Malý
Hi Dmitry,
thank you for reviewing this.
Quoted 54 lines · On Tuesday 13 of May 2014 23:38:06 Dmitry Torokhov wrote:
Quoted 53 lines · Michal Malý
include/linux/input/ff-memless-next.h new file +4
-0+ +/** DEFINITION OF TERMS +* +* Combined effect - An effect whose force is a superposition of forces
+ * generated by all effects that can be added
together.
+ * Only one combined effect can be playing at a
time.
+ * Effects that can be added together to create a
combined + * effect areFF_CONSTANT,FF_PERIODICandFF_RAMP. + * Uncombinable effect - An effect that cannot be combined with
another effect. + * All conditional effects -FF_DAMPER,FF_FRICTION, + *FF_INERTIAandFF_SPRINGare uncombinable. + * Number of
uncombinable effects playing simultaneously + *
depends on the capabilities of the hardware. + * Rumble effect - An effect generated by device's rumble motors instead of + * force feedback actuators.
+ *
+ *
+ * HANDLING OF UNCOMBINABLE EFFECTS
+ *
+ * Uncombinable effects cannot be combined together into just one effect,
at + * least not in a clear and obvious manner. Therefore these effects
have to + * be handled individually by ff-memless-next. Handling of these
effects is + * left entirely to the hardware-specific driver, ff-memless-next merely + * passes these effects to the hardware-specific
driver at appropriate time. + * ff-memless-next provides the UPLOAD command to notify the hardware-specific + * driver that the userspace is
about to request playback of an uncombinable + * effect. The hardware-specific driver shall take all steps needed to make + * the device ready to play the effect when it receives the UPLOAD command. + *
The actual playback shall commence whenSTART_UNCOMBcommand is received.
+ * Opposite to the UPLOAD command is the ERASE command which tells + *
the hardware-specific driver that the playback has finished and that + *
the effect will not be restarted.STOP_UNCOMBcommand tells
+ * the hardware-specific driver that the playback shall stop but the device + * shall still be ready to resume the playback immediately.
+ *
+ * In case it is not possible to make the device ready to play an uncombinable + * effect (all hardware effect slots are occupied), the hardware-specific + * driver may return an error when it receives anQuoted 8 lines
Quoted 1 line
UPLOAD command. If the
This part concerns me. It seems to me that devices supporting "uncombinable" effects are in fact not memoryless devices and we should not be introducing this term here. If the goal is to work around limited number of effect slots in the devices by combining certain effects then it needs to be done at ff-core level as it will be potentially useful for all devices.
Force generated by a conditional effect (referred to as "uncombinable" within ff-memless-next to make the distinction clear) depends on a position of the device. For instance the more a device is deflected from a neutral position the greater force
FF_SPRINGgenerates. A truly memoryless device would have to report its position to the driver, have it calculate the appropriate force and send it back to the device. IMHO such a loop would require a very high USB polling rate to play conditional effects with acceptable quality.We know for a fact that at least many (all?) Logitech devices that support conditional effects use this "semi-memoryless" approach where
FF_CONSTANTandFF_PERIODICare handled in the memoryless fashion and conditional effects are uploaded to the device (in a somewhat simplified form). The amount of effects that can be uploaded to a device is limited which is why ff-memless-next uses two steps (UPLOAD/ERASE and START/STOP) to handle these effects.Quoted 7 lines
Conditional effects - even if they are of the same type - cannot be effectively combined into one because superposition doesn't seem to work here so they have to be processed one by one.
If we ever come across a really memoryless device it should not be particularly difficult to add another callback to ff-memless-next which would emulate conditional effects with constant force.
Thank you for the explanation. This further solidifies for me the idea that handling of such effects that are in fact uploaded to and managed by the device should not be handled by the memoryless core but rather by the driver itself. I.e. such drivers should implement their own
play(),upload(),erase(), etc, and decide whether to use a hardware slot for the effect or handle effect in memoryless fashion (if possible). We can open ff-memless to allow such drivers to use parts of memoryless handling.Quoted 1 line
Thanks.
To bring this to a conclusion we could go from, would this be an acceptable solution?
- Have the HW-specific driver talk directly to ff-core and reimplement
upload(),play(), etc.
- Rewrite "ff-memless-next" so that it is not a self-contained module but a library of functions.
- Have the driver either:
- Upload an effect to a device directly if the device can fully manage the
effect by itself.
- Use provided timing functions to know when an effect should start, stop,
restart etc...
- Use provided timing AND processing functions to combine effects that can be
combined into one, calculate periodic waveforms etc?
Quoted 5 lines
I have no problem with throwing my current approach away but before I start working on a new one I'd like to know which way to go...
Thanks,
Michal
Hi everyone
Allow me to introduce myself. I'm Roland Bosa and I work for Logitech, more specifically the gaming group. I have been tasked to look into gaming device support for Linux and I just started following this list and studying the kernel code related to the Logitech Force Feedback devices. The 'ff-memless-next' module sounds tailor-made for our devices. Please let me know how I can help with its development.
Thanks
Roland
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v4 01/24] input: Add ff-memless-next module
Quoted 142 lines · On Tuesday 20 of May 2014 11:32:14 Roland Bosa wrote:
Quoted 134 lines · Michal Malý
Quoted 106 lines · On Wednesday 14 of May 2014 11:05:58 Dmitry Torokhov wrote:
Quoted 88 lines · Michal Malý
Hi Dmitry,
thank you for reviewing this.
Quoted 56 lines · On Tuesday 13 of May 2014 23:38:06 Dmitry Torokhov wrote:
Quoted 46 lines · Michal Malý
include/linux/input/ff-memless-next.h new file +4
-0+ +/** DEFINITION OF TERMS +* +* Combined effect - An effect whose force is a superposition of forces
+ * generated by all effects that can be added
together.
+ * Only one combined effect can be playing at a
time.
+ * Effects that can be added together to create a
combined + * effect areFF_CONSTANT,FF_PERIODICandFF_RAMP. + * Uncombinable effect - An effect that cannot be combined with
another effect. + * All conditional effects -FF_DAMPER,FF_FRICTION, + *FF_INERTIAandFF_SPRINGare uncombinable. + * Number of
uncombinable effects playing simultaneously + *
depends on the capabilities of the hardware. + * Rumble effect - An effect generated by device's rumble motors instead of + * force feedback actuators.
+ *
+ *
+ * HANDLING OF UNCOMBINABLE EFFECTS
+ *
+ * Uncombinable effects cannot be combined together into just one effect,
at + * least not in a clear and obvious manner. Therefore these effects
have to + * be handled individually by ff-memless-next. Handling of these
effects is + * left entirely to the hardware-specific driver, ff-memless-next merely + * passes these effects to the hardware-specific
driver at appropriate time. + * ff-memless-next provides the UPLOAD command to notify the hardware-specific + * driver that the userspace is
about to request playback of an uncombinable + * effect. The hardware-specific driver shall take all steps needed to make + * the device ready to play the effect when it receives the UPLOAD command. + *
The actual playback shall commence whenSTART_UNCOMBcommand is received.
+ * Opposite to the UPLOAD command is the ERASE command which tells + *
the hardware-specific driver that the playback has finished and that + *Quoted 8 lines
the effect will not be restarted.
STOP_UNCOMBcommand tells
+ * the hardware-specific driver that the playback shall stop but the device + * shall still be ready to resume the playback immediately.
+ *
+ * In case it is not possible to make the device ready to play an uncombinable + * effect (all hardware effect slots are occupied), the hardware-specific + * driver may return an error when it receives an UPLOAD command. If theQuoted 7 lines
This part concerns me. It seems to me that devices supporting "uncombinable" effects are in fact not memoryless devices and we should not be introducing this term here. If the goal is to work around limited
number of effect slots in the devices by combining certain effects then it needs to be done at ff-core level as it will be potentially useful for all devices.Force generated by a conditional effect (referred to as "uncombinable" within ff-memless-next to make the distinction clear) depends on a position of the device. For instance the more a device is deflected from a neutral position the greater force
FF_SPRINGgenerates. A truly memoryless device would have to report its position to the driver, have it calculate the appropriate force and send it back to the device. IMHO such a loop would require a very high USB polling rate to play conditional effects with acceptable quality.We know for a fact that at least many (all?) Logitech devices that support
conditional effects use this "semi-memoryless" approach whereFF_CONSTANT
andFF_PERIODICare handled in the memoryless fashion and conditional effects are uploaded to the device (in a somewhat simplified form). The amount of effects that can be uploaded to a device is limited which is why ff-memless-next uses two steps (UPLOAD/ERASE and START/STOP) to handle these effects.Quoted 7 lines
Conditional effects - even if they are of the same type - cannot be effectively combined into one because superposition doesn't seem to work here so they have to be processed one by one.
If we ever come across a really memoryless device it should not be particularly difficult to add another callback to ff-memless-next which would emulate conditional effects with constant force.
Thank you for the explanation. This further solidifies for me the idea that handling of such effects that are in fact uploaded to and managed by the device should not be handled by the memoryless core but rather by the driver itself. I.e. such drivers should implement their own
play(),upload(),erase(), etc, and decide whether to use a hardware slot for the effect or handle effect in memoryless fashion (if possible). We can open ff-memless to allow such drivers to use parts of memoryless handling.Quoted 1 line
Thanks.
To bring this to a conclusion we could go from, would this be an acceptable
solution?- Have the HW-specific driver talk directly to ff-core and reimplement
upload(),play(), etc.
- Rewrite "ff-memless-next" so that it is not a self-contained module but a
library of functions.- Have the driver either:
- Upload an effect to a device directly if the device can fully manage theeffect by itself.
- Use provided timing functions to know when an effect should start, stop,
restart etc...
- Use provided timing AND processing functions to combine effects that can be>
combined into one, calculate periodic waveforms etc?Quoted 6 lines
I have no problem with throwing my current approach away but before I start
working on a new one I'd like to know which way to go...Thanks,
Michal
Quoted 8 lines
Hi everyone
Allow me to introduce myself. I'm Roland Bosa and I work for Logitech, more specifically the gaming group. I have been tasked to look into gaming device support for Linux and I just started following this list and studying the kernel code related to the Logitech Force Feedback devices. The 'ff-memless-next' module sounds tailor-made for our devices. Please let me know how I can help with its development.
Hi,
"ff-memless-next" was designed with behavior of Logitech devices in mind, however it was always meant as a general replacement for the current "ff- memless". After some followup discussion it's unlikely that it will be mainlined in its current form. See the discussion here "http://www.spinics.net/lists/linux-input/msg31426.html" for more details.
We would however really appreciate some information regarding Logitech devices specifically. Although we have reverse engineered most of things, I believe there are still areas we're not entirely clear about. I realize that you'd probably have to take it up with the legal deparment but if someone at Logitech could at least take a look at what we've found so far at fill in the blanks it'd be most helpful.
Please note that we found numerous bugs and DirectInput specs violations in the Windows driver which might have impacted our understading of how the driver works. "ff-memless-next" and "lg4ff" tries to fix or work around these. A link to out-of-tree update to lg4ff which takes full advantage of "ff-memless- next" is also provided in this thread.
Thanks for any help you can get us,
Michal
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v4 01/24] input: Add ff-memless-next module
Quoted 8 lines · Michal Malý
Hi,
"ff-memless-next" was designed with behavior of Logitech devices in mind, however it was always meant as a general replacement for the current "ff- memless". After some followup discussion it's unlikely that it will be mainlined in its current form. See the discussion here "http://www.spinics.net/lists/linux-input/msg31426.html" for more details.
Quoted 6 lines
We would however really appreciate some information regarding Logitech devices specifically. Although we have reverse engineered most of things, I believe there are still areas we're not entirely clear about. I realize that you'd probably have to take it up with the legal deparment but if someone at Logitech could at least take a look at what we've found so far at fill in the blanks it'd be most helpful.
I'm your guy, then. Please send any questions my way and I'll dig out the information you need - with the lawyer's blessings, if need be.
Quoted 5 lines
Please note that we found numerous bugs and DirectInput specs violations in the Windows driver which might have impacted our understading of how the driver works. "ff-memless-next" and "lg4ff" tries to fix or work around these. A link to out-of-tree update to lg4ff which takes full advantage of "ff-memless- next" is also provided in this thread.
lg4ff is mostly wheels, from what I saw. We should be able to fold in the G940 (Flight System) as well as other joysticks into the same driver. The underlying model driving the forces of our devices is essentially the same, there are just slight improvements made over the years to accommodate higher resolutions and more powerful micro processors.
Each device has a unique number (say 2 or 4) of force 'slots' per axis, which is running a force calculation in firmware. Typically, one of these slots is allocated by the host driver for a constant force, that's streamed to the device (and comprises all constant and periodic forces sent by the 'game' - that's the combined type of your code, as far as I can tell). The other slot may be used for position-based effects (springs, centering spring) as well as velocity-based effects (dampers, friction) - that's the un-combinable type. There's a healthy amount of code in the Windows driver that you would call 'quirks' which deals with deciding how to allocate multiple springs and dampers to a single slot. Sometimes, even the springs and dampers are being streamed in via the constants force, but that requires (as you pointed out earlier) a fast update rate and some "smartness" (I'm getting in hot territory with the lawyers now - let me stop).
One of the key features of the design is the decoupling of the USB updates from the force feedback IOCTL's from the 'game'. I don't think this is currently the case with today's drivers. I was able to send force updates to a gamepad faster than the USB update rate, which led to some lost packets which in turn left the device in a inconsistent state
- the motors were still rumbling although they should have stopped. If the 'ff-memless-next' driver offers this decoupling, it is a step in the right direction, IMO.
I will try to apply the patch mentioned in this thread and see where it leads me...
Thanks
roland
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v4 01/24] input: Add ff-memless-next module
Quoted 4 lines · Roland Bosa
On 05/20/2014 12:00 PM, Michal Malı wrote:
There's a healthy amount of
code in the Windows driver that you would call 'quirks' which deals with deciding how to allocate multiple springs and dampers to a single slot.
But 2 Spring effects with different offsets and non-zero effective force can't be combined into a single slot (without streaming them with Constant force), right?
Quoted 3 lines
Sometimes, even the springs and dampers are being streamed in via the constants force, but that requires (as you pointed out earlier) a fast update rate and some "smartness"
OK, is this method used when all force-slots are already full? Or is it only used for some specific (restricted) devices, such as devices with only 2 force slots?
And in this case, is the position of the device monitored at a speed higher than 8ms, in order to keep the feedback-loop stable?
Thanks,
Elias
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): [email protected]
Re: [PATCH v4 01/24] input: Add ff-memless-next module
Quoted 8 lines
Quoted 4 lines
But 2 Spring effects with different offsets and non-zero effective force can't be combined into a single slot (without streaming them with Constant force), right?
Yes - you cannot *download* two springs to a single slot. You need to choose (allocate) one of them. The winner gets the slot. The losers go somewhere else (they might get discarded, they might get simulated).
In reverse engineering, I thought that a single slot could hold two rotational angles/points (at which a springs would start) and that that the direction could be set so that both acting in the same direction with different forces.
--
Byte 2 - 0x_1
Byte 3 - Clockwise angle, nominally on left (0x00..0xFF - 0x00 isfully left)
Byte 4 - Anti-Clockwise angle, nominally on right(0x00..0xFF) Byte 5 - L/R Proportion force, upper nibble clockwise + lower nibble
anti-clockwise (each 0x0..0xF)
Byte 6 - Reverse Direction; upper nibble clockwise + lower nibble
anti-clockwise (each 0x0..0x1)
Byte 7 - Force (0x00..0xFF)
--
Ie. turning from fully left (00) with no force, you could hit a 'weak' spring (at 40) and then a 'stronger' spring (at 80).
So to some degree you /can/ merge springs... but I'm not saying that you should :-).
Simon
Re: [PATCH v4 01/24] input: Add ff-memless-next module
In reply to Roland BosaQuoted 6 lines
Allow me to introduce myself. I'm Roland Bosa and I work for Logitech, more specifically the gaming group. I have been tasked to look into gaming device support for Linux and I just started following this list and studying the kernel code related to the Logitech Force Feedback devices. The 'ff-memless-next' module sounds tailor-made for our devices. Please let me know how I can help with its development.
Hello Roland,
Let me echo Michal's welcome.
As you will see from the 'ff-memless-next' driver we are looking to extend force-feedback support to cover more than just ConstantForce support, and hopefully bring Linux into scope for force-feedback of AAA game quality.
Mostly this has come from a small group of people reverse engineering the Logitech wheels, which leads to the 'tailor-made' situation. But we'd like the systems/interfaces to be device agnostic.
As you how you can help...? As Michal said having a contact at Logitech to whom we can ask technical questions (off list) would probably be the greatest help. This would clear up any assumptions we have made, and help with decisions going forward.
It may also be the case that Logitech is working with studios/game designers to improve controller performance. If any information can be feed 'forward' to improve the Linux driver, that would be useful too.
Many thanks,
Simon Wood.
Re: [PATCH v4 01/24] input: Add ff-memless-next module
Quoted 1 line · On 05/20/2014 12:39 PM, [email protected] wrote:
hopefully bring Linux into scope for force-feedback of AAA game quality.
^ That's my objective too.
Quoted 3 lines
Mostly this has come from a small group of people reverse engineering the Logitech wheels, which leads to the 'tailor-made' situation. But we'd like the systems/interfaces to be device agnostic.
I'm sure we can consolidate the support into fewer files.
Quoted 4 lines
As you how you can help...? As Michal said having a contact at Logitech to whom we can ask technical questions (off list) would probably be the greatest help. This would clear up any assumptions we have made, and help with decisions going forward.
Please don't hesitate to contact me. ;-)
Quoted 3 lines
It may also be the case that Logitech is working with studios/game designers to improve controller performance. If any information can be feed 'forward' to improve the Linux driver, that would be useful too.
IMO, there are two types of games. The "arcade" ones, which have a set of 'canned' force effects, which play whenever an event happens in game. And the "simulation" ones, which base the game on a physics engine. The latter can redirect some variables of their engine to the input layer and typically drive a constant force and maybe a spring/damper too.
For the first type, you might want to keep a centering spring active all the time. Maybe you want to tweak the gain in the game settings. Maybe there's a gain for the centering and one for the special effects. The canned effects are mostly periodics with varying waveform, duration, amplitude and envelope. That's about it.
For the second type, you don't want a centering spring. You typically will drive a constant force effect with the engine, with some sprinkled damping and maybe a slight spring here and there.
I would personally put more weight and effort to get the second type properly implemented. The players of those games demand more realism and they need the subtle force changes to drive better than the competition. That means having a FF driver that can deal with many force updates per second without choking and a consistent, reproducible force output at the device, maybe even similar across varying devices. This translates into a decoupled design for accepting force updates and sending USB updates, as well as a device-specific layer to "calibrate" and "unify" the force responses across different models.
Does this make sense?
thanks
roland
Re: [PATCH v4 01/24] input: Add ff-memless-next module
Quoted 7 lines
IMO, there are two types of games. The "arcade" ones, which have a set of 'canned' force effects, which play whenever an event happens in game. And the "simulation" ones, which base the game on a physics engine. The latter can redirect some variables of their engine to the input layer and typically drive a constant force and maybe a spring/damper too.
Quoted 5 lines
For the first type, you might want to keep a centering spring active all the time. Maybe you want to tweak the gain in the game settings. Maybe there's a gain for the centering and one for the special effects. The canned effects are mostly periodics with varying waveform, duration, amplitude and envelope. That's about it.
Sounds like these are the effect files produced by FEdit tool (from MS DirectX SDK), and/or played back by pressing buttons when configuring the Logitech driver on Windows ('wooden bridge', etc)...
Do you know if there is a mechanism for playing these under Linux?
Under Windows do games just send a 'file' the DirectX driver, or do they parse them into individual effects to send?
If format is known/public it shouldn't be hard to write a userland client to play them back. If this needs to be supported in the kernel that would be more problematic.
Quoted 7 lines
For the second type, you don't want a centering spring. You typically will drive a constant force effect with the engine, with some sprinkled damping and maybe a slight spring here and there.
I would personally put more weight and effort to get the second type properly implemented. The players of those games demand more realism and they need the subtle force changes to drive better than the competition.
I would agree, these are probably more higher 'priority' but I think that the work Elias and Michal have done already implements these fairly well.
I assume that most AAA games, would implement these through some middle layer. I think that is probably via Steam using SDL2 haptic API, we have been testing against SDL2's 'testhaptic'.
Do you see another path (which we should be supporting/testing)?
Quoted 6 lines
That means having a FF driver that can deal with many force updates per second without choking and a consistent, reproducible force output at the device, maybe even similar across varying devices. This translates into a decoupled design for accepting force updates and sending USB updates, as well as a device-specific layer to "calibrate" and "unify" the force responses across different models.
There was some discussion about rate limiting the USB packets to the wheel, and how to deal if app updates too quickly. Is there an upper limit for the wheel itself, or is it just the USB 'pipe' which is the limiting factor?
Simon
Re: [PATCH v4 01/24] input: Add ff-memless-next module
Quoted 3 lines · On 05/20/2014 04:30 PM, [email protected] wrote:
Sounds like these are the effect files produced by FEdit tool (from MS DirectX SDK), and/or played back by pressing buttons when configuring the Logitech driver on Windows ('wooden bridge', etc)...
Prior to the FEdit tool, there was Immersion Studio [1]. It created IFR files, which were read using a DLL that Immersion provided. This DLL produced arrays of DIEFFECTs, which had specific durations and start offsets. By starting the entire array, you would get the desired effect. Most of the original effects in the Logitech Control Panel were done that way (by yours truly, as a matter of fact). To "sell" the effect, a sound-effect was queued concurrently with the force effect.
(Trivia: part of the "Wooden bridge" sound effect was made by smashing a cigarette lighter against real wooden clogs of a co-worker, then slowing down the audio a bit.)
In 2003, all of these effects were 'hardcoded' in a series of arrays of arrays of DI_EFFECTs. This allowed us to drop the Immersion loader DLL and create them on the fly.
Quoted 1 line
Do you know if there is a mechanism for playing these under Linux?
I don't - I'm fairly new to the Linux platform itself.
Quoted 2 lines
Under Windows do games just send a 'file' the DirectX driver, or do they parse them into individual effects to send?
With the IFR approach, you call a function in a library in userland with the filename, and it returns an array of effects. With the FEdit tool, you call a function on the IDirectInputDevice and calls a given callback the the loaded effects.[2]
At the end of the day, you end up with a series of user-land effect structures. It's up to the 'game' to download and start them on a given device.
Quoted 2 lines
If format is known/public it shouldn't be hard to write a userland client to play them back.
The file format of an IFR is probably easily deducible. There's a lot of textual clues to parameters and the values are also written out in string form.
I don't have a FEdit file at hand, but I suppose it will be similar.
Quoted 3 lines
I assume that most AAA games, would implement these through some middle layer. I think that is probably via Steam using SDL2 haptic API, we have been testing against SDL2's 'testhaptic'.
I wasn't aware of this layer. I must read up on it. It sounds like a simple way to access force feedback - I guess a game developer should shed some light on this...
Quoted 1 line
Do you see another path (which we should be supporting/testing)?
Nope, not at this time.
Quoted 4 lines
There was some discussion about rate limiting the USB packets to the wheel, and how to deal if app updates too quickly. Is there an upper limit for the wheel itself, or is it just the USB 'pipe' which is the limiting factor?
On the Windows side we send 125 reports/sec. The entire simulation loop runs with a 8ms resolution. I assume this value was chosen for some hardware constraints back in the days, but it has proven to be a good compromise for simulated periodics and physics constraints.
In any case, the USB traffic should be decoupled from the app. Any force updates should only change state in the ff-memless[-next] driver. Any change there should trickle down to a 'slot' representation of the device. If there's any change in the slots, the device is marked as 'dirty' and USB transfers are scheduled to send the latest state to the physical device.
The scheduling should keep track of how many requests are in-flight and delay writing the next output, until the previous one has completed.
Question back to the community: are there APIs in the USB layer to check for presence of in-progress requests? Can one add a 'completion' callback to a request, that gets invoked on completion/cancellation?
Thanks
roland
--
[1]
http://www.immersion.com/developers/index.php?option=com_content&view=article&id=423&Itemid=684
Re: [PATCH v4 01/24] input: Add ff-memless-next module
Quoted 6 lines · On Tuesday 20 of May 2014 18:17:51 Roland Bosa wrote:
The file format of an IFR is probably easily deducible. There's a lot of textual clues to parameters and the values are also written out in string form.
I don't have a FEdit file at hand, but I suppose it will be similar.
I believe that Elias successfully reverse engineered the effect file format produced by FEdit. There is no support for this kind of prefabricated effects in the Linux FF API.
Quoted 18 lines
Quoted 3 lines
I assume that most AAA games, would implement these through some middle layer. I think that is probably via Steam using SDL2 haptic API, we have been testing against SDL2's 'testhaptic'.
I wasn't aware of this layer. I must read up on it. It sounds like a simple way to access force feedback - I guess a game developer should shed some light on this...
Quoted 1 line
Do you see another path (which we should be supporting/testing)?
Nope, not at this time.
Quoted 4 lines
There was some discussion about rate limiting the USB packets to the wheel, and how to deal if app updates too quickly. Is there an upper limit for the wheel itself, or is it just the USB 'pipe' which is the limiting factor?
Quoted 4 lines
On the Windows side we send 125 reports/sec. The entire simulation loop runs with a 8ms resolution. I assume this value was chosen for some hardware constraints back in the days, but it has proven to be a good compromise for simulated periodics and physics constraints.
Our current code uses 8 msecs delay as well.
Quoted 9 lines
In any case, the USB traffic should be decoupled from the app. Any force updates should only change state in the ff-memless[-next] driver. Any change there should trickle down to a 'slot' representation of the device. If there's any change in the slots, the device is marked as 'dirty' and USB transfers are scheduled to send the latest state to the physical device.
The scheduling should keep track of how many requests are in-flight and delay writing the next output, until the previous one has completed.
The approach I had in mind would keep track of the last effect that made it to the device and the last effect that arrived from userspace. This would be stored for each effect slot. An update would be scheduled at the desired update rate. The updating routine would figure out the state change between last update and "now", send the required data to the device and reschedule itself. The routine could check if there are any USB transfers still running and reschedule itself immediately.
Quoted 3 lines
Question back to the community: are there APIs in the USB layer to check for presence of in-progress requests? Can one add a 'completion' callback to a request, that gets invoked on completion/cancellation?
For instance "usb_submit_urb()" can have a completion handler that is called once the transfer is done. The current code uses "hid_hw_request()" which is asynchronous and doesn't report anything back.
Proper decoupling of the userspace and driver is the only important thing that is missing from the current code.
Michal
Re: [PATCH v4 01/24] input: Add ff-memless-next module
Elias, Simon, Michal,
It is unfortunate that we didn't get back to you in 2013 when you asked for help in reverse engineering, oftentimes we have conflicting priorities and a particular request may be left laying around for some time before being addressed. But please, don't hesitate to re-kick us if you feel we are not being reactive.
Let me clearly say that our intentions are to disclose as much information as possible and to help the community in having great support to all our hardware across all platforms. We have zero problem with being asked for information.
Many thanks,
-nestor
Quoted 64 lines · Michal Malý
Quoted 6 lines · On Tuesday 20 of May 2014 18:17:51 Roland Bosa wrote:
The file format of an IFR is probably easily deducible. There's a lot of textual clues to parameters and the values are also written out in string form.
I don't have a FEdit file at hand, but I suppose it will be similar.
I believe that Elias successfully reverse engineered the effect file format produced by FEdit. There is no support for this kind of prefabricated effects in the Linux FF API.
Quoted 18 lines
Quoted 3 lines
I assume that most AAA games, would implement these through some middle layer. I think that is probably via Steam using SDL2 haptic API, we have been testing against SDL2's 'testhaptic'.
I wasn't aware of this layer. I must read up on it. It sounds like a simple way to access force feedback - I guess a game developer should shed some light on this...
Quoted 1 line
Do you see another path (which we should be supporting/testing)?
Nope, not at this time.
Quoted 4 lines
There was some discussion about rate limiting the USB packets to the wheel, and how to deal if app updates too quickly. Is there an upper limit for the wheel itself, or is it just the USB 'pipe' which is the limiting factor?
Quoted 4 lines
On the Windows side we send 125 reports/sec. The entire simulation loop runs with a 8ms resolution. I assume this value was chosen for some hardware constraints back in the days, but it has proven to be a good compromise for simulated periodics and physics constraints.
Our current code uses 8 msecs delay as well.
Quoted 9 lines
In any case, the USB traffic should be decoupled from the app. Any force updates should only change state in the ff-memless[-next] driver. Any change there should trickle down to a 'slot' representation of the device. If there's any change in the slots, the device is marked as 'dirty' and USB transfers are scheduled to send the latest state to the physical device.
The scheduling should keep track of how many requests are in-flight and delay writing the next output, until the previous one has completed.
The approach I had in mind would keep track of the last effect that made it to the device and the last effect that arrived from userspace. This would be stored for each effect slot. An update would be scheduled at the desired update rate. The updating routine would figure out the state change between last update and "now", send the required data to the device and reschedule itself. The routine could check if there are any USB transfers still running and reschedule itself immediately.
Quoted 3 lines
Question back to the community: are there APIs in the USB layer to check for presence of in-progress requests? Can one add a 'completion' callback to a request, that gets invoked on completion/cancellation?
For instance "
usb_submit_urb()" can have a completion handler that is called once the transfer is done. The current code uses "hid_hw_request()" which is asynchronous and doesn't report anything back.
Quoted 8 lines
Proper decoupling of the userspace and driver is the only important thing that is missing from the current code.
Michal
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v4 01/24] input: Add ff-memless-next module
Quoted 8 lines · Nestor Lopez Casado
Elias, Simon, Michal,
It is unfortunate that we didn't get back to you in 2013 when you asked for help in reverse engineering, oftentimes we have conflicting priorities and a particular request may be left laying around for some time before being addressed. But please, don't hesitate to re-kick us if you feel we are not being reactive.
Quoted 4 lines
Let me clearly say that our intentions are to disclose as much information as possible and to help the community in having great support to all our hardware across all platforms. We have zero problem with being asked for information.
OK, thanks for your reply.
Don't worry, I understand ;)
Elias
Re: [PATCH v4 01/24] input: Add ff-memless-next module
In reply to Michal MalýQuoted 11 lines · Michal Malý
Quoted 9 lines · On Tuesday 20 of May 2014 18:17:51 Roland Bosa wrote:
In any case, the USB traffic should be decoupled from the app. Any force updates should only change state in the ff-memless[-next] driver. Any change there should trickle down to a 'slot' representation of the device. If there's any change in the slots, the device is marked as 'dirty' and USB transfers are scheduled to send the latest state to the physical device.
The scheduling should keep track of how many requests are in-flight and delay writing the next output, until the previous one has completed.
Quoted 7 lines
The approach I had in mind would keep track of the last effect that made it to the device and the last effect that arrived from userspace. This would be stored for each effect slot. An update would be scheduled at the desired update rate. The updating routine would figure out the state change between last update and "now", send the required data to the device and reschedule itself. The routine could check if there are any USB transfers still running and reschedule itself immediately.
I've got another/(a more detailed?) idea about this:
We can use round-robin scheduling for the slots, and use a priority queue for e.g. LED data or data that doesn't fit in the slot-methodology and doesn't permit in-between packets to be lost. And I believe that ff-memless-next should generate a periodic force with a constant/defined sample-period/update-rate, while the layer between ff-memless-next and USB transfers, i.e. the round-robin and priority queue scheduler, should send the dirty slots as soon as possible, i.e. when the USB pipe is clear or when some custom #maxAllowedPacketsInUsbBuffer (optimized for somewhere between latency and throughput) is not exceeded by the kernel USB queue. Now the question is, can we query the state of the kernel USB queue?
Optionally, this method of packet scheduling could be used by other kernel drivers (even non-FF drivers) as well, and can further increase flexibility of ff-memless-next and the HW-specific drivers, and it will reduce code duplication.
Quoted 10 lines
Quoted 3 lines
Question back to the community: are there APIs in the USB layer to check for presence of in-progress requests? Can one add a 'completion' callback to a request, that gets invoked on completion/cancellation?
For instance "
usb_submit_urb()" can have a completion handler that is called once the transfer is done. The current code uses "hid_hw_request()" which is asynchronous and doesn't report anything back.Proper decoupling of the userspace and driver is the only important thing that is missing from the current code.
Also dynamic updating of periodic effects is not yet supported in "ff-memless-next".
This can also be important in simulation games (=second type), e.g. the "rFactor" game.
Elias
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v4 01/24] input: Add ff-memless-next module
Quoted 9 lines · Elias Vanderstuyft
Quoted 2 lines · Michal Malý
Proper decoupling of the userspace and driver is the only important thing that is missing from the current code.
Also dynamic updating of periodic effects is not yet supported in "ff-memless-next".
This can also be important in simulation games (=second type), e.g. the "rFactor" game.
Oh, and I forgot some other things that need to be mentioned:
- Trigger-button is not yet implemented, as far as I know
- Custom force effects, in Linux it is called FF_CUSTOM. (however I think we can neglect this effect for now)
- Infinite iterations in the Linux FF API is not supported.
@Roland:
Now I understand why Logitech Windows drivers have bugs in the periodic implementation of the DInput specs:
Logitech seems to have based their drivers on the Immersion Studio visualisation of the to-be-generated periodic effects, and these visualisations are not conform with the DInput specs of MSDN. Take a quick look at the MSDN specs for e.g. SawtoothUp:
http://msdn.microsoft.com/en-us/library/windows/desktop/ee418719%28v=vs.85%29.aspx
Now open the Immersion Studio (demo) and create a standard SawtoothUp effect, and look at the visualisation... It's wrong, right? Same applies for SawtoothDown and Triangle.
Elias
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v4 01/24] input: Add ff-memless-next module
In reply to Michal MalýQuoted 11 lines · Michal Malý
Quoted 6 lines · On Tuesday 20 of May 2014 18:17:51 Roland Bosa wrote:
The file format of an IFR is probably easily deducible. There's a lot of textual clues to parameters and the values are also written out in string form.
I don't have a FEdit file at hand, but I suppose it will be similar.
I believe that Elias successfully reverse engineered the effect file format produced by FEdit. There is no support for this kind of prefabricated effects in the Linux FF API.
Of course I did, Simon, what did you expect? :P
Here you are:
http://www.winehq.org/pipermail/wine-devel/2014-February/103108.html
It contains a description of the DInput effect file format (.ffe), a working Python script to load these files and dump their contents, as well as a bunch of example files and tests/results.
The FFE file format is binary RIFF, if you're interested.
But I prefer not to include such things in the Linux kernel, I believe this is the task of the userspace application.
I'm planning to implement this function into Wine, but maybe SDL would benefit from similar functionality too (using an open file-format instead, of course)?
Anyway, this is off-topic.
Elias
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v4 01/24] input: Add ff-memless-next module
In reply to Michal MalýQuoted 22 lines
To bring this to a conclusion we could go from, would this be an acceptable
solution?- Have the HW-specific driver talk directly to ff-core and reimplement
upload(),play(), etc.
- Rewrite "ff-memless-next" so that it is not a self-contained module but a
library of functions.
- Have the driver either:
- Upload an effect to a device directly if the device can fully manage
the
effect by itself.
- Use provided timing functions to know when an effect should start,
stop,
restart etc...
- Use provided timing AND processing functions to combine effects that
can be
combined into one, calculate periodic waveforms etc?
Quoted 2 lines
I have no problem with throwing my current approach away but before I start working on a new one I'd like to know which way to go...
Hi all,
If the driver itself (hid-logitech, via hid-lg4ff for example) is more involved in the creation/timing/management of the effects, does this mean that we end up with code duplicated in lots of places?
Also, does this mean that the 'old' ff-memless system would remain in kernel? If not, who will reworking each driver?
Regarding the question of emulated vs. real effects, can we extend the API so that applications can know which effects are really supported, and enable/disable emulation somehow?
Apologies for asking some many questions, without answering anything... Simon
Re: [PATCH v4 01/24] input: Add ff-memless-next module
Quoted 27 lines · On Tuesday 20 of May 2014 16:16:12 [email protected] wrote:
Quoted 27 lines
To bring this to a conclusion we could go from, would this be an acceptable
solution?- Have the HW-specific driver talk directly to ff-core and reimplement
upload(),play(), etc.
- Rewrite "ff-memless-next" so that it is not a self-contained module but a
library of functions.- Have the driver either:
- Upload an effect to a device directly if the device can fully managethe
effect by itself.- Use provided timing functions to know when an effect should start,
stop,
restart etc...- Use provided timing AND processing functions to combine effects that
can be
combined into one, calculate periodic waveforms etc?
Quoted 7 lines
Quoted 2 lines
I have no problem with throwing my current approach away but before I start working on a new one I'd like to know which way to go...
Hi all,
If the driver itself (hid-logitech, via hid-lg4ff for example) is more involved in the creation/timing/management of the effects, does this mean that we end up with code duplicated in lots of places?
Hopefully not. I tried to work out some scheme how this would work in my head today and the code duplication among other drivers should be minimal. Basically an equivalent of "play_effects()" - implemented in the HW-specific driver - would by called as needed. Such a function would then use provided helper functions to process combinable effects and check if any uncombinable effects changed state. A proper rate limiting will fit into this scheme nicely as well.
The biggest advantage of this design is that the HW-specific driver will be able to either handle an effect all by itself or use the provided "helper" infrastructure.
In retrospect I've got agree with Dmitry that the current handling of (semi)memless devices is not very flexible and therefore potentially problematic. It'll require some extra work but we don't have to invent anything entirely new here, we can just rearrange what we've already done in MLNX and package it into a library.
Quoted 2 lines
Also, does this mean that the 'old' ff-memless system would remain in kernel? If not, who will reworking each driver?
I suppose that the maintainers would want us to move all FF drivers to this architecture. If we get it right, it shouldn't require a terrible amount of work to port the other drivers.
Quoted 3 lines
Regarding the question of emulated vs. real effects, can we extend the API so that applications can know which effects are really supported, and enable/disable emulation somehow?
I suppose that a few extra flags (FF_PERIODIC_EMULATED etc.) defined in "uapi/linux/input.h" should suffice.
Michal
Re: [PATCH v4 01/24] input: Add ff-memless-next module
Quoted 7 lines · Michal Malý
Quoted 3 lines · On Tuesday 20 of May 2014 16:16:12 [email protected] wrote:
Regarding the question of emulated vs. real effects, can we extend the API so that applications can know which effects are really supported, and enable/disable emulation somehow?
I suppose that a few extra flags (
FF_PERIODIC_EMULATEDetc.) defined in "uapi/linux/input.h" should suffice.
@Dmitry:
Now that we're talking about API changes, I would like to propose some additional things in the Linux FF API:
- Possibility to *get* FF state variables, such as the value of the current GAIN, and the current AUTOCENTER:
At the moment, only *setting* is possible.
This poses a problem when implementing proper AUTOCENTER state recovery (upon closing a Windows program) in Wine, because the initial AUTOCENTER state was unknown.
The same applies for GAIN.
- Introduce multiple types of GAIN, apart from the current global GAIN, e.g. GAIN_CONSTANT and GAIN_DAMPER:
This is mainly on request of some users, especially Logitech users: on Windows Logitech additionally supports to set the global Damper and Spring gain.
Maybe it would be nicer to create a global gain for every supported Linux FF effect?
Thanks,
Elias
Re: [PATCH v4 01/24] input: Add ff-memless-next module
Quoted 22 lines · Elias Vanderstuyft
Quoted 7 lines · Michal Malý
Quoted 3 lines · On Tuesday 20 of May 2014 16:16:12 [email protected] wrote:
Regarding the question of emulated vs. real effects, can we extend the API so that applications can know which effects are really supported, and enable/disable emulation somehow?
I suppose that a few extra flags (
FF_PERIODIC_EMULATEDetc.) defined in "uapi/linux/input.h" should suffice.@Dmitry:
Now that we're talking about API changes, I would like to propose some additional things in the Linux FF API:- Possibility to *get* FF state variables, such as the value of the current GAIN, and the current AUTOCENTER:
At the moment, only *setting* is possible.
This poses a problem when implementing proper AUTOCENTER state recovery (upon closing a Windows program) in Wine, because the initial AUTOCENTER state was unknown.
The same applies for GAIN.
Quoted 7 lines
- Introduce multiple types of GAIN, apart from the current global GAIN, e.g.
GAIN_CONSTANTandGAIN_DAMPER:
This is mainly on request of some users, especially Logitech users: on Windows Logitech additionally supports to set the global Damper and Spring gain.
Maybe it would be nicer to create a global gain for every supported Linux FF effect?
And Roland Bosa (from Logitech) also agrees with the following addition/modification to the Linux FF API:
- Infinite iterations, or in Linux FF terms: playback of an effect with an event count of infinity.
Right now, an event count of zero stops the effect, while the maximum count is INT_MAX.
An event count value of '-1' can be used to indicate infinity. (However note that it is somewhat inconsistent with the infinite effect "duration" we already support: in that case '0' is used) Is this feasible? (in terms of backward compatibility)
Thanks,
Elias
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v4 01/24] input: Add ff-memless-next module
In reply to Michal MalýQuoted 8 lines
Quoted 5 lines
Regarding the question of emulated vs. real effects, can we extend the API
so that applications can know which effects are really supported, and enable/disable emulation somehow?I suppose that a few extra flags (
FF_PERIODIC_EMULATEDetc.) defined in "uapi/linux/input.h" should suffice.
The only problem is that we probably want to maintain backward compatibility so that older apps still see 'PERIODIC' (even though it is emulated).
--
#define FF_RUMBLE 0x50
#define FF_PERIODIC 0x51
#define FF_CONSTANT 0x52
#define FF_SPRING 0x53
#define FF_FRICTION 0x54
#define FF_DAMPER 0x55
#define FF_INERTIA 0x56
#define FF_RAMP 0x57
--
Do we therefore have to list extra items in our capabilities? --
static const signed short lg4ff_wheel_effects[] = {
FF_CONSTANT,
FF_PERIODIC,
FF_PERIODIC_NOT_EMULATED,
FF_AUTOCENTER,
-1
};--
Simon
Re: [PATCH v4 01/24] input: Add ff-memless-next module
Quoted 31 lines · On Tuesday 20 of May 2014 19:45:44 [email protected] wrote:
Quoted 7 lines
Quoted 4 lines
Regarding the question of emulated vs. real effects, can we extend the API
so that applications can know which effects are really supported, and enable/disable emulation somehow?I suppose that a few extra flags (
FF_PERIODIC_EMULATEDetc.) defined in "uapi/linux/input.h" should suffice.The only problem is that we probably want to maintain backward compatibility so that older apps still see 'PERIODIC' (even though it is emulated).
--
#defineFF_RUMBLE0x50
#defineFF_PERIODIC0x51
#defineFF_CONSTANT0x52
#defineFF_SPRING0x53
#defineFF_FRICTION0x54
#defineFF_DAMPER0x55
#defineFF_INERTIA0x56
#defineFF_RAMP0x57
--Do we therefore have to list extra items in our capabilities? --
static const signed short lg4ff_wheel_effects[] = { FF_CONSTANT, FF_PERIODIC, FF_PERIODIC_NOT_EMULATED, FF_AUTOCENTER, -1 };
Quoted 3 lines
--
Simon
Actually I was thinking something like this:
"input.h"
#define FF_DAMPER 0x55
#define FF_INERTIA 0x56
#define FF_RAMP 0x57
+# define FF_PERIODIC_EMULATED 0x58
+# define FF_RUMBLE_EMULATED 0x59
and
in the future "library-like" reimplementation of MLNX:
#define EMULATE_PERIODIC BIT(0)
#define EMULATE_RUMBLE BIT(1)
kfflib_init(..., EMULATE_PERIODIC | EMULATE_RUMBLE); for full emulation.
Michal
Dmitry Torokhov
maintainerRe: [PATCH v4 01/24] input: Add ff-memless-next module
In reply to Michal MalýQuoted 4 lines · Michal Malý
include/linux/input/ff-memless-next.h new file +4
-0+ +/** input_ff_create_mlnx() - Register a device within ff-memless-next and +* the kernel force feedback system +* @dev: Pointer to the struct input_dev associated with the device.
include/linux/input/ff-memless-next.h line 145
Quoted 10 lines
include/linux/input/ff-memless-next.h new file +10
-0+* @data: Any device-specific data that shall be passed to the callback. +* function called by ff-memless-next when a force feedback action +* shall be performed. +* @control_effect: Pointer to the callback function. +* @update_date: Delay in milliseconds between two recalculations of periodic +* effects, ramp effects and envelopes. Note that this value will +* never be lower than (CONFIG_HZ / 1000) + 1 regardless of the +* value specified here. This is not a "hard" rate limiter. +* Userspace still can submit effects at a rate faster than +* this value.
The update rate change seems useful whether we use new ff implementation or enhance the old one but I would prefer having a separate call to control it.
Thanks.
Signature · 1 line
Dmitry
Re: [PATCH v4 01/24] input: Add ff-memless-next module
Quoted 11 lines · On Wednesday 14 of May 2014 11:14:02 Dmitry Torokhov wrote:
Quoted 10 lines · Michal Malý
include/linux/input/ff-memless-next.h new file +9
-0+ +/** input_ff_create_mlnx() - Register a device within ff-memless-next and +* the kernel force feedback system +* @dev: Pointer to the struct input_dev associated with the device. +* @data: Any device-specific data that shall be passed to the callback. +* function called by ff-memless-next when a force feedback action +* shall be performed. +* @control_effect: Pointer to the callback function. +* @update_date: Delay in milliseconds between two recalculations of periodic + * effects, ramp effects and envelopes. Note that
Quoted 8 lines
Quoted 4 lines
this value will + * never be lower than (
CONFIG_HZ/ 1000)
+ 1 regardless of the + * value specified here. This is not
a "hard" rate limiter. + * Userspace still can submit
effects at a rate faster than + * this value.The update rate change seems useful whether we use new ff implementation or enhance the old one but I would prefer having a separate call to control it.
OK, that should not be a problem. Please note that the plan is to use this value to do proper "hard" rate limiting in the future.
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v4 2/24 input: Port arizona-haptics to ff-memless-next
In reply to Michal MalýPort arizona-haptics to ff-memless-next
--- drivers/input/misc/Kconfig | 2 +- drivers/input/misc/arizona-haptics.c | 39 +++++++++++++++++++++++------------- 2 files changed, 26 insertions(+), 15 deletions(-)
drivers/input/misc/Kconfig +1 -1
@@ -75,7 +75,7 @@ config INPUT_AD714X_SPI config INPUT_ARIZONA_HAPTICS tristate "Arizona haptics support" depends on MFD_ARIZONA && SND_SOC - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT help Say Y to enable support for the haptics module in Arizona CODECs.
drivers/input/misc/arizona-haptics.c +25 -14
@@ -13,6 +13,7 @@#include <linux/module.h> #include <linux/platform_device.h> #include <linux/input.h> +#include <linux/input/ff-memless-next.h> #include <linux/slab.h> #include <sound/soc.h>
@@ -22,6 +23,8 @@#include <linux/mfd/arizona/pdata.h> #include <linux/mfd/arizona/registers.h> +#define FF_UPDATE_RATE 50 +struct arizona_haptics {struct arizona *arizona;struct input_dev *input_dev;
@@ -108,29 +111,37 @@ static void arizona_haptics_work(struct work_struct *work) }static int arizona_haptics_play (struct input_dev *input,void *data, -struct ff_effect *effect) +const struct mlnx_effect_command *command) {struct arizona_haptics *haptics =input_get_drvdata (input);struct arizona *arizona = haptics->arizona; +const struct mlnx_rumble_force *rumble_force = &command->u.rumble_force;if (!arizona->dapm) {dev_err (arizona->dev,"No DAPM context\n" );return -EBUSY ; } -if (effect->u.rumble.strong_magnitude) { -/* Scale the magnitude into the range the device supports */ -if (arizona->pdata.hap_act) { - haptics->intensity = - effect->u.rumble.strong_magnitude >>9 ; -if (effect->direction <0x8000 ) - haptics->intensity +=0x7f ; +switch (command->cmd) { +case MLNX_START_RUMBLE : +if (rumble_force->strong) { +/* Scale the magnitude into the range the device supports */ +if (arizona->pdata.hap_act) { + haptics->intensity = rumble_force->strong >>9 ; +if (rumble_force->strong_dir <0x8000 ) + haptics->intensity +=0x7f ; + }else { + haptics->intensity = rumble_force->strong >>8 ; + } }else { - haptics->intensity = - effect->u.rumble.strong_magnitude >>8 ; + haptics->intensity =0 ; } - }else { +break ; +case MLNX_STOP_RUMBLE : haptics->intensity =0 ; +break ; +default : +return -EINVAL ; }schedule_work (&haptics->work);
@@ -183,10 +194,10 @@ static int arizona_haptics_probe(struct platform_device *pdev) haptics->input_dev->close = arizona_haptics_close;__set_bit (FF_RUMBLE , haptics->input_dev->ffbit); - ret =input_ff_create_memless (haptics->input_dev,NULL , - arizona_haptics_play); + ret =input_ff_create_mlnx (haptics->input_dev,NULL , + arizona_haptics_play,FF_UPDATE_RATE );if (ret <0 ) { -dev_err (arizona->dev,"input_ff_create_memless() failed: %d\n" , +dev_err (arizona->dev,"input_ff_create_mlnx() failed: %d\n" , ret); goto err_ialloc; }
Signature · 1 line
1.9.2
PATCH v4 3/24 input: Port twl4030-vibra to ff-memless-next
In reply to Michal MalýPort twl4030-vibra to ff-memless-next
--- drivers/input/misc/Kconfig | 2 +- drivers/input/misc/twl4030-vibra.c | 31 +++++++++++++++++++++++++------ 2 files changed, 26 insertions(+), 7 deletions(-)
drivers/input/misc/Kconfig +1 -1
@@ -407,7 +407,7 @@ config INPUT_TWL4030_VIBRA tristate "Support for TWL4030 Vibrator" depends on TWL4030_CORE select MFD_TWL4030_AUDIO - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT help This option enables support for TWL4030 Vibrator Driver.
drivers/input/misc/twl4030-vibra.c +25 -6
@@ -32,9 +32,11 @@#include <linux/mfd/twl4030-audio.h> #include <linux/input.h> #include <linux/slab.h> +#include <linux/input/ff-memless-next.h> /* MODULE ID2 */ #define LEDEN 0x00 +#define FF_UPDATE_RATE 50/* ForceFeedback */ #define EFFECT_DIR_180_DEG 0x8000/* range is 0 - 0xFFFF */
@@ -134,14 +136,31 @@ static void vibra_play_work(struct work_struct *work)/*** Input/ForceFeedback ***/ static int vibra_play (struct input_dev *input,void *data, -struct ff_effect *effect) +const struct mlnx_effect_command *command) {struct vibra_info *info =input_get_drvdata (input); +const struct mlnx_rumble_force *rumble_force = &command->u.rumble_force; + +switch (command->cmd) { +case MLNX_START_RUMBLE : +if (command->u.rumble_force.strong) { + info->speed = rumble_force->strong >>8 ; + info->direction = rumble_force->strong_dir <EFFECT_DIR_180_DEG ? +0 :1 ; + }else { + info->speed = rumble_force->weak >>9 ; + info->direction = rumble_force->weak_dir <EFFECT_DIR_180_DEG ? +0 :1 ; + } +break ; +case MLNX_STOP_RUMBLE : + info->speed =0 ; + info->direction =0 ; +break ; +default : +return -EINVAL ; + } - info->speed = effect->u.rumble.strong_magnitude >>8 ; -if (!info->speed) - info->speed = effect->u.rumble.weak_magnitude >>9 ; - info->direction = effect->direction <EFFECT_DIR_180_DEG ?0 :1 ;schedule_work (&info->play_work);return 0 ; }
@@ -227,7 +246,7 @@ static int twl4030_vibra_probe(struct platform_device *pdev) info->input_dev->close = twl4030_vibra_close;__set_bit (FF_RUMBLE , info->input_dev->ffbit); - ret =input_ff_create_memless (info->input_dev,NULL , vibra_play); + ret =input_ff_create_mlnx (info->input_dev,NULL , vibra_play,FF_UPDATE_RATE );if (ret <0 ) {dev_dbg (&pdev->dev,"couldn't register vibrator to FF\n" );return ret;
Signature · 1 line
1.9.2
PATCH v4 4/24 input: Port twl6040-vibra to ff-memless-next
In reply to Michal MalýPort twl6040-vibra to ff-memless-next
--- drivers/input/misc/Kconfig | 2 +- drivers/input/misc/twl6040-vibra.c | 27 ++++++++++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-)
drivers/input/misc/Kconfig +1 -1
@@ -417,7 +417,7 @@ config INPUT_TWL4030_VIBRA config INPUT_TWL6040_VIBRA tristate "Support for TWL6040 Vibrator" depends on TWL6040_CORE - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT help This option enables support for TWL6040 Vibrator Driver.
drivers/input/misc/twl6040-vibra.c +22 -5
@@ -30,12 +30,14 @@#include <linux/of.h> #include <linux/workqueue.h> #include <linux/input.h> +#include <linux/input/ff-memless-next.h> #include <linux/mfd/twl6040.h> #include <linux/slab.h> #include <linux/delay.h> #include <linux/regulator/consumer.h> #define EFFECT_DIR_180_DEG 0x8000 +#define FF_UPDATE_RATE 50/* Recommended modulation index 85% */ #define TWL6040_VIBRA_MOD 85
@@ -197,9 +199,10 @@ static void vibra_play_work(struct work_struct *work) }static int vibra_play (struct input_dev *input,void *data, -struct ff_effect *effect) +const struct mlnx_effect_command *command) {struct vibra_info *info =input_get_drvdata (input); +const struct mlnx_rumble_force *rumble_force = &command->u.rumble_force;int ret;/* Do not allow effect, while the routing is set to use audio */
@@ -209,9 +212,23 @@ static int vibra_play(struct input_dev *input, void *data,return -EBUSY ; } - info->weak_speed = effect->u.rumble.weak_magnitude; - info->strong_speed = effect->u.rumble.strong_magnitude; - info->direction = effect->direction <EFFECT_DIR_180_DEG ?1 :-1 ; +switch (command->cmd) { +case MLNX_START_RUMBLE : + info->weak_speed = rumble_force->weak; + info->strong_speed = rumble_force->strong; +if (info->strong_speed >= info->weak_speed) + info->direction = rumble_force->strong_dir <EFFECT_DIR_180_DEG ?1 :-1 ; +else + info->direction = rumble_force->weak_dir <EFFECT_DIR_180_DEG ?1 :-1 ; +break ; +case MLNX_STOP_RUMBLE : + info->weak_speed =0 ; + info->strong_speed =0 ; + info->direction =1 ; +break ; +default : +return -EINVAL ; + } ret =queue_work (info->workqueue, &info->play_work);if (!ret) {
@@ -367,7 +384,7 @@ static int twl6040_vibra_probe(struct platform_device *pdev) info->input_dev->close = twl6040_vibra_close;__set_bit (FF_RUMBLE , info->input_dev->ffbit); - ret =input_ff_create_memless (info->input_dev,NULL , vibra_play); + ret =input_ff_create_mlnx (info->input_dev,NULL , vibra_play,FF_UPDATE_RATE );if (ret <0 ) {dev_err (info->dev,"couldn't register vibrator to FF\n" ); goto err_ialloc;
Signature · 1 line
1.9.2
PATCH v4 5/24 input: Port max8997_haptic to ff-memless-next
In reply to Michal MalýPort max8997_haptic to ff-memless-next
--- drivers/input/misc/Kconfig | 2 +- drivers/input/misc/max8997_haptic.c | 25 +++++++++++++++++++------ 2 files changed, 20 insertions(+), 7 deletions(-)
drivers/input/misc/Kconfig +1 -1
@@ -157,7 +157,7 @@ config INPUT_MAX8925_ONKEY config INPUT_MAX8997_HAPTIC tristate "MAXIM MAX8997 haptic controller support" depends on PWM && MFD_MAX8997 - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT help This option enables device driver support for the haptic controller on MAXIM MAX8997 chip. This driver supports ff-memless interface
drivers/input/misc/max8997_haptic.c +19 -6
@@ -31,6 +31,7 @@#include <linux/mfd/max8997-private.h> #include <linux/mfd/max8997.h> #include <linux/regulator/consumer.h> +#include <linux/input/ff-memless-next.h> /* Haptic configuration 2 register */ #define MAX8997_MOTOR_TYPE_SHIFT 7
@@ -43,6 +44,8 @@#define MAX8997_SIG_DUTY_SHIFT 2#define MAX8997_PWM_DUTY_SHIFT 0 +#define FF_UPDATE_RATE 50 +struct max8997_haptic {struct device *dev;struct i2c_client *client;
@@ -219,13 +222,23 @@ static void max8997_haptic_play_effect_work(struct work_struct *work) }static int max8997_haptic_play_effect (struct input_dev *dev,void *data, -struct ff_effect *effect) +const struct mlnx_effect_command *command) {struct max8997_haptic *chip =input_get_drvdata (dev); +const struct mlnx_rumble_force *rumble_force = &command->u.rumble_force; - chip->level = effect->u.rumble.strong_magnitude; -if (!chip->level) - chip->level = effect->u.rumble.weak_magnitude; +switch (command->cmd) { +case MLNX_START_RUMBLE : + chip->level = rumble_force->strong; +if (!chip->level) + chip->level = rumble_force->weak; +break ; +case MLNX_STOP_RUMBLE : + chip->level =0 ; +break ; +default : +return -EINVAL ; + }schedule_work (&chip->work);
@@ -319,8 +332,8 @@ static int max8997_haptic_probe(struct platform_device *pdev)input_set_drvdata (input_dev, chip);input_set_capability (input_dev,EV_FF ,FF_RUMBLE ); - error =input_ff_create_memless (input_dev,NULL , - max8997_haptic_play_effect); + error =input_ff_create_mlnx (input_dev,NULL , + max8997_haptic_play_effect,FF_UPDATE_RATE );if (error) { dev_err(&pdev->dev, "unable to create FF device, error: %d\n",
Signature · 1 line
1.9.2
PATCH v4 6/24 input: Port pm8xxx-vibrator to ff-memless-next
In reply to Michal MalýPort pm8xxx-vibrator to ff-memless-next
--- drivers/input/misc/Kconfig | 2 +- drivers/input/misc/pm8xxx-vibrator.c | 28 +++++++++++++++++++--------- 2 files changed, 20 insertions(+), 10 deletions(-)
drivers/input/misc/Kconfig +1 -1
@@ -108,7 +108,7 @@ config INPUT_PCSPKR config INPUT_PM8XXX_VIBRATOR tristate "Qualcomm PM8XXX vibrator support" depends on MFD_PM8XXX - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT help This option enables device driver support for the vibrator on Qualcomm PM8xxx chip. This driver supports ff-memless interface
drivers/input/misc/pm8xxx-vibrator.c +19 -9
@@ -17,6 +17,7 @@#include <linux/input.h> #include <linux/slab.h> #include <linux/regmap.h> +#include <linux/input/ff-memless-next.h> #define VIB_DRV 0x4A
@@ -29,7 +30,7 @@#define VIB_MAX_LEVELS (VIB_MAX_LEVEL_mV - VIB_MIN_LEVEL_mV)#define MAX_FF_SPEED 0xff - +#define FF_UPDATE_RATE 50/** * struct pm8xxx_vib - structure to hold vibrator data * @vib_input_dev: input device supporting force feedback
@@ -128,14 +129,23 @@ static void pm8xxx_vib_close(struct input_dev *dev)* Currently this driver supports only rumble effects. */ static int pm8xxx_vib_play_effect (struct input_dev *dev,void *data, -struct ff_effect *effect) +const struct mlnx_command *command) {struct pm8xxx_vib *vib =input_get_drvdata (dev); - - vib->speed = effect->u.rumble.strong_magnitude >>8 ; -if (!vib->speed) - vib->speed = effect->u.rumble.weak_magnitude >>9 ; - +const struct mlnx_rumble_force *rumble_force = &command->u.rumble_force; + +switch (command->cmd) { +case MLNX_START_RUMBLE : + vib->speed = rumble_force->strong >>8 ; +if (!vib->speed) + vib->speed = rumble_force->weak >>9 ; +break ; +case MLNX_STOP_RUMBLE : + vib->speed =0 ; +break ; +default : +return -EINVAL ; + }schedule_work (&vib->work);return 0 ;
@@ -181,8 +191,8 @@ static int pm8xxx_vib_probe(struct platform_device *pdev)input_set_drvdata (input_dev, vib);input_set_capability (vib->vib_input_dev,EV_FF ,FF_RUMBLE ); - error =input_ff_create_memless (input_dev,NULL , - pm8xxx_vib_play_effect); + error =input_ff_create_mlnx (input_dev,NULL , + pm8xxx_vib_play_effect,FF_UPDATE_RATE );if (error) {dev_err (&pdev->dev,"couldn't register vibrator as FF device\n" );
Signature · 1 line
1.9.2
PATCH v4 7/24 hid: Port hid-axff to ff-memless-next
In reply to Michal MalýPort hid-axff to ff-memless-next
--- drivers/hid/Kconfig | 2 +- drivers/hid/hid-axff.c | 32 +++++++++++++++++++++++--------- 2 files changed, 24 insertions(+), 10 deletions(-)
drivers/hid/Kconfig +1 -1
@@ -106,7 +106,7 @@ config HID_ACRUX config HID_ACRUX_FF bool "ACRUX force feedback support" depends on HID_ACRUX - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT ---help--- Say Y here if you want to enable force feedback support for ACRUX game controllers.
drivers/hid/hid-axff.c +23 -9
@@ -31,31 +31,45 @@#include <linux/slab.h> #include <linux/hid.h> #include <linux/module.h> +#include <linux/input/ff-memless-next.h> #include "hid-ids.h" +#define FF_UPDATE_RATE 50#ifdef CONFIG_HID_ACRUX_FF struct axff_device {struct hid_report *report; }; -static int axff_play (struct input_dev *dev,void *data,struct ff_effect *effect) +static int axff_play (struct input_dev *dev,void *data, +const struct mlnx_effect_command *command) {struct hid_device *hid =input_get_drvdata (dev);struct axff_device *axff = data;struct hid_report *report = axff->report; +const struct mlnx_rumble_force *rumble_force = &command->u.rumble_force;int field_count =0 ;int left, right;int i, j; - left = effect->u.rumble.strong_magnitude; - right = effect->u.rumble.weak_magnitude; - -dbg_hid ("called with 0x%04x 0x%04x" , left, right); - - left = left *0xff /0xffff ; - right = right *0xff /0xffff ; +switch (command->cmd) { +case MLNX_START_RUMBLE : + left = rumble_force->strong; + right = rumble_force->weak; + +dbg_hid ("called with 0x%04x 0x%04x" , left, right); + + left = left *0xff /0xffff ; + right = right *0xff /0xffff ; +break ; +case MLNX_STOP_RUMBLE : + left =0 ; + right =0 ; +break ; +default : +return -EINVAL ; + }for (i =0 ; i < report->maxfield; i++) {for (j =0 ; j < report->field[i]->report_count; j++) {
@@ -107,7 +121,7 @@ static int axff_init(struct hid_device *hid)set_bit (FF_RUMBLE , dev->ffbit); - error =input_ff_create_memless (dev, axff, axff_play); + error =input_ff_create_mlnx (dev, axff, axff_play,FF_UPDATE_RATE );if (error) goto err_free_mem;
Signature · 6 lines
1.9.2 -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v4 8/24 hid: Port hid-emsff to ff-memless-next
In reply to Michal MalýPort hid-emsff to ff-memless-next
--- drivers/hid/Kconfig | 2 +- drivers/hid/hid-emsff.c | 38 ++++++++++++++++++++++++++------------ 2 files changed, 27 insertions(+), 13 deletions(-)
drivers/hid/Kconfig +1 -1
@@ -213,7 +213,7 @@ config DRAGONRISE_FF config HID_EMS_FF tristate "EMS Production Inc. force feedback support" depends on HID - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT ---help--- Say Y here if you want to enable force feedback support for devices by EMS Production Ltd.
drivers/hid/hid-emsff.c +26 -12
@@ -24,30 +24,44 @@#include <linux/hid.h> #include <linux/input.h> #include <linux/module.h> +#include <linux/input/ff-memless-next.h> #include "hid-ids.h" +#define FF_UPDATE_RATE 50 +struct emsff_device {struct hid_report *report; };static int emsff_play (struct input_dev *dev,void *data, -struct ff_effect *effect) +const struct mlnx_effect_command *command) {struct hid_device *hid =input_get_drvdata (dev);struct emsff_device *emsff = data; +const struct mlnx_rumble_force *rumble_force = &command->u.rumble_force;int weak, strong; - weak = effect->u.rumble.weak_magnitude; - strong = effect->u.rumble.strong_magnitude; - -dbg_hid ("called with 0x%04x 0x%04x\n" , strong, weak); - - weak = weak *0xff /0xffff ; - strong = strong *0xff /0xffff ; - - emsff->report->field[0 ]->value[1 ] = weak; - emsff->report->field[0 ]->value[2 ] = strong; +switch (command->cmd) { +case MLNX_START_RUMBLE : + weak = rumble_force->weak; + strong = rumble_force->strong; + +dbg_hid ("called with 0x%04x 0x%04x\n" , strong, weak); + + weak = weak *0xff /0xffff ; + strong = strong *0xff /0xffff ; + + emsff->report->field[0 ]->value[1 ] = weak; + emsff->report->field[0 ]->value[2 ] = strong; +break ; +case MLNX_STOP_RUMBLE : + weak =0 ; + strong =0 ; +break ; +default : +return -EINVAL ; + }dbg_hid ("running with 0x%02x 0x%02x\n" , strong, weak);hid_hw_request (hid, emsff->report,HID_REQ_SET_REPORT );
@@ -88,7 +102,7 @@ static int emsff_init(struct hid_device *hid)set_bit (FF_RUMBLE , dev->ffbit); - error =input_ff_create_memless (dev, emsff, emsff_play); + error =input_ff_create_mlnx (dev, emsff, emsff_play,FF_UPDATE_RATE );if (error) {kfree (emsff);return error;
Signature · 1 line
1.9.2
PATCH v4 9/24 hid: Port hid-dr to ff-memless-next
In reply to Michal MalýPort hid-dr to ff-memless-next
--- drivers/hid/Kconfig | 2 +- drivers/hid/hid-dr.c | 59 ++++++++++++++++++++++++++++++++-------------------- 2 files changed, 37 insertions(+), 24 deletions(-)
drivers/hid/Kconfig +1 -1
@@ -205,7 +205,7 @@ config HID_DRAGONRISE config DRAGONRISE_FF bool "DragonRise Inc. force feedback" depends on HID_DRAGONRISE - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT ---help--- Say Y here if you want to enable force feedback support for DragonRise Inc. game controllers.
drivers/hid/hid-dr.c +36 -23
89 lines not on this page · raw message
Signature · 6 lines
1.9.2 -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v4 10/24 hid: Port hid-gaff to ff-memless-next
In reply to Michal MalýPort hid-gaff to ff-memless-next
--- drivers/hid/Kconfig | 2 +- drivers/hid/hid-gaff.c | 32 +++++++++++++++++++++++--------- 2 files changed, 24 insertions(+), 10 deletions(-)
drivers/hid/Kconfig +1 -1
@@ -667,7 +667,7 @@ config HID_GREENASIA config GREENASIA_FF bool "GreenAsia (Product ID 0x12) force feedback support" depends on HID_GREENASIA - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT ---help--- Say Y here if you have a GreenAsia (Product ID 0x12) based game controller (like MANTA Warrior MM816 and SpeedLink Strike2 SL-6635) or adapter
drivers/hid/hid-gaff.c +23 -9
@@ -31,8 +31,11 @@#include <linux/slab.h> #include <linux/hid.h> #include <linux/module.h> +#include <linux/input/ff-memless-next.h> #include "hid-ids.h" +#define FF_UPDATE_RATE 50 +#ifdef CONFIG_GREENASIA_FF struct gaff_device {
@@ -40,19 +43,30 @@ struct gaff_device { };static int hid_gaff_play (struct input_dev *dev,void *data, -struct ff_effect *effect) +const struct mlnx_effect_command *command) {struct hid_device *hid =input_get_drvdata (dev);struct gaff_device *gaff = data; +const struct mlnx_rumble_force *rumble_force = &command->u.rumble_force;int left, right; - left = effect->u.rumble.strong_magnitude; - right = effect->u.rumble.weak_magnitude; - -dbg_hid ("called with 0x%04x 0x%04x" , left, right); - - left = left *0xfe /0xffff ; - right = right *0xfe /0xffff ; +switch (command->cmd) { +case MLNX_START_RUMBLE : + left = rumble_force->strong; + right = rumble_force->weak; + +dbg_hid ("called with 0x%04x 0x%04x" , left, right); + + left = left *0xfe /0xffff ; + right = right *0xfe /0xffff ; +break ; +case MLNX_STOP_RUMBLE : + left =0 ; + right =0 ; +break ; +default : +return -EINVAL ; + } gaff->report->field[0 ]->value[0 ] =0x51 ; gaff->report->field[0 ]->value[1 ] =0x0 ;
@@ -109,7 +123,7 @@ static int gaff_init(struct hid_device *hid)set_bit (FF_RUMBLE , dev->ffbit); - error =input_ff_create_memless (dev, gaff, hid_gaff_play); + error =input_ff_create_mlnx (dev, gaff, hid_gaff_play,FF_UPDATE_RATE );if (error) {kfree (gaff);return error;
Signature · 1 line
1.9.2
PATCH v4 11/24 hid: Port hid-holtekff to ff-memless-next
In reply to Michal MalýPort hid-holtekff to ff-memless-next
--- drivers/hid/Kconfig | 2 +- drivers/hid/hid-holtekff.c | 47 +++++++++++++++++++++++++++++----------------- 2 files changed, 31 insertions(+), 18 deletions(-)
drivers/hid/Kconfig +1 -1
@@ -256,7 +256,7 @@ config HID_HOLTEK config HOLTEK_FF bool "Holtek On Line Grip force feedback support" depends on HID_HOLTEK - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT ---help--- Say Y here if you have a Holtek On Line Grip based game controller and want to have force feedback support for it.
drivers/hid/hid-holtekff.c +30 -17
80 lines not on this page · raw message
Signature · 1 line
1.9.2
PATCH v4 12/24 hid: Port hid-lgff to ff-memless-next
In reply to Michal MalýPort hid-lgff to ff-memless-next
--- drivers/hid/Kconfig | 2 +- drivers/hid/hid-lgff.c | 70 +++++++++++++++++++++++++++++++++++--------------- 2 files changed, 51 insertions(+), 21 deletions(-)
drivers/hid/Kconfig +1 -1
@@ -365,7 +365,7 @@ config HID_LOGITECH_DJ config LOGITECH_FF bool "Logitech force feedback support" depends on HID_LOGITECH - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT help Say Y here if you have one of these devices: - Logitech WingMan Cordless RumblePad
drivers/hid/hid-lgff.c +50 -20
122 lines not on this page · raw message
Signature · 1 line
1.9.2
PATCH v4 13/24 hid: Port hid-lg3ff to ff-memless-next
In reply to Michal MalýPort hid-lg3ff to ff-memless-next
--- drivers/hid/Kconfig | 2 +- drivers/hid/hid-lg3ff.c | 60 +++++++++++++++++++++++++++++++------------------ 2 files changed, 39 insertions(+), 23 deletions(-)
drivers/hid/Kconfig +1 -1
@@ -391,7 +391,7 @@ config LOGIRUMBLEPAD2_FF config LOGIG940_FF bool "Logitech Flight System G940 force feedback support" depends on HID_LOGITECH - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT help Say Y here if you want to enable force feedback support for Logitech Flight System G940 devices.
drivers/hid/hid-lg3ff.c +38 -22
102 lines not on this page · raw message
Signature · 1 line
1.9.2
PATCH v4 14/24 hid: Port hid-pl to ff-memless-next
In reply to Michal MalýPort hid-pl to ff-memless-next
--- drivers/hid/Kconfig | 2 +- drivers/hid/hid-pl.c | 38 ++++++++++++++++++++++++++------------ 2 files changed, 27 insertions(+), 13 deletions(-)
drivers/hid/Kconfig +1 -1
@@ -509,7 +509,7 @@ config HID_PANTHERLORD config PANTHERLORD_FF bool "Pantherlord force feedback support" depends on HID_PANTHERLORD - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT ---help--- Say Y here if you have a PantherLord/GreenAsia based game controller or adapter and want to enable force feedback support for it.
drivers/hid/hid-pl.c +26 -12
@@ -44,9 +44,12 @@#include <linux/slab.h> #include <linux/module.h> #include <linux/hid.h> +#include <linux/input/ff-memless-next.h> #include "hid-ids.h" +#define FF_UPDATE_RATE 50 +#ifdef CONFIG_PANTHERLORD_FF struct plff_device {
@@ -57,24 +60,35 @@ struct plff_device { };static int hid_plff_play (struct input_dev *dev,void *data, -struct ff_effect *effect) +const struct mlnx_effect_command *command) {struct hid_device *hid =input_get_drvdata (dev);struct plff_device *plff = data; +const struct mlnx_rumble_force *rumble_force = &command->u.rumble_force;int left, right; - left = effect->u.rumble.strong_magnitude; - right = effect->u.rumble.weak_magnitude; -debug ("called with 0x%04x 0x%04x" , left, right); - - left = left * plff->maxval /0xffff ; - right = right * plff->maxval /0xffff ; +switch (command->cmd) { +case MLNX_START_RUMBLE : + left = rumble_force->strong; + right = rumble_force->weak; +debug ("called with 0x%04x 0x%04x" , left, right); + + left = left * plff->maxval /0xffff ; + right = right * plff->maxval /0xffff ; + + *plff->strong = left; + *plff->weak = right; +debug ("running with 0x%02x 0x%02x" , left, right); +break ; +case MLNX_STOP_RUMBLE : + *plff->strong =0 ; + *plff->weak =0 ; +break ; +default : +return -EINVAL ; + } - *plff->strong = left; - *plff->weak = right; -debug ("running with 0x%02x 0x%02x" , left, right);hid_hw_request (hid, plff->report,HID_REQ_SET_REPORT ); -return 0 ; }
@@ -160,7 +174,7 @@ static int plff_init(struct hid_device *hid)set_bit (FF_RUMBLE , dev->ffbit); - error =input_ff_create_memless (dev, plff, hid_plff_play); + error =input_ff_create_mlnx (dev, plff, hid_plff_play,FF_UPDATE_RATE );if (error) {kfree (plff);return error;
Signature · 1 line
1.9.2
PATCH v4 15/24 hid: Port hid-sjoy to ff-memless-next
In reply to Michal MalýPort hid-sjoy to ff-memless-next
--- drivers/hid/Kconfig | 2 +- drivers/hid/hid-sjoy.c | 35 +++++++++++++++++++++++++---------- 2 files changed, 26 insertions(+), 11 deletions(-)
drivers/hid/Kconfig +1 -1
@@ -692,7 +692,7 @@ config HID_SMARTJOYPLUS config SMARTJOYPLUS_FF bool "SmartJoy PLUS PS2/USB adapter force feedback support" depends on HID_SMARTJOYPLUS - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT ---help--- Say Y here if you have a SmartJoy PLUS PS2/USB adapter and want to enable force feedback support for it.
drivers/hid/hid-sjoy.c +25 -10
@@ -30,8 +30,11 @@#include <linux/slab.h> #include <linux/hid.h> #include <linux/module.h> +#include <linux/input/ff-memless-next.h> #include "hid-ids.h" +#define FF_UPDATE_RATE 50 +#ifdef CONFIG_SMARTJOYPLUS_FF struct sjoyff_device {
@@ -39,21 +42,33 @@ struct sjoyff_device { };static int hid_sjoyff_play (struct input_dev *dev,void *data, -struct ff_effect *effect) +const struct mlnx_effect_command *command) {struct hid_device *hid =input_get_drvdata (dev);struct sjoyff_device *sjoyff = data; +const struct mlnx_rumble_force *rumble_force = &command->u.rumble_force;u32 left, right; - left = effect->u.rumble.strong_magnitude; - right = effect->u.rumble.weak_magnitude; -dev_dbg (&dev->dev,"called with 0x%08x 0x%08x\n" , left, right); - - left = left *0xff /0xffff ; - right = (right !=0 );/* on/off only */ +switch (command->cmd) { +case MLNX_START_RUMBLE : + left = rumble_force->strong; + right = rumble_force->weak; +dev_dbg (&dev->dev,"called with 0x%08x 0x%08x\n" , left, right); + + left = left *0xff /0xffff ; + right = (right !=0 );/* on/off only */ + + sjoyff->report->field[0 ]->value[1 ] = right; + sjoyff->report->field[0 ]->value[2 ] = left; +break ; +case MLNX_STOP_RUMBLE : + left =0 ; + right =0 ; +break ; +default : +return -EINVAL ; + } - sjoyff->report->field[0 ]->value[1 ] = right; - sjoyff->report->field[0 ]->value[2 ] = left;dev_dbg (&dev->dev,"running with 0x%02x 0x%02x\n" , left, right);hid_hw_request (hid, sjoyff->report,HID_REQ_SET_REPORT );
@@ -103,7 +118,7 @@ static int sjoyff_init(struct hid_device *hid)set_bit (FF_RUMBLE , dev->ffbit); - error =input_ff_create_memless (dev, sjoyff, hid_sjoyff_play); + error =input_ff_create_mlnx (dev, sjoyff, hid_sjoyff_play,FF_UPDATE_RATE );if (error) {kfree (sjoyff);return error;
Signature · 1 line
1.9.2
PATCH v4 16/24 hid: Port hid-sony to ff-memless-next
In reply to Michal MalýPort hid-sony to ff-memless-next
--- drivers/hid/Kconfig | 2 +- drivers/hid/hid-sony.c | 23 +++++++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-)
drivers/hid/Kconfig +1 -1
@@ -634,7 +634,7 @@ config HID_SONY config SONY_FF bool "Sony PS2/3/4 accessories force feedback support" depends on HID_SONY - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT ---help--- Say Y here if you have a Sony PS2/3/4 accessory and want to enable force feedback support for it.
drivers/hid/hid-sony.c +17 -6
@@ -34,6 +34,7 @@#include <linux/spinlock.h> #include <linux/list.h> #include <linux/input/mt.h> +#include <linux/input/ff-memless-next.h> #include "hid-ids.h"
@@ -53,6 +54,7 @@#define SONY_BATTERY_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER)#define SONY_FF_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER) +#define FF_UPDATE_RATE 50#define MAX_LEDS 4static const u8 sixaxis_rdesc_fixup[] = {
@@ -1308,16 +1310,25 @@ static void dualshock4_state_worker(struct work_struct *work)#ifdef CONFIG_SONY_FF static int sony_play_effect (struct input_dev *dev,void *data, -struct ff_effect *effect) +const struct mlnx_effect_command *command) {struct hid_device *hid =input_get_drvdata (dev);struct sony_sc *sc =hid_get_drvdata (hid); +const struct mlnx_rumble_force *rumble_force = &command->u.rumble_force; -if (effect->type !=FF_RUMBLE ) -return 0 ; - sc->left = effect->u.rumble.strong_magnitude /256 ; - sc->right = effect->u.rumble.weak_magnitude /256 ; +switch (command->cmd) { +case MLNX_START_RUMBLE : + sc->left = rumble_force->strong /256 ; + sc->right = rumble_force->weak /256 ; +break ; +case MLNX_STOP_RUMBLE : + sc->left =0 ; + sc->right =0 ; +break ; +default : +return -EINVAL ; + }schedule_work (&sc->state_worker);return 0 ;
@@ -1330,7 +1341,7 @@ static int sony_init_ff(struct hid_device *hdev)struct input_dev *input_dev = hidinput->input;input_set_capability (input_dev,EV_FF ,FF_RUMBLE ); - return input_ff_create_memless(input_dev, NULL, sony_play_effect); + return input_ff_create_mlnx(input_dev, NULL, sony_play_effect, FF_UPDATE_RATE); }#else
Signature · 1 line
1.9.2
PATCH v4 17/24 hid: Port hid-tmff to ff-memless-next
In reply to Michal MalýPort hid-tmff to ff-memless-next
--- drivers/hid/Kconfig | 2 +- drivers/hid/hid-tmff.c | 83 ++++++++++++++++++++++++++++++-------------------- 2 files changed, 51 insertions(+), 34 deletions(-)
drivers/hid/Kconfig +1 -1
@@ -730,7 +730,7 @@ config HID_THRUSTMASTER config THRUSTMASTER_FF bool "ThrustMaster devices force feedback support" depends on HID_THRUSTMASTER - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT ---help--- Say Y here if you have a THRUSTMASTER FireStore Dual Power 2 or 3, a THRUSTMASTER Dual Trigger 3-in-1 or a THRUSTMASTER Ferrari GT
drivers/hid/hid-tmff.c +50 -33
127 lines not on this page · raw message
Signature · 1 line
1.9.2
PATCH v4 18/24 hid: Port hid-wiimote-modules to ff-memless-next
In reply to Michal MalýPort hid-wiimote-modules to ff-memless-next
--- drivers/hid/Kconfig | 2 +- drivers/hid/hid-wiimote-modules.c | 74 ++++++++++++++++++++++++--------------- 2 files changed, 46 insertions(+), 30 deletions(-)
drivers/hid/Kconfig +1 -1
@@ -749,7 +749,7 @@ config HID_WIIMOTE depends on HID depends on LEDS_CLASS select POWER_SUPPLY - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT ---help--- Support for Nintendo Wii and Wii U Bluetooth peripherals. Supported devices are the Wii Remote and its extension devices, but also devices
drivers/hid/hid-wiimote-modules.c +45 -29
110 lines not on this page · raw message
Signature · 1 line
1.9.2
PATCH v4 19/24 hid: Port hid-zpff to ff-memless-next
In reply to Michal MalýPort hid-zpff to ff-memless-next
--- drivers/hid/Kconfig | 2 +- drivers/hid/hid-zpff.c | 30 ++++++++++++++++++++++-------- 2 files changed, 23 insertions(+), 9 deletions(-)
drivers/hid/Kconfig +1 -1
@@ -786,7 +786,7 @@ config HID_ZEROPLUS config ZEROPLUS_FF bool "Zeroplus based game controller force feedback support" depends on HID_ZEROPLUS - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT ---help--- Say Y here if you have a Zeroplus based game controller and want to have force feedback support for it.
drivers/hid/hid-zpff.c +22 -8
@@ -25,9 +25,12 @@#include <linux/input.h> #include <linux/slab.h> #include <linux/module.h> +#include <linux/input/ff-memless-next.h> #include "hid-ids.h" +#define FF_UPDATE_RATE 50 +#ifdef CONFIG_ZEROPLUS_FF struct zpff_device {
@@ -35,10 +38,11 @@ struct zpff_device { };static int zpff_play (struct input_dev *dev,void *data, -struct ff_effect *effect) +const struct mlnx_effect_command *command) {struct hid_device *hid =input_get_drvdata (dev);struct zpff_device *zpff = data; +const struct mlnx_rumble_force *rumble_force = &command->u.rumble_force;int left, right;/*
@@ -47,12 +51,22 @@ static int zpff_play(struct input_dev *dev, void *data,* however it is possible that the XFX Executioner is an exception */ - left = effect->u.rumble.strong_magnitude; - right = effect->u.rumble.weak_magnitude; -dbg_hid ("called with 0x%04x 0x%04x\n" , left, right); - - left = left *0x7f /0xffff ; - right = right *0x7f /0xffff ; +switch (command->cmd) { +case MLNX_START_RUMBLE : + left = rumble_force->strong; + right = rumble_force->weak; +dbg_hid ("called with 0x%04x 0x%04x\n" , left, right); + + left = left *0x7f /0xffff ; + right = right *0x7f /0xffff ; +break ; +case MLNX_STOP_RUMBLE : + left =0 ; + right =0 ; +break ; +default : +return -EINVAL ; + } zpff->report->field[2 ]->value[0 ] = left; zpff->report->field[3 ]->value[0 ] = right;
@@ -83,7 +97,7 @@ static int zpff_init(struct hid_device *hid)set_bit (FF_RUMBLE , dev->ffbit); - error =input_ff_create_memless (dev, zpff, zpff_play); + error =input_ff_create_mlnx (dev, zpff, zpff_play,FF_UPDATE_RATE );if (error) {kfree (zpff);return error;
Signature · 1 line
1.9.2
PATCH v4 20/24 input: Port gamecon to ff-memless-next
In reply to Michal MalýPort gamecon to ff-memless-next
--- drivers/input/joystick/Kconfig | 2 +- drivers/input/joystick/gamecon.c | 57 ++++++++++++++++++++++------------------ 2 files changed, 33 insertions(+), 26 deletions(-)
drivers/input/joystick/Kconfig +1 -1
@@ -221,7 +221,7 @@ config JOYSTICK_DB9 config JOYSTICK_GAMECON tristate "Multisystem, NES, SNES, N64, PSX joysticks and gamepads" depends on PARPORT - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT ---help--- Say Y here if you have a Nintendo Entertainment System gamepad, Super Nintendo Entertainment System gamepad, Nintendo 64 gamepad,
drivers/input/joystick/gamecon.c +32 -25
94 lines not on this page · raw message
Signature · 1 line
1.9.2
PATCH v4 21/24 input: Port xpad to ff-memless-next
In reply to Michal MalýPort xpad to ff-memless-next
--- drivers/input/joystick/Kconfig | 2 +- drivers/input/joystick/xpad.c | 125 +++++++++++++++++++++++------------------ 2 files changed, 71 insertions(+), 56 deletions(-)
drivers/input/joystick/Kconfig +1 -1
@@ -294,7 +294,7 @@ config JOYSTICK_XPAD config JOYSTICK_XPAD_FF bool "X-Box gamepad rumble support" depends on JOYSTICK_XPAD && INPUT - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT ---help--- Say Y here if you want to take advantage of xbox 360 rumble features.
drivers/input/joystick/xpad.c +70 -55
152 lines not on this page · raw message
Signature · 1 line
1.9.2
PATCH v4 22/24 hid: Port hid-lg2ff to ff-memless-next
In reply to Michal Malý- Port hid-lg2ff to ff-memless-next
- Clamp vibration magnitude to range <0x02; 0xfd> to prevent irregular shaking of the vibration motors.
--- drivers/hid/Kconfig | 2 +- drivers/hid/hid-lg2ff.c | 65 ++++++++++++++++++++++++++++++++++--------------- 2 files changed, 47 insertions(+), 20 deletions(-)
drivers/hid/Kconfig +1 -1
@@ -381,7 +381,7 @@ config LOGITECH_FF config LOGIRUMBLEPAD2_FF bool "Logitech force feedback support (variant 2)" depends on HID_LOGITECH - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT help Say Y here if you want to enable force feedback support for: - Logitech RumblePad
drivers/hid/hid-lg2ff.c +46 -19
95 lines not on this page · raw message
Signature · 1 line
1.9.2
PATCH v4 23/24 hid: Port hid-lg4ff to ff-memless-next
In reply to Michal MalýPort hid-lg4ff to ff-memless-next
--- drivers/hid/Kconfig | 2 +- drivers/hid/hid-lg4ff.c | 93 ++++++++++++++++++++++++++++++------------------- 2 files changed, 59 insertions(+), 36 deletions(-)
drivers/hid/Kconfig +1 -1
@@ -399,7 +399,7 @@ config LOGIG940_FF config LOGIWHEELS_FF bool "Logitech wheels configuration and force feedback support" depends on HID_LOGITECH - select INPUT_FF_MEMLESS + select INPUT_FF_MEMLESS_NEXT default LOGITECH_FF help Say Y here if you want to enable force feedback and range setting
drivers/hid/hid-lg4ff.c +58 -35
130 lines not on this page · raw message
Signature · 1 line
1.9.2
Re: [PATCH v4 23/24] hid: Port hid-lg4ff to ff-memless-next
Quoted 4 lines
Port hid-lg4ff to ff-memless-next
Signed-off-by Michal Malý <[email protected]>
PATCH v4 24/24 input: Replace ff-memless with ff-memless-next
In reply to Michal MalýReplace ff-memless with ff-memless-next
ff-memless-next is a module for handling force feedback devices that have no FFB effect memory of their own. It is based on the ff-memless module but it has been largerly extended. Notable changes include:
- Support for all force feedback effects currently defined by Microsoft DirectInput.
- Improved emulation of periodic and rumble effects in case either of those is not supported by a device.
- New kernel API to interface with HW-specific drivers.
--- drivers/input/Kconfig | 13 +- drivers/input/Makefile | 1 - drivers/input/ff-memless.c | 547 --------------------------------------------- include/linux/input.h | 3 - 4 files changed, 1 insertion(+), 563 deletions(-) delete mode 100644 drivers/input/ff-memless.c
drivers/input/Kconfig +1 -12
@@ -25,7 +25,7 @@ config INPUT if INPUT -config INPUT_FF_MEMLESS +config INPUT_FF_MEMLESS_NEXT tristate "Support for memoryless force-feedback devices" help Say Y here if you have memoryless force-feedback input device
@@ -36,17 +36,6 @@ config INPUT_FF_MEMLESS If unsure, say N. To compile this driver as a module, choose M here: the - module will be called ff-memless. - -config INPUT_FF_MEMLESS_NEXT - tristate "New version of support for memoryless force-feedback devices" - help - Say Y here to enable a new version of support for memoryless force - feedback devices. - - If unsure, say N. - - To compile this driver as a module, choose M here: the module will be called ff-memless-next. config INPUT_POLLDEV
drivers/input/Makefile +0 -1
@@ -7,7 +7,6 @@ obj-$(CONFIG_INPUT) += input-core.o input-core-y := input.o input-compat.o input-mt.o ff-core.o -obj-$(CONFIG_INPUT_FF_MEMLESS) += ff-memless.o obj-$(CONFIG_INPUT_FF_MEMLESS_NEXT) += ff-memless-next.o obj-$(CONFIG_INPUT_POLLDEV) += input-polldev.o obj-$(CONFIG_INPUT_SPARSEKMAP) += sparse-keymap.o
drivers/input/ff-memless.c deleted +0 -547
547 lines not on this page · raw message
include/linux/input.h +0 -3
@@ -528,7 +528,4 @@ int input_ff_event(struct input_dev *dev, unsigned int type, unsigned int code,int input_ff_upload (struct input_dev *dev,struct ff_effect *effect,struct file *file);int input_ff_erase (struct input_dev *dev,int effect_id,struct file *file); -int input_ff_create_memless (struct input_dev *dev,void *data, -int (*play_effect)(struct input_dev *,void *,struct ff_effect *)); -#endif
Signature · 1 line
1.9.2
Quoted 26 lines
This patch series:
1) Adds "ff-memless-next" module [1]
2) Ports all hardware-specific drivers to MLNX's API [2-23]
3) Removes FFML and replaces it with MLNX [24]Signed-off-by Michal Malý <[email protected]>v4:
- Add a summary of changes between MLNX and FFML to the last patch
- Remove a stale empty line inhid-sony.c
- Add "Tested-by: Elias Vanderstuyft <[email protected]>" to hid-lg4ff
patch.v3:
- Rebase against latest linux-next. Fixes conflict inhid-sony.candmax8997_haptic.c
- Updated documentation inff-memless-next.h. The documentation now
describes
parameters of the callback function and specifically mentions that HW-specific drivers must not keep a reference tomlnx_effect_command
struct
to which a pointer is passed in the callback function.
- Fix a minor brace inconsistency in hid-lgff
I believe that all concerns regarding v2 have been resolved as false
alarms.
Quoted 6 lines
v2:
- Add missing msecs to jiffies conversion in ff-memless-next
- lgff: Properly convert force on Y axis from MLNX to device range Support periodic effects for "joystick_ac" device class
- lg3ff: Properly convert forces from MLNX to device range
- Very minor coding style issues fixed
Hi all,
I'd confirm that I build v2 and tested on a number of devices (1), and it appears to work OK.
The only slight hiccup was with an older version (Xubuntu 12.10) 'ffcfstress' application which did not correctly detect the CF capabilities of my gaming wheel(s). This is believed to be a fault with the application not using correct bit-field testing and appears to have been fixed on later versions (Xubuntu 13.10).
I also built v4, but have not yet had time/access to all the devices (other than DS4) to test.
Cheers,
Simon
(1) Devices:
Logitech Momo Red, Momo Black, DFGT, WiiWheel, G27 Sony DS3-SA, DS4, Intec 3rd Party PS3 controller Nintendo Wii Remote
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 12 lines · Michal Malý
ff-memless-next (MLNX) is a largely improved version of the current ff-memless (FFML) driver. MLNX supports all force feedback effects currently available in the Linux force feedback userspace API. All effects are handled in accordance with Microsoft's DirectInput/XInput. Most notable changes include support for conditional effects, proper handling of all periodic waveforms and improved emulation of rumble effects through periodic effects. MLNX also uses its own kernel API to pass processed effects to hardware-specific drivers instead of abusing "
ff_effect" struct. The API is documented in the respective header file.MLNX has been expanded to be a direct replacement for FFML.
Quoted 7 lines
Support for
FF_PERIODICandFF_RAMPhas been added to all devices that supportFF_CONSTANTas a part of the port to the new API.This patch series:
1) Adds "ff-memless-next" module [1]
2) Ports all hardware-specific drivers to MLNX's API [2-23]
3) Removes FFML and replaces it with MLNX [24]
Dmitry,
what are your plans with this, please?
I personally don't really completely like having two implementations of FF in the kernel; can't it be really done as an extension to ff-memless?
Thanks,
Signature · 6 lines
Jiri Kosina SUSE Labs -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 21 lines · On Monday 12 of May 2014 11:14:42 Jiri Kosina wrote:
Quoted 12 lines · Michal Malý
ff-memless-next (MLNX) is a largely improved version of the current ff-memless (FFML) driver. MLNX supports all force feedback effects currently available in the Linux force feedback userspace API. All effects are handled in accordance with Microsoft's DirectInput/XInput. Most notable changes include support for conditional effects, proper handling of all periodic waveforms and improved emulation of rumble effects through periodic effects. MLNX also uses its own kernel API to pass processed effects to hardware-specific drivers instead of abusing "
ff_effect" struct. The API is documented in the respective header file.MLNX has been expanded to be a direct replacement for FFML.
Quoted 7 lines
Support for
FF_PERIODICandFF_RAMPhas been added to all devices that supportFF_CONSTANTas a part of the port to the new API.This patch series:
1) Adds "ff-memless-next" module [1]
2) Ports all hardware-specific drivers to MLNX's API [2-23]
3) Removes FFML and replaces it with MLNX [24]
Quoted 6 lines
Dmitry,
what are your plans with this, please?
I personally don't really completely like having two implementations of FF in the kernel; can't it be really done as an extension to ff-memless?
There will be no duplication. This patchset fully replaces "ff-memless" with "ff-memless-next". Even though "ff-memless-next" is basically an extended version of "ff-memless", the extent of the changes makes it look very much like a rewrite.
If you are concerned about any confusion due to the "ff-memless" -> "ff-memless- next" name change I can modify the code to make it look like "ff-memless" if you think that'd be more appropriate. However, given the scope of the changes I considered it a better idea to implement this as a new driver to make it clear that ff-memless-next behaves differently from the HW-specific drivers' perspective.
Michal
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html