linux-input.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3] Support for Alps SS5 touchpad
@ 2016-06-21  9:19 Ben Gamari
  2016-06-21  9:19 ` [PATCH 1/5] input/alps: Add touchstick support for SS5 hardware Ben Gamari
                   ` (5 more replies)
  0 siblings, 6 replies; 15+ messages in thread
From: Ben Gamari @ 2016-06-21  9:19 UTC (permalink / raw)
  To: Ben Gamari, linux-input, Hans de Goede, Allen Hung, Masaki Ota,
	Ben Morgan



Hello all,

Here is the third iteration of my patchset adding support for the Alps SS5
touchpad used in the Dell Latitude E7470. The patch is largely unchanged except
for a reorganization of the DUALPOINT flag detection logic and the addition of
protocol documentation.

Thanks to everyone who has offered reviews so far.

Cheers,

- Ben



Changes:

v1:
 * Initial revision

v2:
 * Rework device detection
 * Fix contact release behavior of 1F events
 * Expose pressure of touchstick

v3:
 * Add protocol documentation
 * Move dualpoint detection into alps_set_protocol


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH 1/5] input/alps: Add touchstick support for SS5 hardware
  2016-06-21  9:19 [PATCH v3] Support for Alps SS5 touchpad Ben Gamari
@ 2016-06-21  9:19 ` Ben Gamari
  2016-06-21  9:19 ` [PATCH 2/5] input/alps: Handle 0-pressure 1F events Ben Gamari
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 15+ messages in thread
From: Ben Gamari @ 2016-06-21  9:19 UTC (permalink / raw)
  To: Ben Gamari, linux-input, Hans de Goede, Allen Hung, Masaki Ota,
	Ben Morgan

Add touchstick support for the so-called SS5 hardware, which uses a
variant of the SS4 protocol.

Reviewed-by: Pali Rohár <pali.rohar@gmail.com>
---
 drivers/input/mouse/alps.c | 64 ++++++++++++++++++++++++++++++++++++++--------
 drivers/input/mouse/alps.h |  2 ++
 2 files changed, 55 insertions(+), 11 deletions(-)

diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
index 936f07a..b8454af 100644
--- a/drivers/input/mouse/alps.c
+++ b/drivers/input/mouse/alps.c
@@ -1156,15 +1156,27 @@ static unsigned char alps_get_pkt_id_ss4_v2(unsigned char *byte)
 {
 	unsigned char pkt_id = SS4_PACKET_ID_IDLE;
 
-	if (byte[0] == 0x18 && byte[1] == 0x10 && byte[2] == 0x00 &&
-	    (byte[3] & 0x88) == 0x08 && byte[4] == 0x10 && byte[5] == 0x00) {
-		pkt_id = SS4_PACKET_ID_IDLE;
-	} else if (!(byte[3] & 0x10)) {
-		pkt_id = SS4_PACKET_ID_ONE;
-	} else if (!(byte[3] & 0x20)) {
+	switch (byte[3] & 0x30) {
+	case 0x00:
+		if (byte[0] == 0x18 && byte[1] == 0x10 && byte[2] == 0x00 &&
+				(byte[3] & 0x88) == 0x08 && byte[4] == 0x10 && byte[5] == 0x00) {
+			pkt_id = SS4_PACKET_ID_IDLE;
+		} else {
+			pkt_id = SS4_PACKET_ID_ONE;
+		}
+		break;
+	case 0x10:
+		/* two-finger finger positions */
 		pkt_id = SS4_PACKET_ID_TWO;
-	} else {
+		break;
+	case 0x20:
+		/* stick pointer */
+		pkt_id = SS4_PACKET_ID_STICK;
+		break;
+	case 0x30:
+		/* third and fourth finger positions */
 		pkt_id = SS4_PACKET_ID_MULTI;
+		break;
 	}
 
 	return pkt_id;
@@ -1246,16 +1258,38 @@ static int alps_decode_ss4_v2(struct alps_fields *f,
 		}
 		break;
 
+	case SS4_PACKET_ID_STICK:
+		if (!(priv->flags & ALPS_DUALPOINT)) {
+			psmouse_warn(psmouse,
+				     "Rejected trackstick packet from non DualPoint device");
+		} else {
+			int x = (s8)(((p[0] & 1) << 7) | (p[1] & 0x7f));
+			int y = (s8)(((p[3] & 1) << 7) | (p[2] & 0x7f));
+
+			input_report_rel(priv->dev2, REL_X, x);
+			input_report_rel(priv->dev2, REL_Y, -y);
+		}
+		break;
+
 	case SS4_PACKET_ID_IDLE:
 	default:
 		memset(f, 0, sizeof(struct alps_fields));
 		break;
 	}
 
-	f->left = !!(SS4_BTN_V2(p) & 0x01);
-	if (!(priv->flags & ALPS_BUTTONPAD)) {
-		f->right = !!(SS4_BTN_V2(p) & 0x02);
-		f->middle = !!(SS4_BTN_V2(p) & 0x04);
+	/* handle buttons */
+	if (pkt_id == SS4_PACKET_ID_STICK) {
+		f->ts_left = !!(SS4_BTN_V2(p) & 0x01);
+		if (!(priv->flags & ALPS_BUTTONPAD)) {
+			f->ts_right = !!(SS4_BTN_V2(p) & 0x02);
+			f->ts_middle = !!(SS4_BTN_V2(p) & 0x04);
+		}
+	} else {
+		f->left = !!(SS4_BTN_V2(p) & 0x01);
+		if (!(priv->flags & ALPS_BUTTONPAD)) {
+			f->right = !!(SS4_BTN_V2(p) & 0x02);
+			f->middle = !!(SS4_BTN_V2(p) & 0x04);
+		}
 	}
 
 	return 0;
@@ -1266,6 +1300,7 @@ static void alps_process_packet_ss4_v2(struct psmouse *psmouse)
 	struct alps_data *priv = psmouse->private;
 	unsigned char *packet = psmouse->packet;
 	struct input_dev *dev = psmouse->dev;
+	struct input_dev *dev2 = priv->dev2;
 	struct alps_fields *f = &priv->f;
 
 	memset(f, 0, sizeof(struct alps_fields));
@@ -1311,6 +1346,13 @@ static void alps_process_packet_ss4_v2(struct psmouse *psmouse)
 
 	input_report_abs(dev, ABS_PRESSURE, f->pressure);
 	input_sync(dev);
+
+	if (priv->flags & ALPS_DUALPOINT) {
+		input_report_key(dev2, BTN_LEFT, f->ts_left);
+		input_report_key(dev2, BTN_RIGHT, f->ts_right);
+		input_report_key(dev2, BTN_MIDDLE, f->ts_middle);
+		input_sync(dev2);
+	}
 }
 
 static bool alps_is_valid_package_ss4_v2(struct psmouse *psmouse)
diff --git a/drivers/input/mouse/alps.h b/drivers/input/mouse/alps.h
index d37f814..b9417e2 100644
--- a/drivers/input/mouse/alps.h
+++ b/drivers/input/mouse/alps.h
@@ -37,12 +37,14 @@
  *  or there's button activities.
  * SS4_PACKET_ID_TWO: There's two or more fingers on touchpad
  * SS4_PACKET_ID_MULTI: There's three or more fingers on touchpad
+ * SS4_PACKET_ID_STICK: A stick pointer packet
 */
 enum SS4_PACKET_ID {
 	SS4_PACKET_ID_IDLE = 0,
 	SS4_PACKET_ID_ONE,
 	SS4_PACKET_ID_TWO,
 	SS4_PACKET_ID_MULTI,
+	SS4_PACKET_ID_STICK,
 };
 
 #define SS4_COUNT_PER_ELECTRODE		256
-- 
2.8.1

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

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 2/5] input/alps: Handle 0-pressure 1F events
  2016-06-21  9:19 [PATCH v3] Support for Alps SS5 touchpad Ben Gamari
  2016-06-21  9:19 ` [PATCH 1/5] input/alps: Add touchstick support for SS5 hardware Ben Gamari
@ 2016-06-21  9:19 ` Ben Gamari
  2016-06-21  9:19 ` [PATCH 3/5] input/alps: Allow touchsticks to report pressure Ben Gamari
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 15+ messages in thread
From: Ben Gamari @ 2016-06-21  9:19 UTC (permalink / raw)
  To: Ben Gamari, linux-input, Hans de Goede, Allen Hung, Masaki Ota,
	Ben Morgan

While a button is held SS5 hardware will give us single-finger packets
with x, y, and pressure equal to zero. This causes annoying jumps in
pointer position if a touch is released while the button is held. Handle
this by claiming zero contacts to ensure that no position events are
provided to the user.

Reviewed-by: Pali Rohár <pali.rohar@gmail.com>
---
 drivers/input/mouse/alps.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
index b8454af..7874f4f 100644
--- a/drivers/input/mouse/alps.c
+++ b/drivers/input/mouse/alps.c
@@ -1197,7 +1197,12 @@ static int alps_decode_ss4_v2(struct alps_fields *f,
 		f->mt[0].x = SS4_1F_X_V2(p);
 		f->mt[0].y = SS4_1F_Y_V2(p);
 		f->pressure = ((SS4_1F_Z_V2(p)) * 2) & 0x7f;
-		f->fingers = 1;
+		/*
+		 * When a button is held the device will give us events with x, y, and
+		 * pressure of 0. This causes annoying jumps if a touch is released while
+		 * the button is held. Handle this by claiming zero contacts.
+		 */
+		f->fingers = f->pressure > 0 ? 1 : 0;
 		f->first_mp = 0;
 		f->is_mp = 0;
 		break;
-- 
2.8.1

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

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 3/5] input/alps: Allow touchsticks to report pressure
  2016-06-21  9:19 [PATCH v3] Support for Alps SS5 touchpad Ben Gamari
  2016-06-21  9:19 ` [PATCH 1/5] input/alps: Add touchstick support for SS5 hardware Ben Gamari
  2016-06-21  9:19 ` [PATCH 2/5] input/alps: Handle 0-pressure 1F events Ben Gamari
@ 2016-06-21  9:19 ` Ben Gamari
  2016-06-21  9:19 ` [PATCH 4/5] input/alps: Set DualPoint flag for 74 03 28 devices Ben Gamari
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 15+ messages in thread
From: Ben Gamari @ 2016-06-21  9:19 UTC (permalink / raw)
  To: Ben Gamari, linux-input, Hans de Goede, Allen Hung, Masaki Ota,
	Ben Morgan

The SS5 hardware can report this.
---
 drivers/input/mouse/alps.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
index 7874f4f..25d2cad 100644
--- a/drivers/input/mouse/alps.c
+++ b/drivers/input/mouse/alps.c
@@ -103,6 +103,7 @@ static const struct alps_nibble_commands alps_v6_nibble_commands[] = {
 					   6-byte ALPS packet */
 #define ALPS_STICK_BITS		0x100	/* separate stick button bits */
 #define ALPS_BUTTONPAD		0x200	/* device is a clickpad */
+#define ALPS_DUALPOINT_WITH_PRESSURE		0x400	/* device can report trackpoint pressure */
 
 static const struct alps_model_info alps_model_data[] = {
 	{ { 0x32, 0x02, 0x14 }, 0x00, { ALPS_PROTO_V2, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT } },	/* Toshiba Salellite Pro M10 */
@@ -1270,9 +1271,11 @@ static int alps_decode_ss4_v2(struct alps_fields *f,
 		} else {
 			int x = (s8)(((p[0] & 1) << 7) | (p[1] & 0x7f));
 			int y = (s8)(((p[3] & 1) << 7) | (p[2] & 0x7f));
+			int pressure = (s8)(p[4] & 0x7f);
 
 			input_report_rel(priv->dev2, REL_X, x);
 			input_report_rel(priv->dev2, REL_Y, -y);
+			input_report_abs(priv->dev2, ABS_PRESSURE, pressure);
 		}
 		break;
 
@@ -2996,6 +2999,10 @@ int alps_init(struct psmouse *psmouse)
 
 		input_set_capability(dev2, EV_REL, REL_X);
 		input_set_capability(dev2, EV_REL, REL_Y);
+		if (priv->flags & ALPS_DUALPOINT_WITH_PRESSURE) {
+			input_set_capability(dev2, EV_ABS, ABS_PRESSURE);
+			input_set_abs_params(dev2, ABS_PRESSURE, 0, 127, 0, 0);
+		}
 		input_set_capability(dev2, EV_KEY, BTN_LEFT);
 		input_set_capability(dev2, EV_KEY, BTN_RIGHT);
 		input_set_capability(dev2, EV_KEY, BTN_MIDDLE);
-- 
2.8.1


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 4/5] input/alps: Set DualPoint flag for 74 03 28 devices
  2016-06-21  9:19 [PATCH v3] Support for Alps SS5 touchpad Ben Gamari
                   ` (2 preceding siblings ...)
  2016-06-21  9:19 ` [PATCH 3/5] input/alps: Allow touchsticks to report pressure Ben Gamari
@ 2016-06-21  9:19 ` Ben Gamari
  2016-06-21  9:19 ` [PATCH 5/5] Documentation/alps: Add V8 protocol documentation Ben Gamari
  2016-07-29  8:46 ` [PATCH v3] Support for Alps SS5 touchpad Jiri Kosina
  5 siblings, 0 replies; 15+ messages in thread
