Re: Linux Force Feedback for Saitek Cyborg Evo Force

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Dmitry Torokhov wrote:
> On Tue, Dec 29, 2009 at 02:40:21PM -0800, Dmitry Torokhov wrote:
>>  Dec 29, 2009, at 4:46 AM, Johannes Ebke
>> <johannes.ebke@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>>
>>> Dmitry Torokhov wrote:
>>>> On Sun, Dec 20, 2009 at 11:44:19PM -0800, Dmitry Torokhov wrote:
>>>>> On Sun, Dec 20, 2009 at 12:36:23AM +0100, Johannes Ebke wrote:
>>>>>> Hi,
>>>>>>
>>>>>> It seems that the force feedback works well, I have ported
>>>>>> the force
>>>>>> feedback for my favorite game to linux now, and it works well.
>>>>>>
>>>>>> What does not work is updating effects - there just nothing
>>>>>> happens, and
>>>>>> the old event is played. I have circumvented this by
>>>>>> deleting/re-uploading the effect, but this should probably
>>>>>> been made to
>>>>>> work. Does it work well with other hardware?
>>>>>>
>>>>>> Thirdly, I have re-discovered one kernel oops that occurs if the
>>>>>> joystick is unplugged if some process still has the event
>>>>>> device open.
>>>>>> Steps to reproduce:
>>>>>> * plug joystick in
>>>>>> * fftest /dev/input/eventXX
>>>>>> * unplug joystick
>>>>>>
>>>>>> (kern.log extract attached)
>>>>>>
>>>>>> Sometimes this just gives an oops, sometimes it escalates
>>>>>> into a kernel
>>>>>> panic.
>>>>>>
>>>>> Hmm, it looks like iforce unbinding is completely busted:
>>>>>
>>>>> static void iforce_usb_disconnect(struct usb_interface *intf)
>>>>> {
>>>>>       struct iforce *iforce = usb_get_intfdata(intf);
>>>>>       int open = 0; /* FIXME! iforce->dev.handle->open; */
>>>>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>>
>>>>>       usb_set_intfdata(intf, NULL);
>>>>>       if (iforce) {
>>>>>               iforce->usbdev = NULL;
>>>>>               input_unregister_device(iforce->dev);
>>>>>
>>>>>               if (!open) {
>>>>>                       iforce_delete_device(iforce);
>>>>>                       kfree(iforce);
>>>>>               }
>>>>>       }
>>>>> }
>>>>>
>>>>>
>>>>> Any chance you could fix that FIXME ;) ?
>>>>>
>>>> Actually, does the below fixes it for you?
>>>>
>>> This fixes the kernel oops - thanks! However it also disables FF,
>>> unless
>>> I remove "usb_kill_urb(iforce->out);" from iforce_close.
>> >From some debug statements I found that iforce_close is called
>>> twice if
>>> you just plug in the joystick, so the effect is immediate.
>> I still believe that usb_kill_urb is needed however we need to wait
>> for packet disabling FF to complete.
>>
> 
> Does the patch below (on top of the unmodofied previous one) fixes the
> issue for you?
> 
> Thanks.
> 

This fixes it completely, both the FF and the clean shutdown on
unexpected disconnect! Thank you very much!

Finally, for correct orientation of the rudder axis, I have attached one
small change to packets - this makes it work for me if i remove the old
configuration.

One other question: Since the USB HID driver can actually discover the
joystick buttons and axis ranges sucessfully, would it not be easier to
use that for generic input and only add force-feedback in iforce, or is
that just too much overhead? Thanks!

Cheers,
Johannes

Input: iforce - flip initial RUDDER orientation to correct one

Remove the inversion from the data acqisition routine

Signed-off-by: Johannes Ebke <johannes.ebke@xxxxxxxxxxxxxxxxxxxxxx>
---

diff -ru drivers/input/joystick/iforce_dmitry/iforce-packets.c drivers/input/joystick/iforce/iforce-packets.c
--- drivers/input/joystick/iforce_dmitry/iforce-packets.c	2009-12-30 09:42:22.000000000 +0100
+++ drivers/input/joystick/iforce/iforce-packets.c	2009-12-30 09:32:34.000000000 +0100
@@ -193,7 +193,7 @@
 				if (HI(cmd) == 6) {
 					input_report_abs(dev, ABS_THROTTLE, data[4]);
 					if (LO(cmd) >= 8 && test_bit(ABS_RUDDER ,dev->absbit))
-						input_report_abs(dev, ABS_RUDDER, 255 - data[7]);
+						input_report_abs(dev, ABS_RUDDER, data[7]);
 				} else {
 					input_report_abs(dev, ABS_THROTTLE, 255 - data[4]);
 					if (LO(cmd) >= 8 && test_bit(ABS_RUDDER ,dev->absbit))

[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux