Re: help needed in this part of code regarding FF in hid-sony.c

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

 



Hi Fei,

Thanks for your interest in adding this capability. I'm not sure if
this type of feature is desired in the Linux kernel directly. It is
not common practice to make a controller rumble at startup (not even
on game consoles). This driver is used in many devices (e.g. Android)
and such change would be a drastic behavior change.

If this is a behavior you would like to see for yourself, I would
recommend not to do this kernel side. You can easily add a udev rule
on your system to trigger a certain command upon discovery of a Sony
game controller as well as controllers from other vendors.

Thanks,
Roderick

On Mon, Aug 30, 2021 at 10:23 PM fei fei <cyfei1982@xxxxxxxxx> wrote:
>
> Thanks Mr. Roderick for such quick reply, and sorry for redundant
> emails, still not familiar with how linux kenel mailing list worked.
>
> The purpose for doing this is to have an alternative way of
> initialization/connection success indicator other than just the LEDs
> in case of the leds broken/burnt, it's always better to have
> alternative than no, isn't it?
>
> I'll try digging in the kernel log see if I'm lucky enough to find
> something useful.
>
> For the sleep part, it's because I need to make adjustment to the
> magnitude play duration for the initial rumble, if I take out the
> sleep, the vibration will be long/simply no effect at all either
> has/not has the sc->left/right = 0 part right after, thus unsuitable
> for the initial rumble purpose(kinda weird). Never knew that it's
> taboo to use sleep in kernel, as some articles out there suggested
> that sleep is common in device driver.
>
> It's actually trouble free if I just set the initial rumble as
> independent function, but if I insist to merge it into
> sony_play_effect( ), how would you suggest proper way to make it
> right? Thanks.
>
> Regards,
> fei
>
> On Tue, 31 Aug 2021 at 07:12, Roderick Colenbrander
> <thunderbird2k@xxxxxxxxx> wrote:
> >
> > Hi Fei,
> >
> > I'm not sure why you are trying to make such change kernel side, but
> > of course nothing is stopping you for personal use.
> >
> > Kernel development is not easy and it is very easy to crash your
> > system. I can't say what is wrong here, but among the most common
> > issues are null pointer dereferences. If lucky the error is caught in
> > your kernel log, which should give you some clues on where the error
> > is coming from.
> >
> > Also in your changes, I see you added some sleeps. Sleeping in the
> > kernel is taboo in a lot of places and depending on where is done can
> > also be a thing leading to issues as well. Depending on where you
> > tried to initiate some of this new code, the driver might not have
> > completed fully initializing, so some variables might not be set or
> > buffers might not be fully initialized.
> >
> > Thanks,
> > Roderick
> >
> > On Mon, Aug 30, 2021 at 12:11 AM fei fei <cyfei1982@xxxxxxxxx> wrote:
> > >
> > > 4th attempt......
> > >
> > > Hello to Mr. Roderick or to whom it may concren,
> > >
> > > I am fei, a novice self-studied programming enthusiast, I need help
> > > with hid-sony.c, but there is no relevant maintainer found in the
> > > MAINTAINERS list, the closest is you, Mr. Roderick as the maintainer
> > > of hid-playstation.c, so I just try my luck here, hope you don't mind.
> > >
> > > The scenario as follow:
> > >
> > > I have added a feature to make initial rumble vibrates when devices
> > > are connected, code as follow (sony_play_effect() as reference) :
> > >
> > > add delay.h
> > >
> > > -----------------------------
> > > #include <linux/delay.h>
> > > -----------------------------
> > >
> > >
> > >
> > >
> > >
> > > define a global variable "init_rumble"
> > >
> > > ------------------------------
> > > ......#define SONY_FF_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER)
> > >
> > > bool init_rumble;
> > > #define SONY_BT_DEVICE......
> > > ------------------------------
> > >
> > >
> > >
> > >
> > > declare "init_rumble = true;" in sony_probe()
> > >
> > >
> > > actual part
> > >
> > > ------------------------------
> > > static int sony_init_ff_play(struct input_dev *dev)
> > > {
> > >     struct hid_device *hid = input_get_drvdata(dev);
> > >     struct sony_sc *sc = hid_get_drvdata(hid);
> > >
> > >     sc->left = 255;
> > >     sc->right = 255;
> > >
> > > /*needed for non bt connection or else won't work, reason unknown*/
> > >     if (!(sc->quirks & SONY_BT_DEVICE))
> > >           sony_schedule_work(sc, SONY_WORKER_STATE);
> > >
> > >     /*length-ing magnitude above*/
> > >     msleep(350);
> > >
> > >     sc->left = 0;
> > >     sc->right = 0;
> > >     sony_schedule_work(sc, SONY_WORKER_STATE);
> > >
> > >     init_rumble = false;
> > >
> > >     return 0;
> > > }
> > > -------------------------------
> > >
> > >
> > >
> > >
> > > and called from sony_init_ff()
> > >
> > > --------------------------------
> > > ......input_set_capability(input_dev, EV_FF, FF_RUMBLE);
> > >
> > > if (init_rumble == true) {
> > >     sony_init_ff_play(input_dev);
> > > }
> > >
> > > return input_ff_create_memless(input_dev......
> > > --------------------------------
> > >
> > >
> > >
> > >
> > > it works flawlessly without any error. Since it's identical to
> > > sony_play_effect(), so i just tried to merge them together into
> > > sony_play_effect() to reduce redundancy as follow:
> > >
> > > ------------------------------------
> > > static int sony_play_effect(struct input_dev *dev, void *data,
> > >    struct ff_effect *effect)
> > > {
> > >     struct hid_device *hid = input_get_drvdata(dev);
> > >     struct sony_sc *sc = hid_get_drvdata(hid);
> > >
> > >     if (effect->type != FF_RUMBLE)
> > >         return 0;
> > >
> > >     if (init_rumble == true)
> > >     {
> > >           sc->left = 255;
> > >           sc->right = 255;
> > >
> > >           if (!(sc->quirks & SONY_BT_DEVICE))
> > >               sony_schedule_work(sc, SONY_WORKER_STATE);
> > >
> > >           msleep(400);
> > >
> > >           sc->left = 0;
> > >           sc->right = 0;
> > >           sony_schedule_work(sc, SONY_WORKER_STATE);
> > >
> > >           init_rumble = false;
> > >           return 0;
> > >     }
> > >
> > >     sc->left = effect->u.rumble.strong_magnitude / 256;
> > >     sc->right = effect->u.rumble.weak_magnitude / 256;
> > >
> > >     sony_schedule_work(sc, SONY_WORKER_STATE);
> > >
> > >     return 0;
> > > }
> > > -----------------------------------------------
> > >
> > >
> > >
> > >
> > > called it from sony_init_ff()
> > >
> > > ----------------------------------------------
> > >  ......input_set_capability(input_dev, EV_FF, FF_RUMBLE);
> > >
> > >    if (init_rumble == true) {
> > >        sony_play_effect(input_dev, NULL, NULL);
> > >    }
> > >
> > > return input_ff_create_memless(input_dev......
> > > ------------------------------------------------
> > >
> > >
> > >
> > >
> > > but end up whole system being freezed up, what could possibly going
> > > wrong here? Thx in advance.
> > >
> > > Regards,
> > > fei



[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