From: Ben Gamari @ 2016-06-21  9:19 UTC (permalink / raw)
  To: Ben Gamari, linux-input, Hans de Goede, Allen Hung, Masaki Ota,
	Ben Morgan

Here we introduce logic in alps_identify to set the ALPS_DUALPOINT flag
for touchpad hardware responding to E7 report with 73 03 28, as is found
in the Dell Latitude E7470.
---
 drivers/input/mouse/alps.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
index 25d2cad..308f289 100644
--- a/drivers/input/mouse/alps.c
+++ b/drivers/input/mouse/alps.c
@@ -2745,6 +2745,9 @@ static int alps_set_protocol(struct psmouse *psmouse,
 		if (alps_set_defaults_ss4_v2(psmouse, priv))
 			return -EIO;
 
+		if (priv->fw_ver[1] == 0x1)
+			priv->flags |= ALPS_DUALPOINT | ALPS_DUALPOINT_WITH_PRESSURE;
+
 		break;
 	}
 
@@ -2817,6 +2820,9 @@ static int alps_identify(struct psmouse *psmouse, struct alps_data *priv)
 		} else if (e7[0] == 0x73 && e7[1] == 0x03 &&
 			   e7[2] == 0x14 && ec[1] == 0x02) {
 			protocol = &alps_v8_protocol_data;
+		} else if (e7[0] == 0x73 && e7[1] == 0x03 &&
+			   e7[2] == 0x28 && ec[1] == 0x01) {
+			protocol = &alps_v8_protocol_data;
 		} else {
 			psmouse_dbg(psmouse,
 				    "Likely not an ALPS touchpad: E7=%3ph, EC=%3ph\n", e7, ec);
-- 
2.8.1


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 5/5] Documentation/alps: Add V8 protocol documentation
  2016-06-21  9:19 [PATCH v3] Support for Alps SS5 touchpad Ben Gamari
                   ` (3 preceding siblings ...)
  2016-06-21  9:19 ` [PATCH 4/5] input/alps: Set DualPoint flag for 74 03 28 devices Ben Gamari
@ 2016-06-21  9:19 ` Ben Gamari
  2016-07-29  8:46 ` [PATCH v3] Support for Alps SS5 touchpad Jiri Kosina
  5 siblings, 0 replies; 15+ messages in thread
From: Ben Gamari @ 2016-06-21  9:19 UTC (permalink / raw)
  To: Ben Gamari, linux-input, Hans de Goede, Allen Hung, Masaki Ota,
	Ben Morgan

---
 Documentation/input/alps.txt | 57 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 57 insertions(+)

diff --git a/Documentation/input/alps.txt b/Documentation/input/alps.txt
index 1fec113..8d1341c 100644
--- a/Documentation/input/alps.txt
+++ b/Documentation/input/alps.txt
@@ -319,3 +319,60 @@ For touchpad packet, the format is:
                otherwise byte 0 bit 4 must be set and byte 0/4/5 are
                in NEW fmt
  F:         Number of fingers - 3, 0 means 3 fingers, 1 means 4 ...
