All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Barnabás Pőcze" <pobrn@protonmail.com>
To: Roderick Colenbrander <roderick@gaikai.com>
Cc: Jiri Kosina <jikos@kernel.org>,
	Benjamin Tissoires <benjamin.tissoires@redhat.com>,
	"linux-input@vger.kernel.org" <linux-input@vger.kernel.org>,
	Chris Ye <lzye@google.com>,
	Roderick Colenbrander <roderick.colenbrander@sony.com>
Subject: Re: [PATCH v2 01/13] HID: playstation: initial DualSense USB support.
Date: Fri, 08 Jan 2021 11:53:21 +0000	[thread overview]
Message-ID: <w_A9vpbh55iLS0YEpmqTZ6WE6UcbP4S46COj8QWhG8qf95MZRWoZ2HdjzNurmMYYfzAuLOzw0KLX0bpob3YBsOh-ZPSvlXOj3YOqrfRBtDk=@protonmail.com> (raw)
In-Reply-To: <CANndSKmuqD=Ls2UAEjzrzNKH1GV9rfjqu_+gzxRiGcf3oHmFcQ@mail.gmail.com>

Hi


2021. január 8., péntek 8:12 keltezéssel, Roderick Colenbrander írta:

> [...]
> > > +static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *report,
> > > +             u8 *data, int size)
> > > +{
> > > +     struct hid_device *hdev = ps_dev->hdev;
> > > +     struct dualsense *ds = container_of(ps_dev, struct dualsense, base);
> > > +     struct dualsense_input_report *ds_report;
> > > +     uint8_t value;
> > > +
> >
> > I think `size` should be checked somewhere around here.
> >
> >
> > > +     /* DualSense in USB uses the full HID report for reportID 1, but
> > > +      * Bluetooth uses a minimal HID report for reportID 1 and reports
> > > +      * the full report using reportID 49.
> > > +      */
> > > +     if (report->id == DS_INPUT_REPORT_USB && hdev->bus == BUS_USB) {
> > > +             ds_report = (struct dualsense_input_report *)&data[1];
> > > +     } else {
> > > +             hid_err(hdev, "Unhandled reportID=%d\n", report->id);
> > > +             return -1;
> > > +     }
> > > +
> > > +     input_report_abs(ds->gamepad, ABS_X,  ds_report->x);
> > > +     input_report_abs(ds->gamepad, ABS_Y,  ds_report->y);
> > > +     input_report_abs(ds->gamepad, ABS_RX, ds_report->rx);
> > > +     input_report_abs(ds->gamepad, ABS_RY, ds_report->ry);
> > > +     input_report_abs(ds->gamepad, ABS_Z,  ds_report->z);
> > > +     input_report_abs(ds->gamepad, ABS_RZ, ds_report->rz);
> > > +
> > > +     value = ds_report->buttons[0] & DS_BUTTONS0_HAT_SWITCH;
> > > +     if (value > 7)
> > > +             value = 8; /* center */
> >
> > This seems a bit flimsy to me, it relies on a different part of the code
> > being in a certain way that is not enforced by anything
>
> What do you mean with not enforced? I'm not saying I'm a big fan of
> the code, but HATs seem to work like this. The DualShock4/DualSense
> describe it in their HID descriptors with a logical minimum value of 0
> and a max value of 7.

What I really meant is that I think it would be better to somehow decrease
the chances of unintentionally breaking the code by providing stronger
guarantees that `ps_gamepad_hat_mapping[value]` will not be an out of bounds
access. E.g. checking with static_assert that it has 9 elements, using
ARRAY_SIZE() in some way in the condition, etc. I'm not trying to say it's
very probable, but I think it's easily preventable and thus it should be done.

By "not enforced", I meant that there are no compile time or even runtime guarantees
that the `ps_gamepad_hat_mapping` contains as many elements as expected by this
part of the code.


>
> The code is very similar to hid-input.c:
>
> static const struct {
> __s32 x;
> __s32 y;
> }  hid_hat_to_axis[] = {{ 0, 0}, { 0,-1}, { 1,-1}, { 1, 0}, { 1, 1}, {
> 0, 1}, {-1, 1}, {-1, 0}, {-1,-1}};
>
> int hat_dir = usage->hat_dir;
> if (!hat_dir)
>     hat_dir = (value - usage->hat_min) * 8 / (usage->hat_max -
> usage->hat_min + 1) + 1;
> if (hat_dir < 0 || hat_dir > 8) hat_dir = 0;
> input_event(input, usage->type, usage->code    , hid_hat_to_axis[hat_dir].x);
> input_event(input, usage->type, usage->code + 1, hid_hat_to_axis[hat_dir].y);
>
> Main difference seems to be that this code places {0, 0} at the start
> and adds a "+1" to avoid having to set the value to "8" when out of
> range.
>
>  I'd probably do something
> > like this:
> >
> > enum {
> >   HAT_DIR_W = 0,
> >   HAT_DIR_NW,
> >   ...
> >   HAT_DIR_SW,
> >   HAT_DIR_NONE,
> > };
> >
> > static const struct {int x; int y; } ps_gamepad_hat_mapping[] = {
> >   [HAT_DIR_W] = {0, -1},
> >   ...
> >   [HAT_DIR_NONE] = {0, 0},
> > };
> >
> > and then
> >
> > if (value >= ARRAY_SIZE(ps_gamepad_hat_mapping))
> >   value = HAT_DIR_NONE;
> >
> > Please consider it. By the way, are values 9..15 actually sent by the controller?
>
> See above. They are not sent. The Hat Switch in the report descriptor
> is reported with a logical minimum of 0 and a max of 8.
>
> >
> > > +     input_report_abs(ds->gamepad, ABS_HAT0X, ps_gamepad_hat_mapping[value].x);
> > > +     input_report_abs(ds->gamepad, ABS_HAT0Y, ps_gamepad_hat_mapping[value].y);
> > > +
> > > +     input_report_key(ds->gamepad, BTN_WEST,   ds_report->buttons[0] & DS_BUTTONS0_SQUARE);
> > > +     input_report_key(ds->gamepad, BTN_SOUTH,  ds_report->buttons[0] & DS_BUTTONS0_CROSS);
> > > +     input_report_key(ds->gamepad, BTN_EAST,   ds_report->buttons[0] & DS_BUTTONS0_CIRCLE);
> > > +     input_report_key(ds->gamepad, BTN_NORTH,  ds_report->buttons[0] & DS_BUTTONS0_TRIANGLE);
> > > +     input_report_key(ds->gamepad, BTN_TL,     ds_report->buttons[1] & DS_BUTTONS1_L1);
> > > +     input_report_key(ds->gamepad, BTN_TR,     ds_report->buttons[1] & DS_BUTTONS1_R1);
> > > +     input_report_key(ds->gamepad, BTN_TL2,    ds_report->buttons[1] & DS_BUTTONS1_L2);
> > > +     input_report_key(ds->gamepad, BTN_TR2,    ds_report->buttons[1] & DS_BUTTONS1_R2);
> > > +     input_report_key(ds->gamepad, BTN_SELECT, ds_report->buttons[1] & DS_BUTTONS1_CREATE);
> > > +     input_report_key(ds->gamepad, BTN_START,  ds_report->buttons[1] & DS_BUTTONS1_OPTIONS);
> > > +     input_report_key(ds->gamepad, BTN_THUMBL, ds_report->buttons[1] & DS_BUTTONS1_L3);
> > > +     input_report_key(ds->gamepad, BTN_THUMBR, ds_report->buttons[1] & DS_BUTTONS1_R3);
> > > +     input_report_key(ds->gamepad, BTN_MODE,   ds_report->buttons[2] & DS_BUTTONS2_PS_HOME);
> > > +     input_sync(ds->gamepad);
> > > +
> > > +     return 0;
> > > +}
> [...]


