diff mbox

[v4,4/4] input: Cypress PS/2 Trackpad simulated multitouch (disabled)

Message ID 1354674245-25768-5-git-send-email-kamal@canonical.com (mailing list archive)
State New, archived
Headers show

Commit Message

Kamal Mostafa Dec. 5, 2012, 2:24 a.m. UTC
This feature is disabled by default; enable with CYPRESS_SIMULATED_MT.

Instead of SEMI_MT, present a full mt interface with simulated contact
positions for >=3 fingers.  Enables e.g. multi-finger tap and drag for
old userspace applications which only count the contact positions.

Signed-off-by: Kamal Mostafa <kamal@canonical.com>
---
 drivers/input/mouse/cypress_ps2.c |   18 ++++++++++++++++++
 drivers/input/mouse/cypress_ps2.h |   16 ++++++++++++++--
 2 files changed, 32 insertions(+), 2 deletions(-)

Comments

Henrik Rydberg Dec. 5, 2012, 8:13 p.m. UTC | #1
Hi Kamal,

> This feature is disabled by default; enable with CYPRESS_SIMULATED_MT.
> 
> Instead of SEMI_MT, present a full mt interface with simulated contact
> positions for >=3 fingers.  Enables e.g. multi-finger tap and drag for
> old userspace applications which only count the contact positions.
> 
> Signed-off-by: Kamal Mostafa <kamal@canonical.com>
> ---
>  drivers/input/mouse/cypress_ps2.c |   18 ++++++++++++++++++
>  drivers/input/mouse/cypress_ps2.h |   16 ++++++++++++++--
>  2 files changed, 32 insertions(+), 2 deletions(-)

No thanks. Millions of devices are supported via semi-mt, there is no
reason why this one should be different. If there are userland issues,
something broke recently. You may want to check with Chase, for
instance, for the full history of commodity trackpad MT support.

Thanks.
Henrik
--
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
diff mbox

Patch

diff --git a/drivers/input/mouse/cypress_ps2.c b/drivers/input/mouse/cypress_ps2.c
index fab4d18..088cdb8 100644
--- a/drivers/input/mouse/cypress_ps2.c
+++ b/drivers/input/mouse/cypress_ps2.c
@@ -408,7 +408,9 @@  static int cypress_set_input_params(struct input_dev *input,
 		if (ret < 0)
 			return ret;
 
+#if ( CYPRESS_SIMULATED_MT != 1 )
 		__set_bit(INPUT_PROP_SEMI_MT, input->propbit);
+#endif
 
 		if (cytp->tp_res_x && cytp->tp_res_y) {
 			input_abs_set_res(input, ABS_X, cytp->tp_res_x);
@@ -531,6 +533,22 @@  static int cypress_parse_packet(struct psmouse *psmouse,
 				((packet[5] & 0x0f) << 8) | packet[7];
 			if (cytp->mode & CYTP_BIT_ABS_PRESSURE)
 				report_data->contacts[1].z = report_data->contacts[0].z;
+#if ( CYPRESS_SIMULATED_MT == 1 )
+			/* simulate contact positions for >2 fingers */
+			if ( report_data->contact_cnt >= 3 ) {
+				int i;
+				for ( i=1; i<report_data->contact_cnt; i++ ) {
+				    report_data->contacts[i].x =
+						    report_data->contacts[0].x
+						    + 100*(i)*((i%2)?-1:1);
+				    report_data->contacts[i].y =
+						    report_data->contacts[0].y;
+				    if (cytp->mode & CYTP_BIT_ABS_PRESSURE)
+					    report_data->contacts[i].z =
+						    report_data->contacts[0].z;
+				}
+			}
+#endif
 		}
 
 		report_data->left = (header_byte & BTN_LEFT_BIT) ? 1 : 0;
diff --git a/drivers/input/mouse/cypress_ps2.h b/drivers/input/mouse/cypress_ps2.h
index a74f985..c38cb6f 100644
--- a/drivers/input/mouse/cypress_ps2.h
+++ b/drivers/input/mouse/cypress_ps2.h
@@ -133,8 +133,20 @@ 
 #define RESP_REMOTE_BIT     0x40
 #define RESP_SMBUS_BIT      0x80
 
-#define CYTP_MAX_CONTACTS 2
-#define CYTP_MAX_MT_SLOTS 2
+/*
+ * CYPRESS_SIMULATED_MT
+ *   set to 1 for simulated multitouch (up to CTYP_MAX_CONTACTS fingers)
+ *   set to 0 for SEMI_MT (2 fingers only)
+ */
+#define CYPRESS_SIMULATED_MT 0
+
+#if ( CYPRESS_SIMULATED_MT == 1 )
+# define CYTP_MAX_CONTACTS 5
+# define CYTP_MAX_MT_SLOTS 16
+#else
+# define CYTP_MAX_CONTACTS 2
+# define CYTP_MAX_MT_SLOTS 2
+#endif
 
 enum cytp_type {
 	CYTP_STG,