+
+
+ALPS Absolute Mode - Protocol Version 8
+---------------------------------------
+
+Spoken by SS4 (73 03 14) and SS5 (73 03 28) hardware.
+
+The packet type is given by the APD field, bits 4-5 of byte 3.
+
+Touchpad packet (APD = 0x2):
+
+           b7   b6   b5   b4   b3   b2   b1   b0
+ byte 0:  SWM  SWR  SWL    1    1    0    0   X7
+ byte 1:    0   X6   X5   X4   X3   X2   X1   X0
+ byte 2:    0   Y6   Y5   Y4   Y3   Y2   Y1   Y0
+ byte 3:    0  T&P    1    0    1    0    0   Y7
+ byte 4:    0   Z6   Z5   Z4   Z3   Z2   Z1   Z0
+ byte 5:    0    0    0    0    0    0    0    0
+
+SWM, SWR, SWL: Middle, Right, and Left button states
+
+Touchpad 1 Finger packet (APD = 0x0):
+
+           b7   b6   b5   b4   b3   b2   b1   b0
+ byte 0:  SWM  SWR  SWL    1    1   X2   X1   X0
+ byte 1:   X9   X8   X7    1   X6   X5   X4   X3
+ byte 2:    0  X11  X10  LFB   Y3   Y2   Y1   Y0
+ byte 3:   Y5   Y4    0    0    1 TAPF2 TAPF1 TAPF0
+ byte 4:  Zv7  Y11  Y10    1   Y9   Y8   Y7   Y6
+ byte 5:  Zv6  Zv5  Zv4    0  Zv3  Zv2  Zv1  Zv0
+
+TAPF: ???
+LFB:  ???
+
+Touchpad 2 Finger packet (APD = 0x1):
+
+           b7   b6   b5   b4   b3   b2   b1   b0
+ byte 0:  SWM  SWR  SWL    1    1  AX6  AX5  AX4
+ byte 1: AX11 AX10  AX9  AX8  AX7  AZ1  AY4  AZ0
+ byte 2: AY11 AY10  AY9  CONT AY8  AY7  AY6  AY5
+ byte 3:    0    0    0    1    1  BX6  BX5  BX4
+ byte 4: BX11 BX10  BX9  BX8  BX7  BZ1  BY4  BZ0
+ byte 5: BY11 BY10  BY9    0  BY8  BY7  BY5  BY5
+
+CONT: A 3-or-4 Finger packet is to follow
+
+Touchpad 3-or-4 Finger packet (APD = 0x3):
+
+           b7   b6   b5   b4   b3   b2   b1   b0
+ byte 0:  SWM  SWR  SWL    1    1  AX6  AX5  AX4
+ byte 1: AX11 AX10  AX9  AX8  AX7  AZ1  AY4  AZ0
+ byte 2: AY11 AY10  AY9  OVF  AY8  AY7  AY6  AY5
+ byte 3:    0    0    1    1    1  BX6  BX5  BX4
+ byte 4: BX11 BX10  BX9  BX8  BX7  BZ1  BY4  BZ0
+ byte 5: BY11 BY10  BY9    0  BY8  BY7  BY5  BY5
+
+OVF: 5th finger detected
-- 
2.8.1


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH v3] Support for Alps SS5 touchpad
  2016-06-21  9:19 [PATCH v3] Support for Alps SS5 touchpad Ben Gamari
                   ` (4 preceding siblings ...)
  2016-06-21  9:19 ` [PATCH 5/5] Documentation/alps: Add V8 protocol documentation Ben Gamari
@ 2016-07-29  8:46 ` Jiri Kosina
  2016-08-29  7:14   ` Michal Hocko
  5 siblings, 1 reply; 15+ messages in thread
From: Jiri Kosina @ 2016-07-29  8:46 UTC (permalink / raw)
  To: Ben Gamari
  Cc: linux-input, Hans de Goede, Allen Hung, Masaki Ota, Ben Morgan,
	Dmitry Torokhov

On Tue, 21 Jun 2016, Ben Gamari wrote:

> Hello all,
> 
> Here is the third iteration of my patchset adding support for the Alps SS5
> touchpad used in the Dell Latitude E7470. The patch is largely unchanged except
> for a reorganization of the DUALPOINT flag detection logic and the addition of
> protocol documentation.
> 
> Thanks to everyone who has offered reviews so far.

Seems like this went by unnoticed. Adding Dmitry to CC.

Thanks,

-- 
Jiri Kosina
SUSE Labs

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v3] Support for Alps SS5 touchpad
  2016-07-29  8:46 ` [PATCH v3] Support for Alps SS5 touchpad Jiri Kosina
@ 2016-08-29  7:14   ` Michal Hocko
  2016-10-03  7:23     ` Jiri Kosina
  2016-10-03 12:14     ` Ben Gamari
  0 siblings, 2 replies; 15+ messages in thread
From: Michal Hocko @ 2016-08-29  7:14 UTC (permalink / raw)
  To: Ben Gamari
  Cc: Jiri Kosina, linux-input, Hans de Goede, Allen Hung, Masaki Ota,
	Ben Morgan, Dmitry Torokhov

On Fri 29-07-16 10:46:31, Jiri Kosina wrote:
> On Tue, 21 Jun 2016, Ben Gamari wrote:
> 
> > Hello all,
> > 
> > Here is the third iteration of my patchset adding support for the Alps SS5
> > touchpad used in the Dell Latitude E7470. The patch is largely unchanged except
> > for a reorganization of the DUALPOINT flag detection logic and the addition of
> > protocol documentation.
> > 
> > Thanks to everyone who has offered reviews so far.
> 
> Seems like this went by unnoticed. Adding Dmitry to CC.

Thanks to Jiri for pointing me to these patches. I was running with them
for few days and they seem to be working reasonably well on my Latitude
E7470. The only annoying thing is that the vertical scrolling mode seems
to be hard to exit - sometimes you can get almost to the (horizontal)
middle of the touch pad and the scrolling is still active. I haven't
found any scrolling area width configuration knob though.

Anyway, feel free to add my
Tested-by: Michal Hocko <mhocko@suse.com>

Btw. I've noticed that none of the patches has your signed-off-by which
is required for any patch to be applied.

