Thread (17 messages) 17 messages, 4 authors, 2012-12-05

RE: [PATCH v3 4/4] input: Cypress PS/2 Trackpad simulated multitouch

flat view

From: Dudley Du <hidden>
Date: 2012-12-03 02:03:31
Also in: lkml

quoted hunk ↗ jump to hunk
Instead of SEMI_MT, present a full mt interface with simulated contact positions for >=3 fingers.  Enables e.g. multi-finger tap and drag.

Signed-off-by: Kamal Mostafa <redacted>
---
 drivers/input/mouse/cypress_ps2.c |   16 ++++++++++++++++
 drivers/input/mouse/cypress_ps2.h |   14 +++++++++++++-
 2 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/drivers/input/mouse/cypress_ps2.c b/drivers/input/mouse/cypress_ps2.c
index 472342a..bbaa9b9 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,
                      return ret;
              }

+#if ( CYPRESS_SIMULATED_MT != 1 )
              __set_bit(INPUT_PROP_SEMI_MT, input->propbit);
+#endif

              if (cytp->tp_res_x && cytp->tp_res_x) {

Here, should be "if (cytp->tp_res_x && cytp->tp_res_y) {".
And since cytp->tp_max_abs_y read from trackpad maybe zero, so we should better double check here.

quoted hunk ↗ jump to hunk
                      input_abs_set_res(input, ABS_X, cytp->tp_res_x); @@ -531,6 +533,20 @@ 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 )
+                             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 ce70462..4b903a9 100644
--- a/drivers/input/mouse/cypress_ps2.h
+++ b/drivers/input/mouse/cypress_ps2.h
@@ -134,7 +134,19 @@
 #define RESP_SMBUS_BIT      0x80

 #define CYTP_MAX_CONTACTS 5
-#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 1
+
+#if ( CYPRESS_SIMULATED_MT == 1 )
+# define CYTP_MAX_MT_SLOTS 16
+#else
+# define CYTP_MAX_MT_SLOTS 2
+#endif

 enum cytp_type {
      CYTP_STG,
--
1.7.10.4

This message and any attachments may contain Cypress (or its subsidiaries) confidential information. If it has been received in error, please advise the sender and immediately delete this message.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help