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 Wed, Dec 30, 2009 at 10:01:01AM +0100, Johannes Ebke wrote:
>> 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!
> 
> Ah, great!
>  
>> 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.
> 
> Hmm, that might break some other users though (or does it only kick in
> for Cyborg?

This is in the part that only kicks in for the Cyborg, or perhaps other
devices as well (if(HI(cmd)==6)..)

> 
>> 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?
> 
> We do prefer to have HID driver handle the devices and have only
> non-HID-compliant devices use specialized drivers. Iforce is an older
> driver though, working with both USB devices and devices attached to
> serial ports.
> 
> Does your joystick works well with HID driver (sans FF)?
> 

Yes, with one grievance: Since the "dead man switch" is not physically
present on the cyborg but logically present and "always on", some
applications like the flightgear joystick calibration "fgjs" cannot be used.
However, I am not sure how the information "this is a dead man switch"
can be published to userspace most efficiently, and the application
should probably deal with it anyway (stuck key in old joystick, etc...)

Cheers,
Johannes
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[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