Thanks!
-- 
Michal Hocko
SUSE Labs

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v3] Support for Alps SS5 touchpad
  2016-08-29  7:14   ` Michal Hocko
@ 2016-10-03  7:23     ` Jiri Kosina
  2016-10-03 12:15       ` Ben Gamari
  2016-10-03 12:14     ` Ben Gamari
  1 sibling, 1 reply; 15+ messages in thread
From: Jiri Kosina @ 2016-10-03  7:23 UTC (permalink / raw)
  To: Michal Hocko
  Cc: Ben Gamari, linux-input, Hans de Goede, Allen Hung, Masaki Ota,
	Ben Morgan, Dmitry Torokhov

On Mon, 29 Aug 2016, Michal Hocko wrote:

> > > Here is the third iteration of my patchset adding support for the Alps SS5
> > > touchpad used in the Dell Latitude E7470. The patch is largely unchanged except
> > > for a reorganization of the DUALPOINT flag detection logic and the addition of
> > > protocol documentation.
> > > 
> > > Thanks to everyone who has offered reviews so far.
> > 
> > Seems like this went by unnoticed. Adding Dmitry to CC.
> 
> Thanks to Jiri for pointing me to these patches. I was running with them
> for few days and they seem to be working reasonably well on my Latitude
> E7470. The only annoying thing is that the vertical scrolling mode seems
> to be hard to exit - sometimes you can get almost to the (horizontal)
> middle of the touch pad and the scrolling is still active. I haven't
> found any scrolling area width configuration knob though.
> 
> Anyway, feel free to add my
> Tested-by: Michal Hocko <mhocko@suse.com>
> 
> Btw. I've noticed that none of the patches has your signed-off-by which
> is required for any patch to be applied.

Ben, Dmitry, has this fallen in between the cracks?

Thanks,

-- 
Jiri Kosina
SUSE Labs


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v3] Support for Alps SS5 touchpad
  2016-08-29  7:14   ` Michal Hocko
  2016-10-03  7:23     ` Jiri Kosina
@ 2016-10-03 12:14     ` Ben Gamari
  1 sibling, 0 replies; 15+ messages in thread
From: Ben Gamari @ 2016-10-03 12:14 UTC (permalink / raw)
  To: Michal Hocko
  Cc: Jiri Kosina, linux-input, Hans de Goede, Allen Hung, Masaki Ota,
	Ben Morgan, Dmitry Torokhov

[-- Attachment #1: Type: text/plain, Size: 1130 bytes --]

Michal Hocko <mhocko@kernel.org> writes:

> On Fri 29-07-16 10:46:31, Jiri Kosina wrote:
>> On Tue, 21 Jun 2016, Ben Gamari wrote:
>> 
>> > Hello all,
>> > 
>> > Here is the third iteration of my patchset adding support for the Alps SS5
>> > touchpad used in the Dell Latitude E7470. The patch is largely unchanged except
>> > for a reorganization of the DUALPOINT flag detection logic and the addition of
>> > protocol documentation.
>> > 
>> > Thanks to everyone who has offered reviews so far.
>> 
>> Seems like this went by unnoticed. Adding Dmitry to CC.
>
> Thanks to Jiri for pointing me to these patches. I was running with them
> for few days and they seem to be working reasonably well on my Latitude
> E7470. The only annoying thing is that the vertical scrolling mode seems
> to be hard to exit - sometimes you can get almost to the (horizontal)
> middle of the touch pad and the scrolling is still active. I haven't
> found any scrolling area width configuration knob though.
>
> Anyway, feel free to add my
> Tested-by: Michal Hocko <mhocko@suse.com>
>
Thanks Michael!

Cheers,

- Ben

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 454 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v3] Support for Alps SS5 touchpad
  2016-10-03  7:23     ` Jiri Kosina
@ 2016-10-03 12:15       ` Ben Gamari
  0 siblings, 0 replies; 15+ messages in thread
From: Ben Gamari @ 2016-10-03 12:15 UTC (permalink / raw)
  To: Jiri Kosina, Michal Hocko
  Cc: linux-input, Hans de Goede, Allen Hung, Masaki Ota, Ben Morgan,
	Dmitry Torokhov

[-- Attachment #1: Type: text/plain, Size: 897 bytes --]

Jiri Kosina <jikos@kernel.org> writes:

> On Mon, 29 Aug 2016, Michal Hocko wrote:
>> 
>> Thanks to Jiri for pointing me to these patches. I was running with them
>> for few days and they seem to be working reasonably well on my Latitude
>> E7470. The only annoying thing is that the vertical scrolling mode seems
>> to be hard to exit - sometimes you can get almost to the (horizontal)
>> middle of the touch pad and the scrolling is still active. I haven't
>> found any scrolling area width configuration knob though.
>> 
>> Anyway, feel free to add my
>> Tested-by: Michal Hocko <mhocko@suse.com>
>> 
>> Btw. I've noticed that none of the patches has your signed-off-by which
>> is required for any patch to be applied.
>
> Ben, Dmitry, has this fallen in between the cracks?
>
Indeed it sadly has. Sending a new version right now. Thanks for the
ping.

Cheers,

- Ben

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 454 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH 1/5] input/alps: Add touchstick support for SS5 hardware
@ 2016-10-03 12:16 Ben Gamari
  2016-10-04 18:47 ` Dmitry Torokhov
  0 siblings, 1 reply; 15+ messages in thread
From: Ben Gamari @ 2016-10-03 12:16 UTC (permalink / raw)
  To: Michal Hocko, linux-input, Hans de Goede, Allen Hung, Masaki Ota,
	Ben Morgan, Dmitry Torokhov, Jiri Kosina
  Cc: Ben Gamari

Add touchstick support for the so-called SS5 hardware, which uses a
variant of the SS4 protocol.