Regards,
Barnabás Pőcze

  reply	other threads:[~2021-01-08 11:54 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-02 22:30 [PATCH v2 00/13] HID: new driver for PS5 'DualSense' controller Roderick Colenbrander
2021-01-02 22:30 ` [PATCH v2 01/13] HID: playstation: initial DualSense USB support Roderick Colenbrander
2021-01-04 12:20   ` Jiri Kosina
2021-01-05  8:20   ` Benjamin Tissoires
2021-01-07 17:14   ` Barnabás Pőcze
2021-01-08  7:12     ` Roderick Colenbrander
2021-01-08 11:53       ` Barnabás Pőcze [this message]
2021-01-02 22:30 ` [PATCH v2 02/13] HID: playstation: use DualSense MAC address as unique identifier Roderick Colenbrander
2021-01-07 17:22   ` Barnabás Pőcze
2021-01-02 22:30 ` [PATCH v2 03/13] HID: playstation: add DualSense battery support Roderick Colenbrander
2021-01-07 17:50   ` Barnabás Pőcze
2021-01-02 22:31 ` [PATCH v2 04/13] HID: playstation: add DualSense touchpad support Roderick Colenbrander
2021-01-07 17:55   ` Barnabás Pőcze
2021-01-02 22:31 ` [PATCH v2 05/13] HID: playstation: add DualSense accelerometer and gyroscope support Roderick Colenbrander
2021-01-07 13:34   ` Florian Märkl
2021-01-08  5:51     ` Roderick Colenbrander
2021-01-07 18:51   ` Barnabás Pőcze
2021-01-08  6:06     ` Roderick Colenbrander
2021-01-08 12:01       ` Barnabás Pőcze
2021-01-08 17:15         ` Siarhei Vishniakou
2021-01-08 19:54           ` Roderick Colenbrander
2021-01-09  0:11             ` Siarhei Vishniakou
2021-01-11  0:06               ` Roderick Colenbrander
2021-01-02 22:31 ` [PATCH v2 06/13] HID: playstation: track devices in list Roderick Colenbrander
2021-01-07 20:13   ` Barnabás Pőcze
2021-01-02 22:31 ` [PATCH v2 07/13] HID: playstation: add DualSense Bluetooth support Roderick Colenbrander
2021-01-07 20:18   ` Barnabás Pőcze
2021-01-02 22:31 ` [PATCH v2 08/13] HID: playstation: add DualSense classic rumble support Roderick Colenbrander
2021-01-07 20:41   ` Barnabás Pőcze
2021-01-07 20:48     ` Barnabás Pőcze
2021-01-08 17:01     ` Roderick Colenbrander
2021-01-02 22:31 ` [PATCH v2 09/13] HID: playstation: add DualSense lightbar support Roderick Colenbrander
2021-01-07 21:01   ` Barnabás Pőcze
2021-01-02 22:31 ` [PATCH v2 10/13] HID: playstation: add microphone mute support for DualSense Roderick Colenbrander
2021-01-07 21:57   ` Barnabás Pőcze
2021-01-02 22:31 ` [PATCH v2 11/13] HID: playstation: add DualSense player LEDs support Roderick Colenbrander
2021-01-07 22:17   ` Barnabás Pőcze
2021-01-02 22:31 ` [PATCH v2 12/13] HID: playstation: DualSense set LEDs to default player id Roderick Colenbrander
2021-01-07 22:25   ` Barnabás Pőcze
2021-01-02 22:31 ` [PATCH v2 13/13] HID: playstation: report DualSense hardware and firmware version Roderick Colenbrander
2021-01-07 22:26   ` Barnabás Pőcze
2021-01-09  1:35     ` Roderick Colenbrander

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='w_A9vpbh55iLS0YEpmqTZ6WE6UcbP4S46COj8QWhG8qf95MZRWoZ2HdjzNurmMYYfzAuLOzw0KLX0bpob3YBsOh-ZPSvlXOj3YOqrfRBtDk=@protonmail.com' \
    --to=pobrn@protonmail.com \
    --cc=benjamin.tissoires@redhat.com \
    --cc=jikos@kernel.org \
    --cc=linux-input@vger.kernel.org \
    --cc=lzye@google.com \
    --cc=roderick.colenbrander@sony.com \
    --cc=roderick@gaikai.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.