[PATCH 1/2] touchpad: Add code to get the touchpad model / manufacturer

Hans de Goede hdegoede at redhat.com
Fri Nov 7 05:25:05 PST 2014


This is useful to know in some cases, it is e.g. necessary to figure out
which percentage of a touchpads range to use as edge for edge-scrolling.

Note this is a slightly cleaned up copy of the same code in
xf86-input-synaptics.

Signed-off-by: Hans de Goede <hdegoede at redhat.com>
---
 src/evdev-mt-touchpad.c | 36 ++++++++++++++++++++++++++++++++++++
 src/evdev-mt-touchpad.h | 10 ++++++++++
 2 files changed, 46 insertions(+)

diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index 5835c08..d2ee6ea 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -1194,6 +1194,40 @@ tp_change_to_left_handed(struct evdev_device *device)
 	device->buttons.left_handed = device->buttons.want_left_handed;
 }
 
+struct model_lookup_t {
+	uint16_t vendor;
+	uint16_t product_start;
+	uint16_t product_end;
+	enum touchpad_model model;
+};
+
+static struct model_lookup_t model_lookup_table[] = {
+	{ 0x0002, 0x0007, 0x0007, MODEL_SYNAPTICS },
+	{ 0x0002, 0x0008, 0x0008, MODEL_ALPS },
+	{ 0x0002, 0x000e, 0x000e, MODEL_ELANTECH },
+	{ 0x05ac,      0, 0x0222, MODEL_APPLETOUCH },
+	{ 0x05ac, 0x0223, 0x0228, MODEL_UNIBODY_MACBOOK },
+	{ 0x05ac, 0x0229, 0x022b, MODEL_APPLETOUCH },
+	{ 0x05ac, 0x022c, 0xffff, MODEL_UNIBODY_MACBOOK },
+	{ 0, 0, 0, 0 }
+};
+
+static enum touchpad_model
+tp_get_model(struct evdev_device *device)
+{
+	struct model_lookup_t *lookup;
+	uint16_t vendor  = libevdev_get_id_vendor(device->evdev);
+	uint16_t product = libevdev_get_id_product(device->evdev);
+
+	for (lookup = model_lookup_table; lookup->vendor; lookup++) {
+		if (lookup->vendor == vendor &&
+		    lookup->product_start <= product &&
+		    product <= lookup->product_end)
+			return lookup->model;
+	}
+	return MODEL_UNKNOWN;
+}
+
 struct evdev_dispatch *
 evdev_mt_touchpad_create(struct evdev_device *device)
 {
@@ -1203,6 +1237,8 @@ evdev_mt_touchpad_create(struct evdev_device *device)
 	if (!tp)
 		return NULL;
 
+	tp->model = tp_get_model(device);
+
 	if (tp_init(tp, device) != 0) {
 		tp_destroy(&tp->base);
 		return NULL;
diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h
index 4d7b8a9..d012458 100644
--- a/src/evdev-mt-touchpad.h
+++ b/src/evdev-mt-touchpad.h
@@ -42,6 +42,15 @@ enum touchpad_event {
 	TOUCHPAD_EVENT_BUTTON_RELEASE	= (1 << 2),
 };
 
+enum touchpad_model {
+	MODEL_UNKNOWN = 0,
+	MODEL_SYNAPTICS,
+	MODEL_ALPS,
+	MODEL_APPLETOUCH,
+	MODEL_ELANTECH,
+	MODEL_UNIBODY_MACBOOK
+};
+
 enum touch_state {
 	TOUCH_NONE = 0,
 	TOUCH_BEGIN,
@@ -156,6 +165,7 @@ struct tp_dispatch {
 	unsigned int slot;			/* current slot */
 	bool has_mt;
 	bool semi_mt;
+	enum touchpad_model model;
 
 	unsigned int real_touches;		/* number of slots */
 	unsigned int ntouches;			/* no slots inc. fakes */
-- 
2.1.0



More information about the wayland-devel mailing list