Reviewed-by: Pali Rohár <pali.rohar@gmail.com>
Tested-by: Michal Hocko <mhocko@suse.com>
Signed-off-by: Ben Gamari <ben@smart-cactus.org>
---
 drivers/input/mouse/alps.c | 64 ++++++++++++++++++++++++++++++++++++++--------
 drivers/input/mouse/alps.h |  2 ++
 2 files changed, 55 insertions(+), 11 deletions(-)

diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
index 936f07a..b8454af 100644
--- a/drivers/input/mouse/alps.c
+++ b/drivers/input/mouse/alps.c
@@ -1156,15 +1156,27 @@ static unsigned char alps_get_pkt_id_ss4_v2(unsigned char *byte)
 {
 	unsigned char pkt_id = SS4_PACKET_ID_IDLE;
 
-	if (byte[0] == 0x18 && byte[1] == 0x10 && byte[2] == 0x00 &&
-	    (byte[3] & 0x88) == 0x08 && byte[4] == 0x10 && byte[5] == 0x00) {
-		pkt_id = SS4_PACKET_ID_IDLE;
-	} else if (!(byte[3] & 0x10)) {
-		pkt_id = SS4_PACKET_ID_ONE;
-	} else if (!(byte[3] & 0x20)) {
+	switch (byte[3] & 0x30) {
+	case 0x00:
+		if (byte[0] == 0x18 && byte[1] == 0x10 && byte[2] == 0x00 &&
+				(byte[3] & 0x88) == 0x08 && byte[4] == 0x10 && byte[5] == 0x00) {
+			pkt_id = SS4_PACKET_ID_IDLE;
+		} else {
+			pkt_id = SS4_PACKET_ID_ONE;
+		}
+		break;
+	case 0x10:
+		/* two-finger finger positions */
 		pkt_id = SS4_PACKET_ID_TWO;
-	} else {
+		break;
+	case 0x20:
+		/* stick pointer */
+		pkt_id = SS4_PACKET_ID_STICK;
+		break;
+	case 0x30:
+		/* third and fourth finger positions */
 		pkt_id = SS4_PACKET_ID_MULTI;
+		break;
 	}
 
 	return pkt_id;
@@ -1246,16 +1258,38 @@ static int alps_decode_ss4_v2(struct alps_fields *f,
 		}
 		break;
 
+	case SS4_PACKET_ID_STICK:
+		if (!(priv->flags & ALPS_DUALPOINT)) {
+			psmouse_warn(psmouse,
+				     "Rejected trackstick packet from non DualPoint device");
+		} else {
+			int x = (s8)(((p[0] & 1) << 7) | (p[1] & 0x7f));
+			int y = (s8)(((p[3] & 1) << 7) | (p[2] & 0x7f));
+
+			input_report_rel(priv->dev2, REL_X, x);
+			input_report_rel(priv->dev2, REL_Y, -y);
+		}
+		break;
+
 	case SS4_PACKET_ID_IDLE:
 	default:
 		memset(f, 0, sizeof(struct alps_fields));
 		break;
 	}
 
-	f->left = !!(SS4_BTN_V2(p) & 0x01);
-	if (!(priv->flags & ALPS_BUTTONPAD)) {
-		f->right = !!(SS4_BTN_V2(p) & 0x02);
-		f->middle = !!(SS4_BTN_V2(p) & 0x04);
+	/* handle buttons */
+	if (pkt_id == SS4_PACKET_ID_STICK) {
+		f->ts_left = !!(SS4_BTN_V2(p) & 0x01);
+		if (!(priv->flags & ALPS_BUTTONPAD)) {
+			f->ts_right = !!(SS4_BTN_V2(p) & 0x02);
+			f->ts_middle = !!(SS4_BTN_V2(p) & 0x04);
+		}
+	} else {
+		f->left = !!(SS4_BTN_V2(p) & 0x01);
+		if (!(priv->flags & ALPS_BUTTONPAD)) {
+			f->right = !!(SS4_BTN_V2(p) & 0x02);
+			f->middle = !!(SS4_BTN_V2(p) & 0x04);
+		}
 	}
 
 	return 0;
@@ -1266,6 +1300,7 @@ static void alps_process_packet_ss4_v2(struct psmouse *psmouse)
 	struct alps_data *priv = psmouse->private;
 	unsigned char *packet = psmouse->packet;
 	struct input_dev *dev = psmouse->dev;
+	struct input_dev *dev2 = priv->dev2;
 	struct alps_fields *f = &priv->f;
 
 	memset(f, 0, sizeof(struct alps_fields));
@@ -1311,6 +1346,13 @@ static void alps_process_packet_ss4_v2(struct psmouse *psmouse)
 
 	input_report_abs(dev, ABS_PRESSURE, f->pressure);
 	input_sync(dev);
+
+	if (priv->flags & ALPS_DUALPOINT) {
+		input_report_key(dev2, BTN_LEFT, f->ts_left);
+		input_report_key(dev2, BTN_RIGHT, f->ts_right);
+		input_report_key(dev2, BTN_MIDDLE, f->ts_middle);
+		input_sync(dev2);
+	}
 }
 
 static bool alps_is_valid_package_ss4_v2(struct psmouse *psmouse)
diff --git a/drivers/input/mouse/alps.h b/drivers/input/mouse/alps.h
index d37f814..b9417e2 100644
--- a/drivers/input/mouse/alps.h
+++ b/drivers/input/mouse/alps.h
@@ -37,12 +37,14 @@
  *  or there's button activities.
  * SS4_PACKET_ID_TWO: There's two or more fingers on touchpad
  * SS4_PACKET_ID_MULTI: There's three or more fingers on touchpad
+ * SS4_PACKET_ID_STICK: A stick pointer packet
 */
 enum SS4_PACKET_ID {
 	SS4_PACKET_ID_IDLE = 0,
 	SS4_PACKET_ID_ONE,
 	SS4_PACKET_ID_TWO,
 	SS4_PACKET_ID_MULTI,
+	SS4_PACKET_ID_STICK,
 };
 
 #define SS4_COUNT_PER_ELECTRODE		256
-- 
2.9.3


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH 1/5] input/alps: Add touchstick support for SS5 hardware
  2016-10-03 12:16 [PATCH 1/5] input/alps: Add touchstick support for SS5 hardware Ben Gamari
@ 2016-10-04 18:47 ` Dmitry Torokhov
  2016-10-11 13:46   ` Jiri Kosina
  0 siblings, 1 reply; 15+ messages in thread
From: Dmitry Torokhov @ 2016-10-04 18:47 UTC (permalink / raw)
  To: Ben Gamari
  Cc: Michal Hocko, linux-input, Hans de Goede, Allen Hung, Masaki Ota,
	Ben Morgan, Jiri Kosina

On Mon, Oct 03, 2016 at 08:16:26AM -0400, Ben Gamari wrote:
> Add touchstick support for the so-called SS5 hardware, which uses a
> variant of the SS4 protocol.
> 
> Reviewed-by: Pali Rohár <pali.rohar@gmail.com>
> Tested-by: Michal Hocko <mhocko@suse.com>
> Signed-off-by: Ben Gamari <ben@smart-cactus.org>
> ---

Applied the lot, thanks.

>  drivers/input/mouse/alps.c | 64 ++++++++++++++++++++++++++++++++++++++--------
>  drivers/input/mouse/alps.h |  2 ++
>  2 files changed, 55 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
> index 936f07a..b8454af 100644
> --- a/drivers/input/mouse/alps.c
> +++ b/drivers/input/mouse/alps.c
> @@ -1156,15 +1156,27 @@ static unsigned char alps_get_pkt_id_ss4_v2(unsigned char *byte)
>  {
>  	unsigned char pkt_id = SS4_PACKET_ID_IDLE;
>  
> -	if (byte[0] == 0x18 && byte[1] == 0x10 && byte[2] == 0x00 &&
> -	    (byte[3] & 0x88) == 0x08 && byte[4] == 0x10 && byte[5] == 0x00) {
> -		pkt_id = SS4_PACKET_ID_IDLE;
> -	} else if (!(byte[3] & 0x10)) {
> -		pkt_id = SS4_PACKET_ID_ONE;
> -	} else if (!(byte[3] & 0x20)) {
> +	switch (byte[3] & 0x30) {
> +	case 0x00:
> +		if (byte[0] == 0x18 && byte[1] == 0x10 && byte[2] == 0x00 &&
> +				(byte[3] & 0x88) == 0x08 && byte[4] == 0x10 && byte[5] == 0x00) {
> +			pkt_id = SS4_PACKET_ID_IDLE;
> +		} else {
> +			pkt_id = SS4_PACKET_ID_ONE;
> +		}
> +		break;
> +	case 0x10:
> +		/* two-finger finger positions */
>  		pkt_id = SS4_PACKET_ID_TWO;
> -	} else {
> +		break;
> +	case 0x20:
> +		/* stick pointer */
> +		pkt_id = SS4_PACKET_ID_STICK;
> +		break;
> +	case 0x30:
> +		/* third and fourth finger positions */
>  		pkt_id = SS4_PACKET_ID_MULTI;
> +		break;
>  	}
>  
>  	return pkt_id;
> @@ -1246,16 +1258,38 @@ static int alps_decode_ss4_v2(struct alps_fields *f,
>  		}
>  		break;
>  
> +	case SS4_PACKET_ID_STICK:
> +		if (!(priv->flags & ALPS_DUALPOINT)) {
> +			psmouse_warn(psmouse,
> +				     "Rejected trackstick packet from non DualPoint device");
> +		} else {
> +			int x = (s8)(((p[0] & 1) << 7) | (p[1] & 0x7f));
> +			int y = (s8)(((p[3] & 1) << 7) | (p[2] & 0x7f));
> +
> +			input_report_rel(priv->dev2, REL_X, x);
> +			input_report_rel(priv->dev2, REL_Y, -y);
> +		}
> +		break;
> +
>  	case SS4_PACKET_ID_IDLE:
>  	default:
>  		memset(f, 0, sizeof(struct alps_fields));
>  		break;
>  	}
>  
> -	f->left = !!(SS4_BTN_V2(p) & 0x01);
> -	if (!(priv->flags & ALPS_BUTTONPAD)) {
> -		f->right = !!(SS4_BTN_V2(p) & 0x02);
> -		f->middle = !!(SS4_BTN_V2(p) & 0x04);
> +	/* handle buttons */
> +	if (pkt_id == SS4_PACKET_ID_STICK) {
> +		f->ts_left = !!(SS4_BTN_V2(p) & 0x01);
> +		if (!(priv->flags & ALPS_BUTTONPAD)) {
> +			f->ts_right = !!(SS4_BTN_V2(p) & 0x02);
> +			f->ts_middle = !!(SS4_BTN_V2(p) & 0x04);
> +		}
> +	} else {
> +		f->left = !!(SS4_BTN_V2(p) & 0x01);
> +		if (!(priv->flags & ALPS_BUTTONPAD)) {
> +			f->right = !!(SS4_BTN_V2(p) & 0x02);
> +			f->middle = !!(SS4_BTN_V2(p) & 0x04);
> +		}
>  	}
>  
>  	return 0;
> @@ -1266,6 +1300,7 @@ static void alps_process_packet_ss4_v2(struct psmouse *psmouse)
>  	struct alps_data *priv = psmouse->private;
>  	unsigned char *packet = psmouse->packet;
>  	struct input_dev *dev = psmouse->dev;
> +	struct input_dev *dev2 = priv->dev2;
>  	struct alps_fields *f = &priv->f;
>  
>  	memset(f, 0, sizeof(struct alps_fields));
> @@ -1311,6 +1346,13 @@ static void alps_process_packet_ss4_v2(struct psmouse *psmouse)
>  
>  	input_report_abs(dev, ABS_PRESSURE, f->pressure);
>  	input_sync(dev);
> +
> +	if (priv->flags & ALPS_DUALPOINT) {
> +		input_report_key(dev2, BTN_LEFT, f->ts_left);
> +		input_report_key(dev2, BTN_RIGHT, f->ts_right);
> +		input_report_key(dev2, BTN_MIDDLE, f->ts_middle);
> +		input_sync(dev2);
> +	}
>  }
>  
>  static bool alps_is_valid_package_ss4_v2(struct psmouse *psmouse)
> diff --git a/drivers/input/mouse/alps.h b/drivers/input/mouse/alps.h
> index d37f814..b9417e2 100644
> --- a/drivers/input/mouse/alps.h
> +++ b/drivers/input/mouse/alps.h
> @@ -37,12 +37,14 @@
>   *  or there's button activities.
>   * SS4_PACKET_ID_TWO: There's two or more fingers on touchpad
>   * SS4_PACKET_ID_MULTI: There's three or more fingers on touchpad
> + * SS4_PACKET_ID_STICK: A stick pointer packet
>  */
>  enum SS4_PACKET_ID {
>  	SS4_PACKET_ID_IDLE = 0,
>  	SS4_PACKET_ID_ONE,
>  	SS4_PACKET_ID_TWO,
>  	SS4_PACKET_ID_MULTI,
> +	SS4_PACKET_ID_STICK,
>  };
>  
>  #define SS4_COUNT_PER_ELECTRODE		256
> -- 
> 2.9.3
> 

-- 
Dmitry

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 1/5] input/alps: Add touchstick support for SS5 hardware
  2016-10-04 18:47 ` Dmitry Torokhov
@ 2016-10-11 13:46   ` Jiri Kosina
  2016-10-11 17:20     ` Dmitry Torokhov
  0 siblings, 1 reply; 15+ messages in thread
From: Jiri Kosina @ 2016-10-11 13:46 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: Ben Gamari, Michal Hocko, linux-input, Hans de Goede, Allen Hung,
	Masaki Ota, Ben Morgan

On Tue, 4 Oct 2016, Dmitry Torokhov wrote:

> > Add touchstick support for the so-called SS5 hardware, which uses a
> > variant of the SS4 protocol.
> > 
> > Reviewed-by: Pali Rohár <pali.rohar@gmail.com>
> > Tested-by: Michal Hocko <mhocko@suse.com>
> > Signed-off-by: Ben Gamari <ben@smart-cactus.org>
> > ---
> 
> Applied the lot, thanks.

Thanks. I see this wasn't in the d4e65476b merge; what are your plans with 
this, please? Still for this merge window?

Thanks,

-- 
Jiri Kosina
SUSE Labs


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 1/5] input/alps: Add touchstick support for SS5 hardware
  2016-10-11 13:46   ` Jiri Kosina
