Hi
On Thu, Jan 30, 2014 at 6:24 PM, Frank Praznik <[email protected]> wrote:
> Add formatting and reporting for Dualshock 4 output reports on Bluetooth.
>
> Signed-off-by: Frank Praznik <[email protected]>
>
> ---
> drivers/hid/hid-sony.c | 29 +++++++++++++++++++++++------
> 1 file changed, 23 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
> index 52162a9..4d12b4e 100644
> --- a/drivers/hid/hid-sony.c
> +++ b/drivers/hid/hid-sony.c
> @@ -1268,11 +1268,18 @@ static void dualshock4_state_worker(struct
> work_struct *work)
> struct hid_device *hdev = sc->hdev;
> int offset;
>
> - __u8 buf[32] = { 0 };
> + __u8 buf[78] = { 0 };
>
> - buf[0] = 0x05;
> - buf[1] = 0x03;
> - offset = 4;
> + if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
> + buf[0] = 0x05;
> + buf[1] = 0x03;
> + offset = 4;
> + } else {
> + buf[0] = 0x11;
> + buf[1] = 0xB0;
> + buf[3] = 0x0F;
> + offset = 6;
> + }
>
> #ifdef CONFIG_SONY_FF
> buf[offset++] = sc->right;
> @@ -1285,7 +1292,11 @@ static void dualshock4_state_worker(struct work_struct
> *work)
> buf[offset++] = sc->led_state[1];
> buf[offset++] = sc->led_state[2];
>
> - hdev->ll_driver->output_report(hdev, buf, sizeof(buf));
> + if (sc->quirks & DUALSHOCK4_CONTROLLER_USB)
> + hdev->ll_driver->output_report(hdev, buf, 32);
> + else
> + hdev->ll_driver->raw_request(hdev, 0x11, buf, 78,
> + HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
Ok, now I get it. The USB stuff takes output-reports and BT uses
SET_REPORT. That's exactly the inverse of wiimotes.
> }
>
> #ifdef CONFIG_SONY_FF
> @@ -1482,10 +1493,16 @@ static int sony_probe(struct hid_device *hdev, const
> struct hid_device_id *id)
> else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
> ret = sixaxis_set_operational_bt(hdev);
> else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
> - if (hdev->ll_driver->output_report == NULL) {
> + if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) &&
> + hdev->ll_driver->output_report == NULL) {
> hid_err(hdev, "NULL output_report handler\n");
> ret = -EINVAL;
> goto err_stop;
> + } else if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) &&
> + hdev->ll_driver->raw_request == NULL) {
> + hid_err(hdev, "NULL raw_request handler\n");
> + ret = -EINVAL;
> + goto err_stop;
If you rebase your patches on Benjamins series, you can use
hid_hw_output_report() and hid_hw_raw_request() which already to the
NULL check. So you can drop this stuff here.
Thanks
David
> }
>
> /* The Dualshock 4 touchpad supports 2 touches and has a
> --
> 1.8.5.3
>
--
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