Skip to contentSkip to conversation

input: Introduce ff-memless-next as an improved replacement for ff-memless

PATCH In review Michal Malý 7 participants 60 messages Apr 26, 2014 – May 22, 2014 1 message not in the archive

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

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
#1 lore raw

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
index a11ff74..3780962 100644
@@ -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
index 5ca3f63..b4f11f5 100644
@@ -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
maintainer
#2 lore raw

Re: [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_UNCOMB and STOP_UNCOMB commands 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 with START_UNCOMB command).

+ */

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
#3 lore raw

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_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. + * 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

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_UNCOMB and STOP_UNCOMB commands 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 with START_UNCOMB command).

+ */

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

#4 lore raw

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_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. + * 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

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.

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

#5 lore raw

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.

maintainer
#6 lore raw

Re: [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
maintainer
#7 lore raw

Re: [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_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. + * 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

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.

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
#8 lore raw

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 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. + *
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

Quoted 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_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.

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

#9 lore raw

Re: [PATCH v4 01/24] input: Add ff-memless-next module

In reply to Dmitry Torokhov
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 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. + *
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

Quoted 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_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.

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

#10 lore raw

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 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. + *
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

Quoted 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_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.

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

#11 lore raw

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 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. + *
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 + *

Quoted 8 lines

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

Quoted 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_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.

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

#12 lore raw

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

#13 lore raw

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]

#15 lore raw

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 is

fully 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

#16 lore raw

Re: [PATCH v4 01/24] input: Add ff-memless-next module

In reply to Roland Bosa
Quoted 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.

#17 lore raw

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

#18 lore raw

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

#19 lore raw

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

[2]
http://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.idirectinputdevice8.idirectinputdevice8.enumeffectsinfile(v=vs.85).aspx

#20 lore raw

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

#21 lore raw

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

#22 lore raw

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

#23 lore raw

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

#24 lore raw

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

#25 lore raw

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

#26 lore raw

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

#27 lore raw

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

#28 lore raw

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_EMULATED etc.) 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

#29 lore raw

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_EMULATED etc.) 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_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?

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

#30 lore raw

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_EMULATED etc.) 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

#31 lore raw

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_EMULATED etc.) 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
};
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

maintainer
#32 lore raw

Re: [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
#33 lore raw

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

#34 lore raw

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
index 5928ea7..f669cc7 100644
@@ -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
index ef2e281..b4707cc 100644
@@ -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
#35 lore raw

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
index f669cc7..817156f 100644
@@ -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
index 960ef2a..5274ad2 100644
@@ -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
#36 lore raw

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
index 817156f..b9cbb91 100644
@@ -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
index 77dc23b..7440a74 100644
@@ -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
#37 lore raw

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
index b9cbb91..a89dc22 100644
@@ -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
index 1fea548..029ac8b 100644
@@ -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
#38 lore raw

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
index a89dc22..7b962e4 100644
@@ -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
index 6a915ba..1796f4f 100644
@@ -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
#39 lore raw

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
index 7af9d0b..e076627 100644
@@ -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
index a594e47..7fbfcbc 100644
@@ -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
#40 lore raw

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
index e076627..a78b5d8 100644
@@ -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
index d82d75b..c0cbe50 100644
@@ -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
#41 lore raw

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
index a78b5d8..1d4180c 100644
@@ -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
#42 lore raw

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
index 1d4180c..4c59a88 100644
@@ -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
index 2d8cead..f2f70c1 100644
@@ -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
#43 lore raw

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
index 4c59a88..1749a4a 100644
@@ -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
#44 lore raw

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
index 1749a4a..c4b0cbb 100644
@@ -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
#45 lore raw

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
index c4b0cbb..eb0c7f1 100644
@@ -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
#46 lore raw

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
index eb0c7f1..42904e4 100644
@@ -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
index 2dcd7d9..9b539d5 100644
@@ -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
#47 lore raw

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
index 42904e4..9260d14 100644
@@ -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
index 37845ec..a6f8cfe 100644
@@ -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
#48 lore raw

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
index 9260d14..e97c382 100644
@@ -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
index 908de27..5a28833 100644
@@ -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 4
 
 static 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
#49 lore raw

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
index e97c382..17ed5cf 100644
@@ -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
#50 lore raw

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
index 17ed5cf..23d9776 100644
@@ -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
#51 lore raw

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
index 23d9776..97d2d8f 100644
@@ -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
index a29756c..6912500 100644
@@ -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
#52 lore raw

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
index 56eb471..2dd3ba1 100644
@@ -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
#53 lore raw

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
index 2dd3ba1..9f26e48 100644
@@ -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
#54 lore raw

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
index 97d2d8f..5e70519 100644
@@ -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
#55 lore raw

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
index 5e70519..546ac4a 100644
@@ -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
#57 lore raw

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
index 3780962..061ae3c 100644
@@ -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
index b4f11f5..f7ae055 100644
@@ -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
index 82ce323..0c6c3f1 100644
@@ -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
Tested-by on the v4 series
#58 lore raw
In reply to Michal Malý
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]

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.

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

#59 lore raw
In reply to Michal Malý
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_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]

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
#60 lore raw
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_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]

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