hid-multitouch.c revision c50bb1a4005630f47b5da26336f74a485033a515
15519cab477b61326963c8d523520db0342862b63Benjamin Tissoires/* 25519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * HID driver for multitouch panels 35519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * 45519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * Copyright (c) 2010-2011 Stephane Chatty <chatty@enac.fr> 55519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * Copyright (c) 2010-2011 Benjamin Tissoires <benjamin.tissoires@gmail.com> 65519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * Copyright (c) 2010-2011 Ecole Nationale de l'Aviation Civile, France 75519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * 84875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber * This code is partly based on hid-egalax.c: 94875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber * 104875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber * Copyright (c) 2010 Stephane Chatty <chatty@enac.fr> 114875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber * Copyright (c) 2010 Henrik Rydberg <rydberg@euromail.se> 124875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber * Copyright (c) 2010 Canonical, Ltd. 134875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber * 14f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires * This code is partly based on hid-3m-pct.c: 15f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires * 16f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires * Copyright (c) 2009-2010 Stephane Chatty <chatty@enac.fr> 17f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires * Copyright (c) 2010 Henrik Rydberg <rydberg@euromail.se> 18f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires * Copyright (c) 2010 Canonical, Ltd. 19f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires * 205519cab477b61326963c8d523520db0342862b63Benjamin Tissoires */ 215519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 225519cab477b61326963c8d523520db0342862b63Benjamin Tissoires/* 235519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * This program is free software; you can redistribute it and/or modify it 245519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * under the terms of the GNU General Public License as published by the Free 255519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * Software Foundation; either version 2 of the License, or (at your option) 265519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * any later version. 275519cab477b61326963c8d523520db0342862b63Benjamin Tissoires */ 285519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 295519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#include <linux/device.h> 305519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#include <linux/hid.h> 315519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#include <linux/module.h> 325519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#include <linux/slab.h> 335519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#include <linux/usb.h> 345519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#include <linux/input/mt.h> 355519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#include "usbhid/usbhid.h" 365519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 375519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 385519cab477b61326963c8d523520db0342862b63Benjamin TissoiresMODULE_AUTHOR("Stephane Chatty <chatty@enac.fr>"); 39ef2fafb3e233ca9cb390fc3c1461b7f3859998fcBenjamin TissoiresMODULE_AUTHOR("Benjamin Tissoires <benjamin.tissoires@gmail.com>"); 405519cab477b61326963c8d523520db0342862b63Benjamin TissoiresMODULE_DESCRIPTION("HID multitouch panels"); 415519cab477b61326963c8d523520db0342862b63Benjamin TissoiresMODULE_LICENSE("GPL"); 425519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 435519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#include "hid-ids.h" 445519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 455519cab477b61326963c8d523520db0342862b63Benjamin Tissoires/* quirks to control the device */ 465519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#define MT_QUIRK_NOT_SEEN_MEANS_UP (1 << 0) 475519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#define MT_QUIRK_SLOT_IS_CONTACTID (1 << 1) 482d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires#define MT_QUIRK_CYPRESS (1 << 2) 495572da08a784621f2ab4fdc8dc65471261871795Benjamin Tissoires#define MT_QUIRK_SLOT_IS_CONTACTNUMBER (1 << 3) 502d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires#define MT_QUIRK_VALID_IS_INRANGE (1 << 4) 512d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires#define MT_QUIRK_VALID_IS_CONFIDENCE (1 << 5) 524875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber#define MT_QUIRK_EGALAX_XYZ_FIXUP (1 << 6) 534a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires#define MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE (1 << 7) 545519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 555519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstruct mt_slot { 565519cab477b61326963c8d523520db0342862b63Benjamin Tissoires __s32 x, y, p, w, h; 575519cab477b61326963c8d523520db0342862b63Benjamin Tissoires __s32 contactid; /* the device ContactID assigned to this slot */ 585519cab477b61326963c8d523520db0342862b63Benjamin Tissoires bool touch_state; /* is the touch valid? */ 595519cab477b61326963c8d523520db0342862b63Benjamin Tissoires bool seen_in_this_frame;/* has this slot been updated */ 605519cab477b61326963c8d523520db0342862b63Benjamin Tissoires}; 615519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 625519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstruct mt_device { 635519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct mt_slot curdata; /* placeholder of incoming data */ 645519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct mt_class *mtclass; /* our mt device class */ 655519cab477b61326963c8d523520db0342862b63Benjamin Tissoires unsigned last_field_index; /* last field index of the report */ 665519cab477b61326963c8d523520db0342862b63Benjamin Tissoires unsigned last_slot_field; /* the last field of a slot */ 67b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires int last_mt_collection; /* last known mt-related collection */ 685519cab477b61326963c8d523520db0342862b63Benjamin Tissoires __s8 inputmode; /* InputMode HID feature, -1 if non-existent */ 695519cab477b61326963c8d523520db0342862b63Benjamin Tissoires __u8 num_received; /* how many contacts we received */ 705519cab477b61326963c8d523520db0342862b63Benjamin Tissoires __u8 num_expected; /* expected last contact index */ 719498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires __u8 maxcontacts; 725519cab477b61326963c8d523520db0342862b63Benjamin Tissoires bool curvalid; /* is the current contact valid? */ 739498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires struct mt_slot *slots; 745519cab477b61326963c8d523520db0342862b63Benjamin Tissoires}; 755519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 765519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstruct mt_class { 772d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires __s32 name; /* MT_CLS */ 785519cab477b61326963c8d523520db0342862b63Benjamin Tissoires __s32 quirks; 795519cab477b61326963c8d523520db0342862b63Benjamin Tissoires __s32 sn_move; /* Signal/noise ratio for move events */ 80f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires __s32 sn_width; /* Signal/noise ratio for width events */ 81f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires __s32 sn_height; /* Signal/noise ratio for height events */ 825519cab477b61326963c8d523520db0342862b63Benjamin Tissoires __s32 sn_pressure; /* Signal/noise ratio for pressure events */ 835519cab477b61326963c8d523520db0342862b63Benjamin Tissoires __u8 maxcontacts; 845519cab477b61326963c8d523520db0342862b63Benjamin Tissoires}; 855519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 865519cab477b61326963c8d523520db0342862b63Benjamin Tissoires/* classes of device behavior */ 8722408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires#define MT_CLS_DEFAULT 0x0001 8822408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires 8922408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires#define MT_CLS_CONFIDENCE 0x0002 9022408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires#define MT_CLS_CONFIDENCE_MINUS_ONE 0x0003 9122408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires#define MT_CLS_DUAL_INRANGE_CONTACTID 0x0004 9222408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires#define MT_CLS_DUAL_INRANGE_CONTACTNUMBER 0x0005 9322408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires#define MT_CLS_DUAL_NSMU_CONTACTID 0x0006 9422408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires 9522408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires/* vendor specific classes */ 9622408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires#define MT_CLS_3M 0x0101 9722408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires#define MT_CLS_CYPRESS 0x0102 9822408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires#define MT_CLS_EGALAX 0x0103 995519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 1009498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires#define MT_DEFAULT_MAXCONTACT 10 1019498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires 1025519cab477b61326963c8d523520db0342862b63Benjamin Tissoires/* 1035519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * these device-dependent functions determine what slot corresponds 1045519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * to a valid contact that was just read. 1055519cab477b61326963c8d523520db0342862b63Benjamin Tissoires */ 1065519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 107a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoiresstatic int cypress_compute_slot(struct mt_device *td) 108a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires{ 109a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires if (td->curdata.contactid != 0 || td->num_received == 0) 110a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires return td->curdata.contactid; 111a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires else 112a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires return -1; 113a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires} 114a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires 1155519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic int find_slot_from_contactid(struct mt_device *td) 1165519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 1175519cab477b61326963c8d523520db0342862b63Benjamin Tissoires int i; 1189498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires for (i = 0; i < td->maxcontacts; ++i) { 1195519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if (td->slots[i].contactid == td->curdata.contactid && 1205519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->slots[i].touch_state) 1215519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return i; 1225519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 1239498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires for (i = 0; i < td->maxcontacts; ++i) { 1245519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if (!td->slots[i].seen_in_this_frame && 1255519cab477b61326963c8d523520db0342862b63Benjamin Tissoires !td->slots[i].touch_state) 1265519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return i; 1275519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 1285519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* should not occurs. If this happens that means 1295519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * that the device sent more touches that it says 1305519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * in the report descriptor. It is ignored then. */ 1312d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires return -1; 1325519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 1335519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 1345519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstruct mt_class mt_classes[] = { 1352d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires { .name = MT_CLS_DEFAULT, 1369498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires .quirks = MT_QUIRK_NOT_SEEN_MEANS_UP }, 13722408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires { .name = MT_CLS_CONFIDENCE, 13822408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires .quirks = MT_QUIRK_VALID_IS_CONFIDENCE }, 13922408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires { .name = MT_CLS_CONFIDENCE_MINUS_ONE, 14022408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires .quirks = MT_QUIRK_VALID_IS_CONFIDENCE | 14122408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE }, 1421e9cf35b995610e7ba2934d3dc92e3a03fa361a1Benjamin Tissoires { .name = MT_CLS_DUAL_INRANGE_CONTACTID, 1432d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires .quirks = MT_QUIRK_VALID_IS_INRANGE | 1442d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires MT_QUIRK_SLOT_IS_CONTACTID, 1452d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires .maxcontacts = 2 }, 1461e9cf35b995610e7ba2934d3dc92e3a03fa361a1Benjamin Tissoires { .name = MT_CLS_DUAL_INRANGE_CONTACTNUMBER, 1472d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires .quirks = MT_QUIRK_VALID_IS_INRANGE | 1482d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires MT_QUIRK_SLOT_IS_CONTACTNUMBER, 1492d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires .maxcontacts = 2 }, 15022408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires { .name = MT_CLS_DUAL_NSMU_CONTACTID, 15122408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires .quirks = MT_QUIRK_NOT_SEEN_MEANS_UP | 15222408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires MT_QUIRK_SLOT_IS_CONTACTID, 15322408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires .maxcontacts = 2 }, 15422408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires 15522408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires /* 15622408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires * vendor specific classes 15722408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires */ 15822408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires { .name = MT_CLS_3M, 15922408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires .quirks = MT_QUIRK_VALID_IS_CONFIDENCE | 16022408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires MT_QUIRK_SLOT_IS_CONTACTID, 16122408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires .sn_move = 2048, 16222408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires .sn_width = 128, 16322408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires .sn_height = 128 }, 1642d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires { .name = MT_CLS_CYPRESS, 1652d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires .quirks = MT_QUIRK_NOT_SEEN_MEANS_UP | 1662d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires MT_QUIRK_CYPRESS, 1672d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires .maxcontacts = 10 }, 1684875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber { .name = MT_CLS_EGALAX, 1694875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber .quirks = MT_QUIRK_SLOT_IS_CONTACTID | 1704875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber MT_QUIRK_VALID_IS_INRANGE | 1714875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber MT_QUIRK_EGALAX_XYZ_FIXUP, 1724875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber .maxcontacts = 2, 1734875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber .sn_move = 4096, 1744875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber .sn_pressure = 32, 1754875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber }, 176043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires 1772d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires { } 1785519cab477b61326963c8d523520db0342862b63Benjamin Tissoires}; 1795519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 180f635bd11c8d332d917fb9a4cad3071b2357d5b2aHenrik Rydbergstatic void mt_feature_mapping(struct hid_device *hdev, 1815519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct hid_field *field, struct hid_usage *usage) 1825519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 1839498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires struct mt_device *td = hid_get_drvdata(hdev); 1849498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires 1859498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires switch (usage->hid) { 1869498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires case HID_DG_INPUTMODE: 1875519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->inputmode = field->report->id; 1889498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires break; 1899498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires case HID_DG_CONTACTMAX: 1909498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires td->maxcontacts = field->value[0]; 1919498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires if (td->mtclass->maxcontacts) 1929498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires /* check if the maxcontacts is given by the class */ 1939498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires td->maxcontacts = td->mtclass->maxcontacts; 1949498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires 1959498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires break; 1965519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 1975519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 1985519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 1995519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic void set_abs(struct input_dev *input, unsigned int code, 2005519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct hid_field *field, int snratio) 2015519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 2025519cab477b61326963c8d523520db0342862b63Benjamin Tissoires int fmin = field->logical_minimum; 2035519cab477b61326963c8d523520db0342862b63Benjamin Tissoires int fmax = field->logical_maximum; 2045519cab477b61326963c8d523520db0342862b63Benjamin Tissoires int fuzz = snratio ? (fmax - fmin) / snratio : 0; 2055519cab477b61326963c8d523520db0342862b63Benjamin Tissoires input_set_abs_params(input, code, fmin, fmax, fuzz, 0); 2065519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 2075519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 2085519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi, 2095519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct hid_field *field, struct hid_usage *usage, 2105519cab477b61326963c8d523520db0342862b63Benjamin Tissoires unsigned long **bit, int *max) 2115519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 2125519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct mt_device *td = hid_get_drvdata(hdev); 2135519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct mt_class *cls = td->mtclass; 2144875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber __s32 quirks = cls->quirks; 2154875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber 216658d4aed59b36f877edc668cc27b188a33e643e5Jeff Brown /* Only map fields from TouchScreen or TouchPad collections. 217658d4aed59b36f877edc668cc27b188a33e643e5Jeff Brown * We need to ignore fields that belong to other collections 218658d4aed59b36f877edc668cc27b188a33e643e5Jeff Brown * such as Mouse that might have the same GenericDesktop usages. */ 219658d4aed59b36f877edc668cc27b188a33e643e5Jeff Brown if (field->application == HID_DG_TOUCHSCREEN) 220658d4aed59b36f877edc668cc27b188a33e643e5Jeff Brown set_bit(INPUT_PROP_DIRECT, hi->input->propbit); 221658d4aed59b36f877edc668cc27b188a33e643e5Jeff Brown else if (field->application == HID_DG_TOUCHPAD) 222658d4aed59b36f877edc668cc27b188a33e643e5Jeff Brown set_bit(INPUT_PROP_POINTER, hi->input->propbit); 223658d4aed59b36f877edc668cc27b188a33e643e5Jeff Brown else 224658d4aed59b36f877edc668cc27b188a33e643e5Jeff Brown return 0; 225658d4aed59b36f877edc668cc27b188a33e643e5Jeff Brown 2265519cab477b61326963c8d523520db0342862b63Benjamin Tissoires switch (usage->hid & HID_USAGE_PAGE) { 2275519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 2285519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_UP_GENDESK: 2295519cab477b61326963c8d523520db0342862b63Benjamin Tissoires switch (usage->hid) { 2305519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_GD_X: 2314875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber if (quirks & MT_QUIRK_EGALAX_XYZ_FIXUP) 2324875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber field->logical_maximum = 32760; 2335519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid_map_usage(hi, usage, bit, max, 2345519cab477b61326963c8d523520db0342862b63Benjamin Tissoires EV_ABS, ABS_MT_POSITION_X); 2355519cab477b61326963c8d523520db0342862b63Benjamin Tissoires set_abs(hi->input, ABS_MT_POSITION_X, field, 2365519cab477b61326963c8d523520db0342862b63Benjamin Tissoires cls->sn_move); 2375519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* touchscreen emulation */ 2385519cab477b61326963c8d523520db0342862b63Benjamin Tissoires set_abs(hi->input, ABS_X, field, cls->sn_move); 239b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires if (td->last_mt_collection == usage->collection_index) { 240b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires td->last_slot_field = usage->hid; 241b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires td->last_field_index = field->index; 242b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires } 2435519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 2445519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_GD_Y: 2454875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber if (quirks & MT_QUIRK_EGALAX_XYZ_FIXUP) 2464875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber field->logical_maximum = 32760; 2475519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid_map_usage(hi, usage, bit, max, 2485519cab477b61326963c8d523520db0342862b63Benjamin Tissoires EV_ABS, ABS_MT_POSITION_Y); 2495519cab477b61326963c8d523520db0342862b63Benjamin Tissoires set_abs(hi->input, ABS_MT_POSITION_Y, field, 2505519cab477b61326963c8d523520db0342862b63Benjamin Tissoires cls->sn_move); 2515519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* touchscreen emulation */ 2525519cab477b61326963c8d523520db0342862b63Benjamin Tissoires set_abs(hi->input, ABS_Y, field, cls->sn_move); 253b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires if (td->last_mt_collection == usage->collection_index) { 254b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires td->last_slot_field = usage->hid; 255b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires td->last_field_index = field->index; 256b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires } 2575519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 2585519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 2595519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 0; 2605519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 2615519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_UP_DIGITIZER: 2625519cab477b61326963c8d523520db0342862b63Benjamin Tissoires switch (usage->hid) { 2635519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_INRANGE: 264b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires if (td->last_mt_collection == usage->collection_index) { 265b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires td->last_slot_field = usage->hid; 266b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires td->last_field_index = field->index; 267b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires } 2685519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 2695519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_CONFIDENCE: 270b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires if (td->last_mt_collection == usage->collection_index) { 271b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires td->last_slot_field = usage->hid; 272b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires td->last_field_index = field->index; 273b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires } 2745519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 2755519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_TIPSWITCH: 2765519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_TOUCH); 2775519cab477b61326963c8d523520db0342862b63Benjamin Tissoires input_set_capability(hi->input, EV_KEY, BTN_TOUCH); 278b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires if (td->last_mt_collection == usage->collection_index) { 279b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires td->last_slot_field = usage->hid; 280b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires td->last_field_index = field->index; 281b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires } 2825519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 2835519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_CONTACTID: 28450bc03ab5c7529fdfe4e01621efca7d26439ea00Benjamin Tissoires if (!td->maxcontacts) 28550bc03ab5c7529fdfe4e01621efca7d26439ea00Benjamin Tissoires td->maxcontacts = MT_DEFAULT_MAXCONTACT; 2869498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires input_mt_init_slots(hi->input, td->maxcontacts); 2875519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->last_slot_field = usage->hid; 2882955caed8b9865c1f04fcde6bd7103d5d5ec9415Benjamin Tissoires td->last_field_index = field->index; 289b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires td->last_mt_collection = usage->collection_index; 2905519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 2915519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_WIDTH: 2925519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid_map_usage(hi, usage, bit, max, 2935519cab477b61326963c8d523520db0342862b63Benjamin Tissoires EV_ABS, ABS_MT_TOUCH_MAJOR); 294f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires set_abs(hi->input, ABS_MT_TOUCH_MAJOR, field, 295f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires cls->sn_width); 296b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires if (td->last_mt_collection == usage->collection_index) { 297b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires td->last_slot_field = usage->hid; 298b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires td->last_field_index = field->index; 299b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires } 3005519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 3015519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_HEIGHT: 3025519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid_map_usage(hi, usage, bit, max, 3035519cab477b61326963c8d523520db0342862b63Benjamin Tissoires EV_ABS, ABS_MT_TOUCH_MINOR); 304f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires set_abs(hi->input, ABS_MT_TOUCH_MINOR, field, 305f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires cls->sn_height); 3061e648a13720ef5de51f132501acf3e443d1a36d4Benjamin Tissoires input_set_abs_params(hi->input, 3071e648a13720ef5de51f132501acf3e443d1a36d4Benjamin Tissoires ABS_MT_ORIENTATION, 0, 1, 0, 0); 308b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires if (td->last_mt_collection == usage->collection_index) { 309b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires td->last_slot_field = usage->hid; 310b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires td->last_field_index = field->index; 311b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires } 3125519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 3135519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_TIPPRESSURE: 3144875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber if (quirks & MT_QUIRK_EGALAX_XYZ_FIXUP) 3154875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber field->logical_minimum = 0; 3165519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid_map_usage(hi, usage, bit, max, 3175519cab477b61326963c8d523520db0342862b63Benjamin Tissoires EV_ABS, ABS_MT_PRESSURE); 3185519cab477b61326963c8d523520db0342862b63Benjamin Tissoires set_abs(hi->input, ABS_MT_PRESSURE, field, 3195519cab477b61326963c8d523520db0342862b63Benjamin Tissoires cls->sn_pressure); 3205519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* touchscreen emulation */ 3215519cab477b61326963c8d523520db0342862b63Benjamin Tissoires set_abs(hi->input, ABS_PRESSURE, field, 3225519cab477b61326963c8d523520db0342862b63Benjamin Tissoires cls->sn_pressure); 323b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires if (td->last_mt_collection == usage->collection_index) { 324b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires td->last_slot_field = usage->hid; 325b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires td->last_field_index = field->index; 326b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires } 3275519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 3285519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_CONTACTCOUNT: 329b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires if (td->last_mt_collection == usage->collection_index) 330b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires td->last_field_index = field->index; 3315519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 3325519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_CONTACTMAX: 3335519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* we don't set td->last_slot_field as contactcount and 3345519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * contact max are global to the report */ 335b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires if (td->last_mt_collection == usage->collection_index) 336b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires td->last_field_index = field->index; 3375519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return -1; 3385519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 3395519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* let hid-input decide for the others */ 3405519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 0; 3415519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3425519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case 0xff000000: 3435519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* we do not want to map these: no input-oriented meaning */ 3445519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return -1; 3455519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 3465519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3475519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 0; 3485519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 3495519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3505519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic int mt_input_mapped(struct hid_device *hdev, struct hid_input *hi, 3515519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct hid_field *field, struct hid_usage *usage, 3525519cab477b61326963c8d523520db0342862b63Benjamin Tissoires unsigned long **bit, int *max) 3535519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 3545519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if (usage->type == EV_KEY || usage->type == EV_ABS) 3555519cab477b61326963c8d523520db0342862b63Benjamin Tissoires set_bit(usage->type, hi->input->evbit); 3565519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3575519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return -1; 3585519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 3595519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3605519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic int mt_compute_slot(struct mt_device *td) 3615519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 3622d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires __s32 quirks = td->mtclass->quirks; 3635519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3642d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires if (quirks & MT_QUIRK_SLOT_IS_CONTACTID) 3652d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires return td->curdata.contactid; 3665519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3672d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires if (quirks & MT_QUIRK_CYPRESS) 368a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires return cypress_compute_slot(td); 369a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires 3702d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires if (quirks & MT_QUIRK_SLOT_IS_CONTACTNUMBER) 3712d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires return td->num_received; 3725572da08a784621f2ab4fdc8dc65471261871795Benjamin Tissoires 3734a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires if (quirks & MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE) 3744a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires return td->curdata.contactid - 1; 3754a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires 3765519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return find_slot_from_contactid(td); 3775519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 3785519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3795519cab477b61326963c8d523520db0342862b63Benjamin Tissoires/* 3805519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * this function is called when a whole contact has been processed, 3815519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * so that it can assign it to a slot and store the data there 3825519cab477b61326963c8d523520db0342862b63Benjamin Tissoires */ 3835519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic void mt_complete_slot(struct mt_device *td) 3845519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 3852d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires td->curdata.seen_in_this_frame = true; 3865519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if (td->curvalid) { 3875519cab477b61326963c8d523520db0342862b63Benjamin Tissoires int slotnum = mt_compute_slot(td); 3885519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3899498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires if (slotnum >= 0 && slotnum < td->maxcontacts) 3902d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires td->slots[slotnum] = td->curdata; 3915519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 3925519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->num_received++; 3935519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 3945519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3955519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3965519cab477b61326963c8d523520db0342862b63Benjamin Tissoires/* 3975519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * this function is called when a whole packet has been received and processed, 3985519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * so that it can decide what to send to the input layer. 3995519cab477b61326963c8d523520db0342862b63Benjamin Tissoires */ 4005519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic void mt_emit_event(struct mt_device *td, struct input_dev *input) 4015519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 4025519cab477b61326963c8d523520db0342862b63Benjamin Tissoires int i; 4035519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 4049498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires for (i = 0; i < td->maxcontacts; ++i) { 4055519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct mt_slot *s = &(td->slots[i]); 4065519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if ((td->mtclass->quirks & MT_QUIRK_NOT_SEEN_MEANS_UP) && 4075519cab477b61326963c8d523520db0342862b63Benjamin Tissoires !s->seen_in_this_frame) { 4085519cab477b61326963c8d523520db0342862b63Benjamin Tissoires s->touch_state = false; 4095519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 4105519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 4115519cab477b61326963c8d523520db0342862b63Benjamin Tissoires input_mt_slot(input, i); 4125519cab477b61326963c8d523520db0342862b63Benjamin Tissoires input_mt_report_slot_state(input, MT_TOOL_FINGER, 4135519cab477b61326963c8d523520db0342862b63Benjamin Tissoires s->touch_state); 4142d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires if (s->touch_state) { 415f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires /* this finger is on the screen */ 416f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires int wide = (s->w > s->h); 417f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires /* divided by two to match visual scale of touch */ 418f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires int major = max(s->w, s->h) >> 1; 419f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires int minor = min(s->w, s->h) >> 1; 420f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires 4212d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires input_event(input, EV_ABS, ABS_MT_POSITION_X, s->x); 4222d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires input_event(input, EV_ABS, ABS_MT_POSITION_Y, s->y); 423f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires input_event(input, EV_ABS, ABS_MT_ORIENTATION, wide); 4242d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires input_event(input, EV_ABS, ABS_MT_PRESSURE, s->p); 425f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires input_event(input, EV_ABS, ABS_MT_TOUCH_MAJOR, major); 426f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires input_event(input, EV_ABS, ABS_MT_TOUCH_MINOR, minor); 4272d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires } 4285519cab477b61326963c8d523520db0342862b63Benjamin Tissoires s->seen_in_this_frame = false; 4295519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 4305519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 4315519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 4325519cab477b61326963c8d523520db0342862b63Benjamin Tissoires input_mt_report_pointer_emulation(input, true); 4335519cab477b61326963c8d523520db0342862b63Benjamin Tissoires input_sync(input); 4345519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->num_received = 0; 4355519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 4365519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 4375519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 4385519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 4395519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic int mt_event(struct hid_device *hid, struct hid_field *field, 4405519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct hid_usage *usage, __s32 value) 4415519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 4425519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct mt_device *td = hid_get_drvdata(hid); 4432d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires __s32 quirks = td->mtclass->quirks; 4445519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 4459498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires if (hid->claimed & HID_CLAIMED_INPUT && td->slots) { 4465519cab477b61326963c8d523520db0342862b63Benjamin Tissoires switch (usage->hid) { 4475519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_INRANGE: 4482d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires if (quirks & MT_QUIRK_VALID_IS_INRANGE) 4492d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires td->curvalid = value; 4505519cab477b61326963c8d523520db0342862b63Benjamin Tissoires break; 4515519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_TIPSWITCH: 4522d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires if (quirks & MT_QUIRK_NOT_SEEN_MEANS_UP) 4532d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires td->curvalid = value; 4545519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->curdata.touch_state = value; 4555519cab477b61326963c8d523520db0342862b63Benjamin Tissoires break; 4565519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_CONFIDENCE: 4572d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires if (quirks & MT_QUIRK_VALID_IS_CONFIDENCE) 4582d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires td->curvalid = value; 4595519cab477b61326963c8d523520db0342862b63Benjamin Tissoires break; 4605519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_CONTACTID: 4615519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->curdata.contactid = value; 4625519cab477b61326963c8d523520db0342862b63Benjamin Tissoires break; 4635519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_TIPPRESSURE: 4645519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->curdata.p = value; 4655519cab477b61326963c8d523520db0342862b63Benjamin Tissoires break; 4665519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_GD_X: 4675519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->curdata.x = value; 4685519cab477b61326963c8d523520db0342862b63Benjamin Tissoires break; 4695519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_GD_Y: 4705519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->curdata.y = value; 4715519cab477b61326963c8d523520db0342862b63Benjamin Tissoires break; 4725519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_WIDTH: 4735519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->curdata.w = value; 4745519cab477b61326963c8d523520db0342862b63Benjamin Tissoires break; 4755519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_HEIGHT: 4765519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->curdata.h = value; 4775519cab477b61326963c8d523520db0342862b63Benjamin Tissoires break; 4785519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_CONTACTCOUNT: 4795519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* 4802d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires * Includes multi-packet support where subsequent 4812d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires * packets are sent with zero contactcount. 4825519cab477b61326963c8d523520db0342862b63Benjamin Tissoires */ 4835519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if (value) 4842d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires td->num_expected = value; 4855519cab477b61326963c8d523520db0342862b63Benjamin Tissoires break; 4865519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 4875519cab477b61326963c8d523520db0342862b63Benjamin Tissoires default: 4885519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* fallback to the generic hidinput handling */ 4895519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 0; 4905519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 4915519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 492f153fc3990d4ad2709a52d7150e2c04363afb1fbHenrik Rydberg if (usage->hid == td->last_slot_field) { 4932d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires mt_complete_slot(td); 494f153fc3990d4ad2709a52d7150e2c04363afb1fbHenrik Rydberg } 4952d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires 4962d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires if (field->index == td->last_field_index 4972d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires && td->num_received >= td->num_expected) 4982d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires mt_emit_event(td, field->hidinput->input); 4995519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5002d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires } 5015519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5025519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* we have handled the hidinput part, now remains hiddev */ 5035519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if (hid->claimed & HID_CLAIMED_HIDDEV && hid->hiddev_hid_event) 5045519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid->hiddev_hid_event(hid, field, usage, value); 5055519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5065519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 5075519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 5085519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5095519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic void mt_set_input_mode(struct hid_device *hdev) 5105519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 5115519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct mt_device *td = hid_get_drvdata(hdev); 5125519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct hid_report *r; 5135519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct hid_report_enum *re; 5145519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5155519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if (td->inputmode < 0) 5165519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return; 5175519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5185519cab477b61326963c8d523520db0342862b63Benjamin Tissoires re = &(hdev->report_enum[HID_FEATURE_REPORT]); 5195519cab477b61326963c8d523520db0342862b63Benjamin Tissoires r = re->report_id_hash[td->inputmode]; 5205519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if (r) { 5215519cab477b61326963c8d523520db0342862b63Benjamin Tissoires r->field[0]->value[0] = 0x02; 5225519cab477b61326963c8d523520db0342862b63Benjamin Tissoires usbhid_submit_report(hdev, r, USB_DIR_OUT); 5235519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 5245519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 5255519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5265519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) 5275519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 5282d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires int ret, i; 5295519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct mt_device *td; 5302d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires struct mt_class *mtclass = mt_classes; /* MT_CLS_DEFAULT */ 5312d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires 5322d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires for (i = 0; mt_classes[i].name ; i++) { 5332d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires if (id->driver_data == mt_classes[i].name) { 5342d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires mtclass = &(mt_classes[i]); 5352d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires break; 5362d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires } 5372d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires } 5385519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5395519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* This allows the driver to correctly support devices 5405519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * that emit events over several HID messages. 5415519cab477b61326963c8d523520db0342862b63Benjamin Tissoires */ 5425519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hdev->quirks |= HID_QUIRK_NO_INPUT_SYNC; 5435519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5449498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires td = kzalloc(sizeof(struct mt_device), GFP_KERNEL); 5455519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if (!td) { 5465519cab477b61326963c8d523520db0342862b63Benjamin Tissoires dev_err(&hdev->dev, "cannot allocate multitouch data\n"); 5475519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return -ENOMEM; 5485519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 5495519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->mtclass = mtclass; 5505519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->inputmode = -1; 551b84bd27fe70206f9253c395958134e4e4b7e55f0Benjamin Tissoires td->last_mt_collection = -1; 5525519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid_set_drvdata(hdev, td); 5535519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5545519cab477b61326963c8d523520db0342862b63Benjamin Tissoires ret = hid_parse(hdev); 5555519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if (ret != 0) 5565519cab477b61326963c8d523520db0342862b63Benjamin Tissoires goto fail; 5575519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5585519cab477b61326963c8d523520db0342862b63Benjamin Tissoires ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); 5592d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires if (ret) 5605519cab477b61326963c8d523520db0342862b63Benjamin Tissoires goto fail; 5615519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5629498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires td->slots = kzalloc(td->maxcontacts * sizeof(struct mt_slot), 5639498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires GFP_KERNEL); 5649498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires if (!td->slots) { 5659498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires dev_err(&hdev->dev, "cannot allocate multitouch slots\n"); 5669498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires hid_hw_stop(hdev); 5679498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires ret = -ENOMEM; 5689498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires goto fail; 5699498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires } 5709498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires 5715519cab477b61326963c8d523520db0342862b63Benjamin Tissoires mt_set_input_mode(hdev); 5725519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5735519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 0; 5745519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5755519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresfail: 5765519cab477b61326963c8d523520db0342862b63Benjamin Tissoires kfree(td); 5775519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return ret; 5785519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 5795519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5805519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#ifdef CONFIG_PM 5815519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic int mt_reset_resume(struct hid_device *hdev) 5825519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 5835519cab477b61326963c8d523520db0342862b63Benjamin Tissoires mt_set_input_mode(hdev); 5845519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 0; 5855519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 5865519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#endif 5875519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5885519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic void mt_remove(struct hid_device *hdev) 5895519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 5905519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct mt_device *td = hid_get_drvdata(hdev); 5915519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid_hw_stop(hdev); 5929498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires kfree(td->slots); 5935519cab477b61326963c8d523520db0342862b63Benjamin Tissoires kfree(td); 5945519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid_set_drvdata(hdev, NULL); 5955519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 5965519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5975519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic const struct hid_device_id mt_devices[] = { 5985519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 599f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires /* 3M panels */ 600f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires { .driver_data = MT_CLS_3M, 601f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_3M, 602f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires USB_DEVICE_ID_3M1968) }, 603f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires { .driver_data = MT_CLS_3M, 604f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_3M, 605f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires USB_DEVICE_ID_3M2256) }, 606f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires 607e6aac3427ef03f61e7478514d0648b58359d05d1Benjamin Tissoires /* ActionStar panels */ 608e6aac3427ef03f61e7478514d0648b58359d05d1Benjamin Tissoires { .driver_data = MT_CLS_DEFAULT, 609e6aac3427ef03f61e7478514d0648b58359d05d1Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_ACTIONSTAR, 610e6aac3427ef03f61e7478514d0648b58359d05d1Benjamin Tissoires USB_DEVICE_ID_ACTIONSTAR_1011) }, 611e6aac3427ef03f61e7478514d0648b58359d05d1Benjamin Tissoires 612a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires /* Cando panels */ 613a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER, 614a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_CANDO, 615a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires USB_DEVICE_ID_CANDO_MULTI_TOUCH) }, 616a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER, 617a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_CANDO, 618a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires USB_DEVICE_ID_CANDO_MULTI_TOUCH_10_1) }, 619a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER, 620a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_CANDO, 621a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6) }, 622a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER, 623a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_CANDO, 624a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires USB_DEVICE_ID_CANDO_MULTI_TOUCH_15_6) }, 625a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires 626942fd4225f72826b31d893582b6ae7e172bb3202Austin Zhang /* Chunghwa Telecom touch panels */ 627942fd4225f72826b31d893582b6ae7e172bb3202Austin Zhang { .driver_data = MT_CLS_DEFAULT, 628942fd4225f72826b31d893582b6ae7e172bb3202Austin Zhang HID_USB_DEVICE(USB_VENDOR_ID_CHUNGHWAT, 629942fd4225f72826b31d893582b6ae7e172bb3202Austin Zhang USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH) }, 630942fd4225f72826b31d893582b6ae7e172bb3202Austin Zhang 63179603dc9a8223856cf3194dcabad32b9828c7be9Benjamin Tissoires /* CVTouch panels */ 63279603dc9a8223856cf3194dcabad32b9828c7be9Benjamin Tissoires { .driver_data = MT_CLS_DEFAULT, 63379603dc9a8223856cf3194dcabad32b9828c7be9Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_CVTOUCH, 63479603dc9a8223856cf3194dcabad32b9828c7be9Benjamin Tissoires USB_DEVICE_ID_CVTOUCH_SCREEN) }, 63579603dc9a8223856cf3194dcabad32b9828c7be9Benjamin Tissoires 636a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires /* Cypress panel */ 637a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires { .driver_data = MT_CLS_CYPRESS, 638a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, 639a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires USB_DEVICE_ID_CYPRESS_TRUETOUCH) }, 640a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires 64122408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires /* eGalax devices (resistive) */ 64222408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires { .driver_data = MT_CLS_EGALAX, 64322408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_DWAV, 64422408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH) }, 64522408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires { .driver_data = MT_CLS_EGALAX, 64622408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_DWAV, 64722408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH3) }, 64822408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires 64922408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires /* eGalax devices (capacitive) */ 65022408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires { .driver_data = MT_CLS_EGALAX, 65122408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_DWAV, 65222408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH1) }, 65322408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires { .driver_data = MT_CLS_EGALAX, 65422408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_DWAV, 65522408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH2) }, 65622408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires { .driver_data = MT_CLS_EGALAX, 65722408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_DWAV, 65822408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH4) }, 65922408283bca57780bdd53da5a6e4474b71b94430Benjamin Tissoires 660c04abeeff9d76a703cac1e6d312853b0fc8136f5Benjamin Tissoires /* Elo TouchSystems IntelliTouch Plus panel */ 661c04abeeff9d76a703cac1e6d312853b0fc8136f5Benjamin Tissoires { .driver_data = MT_CLS_DUAL_NSMU_CONTACTID, 662c04abeeff9d76a703cac1e6d312853b0fc8136f5Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_ELO, 663c04abeeff9d76a703cac1e6d312853b0fc8136f5Benjamin Tissoires USB_DEVICE_ID_ELO_TS2515) }, 664c04abeeff9d76a703cac1e6d312853b0fc8136f5Benjamin Tissoires 6655572da08a784621f2ab4fdc8dc65471261871795Benjamin Tissoires /* GeneralTouch panel */ 6661e9cf35b995610e7ba2934d3dc92e3a03fa361a1Benjamin Tissoires { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER, 6675572da08a784621f2ab4fdc8dc65471261871795Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 6685572da08a784621f2ab4fdc8dc65471261871795Benjamin Tissoires USB_DEVICE_ID_GENERAL_TOUCH_WIN7_TWOFINGERS) }, 6695572da08a784621f2ab4fdc8dc65471261871795Benjamin Tissoires 670ee0fbd149182d91e3b9df7b306eb03cd1f1dd4a1Benjamin Tissoires /* GoodTouch panels */ 671ee0fbd149182d91e3b9df7b306eb03cd1f1dd4a1Benjamin Tissoires { .driver_data = MT_CLS_DEFAULT, 672ee0fbd149182d91e3b9df7b306eb03cd1f1dd4a1Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_GOODTOUCH, 673ee0fbd149182d91e3b9df7b306eb03cd1f1dd4a1Benjamin Tissoires USB_DEVICE_ID_GOODTOUCH_000f) }, 674ee0fbd149182d91e3b9df7b306eb03cd1f1dd4a1Benjamin Tissoires 6754e61f0d75aa86c9e59451f6bcffcdceb355b4fc4Austin Zhang /* Ilitek dual touch panel */ 6764e61f0d75aa86c9e59451f6bcffcdceb355b4fc4Austin Zhang { .driver_data = MT_CLS_DEFAULT, 6774e61f0d75aa86c9e59451f6bcffcdceb355b4fc4Austin Zhang HID_USB_DEVICE(USB_VENDOR_ID_ILITEK, 6784e61f0d75aa86c9e59451f6bcffcdceb355b4fc4Austin Zhang USB_DEVICE_ID_ILITEK_MULTITOUCH) }, 6794e61f0d75aa86c9e59451f6bcffcdceb355b4fc4Austin Zhang 6804dfcced8a1f42248f9e7a461485f6aa5f66d2105Benjamin Tissoires /* IRTOUCH panels */ 6814dfcced8a1f42248f9e7a461485f6aa5f66d2105Benjamin Tissoires { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID, 6824dfcced8a1f42248f9e7a461485f6aa5f66d2105Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_IRTOUCHSYSTEMS, 6834dfcced8a1f42248f9e7a461485f6aa5f66d2105Benjamin Tissoires USB_DEVICE_ID_IRTOUCH_INFRARED_USB) }, 6844dfcced8a1f42248f9e7a461485f6aa5f66d2105Benjamin Tissoires 685c50bb1a4005630f47b5da26336f74a485033a515Jeff Brown /* LG Display panels */ 686c50bb1a4005630f47b5da26336f74a485033a515Jeff Brown { .driver_data = MT_CLS_DEFAULT, 687c50bb1a4005630f47b5da26336f74a485033a515Jeff Brown HID_USB_DEVICE(USB_VENDOR_ID_LG, 688c50bb1a4005630f47b5da26336f74a485033a515Jeff Brown USB_DEVICE_ID_LG_MULTITOUCH) }, 689c50bb1a4005630f47b5da26336f74a485033a515Jeff Brown 690df167c4a0d68a9dbde044a39a77f255ac666f93eBenjamin Tissoires /* Lumio panels */ 691df167c4a0d68a9dbde044a39a77f255ac666f93eBenjamin Tissoires { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, 692df167c4a0d68a9dbde044a39a77f255ac666f93eBenjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, 693df167c4a0d68a9dbde044a39a77f255ac666f93eBenjamin Tissoires USB_DEVICE_ID_CRYSTALTOUCH) }, 694c3ead6de4f6bd1c08a81f84e629e3dbf4a9078f0Benjamin Tissoires { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, 695c3ead6de4f6bd1c08a81f84e629e3dbf4a9078f0Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, 696c3ead6de4f6bd1c08a81f84e629e3dbf4a9078f0Benjamin Tissoires USB_DEVICE_ID_CRYSTALTOUCH_DUAL) }, 697df167c4a0d68a9dbde044a39a77f255ac666f93eBenjamin Tissoires 6984a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires /* MosArt panels */ 6994a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, 7004a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_ASUS, 7014a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires USB_DEVICE_ID_ASUS_T91MT)}, 7024a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, 7034a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_ASUS, 7044a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires USB_DEVICE_ID_ASUSTEK_MULTITOUCH_YFO) }, 7054a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, 7064a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, 7074a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires USB_DEVICE_ID_TURBOX_TOUCHSCREEN_MOSART) }, 7084a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires 7096ab3a9a63fc16b04f7de48eb0190d516dd7574dfJohn Sung /* PenMount panels */ 7106ab3a9a63fc16b04f7de48eb0190d516dd7574dfJohn Sung { .driver_data = MT_CLS_CONFIDENCE, 7116ab3a9a63fc16b04f7de48eb0190d516dd7574dfJohn Sung HID_USB_DEVICE(USB_VENDOR_ID_PENMOUNT, 7126ab3a9a63fc16b04f7de48eb0190d516dd7574dfJohn Sung USB_DEVICE_ID_PENMOUNT_PCI) }, 7136ab3a9a63fc16b04f7de48eb0190d516dd7574dfJohn Sung 7145519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* PixCir-based panels */ 7151e9cf35b995610e7ba2934d3dc92e3a03fa361a1Benjamin Tissoires { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID, 7165519cab477b61326963c8d523520db0342862b63Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_HANVON, 7175519cab477b61326963c8d523520db0342862b63Benjamin Tissoires USB_DEVICE_ID_HANVON_MULTITOUCH) }, 7181e9cf35b995610e7ba2934d3dc92e3a03fa361a1Benjamin Tissoires { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID, 7195519cab477b61326963c8d523520db0342862b63Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_CANDO, 7205519cab477b61326963c8d523520db0342862b63Benjamin Tissoires USB_DEVICE_ID_CANDO_PIXCIR_MULTI_TOUCH) }, 7215519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 722043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires /* Stantum panels */ 723bf5af9b5bba2453ff46f241e8f2e139ca79302e7Benjamin Tissoires { .driver_data = MT_CLS_CONFIDENCE, 724043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, 725043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires USB_DEVICE_ID_MTP)}, 726bf5af9b5bba2453ff46f241e8f2e139ca79302e7Benjamin Tissoires { .driver_data = MT_CLS_CONFIDENCE, 72785a600825b425d52e466c6093dcdfeba85eb0044Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_STM, 728043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires USB_DEVICE_ID_MTP_STM)}, 729bf5af9b5bba2453ff46f241e8f2e139ca79302e7Benjamin Tissoires { .driver_data = MT_CLS_CONFIDENCE, 73085a600825b425d52e466c6093dcdfeba85eb0044Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_SITRONIX, 731043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires USB_DEVICE_ID_MTP_SITRONIX)}, 732043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires 7335e74e56da03f581482c104628951eeb1455848eaBenjamin Tissoires /* Touch International panels */ 7345e74e56da03f581482c104628951eeb1455848eaBenjamin Tissoires { .driver_data = MT_CLS_DEFAULT, 7355e74e56da03f581482c104628951eeb1455848eaBenjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_TOUCH_INTL, 7365e74e56da03f581482c104628951eeb1455848eaBenjamin Tissoires USB_DEVICE_ID_TOUCH_INTL_MULTI_TOUCH) }, 7375e74e56da03f581482c104628951eeb1455848eaBenjamin Tissoires 738617b64f97708be26a061e6c8178ad46b4c49d031Benjamin Tissoires /* Unitec panels */ 739617b64f97708be26a061e6c8178ad46b4c49d031Benjamin Tissoires { .driver_data = MT_CLS_DEFAULT, 740617b64f97708be26a061e6c8178ad46b4c49d031Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_UNITEC, 741617b64f97708be26a061e6c8178ad46b4c49d031Benjamin Tissoires USB_DEVICE_ID_UNITEC_USB_TOUCH_0709) }, 742617b64f97708be26a061e6c8178ad46b4c49d031Benjamin Tissoires { .driver_data = MT_CLS_DEFAULT, 743617b64f97708be26a061e6c8178ad46b4c49d031Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_UNITEC, 744617b64f97708be26a061e6c8178ad46b4c49d031Benjamin Tissoires USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19) }, 745bc8a2a9b4e5c418bebaa6bb812982b7ecd298821ice chien /* XAT */ 746bc8a2a9b4e5c418bebaa6bb812982b7ecd298821ice chien { .driver_data = MT_CLS_DEFAULT, 747bc8a2a9b4e5c418bebaa6bb812982b7ecd298821ice chien HID_USB_DEVICE(USB_VENDOR_ID_XAT, 748bc8a2a9b4e5c418bebaa6bb812982b7ecd298821ice chien USB_DEVICE_ID_XAT_CSR) }, 749617b64f97708be26a061e6c8178ad46b4c49d031Benjamin Tissoires 7505519cab477b61326963c8d523520db0342862b63Benjamin Tissoires { } 7515519cab477b61326963c8d523520db0342862b63Benjamin Tissoires}; 7525519cab477b61326963c8d523520db0342862b63Benjamin TissoiresMODULE_DEVICE_TABLE(hid, mt_devices); 7535519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 7545519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic const struct hid_usage_id mt_grabbed_usages[] = { 7555519cab477b61326963c8d523520db0342862b63Benjamin Tissoires { HID_ANY_ID, HID_ANY_ID, HID_ANY_ID }, 7565519cab477b61326963c8d523520db0342862b63Benjamin Tissoires { HID_ANY_ID - 1, HID_ANY_ID - 1, HID_ANY_ID - 1} 7575519cab477b61326963c8d523520db0342862b63Benjamin Tissoires}; 7585519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 7595519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic struct hid_driver mt_driver = { 7605519cab477b61326963c8d523520db0342862b63Benjamin Tissoires .name = "hid-multitouch", 7615519cab477b61326963c8d523520db0342862b63Benjamin Tissoires .id_table = mt_devices, 7625519cab477b61326963c8d523520db0342862b63Benjamin Tissoires .probe = mt_probe, 7635519cab477b61326963c8d523520db0342862b63Benjamin Tissoires .remove = mt_remove, 7645519cab477b61326963c8d523520db0342862b63Benjamin Tissoires .input_mapping = mt_input_mapping, 7655519cab477b61326963c8d523520db0342862b63Benjamin Tissoires .input_mapped = mt_input_mapped, 7665519cab477b61326963c8d523520db0342862b63Benjamin Tissoires .feature_mapping = mt_feature_mapping, 7675519cab477b61326963c8d523520db0342862b63Benjamin Tissoires .usage_table = mt_grabbed_usages, 7685519cab477b61326963c8d523520db0342862b63Benjamin Tissoires .event = mt_event, 7695519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#ifdef CONFIG_PM 7705519cab477b61326963c8d523520db0342862b63Benjamin Tissoires .reset_resume = mt_reset_resume, 7715519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#endif 7725519cab477b61326963c8d523520db0342862b63Benjamin Tissoires}; 7735519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 7745519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic int __init mt_init(void) 7755519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 7765519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return hid_register_driver(&mt_driver); 7775519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 7785519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 7795519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic void __exit mt_exit(void) 7805519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 7815519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid_unregister_driver(&mt_driver); 7825519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 7835519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 7845519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresmodule_init(mt_init); 7855519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresmodule_exit(mt_exit); 786