From: Roderick Colenbrander <roderick@gaikai.com>
To: Jiri Kosina <jikos@kernel.org>,
Benjamin Tissoires <benjamin.tissoires@redhat.com>
Cc: linux-input@vger.kernel.org, Chris Ye <lzye@google.com>,
Roderick Colenbrander <roderick.colenbrander@sony.com>
Subject: [PATCH 04/13] HID: playstation: add DualSense touchpad support.
Date: Fri, 18 Dec 2020 22:23:27 -0800 [thread overview]
Message-ID: <20201219062336.72568-5-roderick@gaikai.com> (raw)
In-Reply-To: <20201219062336.72568-1-roderick@gaikai.com>
From: Roderick Colenbrander <roderick.colenbrander@sony.com>
Implement support for DualSense touchpad as a separate input device.
Signed-off-by: Roderick Colenbrander <roderick.colenbrander@sony.com>
---
drivers/hid/hid-playstation.c | 59 +++++++++++++++++++++++++++++++++++
1 file changed, 59 insertions(+)
diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c
index 598d262e2a08..7e622b02ee30 100644
--- a/drivers/hid/hid-playstation.c
+++ b/drivers/hid/hid-playstation.c
@@ -56,9 +56,14 @@ struct ps_device {
#define DS_STATUS_CHARGING GENMASK(7, 4)
#define DS_STATUS_CHARGING_SHIFT 4
+/* DualSense hardware limits */
+#define DS_TOUCHPAD_WIDTH 1920
+#define DS_TOUCHPAD_HEIGHT 1080
+
struct dualsense {
struct ps_device base;
struct input_dev *gamepad;
+ struct input_dev *touchpad;
};
struct dualsense_touch_point {
@@ -239,6 +244,34 @@ static struct input_dev *ps_gamepad_create(struct hid_device *hdev)
return gamepad;
}
+static struct input_dev *ps_touchpad_create(struct hid_device *hdev, int width, int height,
+ int num_contacts)
+{
+ struct input_dev *touchpad;
+ int ret;
+
+ touchpad = ps_allocate_input_dev(hdev, "Touchpad");
+ if (IS_ERR(touchpad))
+ return ERR_PTR(-ENOMEM);
+
+ /* Map button underneath touchpad to BTN_LEFT. */
+ input_set_capability(touchpad, EV_KEY, BTN_LEFT);
+ __set_bit(INPUT_PROP_BUTTONPAD, touchpad->propbit);
+
+ input_set_abs_params(touchpad, ABS_MT_POSITION_X, 0, width, 0, 0);
+ input_set_abs_params(touchpad, ABS_MT_POSITION_Y, 0, height, 0, 0);
+
+ ret = input_mt_init_slots(touchpad, num_contacts, INPUT_MT_POINTER);
+ if (ret)
+ return ERR_PTR(ret);
+
+ ret = input_register_device(touchpad);
+ if (ret)
+ return ERR_PTR(ret);
+
+ return touchpad;
+}
+
static int dualsense_get_mac_address(struct dualsense *ds)
{
uint8_t *buf;
@@ -271,6 +304,7 @@ static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *r
uint8_t battery_data, battery_capacity, charging_status, value;
int battery_status;
unsigned long flags;
+ int i;
/* DualSense in USB uses the full HID report for reportID 1, but
* Bluetooth uses a minimal HID report for reportID 1 and reports
@@ -311,6 +345,25 @@ static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *r
input_report_key(ds->gamepad, BTN_MODE, ds_report->buttons[2] & DS_BUTTONS2_PS_HOME);
input_sync(ds->gamepad);
+ input_report_key(ds->touchpad, BTN_LEFT, ds_report->buttons[2] & DS_BUTTONS2_TOUCHPAD);
+ for (i = 0; i < 2; i++) {
+ bool active = (ds_report->points[i].contact & 0x80) ? false : true;
+
+ input_mt_slot(ds->touchpad, i);
+ input_mt_report_slot_state(ds->touchpad, MT_TOOL_FINGER, active);
+
+ if (active) {
+ int x = (ds_report->points[i].x_hi << 8) | ds_report->points[i].x_lo;
+ int y = (ds_report->points[i].y_hi << 4) | ds_report->points[i].y_lo;
+
+ input_report_abs(ds->touchpad, ABS_MT_POSITION_X, x);
+ input_report_abs(ds->touchpad, ABS_MT_POSITION_Y, y);
+ }
+ }
+ input_mt_sync_frame(ds->touchpad);
+ input_report_key(ds->touchpad, BTN_LEFT, ds_report->buttons[2] & DS_BUTTONS2_TOUCHPAD);
+ input_sync(ds->touchpad);
+
battery_data = ds_report->status & DS_STATUS_BATTERY_CAPACITY;
charging_status = (ds_report->status & DS_STATUS_CHARGING) >> DS_STATUS_CHARGING_SHIFT;
@@ -382,6 +435,12 @@ static struct ps_device *dualsense_create(struct hid_device *hdev)
goto err;
}
+ ds->touchpad = ps_touchpad_create(hdev, DS_TOUCHPAD_WIDTH, DS_TOUCHPAD_HEIGHT, 2);
+ if (IS_ERR(ds->touchpad)) {
+ ret = PTR_ERR(ds->touchpad);
+ goto err;
+ }
+
ret = ps_device_register_battery((struct ps_device *)ds);
if (ret < 0)
goto err;
--
2.26.2
next prev parent reply other threads:[~2020-12-19 6:24 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-19 6:23 [PATCH 00/13] HID: new driver for PS5 'DualSense' controller Roderick Colenbrander
2020-12-19 6:23 ` [PATCH 01/13] HID: playstation: initial DualSense USB support Roderick Colenbrander
2020-12-27 16:23 ` Barnabás Pőcze
2020-12-27 23:04 ` Roderick Colenbrander
2020-12-29 19:12 ` Barnabás Pőcze
2020-12-31 0:08 ` Barnabás Pőcze
2020-12-31 1:08 ` Roderick Colenbrander
2020-12-19 6:23 ` [PATCH 02/13] HID: playstation: use DualSense MAC address as unique identifier Roderick Colenbrander
2020-12-19 6:23 ` [PATCH 03/13] HID: playstation: add DualSense battery support Roderick Colenbrander
2020-12-19 6:23 ` Roderick Colenbrander [this message]
2020-12-26 2:14 ` [PATCH 04/13] HID: playstation: add DualSense touchpad support Samuel Čavoj
2020-12-26 22:27 ` Roderick Colenbrander
2020-12-29 19:49 ` Barnabás Pőcze
2020-12-29 21:44 ` Roderick Colenbrander
2020-12-19 6:23 ` [PATCH 05/13] HID: playstation: add DualSense accelerometer and gyroscope support Roderick Colenbrander
2020-12-19 6:23 ` [PATCH 06/13] HID: playstation: track devices in list Roderick Colenbrander
2020-12-19 6:23 ` [PATCH 07/13] HID: playstation: add DualSense Bluetooth support Roderick Colenbrander
2020-12-19 6:23 ` [PATCH 08/13] HID: playstation: add DualSense classic rumble support Roderick Colenbrander
2020-12-19 6:23 ` [PATCH 09/13] HID: playstation: add DualSense lightbar support Roderick Colenbrander
2020-12-27 14:41 ` Barnabás Pőcze
2020-12-28 21:26 ` Roderick Colenbrander
2020-12-29 18:59 ` Barnabás Pőcze
2020-12-29 19:54 ` Roderick Colenbrander
2020-12-29 20:22 ` Barnabás Pőcze
2020-12-19 6:23 ` [PATCH 10/13] HID: playstation: add microphone mute support for DualSense Roderick Colenbrander
2020-12-19 6:23 ` [PATCH 11/13] HID: playstation: add DualSense player LEDs support Roderick Colenbrander
2020-12-26 19:27 ` Samuel Čavoj
2020-12-26 23:07 ` Roderick Colenbrander
2020-12-27 14:27 ` Barnabás Pőcze
2020-12-28 22:02 ` Roderick Colenbrander
2020-12-29 18:49 ` Barnabás Pőcze
2020-12-19 6:23 ` [PATCH 12/13] HID: playstation: DualSense set LEDs to default player id Roderick Colenbrander
2020-12-27 0:08 ` Samuel Čavoj
2020-12-27 23:07 ` Roderick Colenbrander
2020-12-19 6:23 ` [PATCH 13/13] HID: playstation: report DualSense hardware and firmware version Roderick Colenbrander
2020-12-27 17:06 ` Barnabás Pőcze
2020-12-27 22:21 ` Roderick Colenbrander
2020-12-27 22:27 ` Roderick Colenbrander
2020-12-27 22:37 ` Barnabás Pőcze
2020-12-28 22:45 ` Roderick Colenbrander
2020-12-29 15:10 ` Barnabás Pőcze
2020-12-19 8:38 ` [PATCH 00/13] HID: new driver for PS5 'DualSense' controller Bastien Nocera
2020-12-19 22:39 ` 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=20201219062336.72568-5-roderick@gaikai.com \
--to=roderick@gaikai.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 \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).