@ 2016-10-11 17:20     ` Dmitry Torokhov
  0 siblings, 0 replies; 15+ messages in thread
From: Dmitry Torokhov @ 2016-10-11 17:20 UTC (permalink / raw)
  To: Jiri Kosina
  Cc: Ben Gamari, Michal Hocko, linux-input, Hans de Goede, Allen Hung,
	Masaki Ota, Ben Morgan

On Tue, Oct 11, 2016 at 03:46:42PM +0200, Jiri Kosina wrote:
> On Tue, 4 Oct 2016, Dmitry Torokhov wrote:
> 
> > > Add touchstick support for the so-called SS5 hardware, which uses a
> > > variant of the SS4 protocol.
> > > 
> > > Reviewed-by: Pali Rohár <pali.rohar@gmail.com>
> > > Tested-by: Michal Hocko <mhocko@suse.com>
> > > Signed-off-by: Ben Gamari <ben@smart-cactus.org>
> > > ---
> > 
> > Applied the lot, thanks.
> 
> Thanks. I see this wasn't in the d4e65476b merge; what are your plans with 
> this, please? Still for this merge window?

Yeah, I'll include in my 2nd pull later this week.

Thanks.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2016-10-11 17:20 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-06-21  9:19 [PATCH v3] Support for Alps SS5 touchpad Ben Gamari
2016-06-21  9:19 ` [PATCH 1/5] input/alps: Add touchstick support for SS5 hardware Ben Gamari
2016-06-21  9:19 ` [PATCH 2/5] input/alps: Handle 0-pressure 1F events Ben Gamari
2016-06-21  9:19 ` [PATCH 3/5] input/alps: Allow touchsticks to report pressure Ben Gamari
2016-06-21  9:19 ` [PATCH 4/5] input/alps: Set DualPoint flag for 74 03 28 devices Ben Gamari
2016-06-21  9:19 ` [PATCH 5/5] Documentation/alps: Add V8 protocol documentation Ben Gamari
2016-07-29  8:46 ` [PATCH v3] Support for Alps SS5 touchpad Jiri Kosina
2016-08-29  7:14   ` Michal Hocko
2016-10-03  7:23     ` Jiri Kosina
2016-10-03 12:15       ` Ben Gamari
2016-10-03 12:14     ` Ben Gamari
  -- strict thread matches above, loose matches on Subject: below --
2016-10-03 12:16 [PATCH 1/5] input/alps: Add touchstick support for SS5 hardware Ben Gamari
2016-10-04 18:47 ` Dmitry Torokhov
2016-10-11 13:46   ` Jiri Kosina
2016-10-11 17:20     ` Dmitry Torokhov

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).