1*0bb3ed71SBenjamin Tissoires#!/bin/env python3
2*0bb3ed71SBenjamin Tissoires# SPDX-License-Identifier: GPL-2.0
3*0bb3ed71SBenjamin Tissoires# -*- coding: utf-8 -*-
4*0bb3ed71SBenjamin Tissoires#
5*0bb3ed71SBenjamin Tissoires# Copyright (c) 2017 Benjamin Tissoires <benjamin.tissoires@gmail.com>
6*0bb3ed71SBenjamin Tissoires# Copyright (c) 2017 Red Hat, Inc.
7*0bb3ed71SBenjamin Tissoires#
8*0bb3ed71SBenjamin Tissoires
9*0bb3ed71SBenjamin Tissoiresfrom . import base
10*0bb3ed71SBenjamin Tissoiresfrom hidtools.hut import HUT
11*0bb3ed71SBenjamin Tissoiresfrom hidtools.util import BusType
12*0bb3ed71SBenjamin Tissoiresimport libevdev
13*0bb3ed71SBenjamin Tissoiresimport logging
14*0bb3ed71SBenjamin Tissoiresimport pytest
15*0bb3ed71SBenjamin Tissoiresimport sys
16*0bb3ed71SBenjamin Tissoiresimport time
17*0bb3ed71SBenjamin Tissoires
18*0bb3ed71SBenjamin Tissoireslogger = logging.getLogger("hidtools.test.multitouch")
19*0bb3ed71SBenjamin Tissoires
20*0bb3ed71SBenjamin TissoiresKERNEL_MODULE = ("hid-multitouch", "hid_multitouch")
21*0bb3ed71SBenjamin Tissoires
22*0bb3ed71SBenjamin Tissoires
23*0bb3ed71SBenjamin Tissoiresdef BIT(x):
24*0bb3ed71SBenjamin Tissoires    return 1 << x
25*0bb3ed71SBenjamin Tissoires
26*0bb3ed71SBenjamin Tissoires
27*0bb3ed71SBenjamin Tissoiresmt_quirks = {
28*0bb3ed71SBenjamin Tissoires    "NOT_SEEN_MEANS_UP": BIT(0),
29*0bb3ed71SBenjamin Tissoires    "SLOT_IS_CONTACTID": BIT(1),
30*0bb3ed71SBenjamin Tissoires    "CYPRESS": BIT(2),
31*0bb3ed71SBenjamin Tissoires    "SLOT_IS_CONTACTNUMBER": BIT(3),
32*0bb3ed71SBenjamin Tissoires    "ALWAYS_VALID": BIT(4),
33*0bb3ed71SBenjamin Tissoires    "VALID_IS_INRANGE": BIT(5),
34*0bb3ed71SBenjamin Tissoires    "VALID_IS_CONFIDENCE": BIT(6),
35*0bb3ed71SBenjamin Tissoires    "CONFIDENCE": BIT(7),
36*0bb3ed71SBenjamin Tissoires    "SLOT_IS_CONTACTID_MINUS_ONE": BIT(8),
37*0bb3ed71SBenjamin Tissoires    "NO_AREA": BIT(9),
38*0bb3ed71SBenjamin Tissoires    "IGNORE_DUPLICATES": BIT(10),
39*0bb3ed71SBenjamin Tissoires    "HOVERING": BIT(11),
40*0bb3ed71SBenjamin Tissoires    "CONTACT_CNT_ACCURATE": BIT(12),
41*0bb3ed71SBenjamin Tissoires    "FORCE_GET_FEATURE": BIT(13),
42*0bb3ed71SBenjamin Tissoires    "FIX_CONST_CONTACT_ID": BIT(14),
43*0bb3ed71SBenjamin Tissoires    "TOUCH_SIZE_SCALING": BIT(15),
44*0bb3ed71SBenjamin Tissoires    "STICKY_FINGERS": BIT(16),
45*0bb3ed71SBenjamin Tissoires    "ASUS_CUSTOM_UP": BIT(17),
46*0bb3ed71SBenjamin Tissoires    "WIN8_PTP_BUTTONS": BIT(18),
47*0bb3ed71SBenjamin Tissoires    "SEPARATE_APP_REPORT": BIT(19),
48*0bb3ed71SBenjamin Tissoires    "MT_QUIRK_FORCE_MULTI_INPUT": BIT(20),
49*0bb3ed71SBenjamin Tissoires}
50*0bb3ed71SBenjamin Tissoires
51*0bb3ed71SBenjamin Tissoires
52*0bb3ed71SBenjamin Tissoiresclass Data(object):
53*0bb3ed71SBenjamin Tissoires    pass
54*0bb3ed71SBenjamin Tissoires
55*0bb3ed71SBenjamin Tissoires
56*0bb3ed71SBenjamin Tissoiresclass Touch(object):
57*0bb3ed71SBenjamin Tissoires    def __init__(self, id, x, y):
58*0bb3ed71SBenjamin Tissoires        self.contactid = id
59*0bb3ed71SBenjamin Tissoires        self.x = x
60*0bb3ed71SBenjamin Tissoires        self.y = y
61*0bb3ed71SBenjamin Tissoires        self.cx = x
62*0bb3ed71SBenjamin Tissoires        self.cy = y
63*0bb3ed71SBenjamin Tissoires        self.tipswitch = True
64*0bb3ed71SBenjamin Tissoires        self.confidence = True
65*0bb3ed71SBenjamin Tissoires        self.tippressure = 15
66*0bb3ed71SBenjamin Tissoires        self.azimuth = 0
67*0bb3ed71SBenjamin Tissoires        self.inrange = True
68*0bb3ed71SBenjamin Tissoires        self.width = 10
69*0bb3ed71SBenjamin Tissoires        self.height = 10
70*0bb3ed71SBenjamin Tissoires
71*0bb3ed71SBenjamin Tissoires
72*0bb3ed71SBenjamin Tissoiresclass Pen(Touch):
73*0bb3ed71SBenjamin Tissoires    def __init__(self, x, y):
74*0bb3ed71SBenjamin Tissoires        super().__init__(0, x, y)
75*0bb3ed71SBenjamin Tissoires        self.barrel = False
76*0bb3ed71SBenjamin Tissoires        self.invert = False
77*0bb3ed71SBenjamin Tissoires        self.eraser = False
78*0bb3ed71SBenjamin Tissoires        self.x_tilt = False
79*0bb3ed71SBenjamin Tissoires        self.y_tilt = False
80*0bb3ed71SBenjamin Tissoires        self.twist = 0
81*0bb3ed71SBenjamin Tissoires
82*0bb3ed71SBenjamin Tissoires
83*0bb3ed71SBenjamin Tissoiresclass Digitizer(base.UHIDTestDevice):
84*0bb3ed71SBenjamin Tissoires    @classmethod
85*0bb3ed71SBenjamin Tissoires    def msCertificationBlob(cls, reportID):
86*0bb3ed71SBenjamin Tissoires        return f"""
87*0bb3ed71SBenjamin Tissoires        Usage Page (Digitizers)
88*0bb3ed71SBenjamin Tissoires        Usage (Touch Screen)
89*0bb3ed71SBenjamin Tissoires        Collection (Application)
90*0bb3ed71SBenjamin Tissoires         Report ID ({reportID})
91*0bb3ed71SBenjamin Tissoires         Usage Page (0xff00)
92*0bb3ed71SBenjamin Tissoires         Usage (0xc5)
93*0bb3ed71SBenjamin Tissoires         Logical Minimum (0)
94*0bb3ed71SBenjamin Tissoires         Logical Maximum (255)
95*0bb3ed71SBenjamin Tissoires         Report Size (8)
96*0bb3ed71SBenjamin Tissoires         Report Count (256)
97*0bb3ed71SBenjamin Tissoires         Feature (Data,Var,Abs)
98*0bb3ed71SBenjamin Tissoires        End Collection
99*0bb3ed71SBenjamin Tissoires    """
100*0bb3ed71SBenjamin Tissoires
101*0bb3ed71SBenjamin Tissoires    def __init__(
102*0bb3ed71SBenjamin Tissoires        self,
103*0bb3ed71SBenjamin Tissoires        name,
104*0bb3ed71SBenjamin Tissoires        rdesc_str=None,
105*0bb3ed71SBenjamin Tissoires        rdesc=None,
106*0bb3ed71SBenjamin Tissoires        application="Touch Screen",
107*0bb3ed71SBenjamin Tissoires        physical="Finger",
108*0bb3ed71SBenjamin Tissoires        max_contacts=None,
109*0bb3ed71SBenjamin Tissoires        input_info=(BusType.USB, 1, 2),
110*0bb3ed71SBenjamin Tissoires        quirks=None,
111*0bb3ed71SBenjamin Tissoires    ):
112*0bb3ed71SBenjamin Tissoires        super().__init__(name, application, rdesc_str, rdesc, input_info)
113*0bb3ed71SBenjamin Tissoires        self.scantime = 0
114*0bb3ed71SBenjamin Tissoires        self.quirks = quirks
115*0bb3ed71SBenjamin Tissoires        if max_contacts is None:
116*0bb3ed71SBenjamin Tissoires            self.max_contacts = sys.maxsize
117*0bb3ed71SBenjamin Tissoires            for features in self.parsed_rdesc.feature_reports.values():
118*0bb3ed71SBenjamin Tissoires                for feature in features:
119*0bb3ed71SBenjamin Tissoires                    if feature.usage_name in ["Contact Max"]:
120*0bb3ed71SBenjamin Tissoires                        self.max_contacts = feature.logical_max
121*0bb3ed71SBenjamin Tissoires            for inputs in self.parsed_rdesc.input_reports.values():
122*0bb3ed71SBenjamin Tissoires                for i in inputs:
123*0bb3ed71SBenjamin Tissoires                    if (
124*0bb3ed71SBenjamin Tissoires                        i.usage_name in ["Contact Count"]
125*0bb3ed71SBenjamin Tissoires                        and i.logical_max > 0
126*0bb3ed71SBenjamin Tissoires                        and self.max_contacts > i.logical_max
127*0bb3ed71SBenjamin Tissoires                    ):
128*0bb3ed71SBenjamin Tissoires                        self.max_contacts = i.logical_max
129*0bb3ed71SBenjamin Tissoires            if self.max_contacts == sys.maxsize:
130*0bb3ed71SBenjamin Tissoires                self.max_contacts = 1
131*0bb3ed71SBenjamin Tissoires        else:
132*0bb3ed71SBenjamin Tissoires            self.max_contacts = max_contacts
133*0bb3ed71SBenjamin Tissoires        self.physical = physical
134*0bb3ed71SBenjamin Tissoires        self.cur_application = application
135*0bb3ed71SBenjamin Tissoires
136*0bb3ed71SBenjamin Tissoires        for features in self.parsed_rdesc.feature_reports.values():
137*0bb3ed71SBenjamin Tissoires            for feature in features:
138*0bb3ed71SBenjamin Tissoires                if feature.usage_name == "Inputmode":
139*0bb3ed71SBenjamin Tissoires                    self.cur_application = "Mouse"
140*0bb3ed71SBenjamin Tissoires
141*0bb3ed71SBenjamin Tissoires        self.fields = []
142*0bb3ed71SBenjamin Tissoires        for r in self.parsed_rdesc.input_reports.values():
143*0bb3ed71SBenjamin Tissoires            if r.application_name == self.application:
144*0bb3ed71SBenjamin Tissoires                physicals = [f.physical_name for f in r]
145*0bb3ed71SBenjamin Tissoires                if self.physical not in physicals and None not in physicals:
146*0bb3ed71SBenjamin Tissoires                    continue
147*0bb3ed71SBenjamin Tissoires                self.fields = [f.usage_name for f in r]
148*0bb3ed71SBenjamin Tissoires
149*0bb3ed71SBenjamin Tissoires    @property
150*0bb3ed71SBenjamin Tissoires    def touches_in_a_report(self):
151*0bb3ed71SBenjamin Tissoires        return self.fields.count("Contact Id")
152*0bb3ed71SBenjamin Tissoires
153*0bb3ed71SBenjamin Tissoires    def event(self, slots, global_data=None, contact_count=None, incr_scantime=True):
154*0bb3ed71SBenjamin Tissoires        if incr_scantime:
155*0bb3ed71SBenjamin Tissoires            self.scantime += 1
156*0bb3ed71SBenjamin Tissoires        rs = []
157*0bb3ed71SBenjamin Tissoires        # make sure we have only the required number of available slots
158*0bb3ed71SBenjamin Tissoires        slots = slots[: self.max_contacts]
159*0bb3ed71SBenjamin Tissoires
160*0bb3ed71SBenjamin Tissoires        if global_data is None:
161*0bb3ed71SBenjamin Tissoires            global_data = Data()
162*0bb3ed71SBenjamin Tissoires        if contact_count is None:
163*0bb3ed71SBenjamin Tissoires            global_data.contactcount = len(slots)
164*0bb3ed71SBenjamin Tissoires        else:
165*0bb3ed71SBenjamin Tissoires            global_data.contactcount = contact_count
166*0bb3ed71SBenjamin Tissoires        global_data.scantime = self.scantime
167*0bb3ed71SBenjamin Tissoires
168*0bb3ed71SBenjamin Tissoires        while len(slots):
169*0bb3ed71SBenjamin Tissoires            r = self.create_report(
170*0bb3ed71SBenjamin Tissoires                application=self.cur_application, data=slots, global_data=global_data
171*0bb3ed71SBenjamin Tissoires            )
172*0bb3ed71SBenjamin Tissoires            self.call_input_event(r)
173*0bb3ed71SBenjamin Tissoires            rs.append(r)
174*0bb3ed71SBenjamin Tissoires            global_data.contactcount = 0
175*0bb3ed71SBenjamin Tissoires        return rs
176*0bb3ed71SBenjamin Tissoires
177*0bb3ed71SBenjamin Tissoires    def get_report(self, req, rnum, rtype):
178*0bb3ed71SBenjamin Tissoires        if rtype != self.UHID_FEATURE_REPORT:
179*0bb3ed71SBenjamin Tissoires            return (1, [])
180*0bb3ed71SBenjamin Tissoires
181*0bb3ed71SBenjamin Tissoires        rdesc = None
182*0bb3ed71SBenjamin Tissoires        for v in self.parsed_rdesc.feature_reports.values():
183*0bb3ed71SBenjamin Tissoires            if v.report_ID == rnum:
184*0bb3ed71SBenjamin Tissoires                rdesc = v
185*0bb3ed71SBenjamin Tissoires
186*0bb3ed71SBenjamin Tissoires        if rdesc is None:
187*0bb3ed71SBenjamin Tissoires            return (1, [])
188*0bb3ed71SBenjamin Tissoires
189*0bb3ed71SBenjamin Tissoires        if "Contact Max" not in [f.usage_name for f in rdesc]:
190*0bb3ed71SBenjamin Tissoires            return (1, [])
191*0bb3ed71SBenjamin Tissoires
192*0bb3ed71SBenjamin Tissoires        self.contactmax = self.max_contacts
193*0bb3ed71SBenjamin Tissoires        r = rdesc.create_report([self], None)
194*0bb3ed71SBenjamin Tissoires        return (0, r)
195*0bb3ed71SBenjamin Tissoires
196*0bb3ed71SBenjamin Tissoires    def set_report(self, req, rnum, rtype, data):
197*0bb3ed71SBenjamin Tissoires        if rtype != self.UHID_FEATURE_REPORT:
198*0bb3ed71SBenjamin Tissoires            return 1
199*0bb3ed71SBenjamin Tissoires
200*0bb3ed71SBenjamin Tissoires        rdesc = None
201*0bb3ed71SBenjamin Tissoires        for v in self.parsed_rdesc.feature_reports.values():
202*0bb3ed71SBenjamin Tissoires            if v.report_ID == rnum:
203*0bb3ed71SBenjamin Tissoires                rdesc = v
204*0bb3ed71SBenjamin Tissoires
205*0bb3ed71SBenjamin Tissoires        if rdesc is None:
206*0bb3ed71SBenjamin Tissoires            return 1
207*0bb3ed71SBenjamin Tissoires
208*0bb3ed71SBenjamin Tissoires        if "Inputmode" not in [f.usage_name for f in rdesc]:
209*0bb3ed71SBenjamin Tissoires            return 0
210*0bb3ed71SBenjamin Tissoires
211*0bb3ed71SBenjamin Tissoires        Inputmode_seen = False
212*0bb3ed71SBenjamin Tissoires        for f in rdesc:
213*0bb3ed71SBenjamin Tissoires            if "Inputmode" == f.usage_name:
214*0bb3ed71SBenjamin Tissoires                values = f.get_values(data)
215*0bb3ed71SBenjamin Tissoires                assert len(values) == 1
216*0bb3ed71SBenjamin Tissoires                value = values[0]
217*0bb3ed71SBenjamin Tissoires
218*0bb3ed71SBenjamin Tissoires                if not Inputmode_seen:
219*0bb3ed71SBenjamin Tissoires                    Inputmode_seen = True
220*0bb3ed71SBenjamin Tissoires                    if value == 0:
221*0bb3ed71SBenjamin Tissoires                        self.cur_application = "Mouse"
222*0bb3ed71SBenjamin Tissoires                    elif value == 2:
223*0bb3ed71SBenjamin Tissoires                        self.cur_application = "Touch Screen"
224*0bb3ed71SBenjamin Tissoires                    elif value == 3:
225*0bb3ed71SBenjamin Tissoires                        self.cur_application = "Touch Pad"
226*0bb3ed71SBenjamin Tissoires                else:
227*0bb3ed71SBenjamin Tissoires                    if value != 0:
228*0bb3ed71SBenjamin Tissoires                        # Elan bug where the device doesn't work properly
229*0bb3ed71SBenjamin Tissoires                        # if we set twice an Input Mode in the same Feature
230*0bb3ed71SBenjamin Tissoires                        self.cur_application = "Mouse"
231*0bb3ed71SBenjamin Tissoires
232*0bb3ed71SBenjamin Tissoires        return 0
233*0bb3ed71SBenjamin Tissoires
234*0bb3ed71SBenjamin Tissoires
235*0bb3ed71SBenjamin Tissoiresclass PTP(Digitizer):
236*0bb3ed71SBenjamin Tissoires    def __init__(
237*0bb3ed71SBenjamin Tissoires        self,
238*0bb3ed71SBenjamin Tissoires        name,
239*0bb3ed71SBenjamin Tissoires        type="Click Pad",
240*0bb3ed71SBenjamin Tissoires        rdesc_str=None,
241*0bb3ed71SBenjamin Tissoires        rdesc=None,
242*0bb3ed71SBenjamin Tissoires        application="Touch Pad",
243*0bb3ed71SBenjamin Tissoires        physical="Pointer",
244*0bb3ed71SBenjamin Tissoires        max_contacts=None,
245*0bb3ed71SBenjamin Tissoires        input_info=None,
246*0bb3ed71SBenjamin Tissoires    ):
247*0bb3ed71SBenjamin Tissoires        self.type = type.lower().replace(" ", "")
248*0bb3ed71SBenjamin Tissoires        if self.type == "clickpad":
249*0bb3ed71SBenjamin Tissoires            self.buttontype = 0
250*0bb3ed71SBenjamin Tissoires        else:  # pressurepad
251*0bb3ed71SBenjamin Tissoires            self.buttontype = 1
252*0bb3ed71SBenjamin Tissoires        self.clickpad_state = False
253*0bb3ed71SBenjamin Tissoires        self.left_state = False
254*0bb3ed71SBenjamin Tissoires        self.right_state = False
255*0bb3ed71SBenjamin Tissoires        super().__init__(
256*0bb3ed71SBenjamin Tissoires            name, rdesc_str, rdesc, application, physical, max_contacts, input_info
257*0bb3ed71SBenjamin Tissoires        )
258*0bb3ed71SBenjamin Tissoires
259*0bb3ed71SBenjamin Tissoires    def event(
260*0bb3ed71SBenjamin Tissoires        self,
261*0bb3ed71SBenjamin Tissoires        slots=None,
262*0bb3ed71SBenjamin Tissoires        click=None,
263*0bb3ed71SBenjamin Tissoires        left=None,
264*0bb3ed71SBenjamin Tissoires        right=None,
265*0bb3ed71SBenjamin Tissoires        contact_count=None,
266*0bb3ed71SBenjamin Tissoires        incr_scantime=True,
267*0bb3ed71SBenjamin Tissoires    ):
268*0bb3ed71SBenjamin Tissoires        # update our internal state
269*0bb3ed71SBenjamin Tissoires        if click is not None:
270*0bb3ed71SBenjamin Tissoires            self.clickpad_state = click
271*0bb3ed71SBenjamin Tissoires        if left is not None:
272*0bb3ed71SBenjamin Tissoires            self.left_state = left
273*0bb3ed71SBenjamin Tissoires        if right is not None:
274*0bb3ed71SBenjamin Tissoires            self.right_state = right
275*0bb3ed71SBenjamin Tissoires
276*0bb3ed71SBenjamin Tissoires        # now create the global data
277*0bb3ed71SBenjamin Tissoires        global_data = Data()
278*0bb3ed71SBenjamin Tissoires        global_data.b1 = 1 if self.clickpad_state else 0
279*0bb3ed71SBenjamin Tissoires        global_data.b2 = 1 if self.left_state else 0
280*0bb3ed71SBenjamin Tissoires        global_data.b3 = 1 if self.right_state else 0
281*0bb3ed71SBenjamin Tissoires
282*0bb3ed71SBenjamin Tissoires        if slots is None:
283*0bb3ed71SBenjamin Tissoires            slots = [Data()]
284*0bb3ed71SBenjamin Tissoires
285*0bb3ed71SBenjamin Tissoires        return super().event(slots, global_data, contact_count, incr_scantime)
286*0bb3ed71SBenjamin Tissoires
287*0bb3ed71SBenjamin Tissoires
288*0bb3ed71SBenjamin Tissoiresclass MinWin8TSParallel(Digitizer):
289*0bb3ed71SBenjamin Tissoires    def __init__(self, max_slots):
290*0bb3ed71SBenjamin Tissoires        self.max_slots = max_slots
291*0bb3ed71SBenjamin Tissoires        self.phys_max = 120, 90
292*0bb3ed71SBenjamin Tissoires        rdesc_finger_str = f"""
293*0bb3ed71SBenjamin Tissoires            Usage Page (Digitizers)
294*0bb3ed71SBenjamin Tissoires            Usage (Finger)
295*0bb3ed71SBenjamin Tissoires            Collection (Logical)
296*0bb3ed71SBenjamin Tissoires             Report Size (1)
297*0bb3ed71SBenjamin Tissoires             Report Count (1)
298*0bb3ed71SBenjamin Tissoires             Logical Minimum (0)
299*0bb3ed71SBenjamin Tissoires             Logical Maximum (1)
300*0bb3ed71SBenjamin Tissoires             Usage (Tip Switch)
301*0bb3ed71SBenjamin Tissoires             Input (Data,Var,Abs)
302*0bb3ed71SBenjamin Tissoires             Report Size (7)
303*0bb3ed71SBenjamin Tissoires             Logical Maximum (127)
304*0bb3ed71SBenjamin Tissoires             Input (Cnst,Var,Abs)
305*0bb3ed71SBenjamin Tissoires             Report Size (8)
306*0bb3ed71SBenjamin Tissoires             Logical Maximum (255)
307*0bb3ed71SBenjamin Tissoires             Usage (Contact Id)
308*0bb3ed71SBenjamin Tissoires             Input (Data,Var,Abs)
309*0bb3ed71SBenjamin Tissoires             Report Size (16)
310*0bb3ed71SBenjamin Tissoires             Unit Exponent (-1)
311*0bb3ed71SBenjamin Tissoires             Unit (SILinear: cm)
312*0bb3ed71SBenjamin Tissoires             Logical Maximum (4095)
313*0bb3ed71SBenjamin Tissoires             Physical Minimum (0)
314*0bb3ed71SBenjamin Tissoires             Physical Maximum ({self.phys_max[0]})
315*0bb3ed71SBenjamin Tissoires             Usage Page (Generic Desktop)
316*0bb3ed71SBenjamin Tissoires             Usage (X)
317*0bb3ed71SBenjamin Tissoires             Input (Data,Var,Abs)
318*0bb3ed71SBenjamin Tissoires             Physical Maximum ({self.phys_max[1]})
319*0bb3ed71SBenjamin Tissoires             Usage (Y)
320*0bb3ed71SBenjamin Tissoires             Input (Data,Var,Abs)
321*0bb3ed71SBenjamin Tissoires             Usage Page (Digitizers)
322*0bb3ed71SBenjamin Tissoires             Usage (Azimuth)
323*0bb3ed71SBenjamin Tissoires             Logical Maximum (360)
324*0bb3ed71SBenjamin Tissoires             Unit (SILinear: deg)
325*0bb3ed71SBenjamin Tissoires             Report Size (16)
326*0bb3ed71SBenjamin Tissoires             Input (Data,Var,Abs)
327*0bb3ed71SBenjamin Tissoires            End Collection
328*0bb3ed71SBenjamin Tissoires"""
329*0bb3ed71SBenjamin Tissoires        rdesc_str = f"""
330*0bb3ed71SBenjamin Tissoires           Usage Page (Digitizers)
331*0bb3ed71SBenjamin Tissoires           Usage (Touch Screen)
332*0bb3ed71SBenjamin Tissoires           Collection (Application)
333*0bb3ed71SBenjamin Tissoires            Report ID (1)
334*0bb3ed71SBenjamin Tissoires            {rdesc_finger_str * self.max_slots}
335*0bb3ed71SBenjamin Tissoires            Unit Exponent (-4)
336*0bb3ed71SBenjamin Tissoires            Unit (SILinear: s)
337*0bb3ed71SBenjamin Tissoires            Logical Maximum (65535)
338*0bb3ed71SBenjamin Tissoires            Physical Maximum (65535)
339*0bb3ed71SBenjamin Tissoires            Usage Page (Digitizers)
340*0bb3ed71SBenjamin Tissoires            Usage (Scan Time)
341*0bb3ed71SBenjamin Tissoires            Input (Data,Var,Abs)
342*0bb3ed71SBenjamin Tissoires            Report Size (8)
343*0bb3ed71SBenjamin Tissoires            Logical Maximum (255)
344*0bb3ed71SBenjamin Tissoires            Usage (Contact Count)
345*0bb3ed71SBenjamin Tissoires            Input (Data,Var,Abs)
346*0bb3ed71SBenjamin Tissoires            Report ID (2)
347*0bb3ed71SBenjamin Tissoires            Logical Maximum ({self.max_slots})
348*0bb3ed71SBenjamin Tissoires            Usage (Contact Max)
349*0bb3ed71SBenjamin Tissoires            Feature (Data,Var,Abs)
350*0bb3ed71SBenjamin Tissoires          End Collection
351*0bb3ed71SBenjamin Tissoires          {Digitizer.msCertificationBlob(68)}
352*0bb3ed71SBenjamin Tissoires"""
353*0bb3ed71SBenjamin Tissoires        super().__init__(f"uhid test parallel {self.max_slots}", rdesc_str)
354*0bb3ed71SBenjamin Tissoires
355*0bb3ed71SBenjamin Tissoires
356*0bb3ed71SBenjamin Tissoiresclass MinWin8TSHybrid(Digitizer):
357*0bb3ed71SBenjamin Tissoires    def __init__(self):
358*0bb3ed71SBenjamin Tissoires        self.max_slots = 10
359*0bb3ed71SBenjamin Tissoires        self.phys_max = 120, 90
360*0bb3ed71SBenjamin Tissoires        rdesc_finger_str = f"""
361*0bb3ed71SBenjamin Tissoires            Usage Page (Digitizers)
362*0bb3ed71SBenjamin Tissoires            Usage (Finger)
363*0bb3ed71SBenjamin Tissoires            Collection (Logical)
364*0bb3ed71SBenjamin Tissoires             Report Size (1)
365*0bb3ed71SBenjamin Tissoires             Report Count (1)
366*0bb3ed71SBenjamin Tissoires             Logical Minimum (0)
367*0bb3ed71SBenjamin Tissoires             Logical Maximum (1)
368*0bb3ed71SBenjamin Tissoires             Usage (Tip Switch)
369*0bb3ed71SBenjamin Tissoires             Input (Data,Var,Abs)
370*0bb3ed71SBenjamin Tissoires             Report Size (7)
371*0bb3ed71SBenjamin Tissoires             Logical Maximum (127)
372*0bb3ed71SBenjamin Tissoires             Input (Cnst,Var,Abs)
373*0bb3ed71SBenjamin Tissoires             Report Size (8)
374*0bb3ed71SBenjamin Tissoires             Logical Maximum (255)
375*0bb3ed71SBenjamin Tissoires             Usage (Contact Id)
376*0bb3ed71SBenjamin Tissoires             Input (Data,Var,Abs)
377*0bb3ed71SBenjamin Tissoires             Report Size (16)
378*0bb3ed71SBenjamin Tissoires             Unit Exponent (-1)
379*0bb3ed71SBenjamin Tissoires             Unit (SILinear: cm)
380*0bb3ed71SBenjamin Tissoires             Logical Maximum (4095)
381*0bb3ed71SBenjamin Tissoires             Physical Minimum (0)
382*0bb3ed71SBenjamin Tissoires             Physical Maximum ({self.phys_max[0]})
383*0bb3ed71SBenjamin Tissoires             Usage Page (Generic Desktop)
384*0bb3ed71SBenjamin Tissoires             Usage (X)
385*0bb3ed71SBenjamin Tissoires             Input (Data,Var,Abs)
386*0bb3ed71SBenjamin Tissoires             Physical Maximum ({self.phys_max[1]})
387*0bb3ed71SBenjamin Tissoires             Usage (Y)
388*0bb3ed71SBenjamin Tissoires             Input (Data,Var,Abs)
389*0bb3ed71SBenjamin Tissoires            End Collection
390*0bb3ed71SBenjamin Tissoires"""
391*0bb3ed71SBenjamin Tissoires        rdesc_str = f"""
392*0bb3ed71SBenjamin Tissoires           Usage Page (Digitizers)
393*0bb3ed71SBenjamin Tissoires           Usage (Touch Screen)
394*0bb3ed71SBenjamin Tissoires           Collection (Application)
395*0bb3ed71SBenjamin Tissoires            Report ID (1)
396*0bb3ed71SBenjamin Tissoires            {rdesc_finger_str * 2}
397*0bb3ed71SBenjamin Tissoires            Unit Exponent (-4)
398*0bb3ed71SBenjamin Tissoires            Unit (SILinear: s)
399*0bb3ed71SBenjamin Tissoires            Logical Maximum (65535)
400*0bb3ed71SBenjamin Tissoires            Physical Maximum (65535)
401*0bb3ed71SBenjamin Tissoires            Usage Page (Digitizers)
402*0bb3ed71SBenjamin Tissoires            Usage (Scan Time)
403*0bb3ed71SBenjamin Tissoires            Input (Data,Var,Abs)
404*0bb3ed71SBenjamin Tissoires            Report Size (8)
405*0bb3ed71SBenjamin Tissoires            Logical Maximum (255)
406*0bb3ed71SBenjamin Tissoires            Usage (Contact Count)
407*0bb3ed71SBenjamin Tissoires            Input (Data,Var,Abs)
408*0bb3ed71SBenjamin Tissoires            Report ID (2)
409*0bb3ed71SBenjamin Tissoires            Logical Maximum ({self.max_slots})
410*0bb3ed71SBenjamin Tissoires            Usage (Contact Max)
411*0bb3ed71SBenjamin Tissoires            Feature (Data,Var,Abs)
412*0bb3ed71SBenjamin Tissoires          End Collection
413*0bb3ed71SBenjamin Tissoires          {Digitizer.msCertificationBlob(68)}
414*0bb3ed71SBenjamin Tissoires"""
415*0bb3ed71SBenjamin Tissoires        super().__init__("uhid test hybrid", rdesc_str)
416*0bb3ed71SBenjamin Tissoires
417*0bb3ed71SBenjamin Tissoires
418*0bb3ed71SBenjamin Tissoiresclass Win8TSConfidence(Digitizer):
419*0bb3ed71SBenjamin Tissoires    def __init__(self, max_slots):
420*0bb3ed71SBenjamin Tissoires        self.max_slots = max_slots
421*0bb3ed71SBenjamin Tissoires        self.phys_max = 120, 90
422*0bb3ed71SBenjamin Tissoires        rdesc_finger_str = f"""
423*0bb3ed71SBenjamin Tissoires            Usage Page (Digitizers)
424*0bb3ed71SBenjamin Tissoires            Usage (Finger)
425*0bb3ed71SBenjamin Tissoires            Collection (Logical)
426*0bb3ed71SBenjamin Tissoires             Report Size (1)
427*0bb3ed71SBenjamin Tissoires             Report Count (1)
428*0bb3ed71SBenjamin Tissoires             Logical Minimum (0)
429*0bb3ed71SBenjamin Tissoires             Logical Maximum (1)
430*0bb3ed71SBenjamin Tissoires             Usage (Tip Switch)
431*0bb3ed71SBenjamin Tissoires             Input (Data,Var,Abs)
432*0bb3ed71SBenjamin Tissoires             Usage (Confidence)
433*0bb3ed71SBenjamin Tissoires             Input (Data,Var,Abs)
434*0bb3ed71SBenjamin Tissoires             Report Size (6)
435*0bb3ed71SBenjamin Tissoires             Logical Maximum (127)
436*0bb3ed71SBenjamin Tissoires             Input (Cnst,Var,Abs)
437*0bb3ed71SBenjamin Tissoires             Report Size (8)
438*0bb3ed71SBenjamin Tissoires             Logical Maximum (255)
439*0bb3ed71SBenjamin Tissoires             Usage (Contact Id)
440*0bb3ed71SBenjamin Tissoires             Input (Data,Var,Abs)
441*0bb3ed71SBenjamin Tissoires             Report Size (16)
442*0bb3ed71SBenjamin Tissoires             Unit Exponent (-1)
443*0bb3ed71SBenjamin Tissoires             Unit (SILinear: cm)
444*0bb3ed71SBenjamin Tissoires             Logical Maximum (4095)
445*0bb3ed71SBenjamin Tissoires             Physical Minimum (0)
446*0bb3ed71SBenjamin Tissoires             Physical Maximum ({self.phys_max[0]})
447*0bb3ed71SBenjamin Tissoires             Usage Page (Generic Desktop)
448*0bb3ed71SBenjamin Tissoires             Usage (X)
449*0bb3ed71SBenjamin Tissoires             Input (Data,Var,Abs)
450*0bb3ed71SBenjamin Tissoires             Physical Maximum ({self.phys_max[1]})
451*0bb3ed71SBenjamin Tissoires             Usage (Y)
452*0bb3ed71SBenjamin Tissoires             Input (Data,Var,Abs)
453*0bb3ed71SBenjamin Tissoires             Usage Page (Digitizers)
454*0bb3ed71SBenjamin Tissoires             Usage (Azimuth)
455*0bb3ed71SBenjamin Tissoires             Logical Maximum (360)
456*0bb3ed71SBenjamin Tissoires             Unit (SILinear: deg)
457*0bb3ed71SBenjamin Tissoires             Report Size (16)
458*0bb3ed71SBenjamin Tissoires             Input (Data,Var,Abs)
459*0bb3ed71SBenjamin Tissoires            End Collection
460*0bb3ed71SBenjamin Tissoires"""
461*0bb3ed71SBenjamin Tissoires        rdesc_str = f"""
462*0bb3ed71SBenjamin Tissoires           Usage Page (Digitizers)
463*0bb3ed71SBenjamin Tissoires           Usage (Touch Screen)
464*0bb3ed71SBenjamin Tissoires           Collection (Application)
465*0bb3ed71SBenjamin Tissoires            Report ID (1)
466*0bb3ed71SBenjamin Tissoires            {rdesc_finger_str * self.max_slots}
467*0bb3ed71SBenjamin Tissoires            Unit Exponent (-4)
468*0bb3ed71SBenjamin Tissoires            Unit (SILinear: s)
469*0bb3ed71SBenjamin Tissoires            Logical Maximum (65535)
470*0bb3ed71SBenjamin Tissoires            Physical Maximum (65535)
471*0bb3ed71SBenjamin Tissoires            Usage Page (Digitizers)
472*0bb3ed71SBenjamin Tissoires            Usage (Scan Time)
473*0bb3ed71SBenjamin Tissoires            Input (Data,Var,Abs)
474*0bb3ed71SBenjamin Tissoires            Report Size (8)
475*0bb3ed71SBenjamin Tissoires            Logical Maximum (255)
476*0bb3ed71SBenjamin Tissoires            Usage (Contact Count)
477*0bb3ed71SBenjamin Tissoires            Input (Data,Var,Abs)
478*0bb3ed71SBenjamin Tissoires            Report ID (2)
479*0bb3ed71SBenjamin Tissoires            Logical Maximum ({self.max_slots})
480*0bb3ed71SBenjamin Tissoires            Usage (Contact Max)
481*0bb3ed71SBenjamin Tissoires            Feature (Data,Var,Abs)
482*0bb3ed71SBenjamin Tissoires          End Collection
483*0bb3ed71SBenjamin Tissoires          {Digitizer.msCertificationBlob(68)}
484*0bb3ed71SBenjamin Tissoires"""
485*0bb3ed71SBenjamin Tissoires        super().__init__(f"uhid test confidence {self.max_slots}", rdesc_str)
486*0bb3ed71SBenjamin Tissoires
487*0bb3ed71SBenjamin Tissoires
488*0bb3ed71SBenjamin Tissoiresclass SmartTechDigitizer(Digitizer):
489*0bb3ed71SBenjamin Tissoires    def __init__(self, name, input_info):
490*0bb3ed71SBenjamin Tissoires        super().__init__(
491*0bb3ed71SBenjamin Tissoires            name,
492*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 02 a1 01 85 01 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 95 03 75 01 81 02 95 05 81 03 05 01 15 00 26 ff 0f 55 0e 65 11 75 10 95 01 35 00 46 c8 37 09 30 81 02 46 68 1f 09 31 81 02 45 00 c0 c0 05 0d 09 06 15 00 26 ff 00 a1 01 85 02 75 08 95 3f 09 00 82 02 01 95 3f 09 00 92 02 01 c0 05 0d 09 04 a1 01 85 05 05 0d 09 20 a1 00 25 01 75 01 95 02 09 42 09 45 81 02 75 06 95 01 09 30 81 02 26 ff 00 75 08 09 51 81 02 75 10 09 38 81 02 95 02 26 ff 0f 09 48 09 49 81 02 05 01 09 30 09 31 81 02 c0 05 0d 09 20 a1 00 25 01 75 01 95 02 09 42 09 45 81 02 75 06 95 01 09 30 81 02 26 ff 00 75 08 09 51 81 02 75 10 09 38 81 02 95 02 26 ff 0f 09 48 09 49 81 02 05 01 09 30 09 31 81 02 c0 05 0d 09 20 a1 00 25 01 75 01 95 02 09 42 09 45 81 02 75 06 95 01 09 30 81 02 26 ff 00 75 08 09 51 81 02 75 10 09 38 81 02 95 02 26 ff 0f 09 48 09 49 81 02 05 01 09 30 09 31 81 02 c0 05 0d 09 20 a1 00 25 01 75 01 95 02 09 42 09 45 81 02 75 06 95 01 09 30 81 02 26 ff 00 75 08 09 51 81 02 75 10 09 38 81 02 95 02 26 ff 0f 09 48 09 49 81 02 05 01 09 30 09 31 81 02 c0 05 0d 75 08 95 01 15 00 25 0a 09 54 81 02 09 55 b1 02 c0 05 0d 09 0e a1 01 85 04 09 23 a1 02 15 00 25 02 75 08 95 02 09 52 09 53 b1 02 c0 c0 05 0d 09 04 a1 01 85 03 05 0d 09 22 a1 02 15 00 25 01 75 01 95 02 09 42 09 47 81 02 95 02 81 03 75 04 95 01 25 0f 09 30 81 02 26 ff 00 75 08 95 01 09 51 81 02 75 10 27 a0 8c 00 00 55 0e 65 14 47 a0 8c 00 00 09 3f 81 02 65 11 26 ff 0f 46 c8 37 09 48 81 02 46 68 1f 09 49 81 02 05 01 46 c8 37 09 30 81 02 46 68 1f 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 15 00 25 01 75 01 95 02 09 42 09 47 81 02 95 02 81 03 75 04 95 01 25 0f 09 30 81 02 26 ff 00 75 08 95 01 09 51 81 02 75 10 27 a0 8c 00 00 55 0e 65 14 47 a0 8c 00 00 09 3f 81 02 65 11 26 ff 0f 46 c8 37 09 48 81 02 46 68 1f 09 49 81 02 05 01 46 c8 37 09 30 81 02 46 68 1f 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 15 00 25 01 75 01 95 02 09 42 09 47 81 02 95 02 81 03 75 04 95 01 25 0f 09 30 81 02 26 ff 00 75 08 95 01 09 51 81 02 75 10 27 a0 8c 00 00 55 0e 65 14 47 a0 8c 00 00 09 3f 81 02 65 11 26 ff 0f 46 c8 37 09 48 81 02 46 68 1f 09 49 81 02 05 01 46 c8 37 09 30 81 02 46 68 1f 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 15 00 25 01 75 01 95 02 09 42 09 47 81 02 95 02 81 03 75 04 95 01 25 0f 09 30 81 02 26 ff 00 75 08 95 01 09 51 81 02 75 10 27 a0 8c 00 00 55 0e 65 14 47 a0 8c 00 00 09 3f 81 02 65 11 26 ff 0f 46 c8 37 09 48 81 02 46 68 1f 09 49 81 02 05 01 46 c8 37 09 30 81 02 46 68 1f 09 31 81 02 45 00 c0 05 0d 75 08 95 01 15 00 25 0a 09 54 81 02 09 55 b1 02 c0 05 0d 09 04 a1 01 85 06 09 22 a1 02 15 00 25 01 75 01 95 02 09 42 09 47 81 02 95 06 81 03 95 01 75 10 65 11 55 0e 26 ff 0f 46 c8 37 09 48 81 02 46 68 1f 09 49 81 02 05 01 46 c8 37 09 30 81 02 46 68 1f 09 31 81 02 45 00 c0 c0 05 0d 09 02 a1 01 85 07 09 20 a1 02 25 01 75 01 95 04 09 42 09 44 09 3c 09 45 81 02 75 04 95 01 25 0f 09 30 81 02 26 ff 00 75 08 09 38 81 02 75 10 27 a0 8c 00 00 55 0e 65 14 47 a0 8c 00 00 09 3f 81 02 65 11 26 ff 0f 46 c8 37 09 48 81 02 46 68 1f 09 49 81 02 05 01 46 c8 37 09 30 81 02 46 68 1f 09 31 81 02 45 00 c0 c0 05 0d 09 02 a1 01 85 08 09 20 a1 02 25 01 75 01 95 04 09 42 09 44 09 3c 09 45 81 02 75 04 95 01 25 0f 09 30 81 02 26 ff 00 75 08 09 38 81 02 75 10 27 a0 8c 00 00 55 0e 65 14 47 a0 8c 00 00 09 3f 81 02 65 11 26 ff 0f 46 c8 37 09 48 81 02 46 68 1f 09 49 81 02 05 01 46 c8 37 09 30 81 02 46 68 1f 09 31 81 02 45 00 c0 c0 05 0d 09 02 a1 01 85 09 09 20 a1 02 25 01 75 01 95 04 09 42 09 44 09 3c 09 45 81 02 75 04 95 01 25 0f 09 30 81 02 26 ff 00 75 08 09 38 81 02 75 10 27 a0 8c 00 00 55 0e 65 14 47 a0 8c 00 00 09 3f 81 02 65 11 26 ff 0f 46 c8 37 09 48 81 02 46 68 1f 09 49 81 02 05 01 46 c8 37 09 30 81 02 46 68 1f 09 31 81 02 45 00 c0 c0 05 0d 09 02 a1 01 85 0a 09 20 a1 02 25 01 75 01 95 04 09 42 09 44 09 3c 09 45 81 02 75 04 95 01 25 0f 09 30 81 02 26 ff 00 75 08 09 38 81 02 75 10 27 a0 8c 00 00 55 0e 65 14 47 a0 8c 00 00 09 3f 81 02 65 11 26 ff 0f 46 c8 37 09 48 81 02 46 68 1f 09 49 81 02 05 01 46 c8 37 09 30 81 02 46 68 1f 09 31 81 02 45 00 c0 c0",
493*0bb3ed71SBenjamin Tissoires            input_info=input_info,
494*0bb3ed71SBenjamin Tissoires        )
495*0bb3ed71SBenjamin Tissoires
496*0bb3ed71SBenjamin Tissoires    def create_report(self, data, global_data=None, reportID=None, application=None):
497*0bb3ed71SBenjamin Tissoires        # this device has *a lot* of different reports, and most of them
498*0bb3ed71SBenjamin Tissoires        # have the Touch Screen application. But the first one is a stylus
499*0bb3ed71SBenjamin Tissoires        # report (as stated in the physical type), so we simply override
500*0bb3ed71SBenjamin Tissoires        # the report ID to use what the device sends
501*0bb3ed71SBenjamin Tissoires        return super().create_report(data, global_data=global_data, reportID=3)
502*0bb3ed71SBenjamin Tissoires
503*0bb3ed71SBenjamin Tissoires    def match_evdev_rule(self, application, evdev):
504*0bb3ed71SBenjamin Tissoires        # we need to select the correct evdev node, as the device has multiple
505*0bb3ed71SBenjamin Tissoires        # Touch Screen application collections
506*0bb3ed71SBenjamin Tissoires        if application != "Touch Screen":
507*0bb3ed71SBenjamin Tissoires            return True
508*0bb3ed71SBenjamin Tissoires        absinfo = evdev.absinfo[libevdev.EV_ABS.ABS_MT_POSITION_X]
509*0bb3ed71SBenjamin Tissoires        return absinfo is not None and absinfo.resolution == 3
510*0bb3ed71SBenjamin Tissoires
511*0bb3ed71SBenjamin Tissoires
512*0bb3ed71SBenjamin Tissoiresclass BaseTest:
513*0bb3ed71SBenjamin Tissoires    class TestMultitouch(base.BaseTestCase.TestUhid):
514*0bb3ed71SBenjamin Tissoires        kernel_modules = [KERNEL_MODULE]
515*0bb3ed71SBenjamin Tissoires
516*0bb3ed71SBenjamin Tissoires        def create_device(self):
517*0bb3ed71SBenjamin Tissoires            raise Exception("please reimplement me in subclasses")
518*0bb3ed71SBenjamin Tissoires
519*0bb3ed71SBenjamin Tissoires        def get_slot(self, uhdev, t, default):
520*0bb3ed71SBenjamin Tissoires            if uhdev.quirks is None:
521*0bb3ed71SBenjamin Tissoires                return default
522*0bb3ed71SBenjamin Tissoires
523*0bb3ed71SBenjamin Tissoires            if "SLOT_IS_CONTACTID" in uhdev.quirks:
524*0bb3ed71SBenjamin Tissoires                return t.contactid
525*0bb3ed71SBenjamin Tissoires
526*0bb3ed71SBenjamin Tissoires            if "SLOT_IS_CONTACTID_MINUS_ONE" in uhdev.quirks:
527*0bb3ed71SBenjamin Tissoires                return t.contactid - 1
528*0bb3ed71SBenjamin Tissoires
529*0bb3ed71SBenjamin Tissoires            return default
530*0bb3ed71SBenjamin Tissoires
531*0bb3ed71SBenjamin Tissoires        def test_creation(self):
532*0bb3ed71SBenjamin Tissoires            """Make sure the device gets processed by the kernel and creates
533*0bb3ed71SBenjamin Tissoires            the expected application input node.
534*0bb3ed71SBenjamin Tissoires
535*0bb3ed71SBenjamin Tissoires            If this fail, there is something wrong in the device report
536*0bb3ed71SBenjamin Tissoires            descriptors."""
537*0bb3ed71SBenjamin Tissoires            super().test_creation()
538*0bb3ed71SBenjamin Tissoires
539*0bb3ed71SBenjamin Tissoires            uhdev = self.uhdev
540*0bb3ed71SBenjamin Tissoires            evdev = uhdev.get_evdev()
541*0bb3ed71SBenjamin Tissoires
542*0bb3ed71SBenjamin Tissoires            # some sanity checking for the quirks
543*0bb3ed71SBenjamin Tissoires            if uhdev.quirks is not None:
544*0bb3ed71SBenjamin Tissoires                for q in uhdev.quirks:
545*0bb3ed71SBenjamin Tissoires                    assert q in mt_quirks
546*0bb3ed71SBenjamin Tissoires
547*0bb3ed71SBenjamin Tissoires            assert evdev.num_slots == uhdev.max_contacts
548*0bb3ed71SBenjamin Tissoires
549*0bb3ed71SBenjamin Tissoires            if uhdev.max_contacts > 1:
550*0bb3ed71SBenjamin Tissoires                assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
551*0bb3ed71SBenjamin Tissoires                assert evdev.slots[1][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
552*0bb3ed71SBenjamin Tissoires            if uhdev.max_contacts > 2:
553*0bb3ed71SBenjamin Tissoires                assert evdev.slots[2][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
554*0bb3ed71SBenjamin Tissoires
555*0bb3ed71SBenjamin Tissoires        def test_required_usages(self):
556*0bb3ed71SBenjamin Tissoires            """Make sure the device exports the correct required features and
557*0bb3ed71SBenjamin Tissoires            inputs."""
558*0bb3ed71SBenjamin Tissoires            uhdev = self.uhdev
559*0bb3ed71SBenjamin Tissoires            rdesc = uhdev.parsed_rdesc
560*0bb3ed71SBenjamin Tissoires            for feature in rdesc.feature_reports.values():
561*0bb3ed71SBenjamin Tissoires                for field in feature:
562*0bb3ed71SBenjamin Tissoires                    page_id = field.usage >> 16
563*0bb3ed71SBenjamin Tissoires                    value = field.usage & 0xFF
564*0bb3ed71SBenjamin Tissoires                    try:
565*0bb3ed71SBenjamin Tissoires                        if HUT[page_id][value] == "Contact Max":
566*0bb3ed71SBenjamin Tissoires                            assert HUT[page_id][field.application] in [
567*0bb3ed71SBenjamin Tissoires                                "Touch Screen",
568*0bb3ed71SBenjamin Tissoires                                "Touch Pad",
569*0bb3ed71SBenjamin Tissoires                                "System Multi-Axis Controller",
570*0bb3ed71SBenjamin Tissoires                            ]
571*0bb3ed71SBenjamin Tissoires                    except KeyError:
572*0bb3ed71SBenjamin Tissoires                        pass
573*0bb3ed71SBenjamin Tissoires
574*0bb3ed71SBenjamin Tissoires                    try:
575*0bb3ed71SBenjamin Tissoires                        if HUT[page_id][value] == "Inputmode":
576*0bb3ed71SBenjamin Tissoires                            assert HUT[page_id][field.application] in [
577*0bb3ed71SBenjamin Tissoires                                "Touch Screen",
578*0bb3ed71SBenjamin Tissoires                                "Touch Pad",
579*0bb3ed71SBenjamin Tissoires                                "Device Configuration",
580*0bb3ed71SBenjamin Tissoires                            ]
581*0bb3ed71SBenjamin Tissoires                    except KeyError:
582*0bb3ed71SBenjamin Tissoires                        pass
583*0bb3ed71SBenjamin Tissoires
584*0bb3ed71SBenjamin Tissoires        def test_mt_single_touch(self):
585*0bb3ed71SBenjamin Tissoires            """send a single touch in the first slot of the device,
586*0bb3ed71SBenjamin Tissoires            and release it."""
587*0bb3ed71SBenjamin Tissoires            uhdev = self.uhdev
588*0bb3ed71SBenjamin Tissoires            evdev = uhdev.get_evdev()
589*0bb3ed71SBenjamin Tissoires
590*0bb3ed71SBenjamin Tissoires            t0 = Touch(1, 50, 100)
591*0bb3ed71SBenjamin Tissoires            r = uhdev.event([t0])
592*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
593*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
594*0bb3ed71SBenjamin Tissoires
595*0bb3ed71SBenjamin Tissoires            slot = self.get_slot(uhdev, t0, 0)
596*0bb3ed71SBenjamin Tissoires
597*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH, 1) in events
598*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 0
599*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot][libevdev.EV_ABS.ABS_MT_POSITION_X] == 50
600*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot][libevdev.EV_ABS.ABS_MT_POSITION_Y] == 100
601*0bb3ed71SBenjamin Tissoires
602*0bb3ed71SBenjamin Tissoires            t0.tipswitch = False
603*0bb3ed71SBenjamin Tissoires            if uhdev.quirks is None or "VALID_IS_INRANGE" not in uhdev.quirks:
604*0bb3ed71SBenjamin Tissoires                t0.inrange = False
605*0bb3ed71SBenjamin Tissoires            r = uhdev.event([t0])
606*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
607*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
608*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH, 0) in events
609*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
610*0bb3ed71SBenjamin Tissoires
611*0bb3ed71SBenjamin Tissoires        def test_mt_dual_touch(self):
612*0bb3ed71SBenjamin Tissoires            """Send 2 touches in the first 2 slots.
613*0bb3ed71SBenjamin Tissoires            Make sure the kernel sees this as a dual touch.
614*0bb3ed71SBenjamin Tissoires            Release and check
615*0bb3ed71SBenjamin Tissoires
616*0bb3ed71SBenjamin Tissoires            Note: PTP will send here BTN_DOUBLETAP emulation"""
617*0bb3ed71SBenjamin Tissoires            uhdev = self.uhdev
618*0bb3ed71SBenjamin Tissoires            evdev = uhdev.get_evdev()
619*0bb3ed71SBenjamin Tissoires
620*0bb3ed71SBenjamin Tissoires            t0 = Touch(1, 50, 100)
621*0bb3ed71SBenjamin Tissoires            t1 = Touch(2, 150, 200)
622*0bb3ed71SBenjamin Tissoires
623*0bb3ed71SBenjamin Tissoires            if uhdev.quirks is not None and (
624*0bb3ed71SBenjamin Tissoires                "SLOT_IS_CONTACTID" in uhdev.quirks
625*0bb3ed71SBenjamin Tissoires                or "SLOT_IS_CONTACTNUMBER" in uhdev.quirks
626*0bb3ed71SBenjamin Tissoires            ):
627*0bb3ed71SBenjamin Tissoires                t1.contactid = 0
628*0bb3ed71SBenjamin Tissoires
629*0bb3ed71SBenjamin Tissoires            slot0 = self.get_slot(uhdev, t0, 0)
630*0bb3ed71SBenjamin Tissoires            slot1 = self.get_slot(uhdev, t1, 1)
631*0bb3ed71SBenjamin Tissoires
632*0bb3ed71SBenjamin Tissoires            r = uhdev.event([t0])
633*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
634*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
635*0bb3ed71SBenjamin Tissoires
636*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH, 1) in events
637*0bb3ed71SBenjamin Tissoires            assert evdev.value[libevdev.EV_KEY.BTN_TOUCH] == 1
638*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 0
639*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot0][libevdev.EV_ABS.ABS_MT_POSITION_X] == 50
640*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot0][libevdev.EV_ABS.ABS_MT_POSITION_Y] == 100
641*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot1][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
642*0bb3ed71SBenjamin Tissoires
643*0bb3ed71SBenjamin Tissoires            r = uhdev.event([t0, t1])
644*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
645*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
646*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH) not in events
647*0bb3ed71SBenjamin Tissoires            assert evdev.value[libevdev.EV_KEY.BTN_TOUCH] == 1
648*0bb3ed71SBenjamin Tissoires            assert (
649*0bb3ed71SBenjamin Tissoires                libevdev.InputEvent(libevdev.EV_ABS.ABS_MT_POSITION_X, 5) not in events
650*0bb3ed71SBenjamin Tissoires            )
651*0bb3ed71SBenjamin Tissoires            assert (
652*0bb3ed71SBenjamin Tissoires                libevdev.InputEvent(libevdev.EV_ABS.ABS_MT_POSITION_Y, 10) not in events
653*0bb3ed71SBenjamin Tissoires            )
654*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 0
655*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot0][libevdev.EV_ABS.ABS_MT_POSITION_X] == 50
656*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot0][libevdev.EV_ABS.ABS_MT_POSITION_Y] == 100
657*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot1][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 1
658*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot1][libevdev.EV_ABS.ABS_MT_POSITION_X] == 150
659*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot1][libevdev.EV_ABS.ABS_MT_POSITION_Y] == 200
660*0bb3ed71SBenjamin Tissoires
661*0bb3ed71SBenjamin Tissoires            t0.tipswitch = False
662*0bb3ed71SBenjamin Tissoires            if uhdev.quirks is None or "VALID_IS_INRANGE" not in uhdev.quirks:
663*0bb3ed71SBenjamin Tissoires                t0.inrange = False
664*0bb3ed71SBenjamin Tissoires            r = uhdev.event([t0, t1])
665*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
666*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
667*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
668*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot1][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 1
669*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_ABS.ABS_MT_POSITION_X) not in events
670*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_ABS.ABS_MT_POSITION_Y) not in events
671*0bb3ed71SBenjamin Tissoires
672*0bb3ed71SBenjamin Tissoires            t1.tipswitch = False
673*0bb3ed71SBenjamin Tissoires            if uhdev.quirks is None or "VALID_IS_INRANGE" not in uhdev.quirks:
674*0bb3ed71SBenjamin Tissoires                t1.inrange = False
675*0bb3ed71SBenjamin Tissoires
676*0bb3ed71SBenjamin Tissoires            if uhdev.quirks is not None and "SLOT_IS_CONTACTNUMBER" in uhdev.quirks:
677*0bb3ed71SBenjamin Tissoires                r = uhdev.event([t0, t1])
678*0bb3ed71SBenjamin Tissoires            else:
679*0bb3ed71SBenjamin Tissoires                r = uhdev.event([t1])
680*0bb3ed71SBenjamin Tissoires
681*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
682*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
683*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
684*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot1][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
685*0bb3ed71SBenjamin Tissoires
686*0bb3ed71SBenjamin Tissoires        @pytest.mark.skip_if_uhdev(
687*0bb3ed71SBenjamin Tissoires            lambda uhdev: uhdev.max_contacts <= 2, "Device not compatible"
688*0bb3ed71SBenjamin Tissoires        )
689*0bb3ed71SBenjamin Tissoires        def test_mt_triple_tap(self):
690*0bb3ed71SBenjamin Tissoires            """Send 3 touches in the first 3 slots.
691*0bb3ed71SBenjamin Tissoires            Make sure the kernel sees this as a triple touch.
692*0bb3ed71SBenjamin Tissoires            Release and check
693*0bb3ed71SBenjamin Tissoires
694*0bb3ed71SBenjamin Tissoires            Note: PTP will send here BTN_TRIPLETAP emulation"""
695*0bb3ed71SBenjamin Tissoires            uhdev = self.uhdev
696*0bb3ed71SBenjamin Tissoires            evdev = uhdev.get_evdev()
697*0bb3ed71SBenjamin Tissoires
698*0bb3ed71SBenjamin Tissoires            t0 = Touch(1, 50, 100)
699*0bb3ed71SBenjamin Tissoires            t1 = Touch(2, 150, 200)
700*0bb3ed71SBenjamin Tissoires            t2 = Touch(3, 250, 300)
701*0bb3ed71SBenjamin Tissoires            r = uhdev.event([t0, t1, t2])
702*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
703*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
704*0bb3ed71SBenjamin Tissoires
705*0bb3ed71SBenjamin Tissoires            slot0 = self.get_slot(uhdev, t0, 0)
706*0bb3ed71SBenjamin Tissoires            slot1 = self.get_slot(uhdev, t1, 1)
707*0bb3ed71SBenjamin Tissoires            slot2 = self.get_slot(uhdev, t2, 2)
708*0bb3ed71SBenjamin Tissoires
709*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 0
710*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot0][libevdev.EV_ABS.ABS_MT_POSITION_X] == 50
711*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot0][libevdev.EV_ABS.ABS_MT_POSITION_Y] == 100
712*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot1][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 1
713*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot1][libevdev.EV_ABS.ABS_MT_POSITION_X] == 150
714*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot1][libevdev.EV_ABS.ABS_MT_POSITION_Y] == 200
715*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot2][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 2
716*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot2][libevdev.EV_ABS.ABS_MT_POSITION_X] == 250
717*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot2][libevdev.EV_ABS.ABS_MT_POSITION_Y] == 300
718*0bb3ed71SBenjamin Tissoires
719*0bb3ed71SBenjamin Tissoires            t0.tipswitch = False
720*0bb3ed71SBenjamin Tissoires            t1.tipswitch = False
721*0bb3ed71SBenjamin Tissoires            t2.tipswitch = False
722*0bb3ed71SBenjamin Tissoires            if uhdev.quirks is None or "VALID_IS_INRANGE" not in uhdev.quirks:
723*0bb3ed71SBenjamin Tissoires                t0.inrange = False
724*0bb3ed71SBenjamin Tissoires                t1.inrange = False
725*0bb3ed71SBenjamin Tissoires                t2.inrange = False
726*0bb3ed71SBenjamin Tissoires            r = uhdev.event([t0, t1, t2])
727*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
728*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
729*0bb3ed71SBenjamin Tissoires
730*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
731*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot1][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
732*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot2][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
733*0bb3ed71SBenjamin Tissoires
734*0bb3ed71SBenjamin Tissoires        @pytest.mark.skip_if_uhdev(
735*0bb3ed71SBenjamin Tissoires            lambda uhdev: uhdev.max_contacts <= 2, "Device not compatible"
736*0bb3ed71SBenjamin Tissoires        )
737*0bb3ed71SBenjamin Tissoires        def test_mt_max_contact(self):
738*0bb3ed71SBenjamin Tissoires            """send the maximum number of contact as reported by the device.
739*0bb3ed71SBenjamin Tissoires            Make sure all contacts are forwarded and that there is no miss.
740*0bb3ed71SBenjamin Tissoires            Release and check."""
741*0bb3ed71SBenjamin Tissoires            uhdev = self.uhdev
742*0bb3ed71SBenjamin Tissoires            evdev = uhdev.get_evdev()
743*0bb3ed71SBenjamin Tissoires
744*0bb3ed71SBenjamin Tissoires            touches = [
745*0bb3ed71SBenjamin Tissoires                Touch(i, (i + 3) * 20, (i + 3) * 20 + 5)
746*0bb3ed71SBenjamin Tissoires                for i in range(uhdev.max_contacts)
747*0bb3ed71SBenjamin Tissoires            ]
748*0bb3ed71SBenjamin Tissoires            if (
749*0bb3ed71SBenjamin Tissoires                uhdev.quirks is not None
750*0bb3ed71SBenjamin Tissoires                and "SLOT_IS_CONTACTID_MINUS_ONE" in uhdev.quirks
751*0bb3ed71SBenjamin Tissoires            ):
752*0bb3ed71SBenjamin Tissoires                for t in touches:
753*0bb3ed71SBenjamin Tissoires                    t.contactid += 1
754*0bb3ed71SBenjamin Tissoires            r = uhdev.event(touches)
755*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
756*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
757*0bb3ed71SBenjamin Tissoires            for i, t in enumerate(touches):
758*0bb3ed71SBenjamin Tissoires                slot = self.get_slot(uhdev, t, i)
759*0bb3ed71SBenjamin Tissoires
760*0bb3ed71SBenjamin Tissoires                assert evdev.slots[slot][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == i
761*0bb3ed71SBenjamin Tissoires                assert evdev.slots[slot][libevdev.EV_ABS.ABS_MT_POSITION_X] == t.x
762*0bb3ed71SBenjamin Tissoires                assert evdev.slots[slot][libevdev.EV_ABS.ABS_MT_POSITION_Y] == t.y
763*0bb3ed71SBenjamin Tissoires
764*0bb3ed71SBenjamin Tissoires            for t in touches:
765*0bb3ed71SBenjamin Tissoires                t.tipswitch = False
766*0bb3ed71SBenjamin Tissoires                if uhdev.quirks is None or "VALID_IS_INRANGE" not in uhdev.quirks:
767*0bb3ed71SBenjamin Tissoires                    t.inrange = False
768*0bb3ed71SBenjamin Tissoires
769*0bb3ed71SBenjamin Tissoires            r = uhdev.event(touches)
770*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
771*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
772*0bb3ed71SBenjamin Tissoires            for i, t in enumerate(touches):
773*0bb3ed71SBenjamin Tissoires                slot = self.get_slot(uhdev, t, i)
774*0bb3ed71SBenjamin Tissoires
775*0bb3ed71SBenjamin Tissoires                assert evdev.slots[slot][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
776*0bb3ed71SBenjamin Tissoires
777*0bb3ed71SBenjamin Tissoires        @pytest.mark.skip_if_uhdev(
778*0bb3ed71SBenjamin Tissoires            lambda uhdev: (
779*0bb3ed71SBenjamin Tissoires                uhdev.touches_in_a_report == 1
780*0bb3ed71SBenjamin Tissoires                or uhdev.quirks is not None
781*0bb3ed71SBenjamin Tissoires                and "CONTACT_CNT_ACCURATE" not in uhdev.quirks
782*0bb3ed71SBenjamin Tissoires            ),
783*0bb3ed71SBenjamin Tissoires            "Device not compatible, we can not trigger the conditions",
784*0bb3ed71SBenjamin Tissoires        )
785*0bb3ed71SBenjamin Tissoires        def test_mt_contact_count_accurate(self):
786*0bb3ed71SBenjamin Tissoires            """Test the MT_QUIRK_CONTACT_CNT_ACCURATE from the kernel.
787*0bb3ed71SBenjamin Tissoires            A report should forward an accurate contact count and the kernel
788*0bb3ed71SBenjamin Tissoires            should ignore any data provided after we have reached this
789*0bb3ed71SBenjamin Tissoires            contact count."""
790*0bb3ed71SBenjamin Tissoires            uhdev = self.uhdev
791*0bb3ed71SBenjamin Tissoires            evdev = uhdev.get_evdev()
792*0bb3ed71SBenjamin Tissoires
793*0bb3ed71SBenjamin Tissoires            t0 = Touch(1, 50, 100)
794*0bb3ed71SBenjamin Tissoires            t1 = Touch(2, 150, 200)
795*0bb3ed71SBenjamin Tissoires
796*0bb3ed71SBenjamin Tissoires            slot0 = self.get_slot(uhdev, t0, 0)
797*0bb3ed71SBenjamin Tissoires            slot1 = self.get_slot(uhdev, t1, 1)
798*0bb3ed71SBenjamin Tissoires
799*0bb3ed71SBenjamin Tissoires            r = uhdev.event([t0, t1], contact_count=1)
800*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
801*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
802*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH, 1) in events
803*0bb3ed71SBenjamin Tissoires            assert evdev.value[libevdev.EV_KEY.BTN_TOUCH] == 1
804*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_ABS.ABS_MT_TRACKING_ID, 0) in events
805*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 0
806*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot0][libevdev.EV_ABS.ABS_MT_POSITION_X] == 50
807*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot0][libevdev.EV_ABS.ABS_MT_POSITION_Y] == 100
808*0bb3ed71SBenjamin Tissoires            assert evdev.slots[slot1][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
809*0bb3ed71SBenjamin Tissoires
810*0bb3ed71SBenjamin Tissoires    class TestWin8Multitouch(TestMultitouch):
811*0bb3ed71SBenjamin Tissoires        def test_required_usages8(self):
812*0bb3ed71SBenjamin Tissoires            """Make sure the device exports the correct required features and
813*0bb3ed71SBenjamin Tissoires            inputs."""
814*0bb3ed71SBenjamin Tissoires            uhdev = self.uhdev
815*0bb3ed71SBenjamin Tissoires            rdesc = uhdev.parsed_rdesc
816*0bb3ed71SBenjamin Tissoires            for feature in rdesc.feature_reports.values():
817*0bb3ed71SBenjamin Tissoires                for field in feature:
818*0bb3ed71SBenjamin Tissoires                    page_id = field.usage >> 16
819*0bb3ed71SBenjamin Tissoires                    value = field.usage & 0xFF
820*0bb3ed71SBenjamin Tissoires                    try:
821*0bb3ed71SBenjamin Tissoires                        if HUT[page_id][value] == "Inputmode":
822*0bb3ed71SBenjamin Tissoires                            assert HUT[field.application] not in ["Touch Screen"]
823*0bb3ed71SBenjamin Tissoires                    except KeyError:
824*0bb3ed71SBenjamin Tissoires                        pass
825*0bb3ed71SBenjamin Tissoires
826*0bb3ed71SBenjamin Tissoires        @pytest.mark.skip_if_uhdev(
827*0bb3ed71SBenjamin Tissoires            lambda uhdev: uhdev.fields.count("X") == uhdev.touches_in_a_report,
828*0bb3ed71SBenjamin Tissoires            "Device not compatible, we can not trigger the conditions",
829*0bb3ed71SBenjamin Tissoires        )
830*0bb3ed71SBenjamin Tissoires        def test_mt_tx_cx(self):
831*0bb3ed71SBenjamin Tissoires            """send a single touch in the first slot of the device, with
832*0bb3ed71SBenjamin Tissoires            different values of Tx and Cx. Make sure the kernel reports Tx."""
833*0bb3ed71SBenjamin Tissoires            uhdev = self.uhdev
834*0bb3ed71SBenjamin Tissoires            evdev = uhdev.get_evdev()
835*0bb3ed71SBenjamin Tissoires
836*0bb3ed71SBenjamin Tissoires            t0 = Touch(1, 5, 10)
837*0bb3ed71SBenjamin Tissoires            t0.cx = 50
838*0bb3ed71SBenjamin Tissoires            t0.cy = 100
839*0bb3ed71SBenjamin Tissoires            r = uhdev.event([t0])
840*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
841*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
842*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH, 1) in events
843*0bb3ed71SBenjamin Tissoires            assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 0
844*0bb3ed71SBenjamin Tissoires            assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_POSITION_X] == 5
845*0bb3ed71SBenjamin Tissoires            assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TOOL_X] == 50
846*0bb3ed71SBenjamin Tissoires            assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_POSITION_Y] == 10
847*0bb3ed71SBenjamin Tissoires            assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TOOL_Y] == 100
848*0bb3ed71SBenjamin Tissoires
849*0bb3ed71SBenjamin Tissoires        @pytest.mark.skip_if_uhdev(
850*0bb3ed71SBenjamin Tissoires            lambda uhdev: "In Range" not in uhdev.fields,
851*0bb3ed71SBenjamin Tissoires            "Device not compatible, missing In Range usage",
852*0bb3ed71SBenjamin Tissoires        )
853*0bb3ed71SBenjamin Tissoires        def test_mt_inrange(self):
854*0bb3ed71SBenjamin Tissoires            """Send one contact that has the InRange bit set before/after
855*0bb3ed71SBenjamin Tissoires            tipswitch.
856*0bb3ed71SBenjamin Tissoires            Kernel is supposed to mark the contact with a distance > 0
857*0bb3ed71SBenjamin Tissoires            when inrange is set but not tipswitch.
858*0bb3ed71SBenjamin Tissoires
859*0bb3ed71SBenjamin Tissoires            This tests the hovering capability of devices (MT_QUIRK_HOVERING).
860*0bb3ed71SBenjamin Tissoires
861*0bb3ed71SBenjamin Tissoires            Make sure the contact is only released from the kernel POV
862*0bb3ed71SBenjamin Tissoires            when the inrange bit is set to 0."""
863*0bb3ed71SBenjamin Tissoires            uhdev = self.uhdev
864*0bb3ed71SBenjamin Tissoires            evdev = uhdev.get_evdev()
865*0bb3ed71SBenjamin Tissoires
866*0bb3ed71SBenjamin Tissoires            t0 = Touch(1, 150, 200)
867*0bb3ed71SBenjamin Tissoires            t0.tipswitch = False
868*0bb3ed71SBenjamin Tissoires            r = uhdev.event([t0])
869*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
870*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
871*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH, 1) in events
872*0bb3ed71SBenjamin Tissoires            assert evdev.value[libevdev.EV_KEY.BTN_TOUCH] == 1
873*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_ABS.ABS_MT_TRACKING_ID, 0) in events
874*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_ABS.ABS_MT_DISTANCE) in events
875*0bb3ed71SBenjamin Tissoires            assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_DISTANCE] > 0
876*0bb3ed71SBenjamin Tissoires            assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 0
877*0bb3ed71SBenjamin Tissoires            assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_POSITION_X] == 150
878*0bb3ed71SBenjamin Tissoires            assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_POSITION_Y] == 200
879*0bb3ed71SBenjamin Tissoires            assert evdev.slots[1][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
880*0bb3ed71SBenjamin Tissoires
881*0bb3ed71SBenjamin Tissoires            t0.tipswitch = True
882*0bb3ed71SBenjamin Tissoires            r = uhdev.event([t0])
883*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
884*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
885*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_ABS.ABS_MT_DISTANCE, 0) in events
886*0bb3ed71SBenjamin Tissoires            assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_DISTANCE] == 0
887*0bb3ed71SBenjamin Tissoires
888*0bb3ed71SBenjamin Tissoires            t0.tipswitch = False
889*0bb3ed71SBenjamin Tissoires            r = uhdev.event([t0])
890*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
891*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
892*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_ABS.ABS_MT_DISTANCE) in events
893*0bb3ed71SBenjamin Tissoires            assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_DISTANCE] > 0
894*0bb3ed71SBenjamin Tissoires
895*0bb3ed71SBenjamin Tissoires            t0.inrange = False
896*0bb3ed71SBenjamin Tissoires            r = uhdev.event([t0])
897*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
898*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
899*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH, 0) in events
900*0bb3ed71SBenjamin Tissoires            assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
901*0bb3ed71SBenjamin Tissoires
902*0bb3ed71SBenjamin Tissoires        def test_mt_duplicates(self):
903*0bb3ed71SBenjamin Tissoires            """Test the MT_QUIRK_IGNORE_DUPLICATES from the kernel.
904*0bb3ed71SBenjamin Tissoires            If a touch is reported more than once with the same Contact ID,
905*0bb3ed71SBenjamin Tissoires            we should only handle the first touch.
906*0bb3ed71SBenjamin Tissoires
907*0bb3ed71SBenjamin Tissoires            Note: this is not in MS spec, but the current kernel behaves
908*0bb3ed71SBenjamin Tissoires            like that"""
909*0bb3ed71SBenjamin Tissoires            uhdev = self.uhdev
910*0bb3ed71SBenjamin Tissoires            evdev = uhdev.get_evdev()
911*0bb3ed71SBenjamin Tissoires
912*0bb3ed71SBenjamin Tissoires            t0 = Touch(1, 5, 10)
913*0bb3ed71SBenjamin Tissoires            t1 = Touch(1, 15, 20)
914*0bb3ed71SBenjamin Tissoires            t2 = Touch(2, 50, 100)
915*0bb3ed71SBenjamin Tissoires
916*0bb3ed71SBenjamin Tissoires            r = uhdev.event([t0, t1, t2], contact_count=2)
917*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
918*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
919*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH, 1) in events
920*0bb3ed71SBenjamin Tissoires            assert evdev.value[libevdev.EV_KEY.BTN_TOUCH] == 1
921*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_ABS.ABS_MT_TRACKING_ID, 0) in events
922*0bb3ed71SBenjamin Tissoires            assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 0
923*0bb3ed71SBenjamin Tissoires            assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_POSITION_X] == 5
924*0bb3ed71SBenjamin Tissoires            assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_POSITION_Y] == 10
925*0bb3ed71SBenjamin Tissoires            assert evdev.slots[1][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 1
926*0bb3ed71SBenjamin Tissoires            assert evdev.slots[1][libevdev.EV_ABS.ABS_MT_POSITION_X] == 50
927*0bb3ed71SBenjamin Tissoires            assert evdev.slots[1][libevdev.EV_ABS.ABS_MT_POSITION_Y] == 100
928*0bb3ed71SBenjamin Tissoires
929*0bb3ed71SBenjamin Tissoires        def test_mt_release_miss(self):
930*0bb3ed71SBenjamin Tissoires            """send a single touch in the first slot of the device, and
931*0bb3ed71SBenjamin Tissoires            forget to release it. The kernel is supposed to release by itself
932*0bb3ed71SBenjamin Tissoires            the touch in 100ms.
933*0bb3ed71SBenjamin Tissoires            Make sure that we are dealing with a new touch by resending the
934*0bb3ed71SBenjamin Tissoires            same touch after the timeout expired, and check that the kernel
935*0bb3ed71SBenjamin Tissoires            considers it as a separate touch (different tracking ID)"""
936*0bb3ed71SBenjamin Tissoires            uhdev = self.uhdev
937*0bb3ed71SBenjamin Tissoires            evdev = uhdev.get_evdev()
938*0bb3ed71SBenjamin Tissoires
939*0bb3ed71SBenjamin Tissoires            t0 = Touch(1, 5, 10)
940*0bb3ed71SBenjamin Tissoires            r = uhdev.event([t0])
941*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
942*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
943*0bb3ed71SBenjamin Tissoires            assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 0
944*0bb3ed71SBenjamin Tissoires
945*0bb3ed71SBenjamin Tissoires            time.sleep(0.2)
946*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
947*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
948*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH, 0) in events
949*0bb3ed71SBenjamin Tissoires            assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
950*0bb3ed71SBenjamin Tissoires
951*0bb3ed71SBenjamin Tissoires            r = uhdev.event([t0])
952*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
953*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
954*0bb3ed71SBenjamin Tissoires            assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 1
955*0bb3ed71SBenjamin Tissoires
956*0bb3ed71SBenjamin Tissoires        @pytest.mark.skip_if_uhdev(
957*0bb3ed71SBenjamin Tissoires            lambda uhdev: "Azimuth" not in uhdev.fields,
958*0bb3ed71SBenjamin Tissoires            "Device not compatible, missing Azimuth usage",
959*0bb3ed71SBenjamin Tissoires        )
960*0bb3ed71SBenjamin Tissoires        def test_mt_azimuth(self):
961*0bb3ed71SBenjamin Tissoires            """Check for the azimtuh information bit.
962*0bb3ed71SBenjamin Tissoires            When azimuth is presented by the device, it should be exported
963*0bb3ed71SBenjamin Tissoires            as ABS_MT_ORIENTATION and the exported value should report a quarter
964*0bb3ed71SBenjamin Tissoires            of circle."""
965*0bb3ed71SBenjamin Tissoires            uhdev = self.uhdev
966*0bb3ed71SBenjamin Tissoires
967*0bb3ed71SBenjamin Tissoires            t0 = Touch(1, 5, 10)
968*0bb3ed71SBenjamin Tissoires            t0.azimuth = 270
969*0bb3ed71SBenjamin Tissoires
970*0bb3ed71SBenjamin Tissoires            r = uhdev.event([t0])
971*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
972*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
973*0bb3ed71SBenjamin Tissoires
974*0bb3ed71SBenjamin Tissoires            # orientation is clockwise, while Azimuth is counter clockwise
975*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_ABS.ABS_MT_ORIENTATION, 90) in events
976*0bb3ed71SBenjamin Tissoires
977*0bb3ed71SBenjamin Tissoires    class TestPTP(TestWin8Multitouch):
978*0bb3ed71SBenjamin Tissoires        def test_ptp_buttons(self):
979*0bb3ed71SBenjamin Tissoires            """check for button reliability.
980*0bb3ed71SBenjamin Tissoires            There are 2 types of touchpads: the click pads and the pressure pads.
981*0bb3ed71SBenjamin Tissoires            Each should reliably report the BTN_LEFT events.
982*0bb3ed71SBenjamin Tissoires            """
983*0bb3ed71SBenjamin Tissoires            uhdev = self.uhdev
984*0bb3ed71SBenjamin Tissoires            evdev = uhdev.get_evdev()
985*0bb3ed71SBenjamin Tissoires
986*0bb3ed71SBenjamin Tissoires            if uhdev.type == "clickpad":
987*0bb3ed71SBenjamin Tissoires                r = uhdev.event(click=True)
988*0bb3ed71SBenjamin Tissoires                events = uhdev.next_sync_events()
989*0bb3ed71SBenjamin Tissoires                self.debug_reports(r, uhdev, events)
990*0bb3ed71SBenjamin Tissoires                assert libevdev.InputEvent(libevdev.EV_KEY.BTN_LEFT, 1) in events
991*0bb3ed71SBenjamin Tissoires                assert evdev.value[libevdev.EV_KEY.BTN_LEFT] == 1
992*0bb3ed71SBenjamin Tissoires
993*0bb3ed71SBenjamin Tissoires                r = uhdev.event(click=False)
994*0bb3ed71SBenjamin Tissoires                events = uhdev.next_sync_events()
995*0bb3ed71SBenjamin Tissoires                self.debug_reports(r, uhdev, events)
996*0bb3ed71SBenjamin Tissoires                assert libevdev.InputEvent(libevdev.EV_KEY.BTN_LEFT, 0) in events
997*0bb3ed71SBenjamin Tissoires                assert evdev.value[libevdev.EV_KEY.BTN_LEFT] == 0
998*0bb3ed71SBenjamin Tissoires            else:
999*0bb3ed71SBenjamin Tissoires                r = uhdev.event(left=True)
1000*0bb3ed71SBenjamin Tissoires                events = uhdev.next_sync_events()
1001*0bb3ed71SBenjamin Tissoires                self.debug_reports(r, uhdev, events)
1002*0bb3ed71SBenjamin Tissoires                assert libevdev.InputEvent(libevdev.EV_KEY.BTN_LEFT, 1) in events
1003*0bb3ed71SBenjamin Tissoires                assert evdev.value[libevdev.EV_KEY.BTN_LEFT] == 1
1004*0bb3ed71SBenjamin Tissoires
1005*0bb3ed71SBenjamin Tissoires                r = uhdev.event(left=False)
1006*0bb3ed71SBenjamin Tissoires                events = uhdev.next_sync_events()
1007*0bb3ed71SBenjamin Tissoires                self.debug_reports(r, uhdev, events)
1008*0bb3ed71SBenjamin Tissoires                assert libevdev.InputEvent(libevdev.EV_KEY.BTN_LEFT, 0) in events
1009*0bb3ed71SBenjamin Tissoires                assert evdev.value[libevdev.EV_KEY.BTN_LEFT] == 0
1010*0bb3ed71SBenjamin Tissoires
1011*0bb3ed71SBenjamin Tissoires                r = uhdev.event(right=True)
1012*0bb3ed71SBenjamin Tissoires                events = uhdev.next_sync_events()
1013*0bb3ed71SBenjamin Tissoires                self.debug_reports(r, uhdev, events)
1014*0bb3ed71SBenjamin Tissoires                assert libevdev.InputEvent(libevdev.EV_KEY.BTN_RIGHT, 1) in events
1015*0bb3ed71SBenjamin Tissoires                assert evdev.value[libevdev.EV_KEY.BTN_RIGHT] == 1
1016*0bb3ed71SBenjamin Tissoires
1017*0bb3ed71SBenjamin Tissoires                r = uhdev.event(right=False)
1018*0bb3ed71SBenjamin Tissoires                events = uhdev.next_sync_events()
1019*0bb3ed71SBenjamin Tissoires                self.debug_reports(r, uhdev, events)
1020*0bb3ed71SBenjamin Tissoires                assert libevdev.InputEvent(libevdev.EV_KEY.BTN_RIGHT, 0) in events
1021*0bb3ed71SBenjamin Tissoires                assert evdev.value[libevdev.EV_KEY.BTN_RIGHT] == 0
1022*0bb3ed71SBenjamin Tissoires
1023*0bb3ed71SBenjamin Tissoires        @pytest.mark.skip_if_uhdev(
1024*0bb3ed71SBenjamin Tissoires            lambda uhdev: "Confidence" not in uhdev.fields,
1025*0bb3ed71SBenjamin Tissoires            "Device not compatible, missing Confidence usage",
1026*0bb3ed71SBenjamin Tissoires        )
1027*0bb3ed71SBenjamin Tissoires        def test_ptp_confidence(self):
1028*0bb3ed71SBenjamin Tissoires            """Check for the validity of the confidence bit.
1029*0bb3ed71SBenjamin Tissoires            When a contact is marked as not confident, it should be detected
1030*0bb3ed71SBenjamin Tissoires            as a palm from the kernel POV and released.
1031*0bb3ed71SBenjamin Tissoires
1032*0bb3ed71SBenjamin Tissoires            Note: if the kernel exports ABS_MT_TOOL_TYPE, it shouldn't release
1033*0bb3ed71SBenjamin Tissoires            the touch but instead convert it to ABS_MT_TOOL_PALM."""
1034*0bb3ed71SBenjamin Tissoires            uhdev = self.uhdev
1035*0bb3ed71SBenjamin Tissoires            evdev = uhdev.get_evdev()
1036*0bb3ed71SBenjamin Tissoires
1037*0bb3ed71SBenjamin Tissoires            t0 = Touch(1, 150, 200)
1038*0bb3ed71SBenjamin Tissoires            r = uhdev.event([t0])
1039*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
1040*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
1041*0bb3ed71SBenjamin Tissoires
1042*0bb3ed71SBenjamin Tissoires            t0.confidence = False
1043*0bb3ed71SBenjamin Tissoires            r = uhdev.event([t0])
1044*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
1045*0bb3ed71SBenjamin Tissoires            self.debug_reports(r, uhdev, events)
1046*0bb3ed71SBenjamin Tissoires
1047*0bb3ed71SBenjamin Tissoires            if evdev.absinfo[libevdev.EV_ABS.ABS_MT_TOOL_TYPE] is not None:
1048*0bb3ed71SBenjamin Tissoires                # the kernel exports MT_TOOL_PALM
1049*0bb3ed71SBenjamin Tissoires                assert (
1050*0bb3ed71SBenjamin Tissoires                    libevdev.InputEvent(libevdev.EV_ABS.ABS_MT_TOOL_TYPE, 2) in events
1051*0bb3ed71SBenjamin Tissoires                )
1052*0bb3ed71SBenjamin Tissoires                assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] != -1
1053*0bb3ed71SBenjamin Tissoires
1054*0bb3ed71SBenjamin Tissoires                t0.tipswitch = False
1055*0bb3ed71SBenjamin Tissoires                r = uhdev.event([t0])
1056*0bb3ed71SBenjamin Tissoires                events = uhdev.next_sync_events()
1057*0bb3ed71SBenjamin Tissoires                self.debug_reports(r, uhdev, events)
1058*0bb3ed71SBenjamin Tissoires
1059*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH, 0) in events
1060*0bb3ed71SBenjamin Tissoires            assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
1061*0bb3ed71SBenjamin Tissoires
1062*0bb3ed71SBenjamin Tissoires        @pytest.mark.skip_if_uhdev(
1063*0bb3ed71SBenjamin Tissoires            lambda uhdev: uhdev.touches_in_a_report >= uhdev.max_contacts,
1064*0bb3ed71SBenjamin Tissoires            "Device not compatible, we can not trigger the conditions",
1065*0bb3ed71SBenjamin Tissoires        )
1066*0bb3ed71SBenjamin Tissoires        def test_ptp_non_touch_data(self):
1067*0bb3ed71SBenjamin Tissoires            """Some single finger hybrid touchpads might not provide the
1068*0bb3ed71SBenjamin Tissoires            button information in subsequent reports (only in the first report).
1069*0bb3ed71SBenjamin Tissoires
1070*0bb3ed71SBenjamin Tissoires            Emulate this and make sure we do not release the buttons in the
1071*0bb3ed71SBenjamin Tissoires            middle of the event."""
1072*0bb3ed71SBenjamin Tissoires            uhdev = self.uhdev
1073*0bb3ed71SBenjamin Tissoires            evdev = uhdev.get_evdev()
1074*0bb3ed71SBenjamin Tissoires
1075*0bb3ed71SBenjamin Tissoires            touches = [Touch(i, i * 10, i * 10 + 5) for i in range(uhdev.max_contacts)]
1076*0bb3ed71SBenjamin Tissoires            contact_count = uhdev.max_contacts
1077*0bb3ed71SBenjamin Tissoires            incr_scantime = True
1078*0bb3ed71SBenjamin Tissoires            btn_state = True
1079*0bb3ed71SBenjamin Tissoires            events = None
1080*0bb3ed71SBenjamin Tissoires            while touches:
1081*0bb3ed71SBenjamin Tissoires                t = touches[: uhdev.touches_in_a_report]
1082*0bb3ed71SBenjamin Tissoires                touches = touches[uhdev.touches_in_a_report :]
1083*0bb3ed71SBenjamin Tissoires                r = uhdev.event(
1084*0bb3ed71SBenjamin Tissoires                    t,
1085*0bb3ed71SBenjamin Tissoires                    click=btn_state,
1086*0bb3ed71SBenjamin Tissoires                    left=btn_state,
1087*0bb3ed71SBenjamin Tissoires                    contact_count=contact_count,
1088*0bb3ed71SBenjamin Tissoires                    incr_scantime=incr_scantime,
1089*0bb3ed71SBenjamin Tissoires                )
1090*0bb3ed71SBenjamin Tissoires                contact_count = 0
1091*0bb3ed71SBenjamin Tissoires                incr_scantime = False
1092*0bb3ed71SBenjamin Tissoires                btn_state = False
1093*0bb3ed71SBenjamin Tissoires                events = uhdev.next_sync_events()
1094*0bb3ed71SBenjamin Tissoires                self.debug_reports(r, uhdev, events)
1095*0bb3ed71SBenjamin Tissoires                if touches:
1096*0bb3ed71SBenjamin Tissoires                    assert len(events) == 0
1097*0bb3ed71SBenjamin Tissoires
1098*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_KEY.BTN_LEFT, 1) in events
1099*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_KEY.BTN_LEFT, 0) not in events
1100*0bb3ed71SBenjamin Tissoires            assert evdev.value[libevdev.EV_KEY.BTN_LEFT] == 1
1101*0bb3ed71SBenjamin Tissoires
1102*0bb3ed71SBenjamin Tissoires
1103*0bb3ed71SBenjamin Tissoires################################################################################
1104*0bb3ed71SBenjamin Tissoires#
1105*0bb3ed71SBenjamin Tissoires# Windows 7 compatible devices
1106*0bb3ed71SBenjamin Tissoires#
1107*0bb3ed71SBenjamin Tissoires################################################################################
1108*0bb3ed71SBenjamin Tissoiresclass Test3m_0596_0500(BaseTest.TestMultitouch):
1109*0bb3ed71SBenjamin Tissoires    def create_device(self):
1110*0bb3ed71SBenjamin Tissoires        return Digitizer(
1111*0bb3ed71SBenjamin Tissoires            "uhid test 3m_0596_0500",
1112*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 01 a1 01 85 01 09 01 a1 00 05 09 09 01 95 01 75 01 15 00 25 01 81 02 95 07 75 01 81 03 95 01 75 08 81 03 05 01 09 30 09 31 15 00 26 ff 7f 35 00 46 00 00 95 02 75 10 81 02 c0 a1 02 15 00 26 ff 00 09 01 95 39 75 08 81 01 c0 c0 05 0d 09 0e a1 01 85 11 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0 09 04 a1 01 85 10 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 3a 06 81 02 09 31 46 e8 03 81 02 c0 05 0d a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 3a 06 81 02 09 31 46 e8 03 81 02 c0 05 0d a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 3a 06 81 02 09 31 46 e8 03 81 02 c0 05 0d a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 3a 06 81 02 09 31 46 e8 03 81 02 c0 05 0d a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 3a 06 81 02 09 31 46 e8 03 81 02 c0 05 0d a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 3a 06 81 02 09 31 46 e8 03 81 02 c0 05 0d a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 3a 06 81 02 09 31 46 e8 03 81 02 c0 05 0d a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 3a 06 81 02 09 31 46 e8 03 81 02 c0 05 0d a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 3a 06 81 02 09 31 46 e8 03 81 02 c0 05 0d a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 3a 06 81 02 09 31 46 e8 03 81 02 c0 05 0d 09 54 95 01 75 08 15 00 25 0a 81 02 85 12 09 55 95 01 75 08 15 00 25 0a b1 02 06 00 ff 15 00 26 ff 00 85 03 09 01 75 08 95 07 b1 02 85 04 09 01 75 08 95 17 b1 02 85 05 09 01 75 08 95 47 b1 02 85 06 09 01 75 08 95 07 b1 02 85 07 09 01 75 08 95 07 b1 02 85 08 09 01 75 08 95 07 b1 02 85 09 09 01 75 08 95 3f b1 02 c0",
1113*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x0596, 0x0500),
1114*0bb3ed71SBenjamin Tissoires            max_contacts=60,
1115*0bb3ed71SBenjamin Tissoires            quirks=("VALID_IS_CONFIDENCE", "SLOT_IS_CONTACTID", "TOUCH_SIZE_SCALING"),
1116*0bb3ed71SBenjamin Tissoires        )
1117*0bb3ed71SBenjamin Tissoires
1118*0bb3ed71SBenjamin Tissoires
1119*0bb3ed71SBenjamin Tissoiresclass Test3m_0596_0506(BaseTest.TestMultitouch):
1120*0bb3ed71SBenjamin Tissoires    def create_device(self):
1121*0bb3ed71SBenjamin Tissoires        return Digitizer(
1122*0bb3ed71SBenjamin Tissoires            "uhid test 3m_0596_0506",
1123*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 01 a1 01 85 01 09 01 a1 00 05 09 09 01 95 01 75 01 15 00 25 01 81 02 95 07 75 01 81 03 95 01 75 08 81 03 05 01 09 30 09 31 15 00 26 ff 7f 35 00 46 00 00 95 02 75 10 81 02 c0 a1 02 15 00 26 ff 00 09 01 95 39 75 08 81 03 c0 c0 05 0d 09 0e a1 01 85 11 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0 09 04 a1 01 85 13 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 d6 0a 81 02 09 31 46 22 06 81 02 05 0d 75 10 95 01 09 48 81 02 09 49 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 d6 0a 81 02 09 31 46 22 06 81 02 05 0d 75 10 95 01 09 48 81 02 09 49 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 d6 0a 81 02 09 31 46 22 06 81 02 05 0d 75 10 95 01 09 48 81 02 09 49 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 d6 0a 81 02 09 31 46 22 06 81 02 05 0d 75 10 95 01 09 48 81 02 09 49 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 d6 0a 81 02 09 31 46 22 06 81 02 05 0d 75 10 95 01 09 48 81 02 09 49 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 d6 0a 81 02 09 31 46 22 06 81 02 05 0d 75 10 95 01 09 48 81 02 09 49 81 02 c0 05 0d 09 54 95 01 75 08 15 00 25 3c 81 02 06 00 ff 09 01 15 00 26 ff 00 75 08 95 02 81 03 05 0d 85 12 09 55 95 01 75 08 15 00 25 3c b1 02 06 00 ff 15 00 26 ff 00 85 03 09 01 75 08 95 07 b1 02 85 04 09 01 75 08 95 17 b1 02 85 05 09 01 75 08 95 47 b1 02 85 06 09 01 75 08 95 07 b1 02 85 73 09 01 75 08 95 07 b1 02 85 08 09 01 75 08 95 07 b1 02 85 09 09 01 75 08 95 3f b1 02 85 0f 09 01 75 08 96 07 02 b1 02 c0",
1124*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x0596, 0x0506),
1125*0bb3ed71SBenjamin Tissoires            max_contacts=60,
1126*0bb3ed71SBenjamin Tissoires            quirks=("VALID_IS_CONFIDENCE", "SLOT_IS_CONTACTID", "TOUCH_SIZE_SCALING"),
1127*0bb3ed71SBenjamin Tissoires        )
1128*0bb3ed71SBenjamin Tissoires
1129*0bb3ed71SBenjamin Tissoires
1130*0bb3ed71SBenjamin Tissoiresclass TestActionStar_2101_1011(BaseTest.TestMultitouch):
1131*0bb3ed71SBenjamin Tissoires    def create_device(self):
1132*0bb3ed71SBenjamin Tissoires        return Digitizer(
1133*0bb3ed71SBenjamin Tissoires            "uhid test ActionStar_2101_1011",
1134*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 09 51 75 08 95 01 81 02 05 01 35 00 55 0e 65 33 75 10 95 01 09 30 26 ff 4d 46 70 03 81 02 09 31 26 ff 2b 46 f1 01 81 02 46 00 00 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 09 51 75 08 95 01 81 02 05 01 35 00 55 0e 65 33 75 10 95 01 09 30 26 ff 4d 46 70 03 81 02 09 31 26 ff 2b 46 f1 01 81 02 46 00 00 c0 05 0d 09 54 75 08 95 01 81 02 05 0d 85 02 09 55 25 02 75 08 95 01 b1 02 c0",
1135*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x2101, 0x1011),
1136*0bb3ed71SBenjamin Tissoires        )
1137*0bb3ed71SBenjamin Tissoires
1138*0bb3ed71SBenjamin Tissoires    def test_mt_actionstar_inrange(self):
1139*0bb3ed71SBenjamin Tissoires        """Special sequence that might not be handled properly"""
1140*0bb3ed71SBenjamin Tissoires        uhdev = self.uhdev
1141*0bb3ed71SBenjamin Tissoires        evdev = uhdev.get_evdev()
1142*0bb3ed71SBenjamin Tissoires
1143*0bb3ed71SBenjamin Tissoires        # fmt: off
1144*0bb3ed71SBenjamin Tissoires        sequence = [
1145*0bb3ed71SBenjamin Tissoires            # t0 = Touch(1, 6999, 2441) | t1 = Touch(2, 15227, 2026)
1146*0bb3ed71SBenjamin Tissoires            '01 ff 01 57 1b 89 09 ff 02 7b 3b ea 07 02',
1147*0bb3ed71SBenjamin Tissoires            # t0.xy = (6996, 2450)      | t1.y = 2028
1148*0bb3ed71SBenjamin Tissoires            '01 ff 01 54 1b 92 09 ff 02 7b 3b ec 07 02',
1149*0bb3ed71SBenjamin Tissoires            # t1.xy = (15233, 2040)     | t0.tipswitch = False
1150*0bb3ed71SBenjamin Tissoires            '01 ff 02 81 3b f8 07 fe 01 54 1b 92 09 02',
1151*0bb3ed71SBenjamin Tissoires            # t1                        | t0.inrange = False
1152*0bb3ed71SBenjamin Tissoires            '01 ff 02 81 3b f8 07 fc 01 54 1b 92 09 02',
1153*0bb3ed71SBenjamin Tissoires        ]
1154*0bb3ed71SBenjamin Tissoires        # fmt: on
1155*0bb3ed71SBenjamin Tissoires
1156*0bb3ed71SBenjamin Tissoires        for num, r_str in enumerate(sequence):
1157*0bb3ed71SBenjamin Tissoires            r = [int(i, 16) for i in r_str.split()]
1158*0bb3ed71SBenjamin Tissoires            uhdev.call_input_event(r)
1159*0bb3ed71SBenjamin Tissoires            events = uhdev.next_sync_events()
1160*0bb3ed71SBenjamin Tissoires            self.debug_reports([r], uhdev)
1161*0bb3ed71SBenjamin Tissoires            for e in events:
1162*0bb3ed71SBenjamin Tissoires                print(e)
1163*0bb3ed71SBenjamin Tissoires            if num == 2:
1164*0bb3ed71SBenjamin Tissoires                assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
1165*0bb3ed71SBenjamin Tissoires
1166*0bb3ed71SBenjamin Tissoires
1167*0bb3ed71SBenjamin Tissoiresclass TestAsus_computers_0486_0185(BaseTest.TestMultitouch):
1168*0bb3ed71SBenjamin Tissoires    def create_device(self):
1169*0bb3ed71SBenjamin Tissoires        return Digitizer(
1170*0bb3ed71SBenjamin Tissoires            "uhid test asus-computers_0486_0185",
1171*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 95 01 75 01 81 02 09 32 81 02 09 47 81 02 75 05 81 03 09 30 26 ff 00 75 08 81 02 09 51 25 02 81 02 26 96 0d 05 01 75 10 55 0d 65 33 09 30 35 00 46 fd 1d 81 02 09 31 46 60 11 81 02 c0 09 22 a1 02 05 0d 35 00 45 00 55 00 65 00 09 42 25 01 75 01 81 02 09 32 81 02 09 47 81 02 75 05 81 03 09 30 26 ff 00 75 08 81 02 09 51 25 02 81 02 26 96 0d 05 01 75 10 55 0d 65 33 09 30 46 fd 1d 81 02 09 31 46 60 11 81 02 c0 35 00 45 00 55 00 65 00 05 0d 09 54 75 08 25 02 81 02 85 08 09 55 b1 02 c0 09 0e a1 01 85 07 09 22 a1 00 09 52 25 0a b1 02 c0 05 0c 09 01 a1 01 85 06 09 01 26 ff 00 95 08 b1 02 c0 c0 05 01 09 02 a1 01 85 03 09 01 a1 00 05 09 19 01 29 02 25 01 75 01 95 02 81 02 95 06 81 03 26 96 0d 05 01 75 10 95 01 55 0d 65 33 09 30 46 fd 1d 81 02 09 31 46 60 11 81 02 c0 c0 06 ff 01 09 01 a1 01 26 ff 00 35 00 45 00 55 00 65 00 85 05 75 08 95 3f 09 00 81 02 c0",
1172*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x0486, 0x0185),
1173*0bb3ed71SBenjamin Tissoires            quirks=("VALID_IS_CONFIDENCE", "SLOT_IS_CONTACTID_MINUS_ONE"),
1174*0bb3ed71SBenjamin Tissoires        )
1175*0bb3ed71SBenjamin Tissoires
1176*0bb3ed71SBenjamin Tissoires
1177*0bb3ed71SBenjamin Tissoiresclass TestAtmel_03eb_201c(BaseTest.TestMultitouch):
1178*0bb3ed71SBenjamin Tissoires    def create_device(self):
1179*0bb3ed71SBenjamin Tissoires        return Digitizer(
1180*0bb3ed71SBenjamin Tissoires            "uhid test atmel_03eb_201c",
1181*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 09 51 75 08 95 01 81 02 05 01 35 00 55 0e 65 33 75 10 95 01 09 30 26 ff 4b 46 70 03 81 02 09 31 26 ff 2b 46 f1 01 81 02 46 00 00 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 09 51 75 08 95 01 81 02 05 01 35 00 55 0e 65 33 75 10 95 01 09 30 26 ff 4b 46 70 03 81 02 09 31 26 ff 2b 46 f1 01 81 02 46 00 00 c0 05 0d 09 54 75 08 95 01 81 02 05 0d 85 02 09 55 25 02 75 08 95 01 b1 02 c0",
1182*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x03EB, 0x201C),
1183*0bb3ed71SBenjamin Tissoires        )
1184*0bb3ed71SBenjamin Tissoires
1185*0bb3ed71SBenjamin Tissoires
1186*0bb3ed71SBenjamin Tissoiresclass TestAtmel_03eb_211c(BaseTest.TestMultitouch):
1187*0bb3ed71SBenjamin Tissoires    def create_device(self):
1188*0bb3ed71SBenjamin Tissoires        return Digitizer(
1189*0bb3ed71SBenjamin Tissoires            "uhid test atmel_03eb_211c",
1190*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 00 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 37 81 02 25 1f 75 05 09 51 81 02 05 01 55 0e 65 11 35 00 75 10 46 56 0a 26 ff 0f 09 30 81 02 46 b2 05 26 ff 0f 09 31 81 02 05 0d 75 08 85 02 09 55 25 10 b1 02 c0 c0",
1191*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x03EB, 0x211C),
1192*0bb3ed71SBenjamin Tissoires        )
1193*0bb3ed71SBenjamin Tissoires
1194*0bb3ed71SBenjamin Tissoires
1195*0bb3ed71SBenjamin Tissoiresclass TestCando_2087_0a02(BaseTest.TestMultitouch):
1196*0bb3ed71SBenjamin Tissoires    def create_device(self):
1197*0bb3ed71SBenjamin Tissoires        return Digitizer(
1198*0bb3ed71SBenjamin Tissoires            "uhid test cando_2087_0a02",
1199*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 0f 75 10 55 0e 65 33 09 30 35 00 46 6d 03 81 02 46 ec 01 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 0f 75 10 55 0e 65 33 09 30 35 00 46 6d 03 81 02 46 ec 01 09 31 81 02 c0 05 0d 09 54 95 01 75 08 15 00 25 02 81 02 85 02 09 55 b1 02 c0 06 00 ff 09 01 a1 01 85 a6 95 22 75 08 26 ff 00 15 00 09 01 81 02 85 a5 95 06 75 08 26 ff 00 15 00 09 01 91 02 c0",
1200*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x2087, 0x0A02),
1201*0bb3ed71SBenjamin Tissoires        )
1202*0bb3ed71SBenjamin Tissoires
1203*0bb3ed71SBenjamin Tissoires
1204*0bb3ed71SBenjamin Tissoiresclass TestCando_2087_0b03(BaseTest.TestMultitouch):
1205*0bb3ed71SBenjamin Tissoires    def create_device(self):
1206*0bb3ed71SBenjamin Tissoires        return Digitizer(
1207*0bb3ed71SBenjamin Tissoires            "uhid test cando_2087_0b03",
1208*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 09 51 75 08 95 01 81 02 05 01 35 00 55 0e 65 33 75 10 95 01 09 30 26 ff 49 46 f2 03 81 02 09 31 26 ff 29 46 39 02 81 02 46 00 00 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 09 51 75 08 95 01 81 02 05 01 35 00 55 0e 65 33 75 10 95 01 09 30 26 ff 49 46 f2 03 81 02 09 31 26 ff 29 46 39 02 81 02 46 00 00 c0 05 0d 09 54 75 08 95 01 81 02 05 0d 85 02 09 55 25 02 75 08 95 01 b1 02 c0",
1209*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x2087, 0x0B03),
1210*0bb3ed71SBenjamin Tissoires        )
1211*0bb3ed71SBenjamin Tissoires
1212*0bb3ed71SBenjamin Tissoires
1213*0bb3ed71SBenjamin Tissoiresclass TestCVTouch_1ff7_0013(BaseTest.TestMultitouch):
1214*0bb3ed71SBenjamin Tissoires    def create_device(self):
1215*0bb3ed71SBenjamin Tissoires        return Digitizer(
1216*0bb3ed71SBenjamin Tissoires            "uhid test cvtouch_1ff7_0013",
1217*0bb3ed71SBenjamin Tissoires            rdesc="06 00 ff 09 00 a1 01 85 fd 06 00 ff 09 01 09 02 09 03 09 04 09 05 09 06 15 00 26 ff 00 75 08 95 06 81 02 85 fe 06 00 ff 09 01 09 02 09 03 09 04 15 00 26 ff 00 75 08 95 04 b1 02 c0 05 01 09 02 a1 01 09 01 a1 00 85 01 05 09 19 01 29 03 15 00 25 01 95 03 75 01 81 02 95 01 75 05 81 03 05 01 09 30 09 31 15 00 26 ff 7f 35 00 46 ff 7f 75 10 95 02 81 02 05 0d 09 33 15 00 26 ff 00 35 00 46 ff 00 75 08 95 01 81 02 05 01 09 38 15 81 25 7f 35 81 45 7f 95 01 81 06 c0 c0 06 00 ff 09 00 a1 01 85 fc 15 00 26 ff 00 19 01 29 3f 75 08 95 3f 81 02 19 01 29 3f 91 02 c0 06 00 ff 09 00 a1 01 85 fb 15 00 26 ff 00 19 01 29 3f 75 08 95 3f 81 02 19 01 29 3f 91 02 c0 05 0d 09 04 a1 01 85 02 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 15 00 26 ff 7f 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 15 00 26 ff 7f 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 15 00 26 ff 7f 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 15 00 26 ff 7f 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 15 00 26 ff 7f 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 15 00 26 ff 7f 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 09 31 81 02 c0 05 0d 09 54 15 00 26 ff 00 95 01 75 08 81 02 85 03 09 55 15 00 25 02 b1 02 c0 09 0e a1 01 85 04 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0",
1218*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x1FF7, 0x0013),
1219*0bb3ed71SBenjamin Tissoires            quirks=("NOT_SEEN_MEANS_UP",),
1220*0bb3ed71SBenjamin Tissoires        )
1221*0bb3ed71SBenjamin Tissoires
1222*0bb3ed71SBenjamin Tissoires
1223*0bb3ed71SBenjamin Tissoiresclass TestCvtouch_1ff7_0017(BaseTest.TestMultitouch):
1224*0bb3ed71SBenjamin Tissoires    def create_device(self):
1225*0bb3ed71SBenjamin Tissoires        return Digitizer(
1226*0bb3ed71SBenjamin Tissoires            "uhid test cvtouch_1ff7_0017",
1227*0bb3ed71SBenjamin Tissoires            rdesc="06 00 ff 09 00 a1 01 85 fd 06 00 ff 09 01 09 02 09 03 09 04 09 05 09 06 15 00 26 ff 00 75 08 95 06 81 02 85 fe 06 00 ff 09 01 09 02 09 03 09 04 15 00 26 ff 00 75 08 95 04 b1 02 c0 05 01 09 02 a1 01 09 01 a1 00 85 01 05 09 19 01 29 03 15 00 25 01 95 03 75 01 81 02 95 01 75 05 81 03 05 01 09 30 09 31 15 00 26 ff 0f 35 00 46 ff 0f 75 10 95 02 81 02 09 00 15 00 25 ff 35 00 45 ff 75 08 95 01 81 02 09 38 15 81 25 7f 95 01 81 06 c0 c0 06 00 ff 09 00 a1 01 85 fc 15 00 25 ff 19 01 29 3f 75 08 95 3f 81 02 19 01 29 3f 91 02 c0 06 00 ff 09 00 a1 01 85 fb 15 00 25 ff 19 01 29 3f 75 08 95 3f 81 02 19 01 29 3f 91 02 c0 05 0d 09 04 a1 01 85 02 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 15 00 26 ff 0f 75 10 55 00 65 00 09 30 35 00 46 ff 0f 81 02 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 15 00 26 ff 0f 75 10 55 00 65 00 09 30 35 00 46 ff 0f 81 02 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 15 00 26 ff 0f 75 10 55 00 65 00 09 30 35 00 46 ff 0f 81 02 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 15 00 26 ff 0f 75 10 55 00 65 00 09 30 35 00 46 ff 0f 81 02 09 31 81 02 c0 05 0d 09 54 95 01 75 08 81 02 85 03 09 55 25 02 b1 02 c0 09 0e a1 01 85 04 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0",
1228*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x1FF7, 0x0017),
1229*0bb3ed71SBenjamin Tissoires        )
1230*0bb3ed71SBenjamin Tissoires
1231*0bb3ed71SBenjamin Tissoires
1232*0bb3ed71SBenjamin Tissoiresclass TestCypress_04b4_c001(BaseTest.TestMultitouch):
1233*0bb3ed71SBenjamin Tissoires    def create_device(self):
1234*0bb3ed71SBenjamin Tissoires        return Digitizer(
1235*0bb3ed71SBenjamin Tissoires            "uhid test cypress_04b4_c001",
1236*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 02 a1 01 85 01 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 95 03 75 01 81 02 95 01 75 05 81 01 05 01 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 c0 c0 05 0d 09 04 a1 01 85 02 09 22 09 53 95 01 75 08 81 02 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 15 00 25 20 09 48 81 02 09 49 81 02 05 01 15 00 26 d0 07 75 10 55 00 65 00 09 30 15 00 26 d0 07 35 00 45 00 81 02 09 31 45 00 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 15 00 25 20 09 48 81 02 09 49 81 02 05 01 15 00 26 d0 07 75 10 55 00 65 00 09 30 15 00 26 d0 07 35 00 45 00 81 02 09 31 45 00 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 15 00 25 20 09 48 81 02 09 49 81 02 05 01 15 00 26 d0 07 75 10 55 00 65 00 09 30 15 00 26 d0 07 35 00 45 00 81 02 09 31 45 00 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 15 00 25 20 09 48 81 02 09 49 81 02 05 01 15 00 26 d0 07 75 10 55 00 65 00 09 30 15 00 26 d0 07 35 00 45 00 81 02 09 31 45 00 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 15 00 25 20 09 48 81 02 09 49 81 02 05 01 15 00 26 d0 07 75 10 55 00 65 00 09 30 15 00 26 d0 07 35 00 45 00 81 02 09 31 45 00 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 15 00 25 20 09 48 81 02 09 49 81 02 05 01 15 00 26 d0 07 75 10 55 00 65 00 09 30 15 00 26 d0 07 35 00 45 00 81 02 09 31 45 00 81 02 c0 05 0d 09 54 95 01 75 08 15 00 25 0a 81 02 09 55 b1 02 c0 09 0e a1 01 85 03 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0",
1237*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x04B4, 0xC001),
1238*0bb3ed71SBenjamin Tissoires        )
1239*0bb3ed71SBenjamin Tissoires
1240*0bb3ed71SBenjamin Tissoires
1241*0bb3ed71SBenjamin Tissoiresclass TestData_modul_7374_1232(BaseTest.TestMultitouch):
1242*0bb3ed71SBenjamin Tissoires    def create_device(self):
1243*0bb3ed71SBenjamin Tissoires        return Digitizer(
1244*0bb3ed71SBenjamin Tissoires            "uhid test data-modul_7374_1232",
1245*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 00 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 37 81 02 25 1f 75 05 09 51 81 02 05 01 55 0e 65 11 35 00 75 10 46 d0 07 26 ff 0f 09 30 81 02 46 40 06 09 31 81 02 05 0d 75 08 85 02 09 55 25 10 b1 02 c0 c0",
1246*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x7374, 0x1232),
1247*0bb3ed71SBenjamin Tissoires        )
1248*0bb3ed71SBenjamin Tissoires
1249*0bb3ed71SBenjamin Tissoires
1250*0bb3ed71SBenjamin Tissoiresclass TestData_modul_7374_1252(BaseTest.TestMultitouch):
1251*0bb3ed71SBenjamin Tissoires    def create_device(self):
1252*0bb3ed71SBenjamin Tissoires        return Digitizer(
1253*0bb3ed71SBenjamin Tissoires            "uhid test data-modul_7374_1252",
1254*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 00 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 37 81 02 25 1f 75 05 09 51 81 02 05 01 55 0e 65 11 35 00 75 10 46 d0 07 26 ff 0f 09 30 81 02 46 40 06 09 31 81 02 05 0d 75 08 85 02 09 55 25 10 b1 02 c0 c0",
1255*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x7374, 0x1252),
1256*0bb3ed71SBenjamin Tissoires        )
1257*0bb3ed71SBenjamin Tissoires
1258*0bb3ed71SBenjamin Tissoires
1259*0bb3ed71SBenjamin Tissoiresclass TestE4_2219_044c(BaseTest.TestMultitouch):
1260*0bb3ed71SBenjamin Tissoires    def create_device(self):
1261*0bb3ed71SBenjamin Tissoires        return Digitizer(
1262*0bb3ed71SBenjamin Tissoires            "uhid test e4_2219_044c",
1263*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 09 31 46 00 00 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 09 31 46 00 00 81 02 c0 05 0d 09 54 95 01 75 08 15 00 25 08 81 02 09 55 b1 02 c0 09 0e a1 01 85 02 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0 05 01 09 02 a1 01 85 03 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 95 03 75 01 81 02 95 01 75 05 81 01 05 01 09 30 09 31 15 00 26 ff 7f 75 10 95 02 81 02 05 01 09 38 15 81 25 7f 75 08 95 01 81 06 c0 c0",
1264*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x2219, 0x044C),
1265*0bb3ed71SBenjamin Tissoires        )
1266*0bb3ed71SBenjamin Tissoires
1267*0bb3ed71SBenjamin Tissoires
1268*0bb3ed71SBenjamin Tissoiresclass TestEgalax_capacitive_0eef_7224(BaseTest.TestMultitouch):
1269*0bb3ed71SBenjamin Tissoires    def create_device(self):
1270*0bb3ed71SBenjamin Tissoires        return Digitizer(
1271*0bb3ed71SBenjamin Tissoires            "uhid test egalax-capacitive_0eef_7224",
1272*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 04 09 22 a1 00 09 42 15 00 25 01 75 01 95 01 81 02 09 32 15 00 25 01 81 02 09 51 75 05 95 01 16 00 00 26 10 00 81 02 09 47 75 01 95 01 15 00 25 01 81 02 05 01 09 30 75 10 95 01 55 0d 65 33 35 00 46 34 49 26 ff 7f 81 02 09 31 75 10 95 01 55 0d 65 33 35 00 46 37 29 26 ff 7f 81 02 05 0d 09 55 25 08 75 08 95 01 b1 02 c0 c0 05 01 09 01 a1 01 85 01 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 95 02 75 01 81 02 95 01 75 06 81 01 05 01 09 30 09 31 16 00 00 26 ff 0f 36 00 00 46 ff 0f 66 00 00 75 10 95 02 81 02 c0 c0 06 00 ff 09 01 a1 01 09 01 15 00 26 ff 00 85 03 75 08 95 3f 81 02 06 00 ff 09 01 15 00 26 ff 00 75 08 95 3f 91 02 c0 05 0d 09 04 a1 01 85 02 09 20 a1 00 09 42 09 32 15 00 25 01 95 02 75 01 81 02 95 06 75 01 81 03 05 01 09 30 75 10 95 01 a4 55 0d 65 33 36 00 00 46 34 49 16 00 00 26 ff 0f 81 02 09 31 16 00 00 26 ff 0f 36 00 00 46 37 29 81 02 b4 c0 c0 05 0d 09 0e a1 01 85 05 09 22 a1 00 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0",
1273*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x0EEF, 0x7224),
1274*0bb3ed71SBenjamin Tissoires            quirks=("SLOT_IS_CONTACTID", "ALWAYS_VALID"),
1275*0bb3ed71SBenjamin Tissoires        )
1276*0bb3ed71SBenjamin Tissoires
1277*0bb3ed71SBenjamin Tissoires
1278*0bb3ed71SBenjamin Tissoiresclass TestEgalax_capacitive_0eef_72fa(BaseTest.TestMultitouch):
1279*0bb3ed71SBenjamin Tissoires    def create_device(self):
1280*0bb3ed71SBenjamin Tissoires        return Digitizer(
1281*0bb3ed71SBenjamin Tissoires            "uhid test egalax-capacitive_0eef_72fa",
1282*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 04 09 22 a1 00 09 42 15 00 25 01 75 01 95 01 81 02 09 32 15 00 25 01 81 02 09 51 75 05 95 01 16 00 00 26 10 00 81 02 09 47 75 01 95 01 15 00 25 01 81 02 05 01 09 30 75 10 95 01 55 0d 65 33 35 00 46 72 22 26 ff 7f 81 02 09 31 75 10 95 01 55 0d 65 33 35 00 46 87 13 26 ff 7f 81 02 05 0d 09 55 25 08 75 08 95 01 b1 02 c0 c0 05 01 09 01 a1 01 85 01 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 95 02 75 01 81 02 95 01 75 06 81 01 05 01 09 30 09 31 16 00 00 26 ff 0f 36 00 00 46 ff 0f 66 00 00 75 10 95 02 81 02 c0 c0 06 00 ff 09 01 a1 01 09 01 15 00 26 ff 00 85 03 75 08 95 3f 81 02 06 00 ff 09 01 15 00 26 ff 00 75 08 95 3f 91 02 c0 05 0d 09 04 a1 01 85 02 09 20 a1 00 09 42 09 32 15 00 25 01 95 02 75 01 81 02 95 06 75 01 81 03 05 01 09 30 75 10 95 01 a4 55 0d 65 33 36 00 00 46 72 22 16 00 00 26 ff 0f 81 02 09 31 16 00 00 26 ff 0f 36 00 00 46 87 13 81 02 b4 c0 c0 05 0d 09 0e a1 01 85 05 09 22 a1 00 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0",
1283*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x0EEF, 0x72FA),
1284*0bb3ed71SBenjamin Tissoires            quirks=("SLOT_IS_CONTACTID", "VALID_IS_INRANGE"),
1285*0bb3ed71SBenjamin Tissoires        )
1286*0bb3ed71SBenjamin Tissoires
1287*0bb3ed71SBenjamin Tissoires
1288*0bb3ed71SBenjamin Tissoiresclass TestEgalax_capacitive_0eef_7336(BaseTest.TestMultitouch):
1289*0bb3ed71SBenjamin Tissoires    def create_device(self):
1290*0bb3ed71SBenjamin Tissoires        return Digitizer(
1291*0bb3ed71SBenjamin Tissoires            "uhid test egalax-capacitive_0eef_7336",
1292*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 04 09 22 a1 00 09 42 15 00 25 01 75 01 95 01 81 02 09 32 15 00 25 01 81 02 09 51 75 05 95 01 16 00 00 26 10 00 81 02 09 47 75 01 95 01 15 00 25 01 81 02 05 01 09 30 75 10 95 01 55 0d 65 33 35 00 46 c1 20 26 ff 7f 81 02 09 31 75 10 95 01 55 0d 65 33 35 00 46 c2 18 26 ff 7f 81 02 05 0d 09 55 25 08 75 08 95 01 b1 02 c0 c0 05 01 09 01 a1 01 85 01 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 95 02 75 01 81 02 95 01 75 06 81 01 05 01 09 30 09 31 16 00 00 26 ff 0f 36 00 00 46 ff 0f 66 00 00 75 10 95 02 81 02 c0 c0 06 00 ff 09 01 a1 01 09 01 15 00 26 ff 00 85 03 75 08 95 3f 81 02 06 00 ff 09 01 15 00 26 ff 00 75 08 95 3f 91 02 c0 05 0d 09 04 a1 01 85 02 09 20 a1 00 09 42 09 32 15 00 25 01 95 02 75 01 81 02 95 06 75 01 81 03 05 01 09 30 75 10 95 01 a4 55 0d 65 33 36 00 00 46 c1 20 16 00 00 26 ff 0f 81 02 09 31 16 00 00 26 ff 0f 36 00 00 46 c2 18 81 02 b4 c0 c0 05 0d 09 0e a1 01 85 05 09 22 a1 00 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0",
1293*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x0EEF, 0x7336),
1294*0bb3ed71SBenjamin Tissoires        )
1295*0bb3ed71SBenjamin Tissoires
1296*0bb3ed71SBenjamin Tissoires
1297*0bb3ed71SBenjamin Tissoiresclass TestEgalax_capacitive_0eef_7337(BaseTest.TestMultitouch):
1298*0bb3ed71SBenjamin Tissoires    def create_device(self):
1299*0bb3ed71SBenjamin Tissoires        return Digitizer(
1300*0bb3ed71SBenjamin Tissoires            "uhid test egalax-capacitive_0eef_7337",
1301*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 04 09 22 a1 00 09 42 15 00 25 01 75 01 95 01 81 02 09 32 15 00 25 01 81 02 09 51 75 05 95 01 16 00 00 26 10 00 81 02 09 47 75 01 95 01 15 00 25 01 81 02 05 01 09 30 75 10 95 01 55 0d 65 33 35 00 46 ae 17 26 ff 7f 81 02 09 31 75 10 95 01 55 0d 65 33 35 00 46 c3 0e 26 ff 7f 81 02 05 0d 09 55 25 08 75 08 95 01 b1 02 c0 c0 05 01 09 01 a1 01 85 01 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 95 02 75 01 81 02 95 01 75 06 81 01 05 01 09 30 09 31 16 00 00 26 ff 0f 36 00 00 46 ff 0f 66 00 00 75 10 95 02 81 02 c0 c0 06 00 ff 09 01 a1 01 09 01 15 00 26 ff 00 85 03 75 08 95 3f 81 02 06 00 ff 09 01 15 00 26 ff 00 75 08 95 3f 91 02 c0 05 0d 09 04 a1 01 85 02 09 20 a1 00 09 42 09 32 15 00 25 01 95 02 75 01 81 02 95 06 75 01 81 03 05 01 09 30 75 10 95 01 a4 55 0d 65 33 36 00 00 46 ae 17 16 00 00 26 ff 0f 81 02 09 31 16 00 00 26 ff 0f 36 00 00 46 c3 0e 81 02 b4 c0 c0 05 0d 09 0e a1 01 85 05 09 22 a1 00 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0",
1302*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x0EEF, 0x7337),
1303*0bb3ed71SBenjamin Tissoires        )
1304*0bb3ed71SBenjamin Tissoires
1305*0bb3ed71SBenjamin Tissoires
1306*0bb3ed71SBenjamin Tissoiresclass TestEgalax_capacitive_0eef_7349(BaseTest.TestMultitouch):
1307*0bb3ed71SBenjamin Tissoires    def create_device(self):
1308*0bb3ed71SBenjamin Tissoires        return Digitizer(
1309*0bb3ed71SBenjamin Tissoires            "uhid test egalax-capacitive_0eef_7349",
1310*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 04 09 22 a1 00 09 42 15 00 25 01 75 01 95 01 81 02 09 32 15 00 25 01 81 02 09 51 75 05 95 01 16 00 00 26 10 00 81 02 09 47 75 01 95 01 15 00 25 01 81 02 05 01 09 30 75 10 95 01 55 0d 65 33 35 00 46 34 49 26 ff 7f 81 02 09 31 75 10 95 01 55 0d 65 33 35 00 46 37 29 26 ff 7f 81 02 05 0d 09 55 25 08 75 08 95 01 b1 02 c0 c0 05 01 09 01 a1 01 85 01 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 95 02 75 01 81 02 95 01 75 06 81 01 05 01 09 30 09 31 16 00 00 26 ff 0f 36 00 00 46 ff 0f 66 00 00 75 10 95 02 81 02 c0 c0 06 00 ff 09 01 a1 01 09 01 15 00 26 ff 00 85 03 75 08 95 3f 81 02 06 00 ff 09 01 15 00 26 ff 00 75 08 95 3f 91 02 c0 05 0d 09 04 a1 01 85 02 09 20 a1 00 09 42 09 32 15 00 25 01 95 02 75 01 81 02 95 06 75 01 81 03 05 01 09 30 75 10 95 01 a4 55 0d 65 33 36 00 00 46 34 49 16 00 00 26 ff 0f 81 02 09 31 16 00 00 26 ff 0f 36 00 00 46 37 29 81 02 b4 c0 c0 05 0d 09 0e a1 01 85 05 09 22 a1 00 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0",
1311*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x0EEF, 0x7349),
1312*0bb3ed71SBenjamin Tissoires            quirks=("SLOT_IS_CONTACTID", "ALWAYS_VALID"),
1313*0bb3ed71SBenjamin Tissoires        )
1314*0bb3ed71SBenjamin Tissoires
1315*0bb3ed71SBenjamin Tissoires
1316*0bb3ed71SBenjamin Tissoiresclass TestEgalax_capacitive_0eef_73f4(BaseTest.TestMultitouch):
1317*0bb3ed71SBenjamin Tissoires    def create_device(self):
1318*0bb3ed71SBenjamin Tissoires        return Digitizer(
1319*0bb3ed71SBenjamin Tissoires            "uhid test egalax-capacitive_0eef_73f4",
1320*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 04 09 22 a1 00 09 42 15 00 25 01 75 01 95 01 81 02 09 32 15 00 25 01 81 02 09 51 75 05 95 01 16 00 00 26 10 00 81 02 09 47 75 01 95 01 15 00 25 01 81 02 05 01 09 30 75 10 95 01 55 0d 65 33 35 00 46 96 4e 26 ff 7f 81 02 09 31 75 10 95 01 55 0d 65 33 35 00 46 23 2c 26 ff 7f 81 02 05 0d 09 55 25 08 75 08 95 01 b1 02 c0 c0 05 01 09 01 a1 01 85 01 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 95 02 75 01 81 02 95 01 75 06 81 01 05 01 09 30 09 31 16 00 00 26 ff 0f 36 00 00 46 ff 0f 66 00 00 75 10 95 02 81 02 c0 c0 06 00 ff 09 01 a1 01 09 01 15 00 26 ff 00 85 03 75 08 95 3f 81 02 06 00 ff 09 01 15 00 26 ff 00 75 08 95 3f 91 02 c0 05 0d 09 04 a1 01 85 02 09 20 a1 00 09 42 09 32 15 00 25 01 95 02 75 01 81 02 95 06 75 01 81 03 05 01 09 30 75 10 95 01 a4 55 0d 65 33 36 00 00 46 96 4e 16 00 00 26 ff 0f 81 02 09 31 16 00 00 26 ff 0f 36 00 00 46 23 2c 81 02 b4 c0 c0 05 0d 09 0e a1 01 85 05 09 22 a1 00 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0",
1321*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x0EEF, 0x73F4),
1322*0bb3ed71SBenjamin Tissoires        )
1323*0bb3ed71SBenjamin Tissoires
1324*0bb3ed71SBenjamin Tissoires
1325*0bb3ed71SBenjamin Tissoiresclass TestEgalax_capacitive_0eef_a001(BaseTest.TestMultitouch):
1326*0bb3ed71SBenjamin Tissoires    def create_device(self):
1327*0bb3ed71SBenjamin Tissoires        return Digitizer(
1328*0bb3ed71SBenjamin Tissoires            "uhid test egalax-capacitive_0eef_a001",
1329*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 04 09 22 a1 00 09 42 15 00 25 01 75 01 95 01 81 02 09 32 15 00 25 01 81 02 09 51 75 05 95 01 16 00 00 26 10 00 81 02 09 47 75 01 95 01 15 00 25 01 81 02 05 01 09 30 75 10 95 01 55 0d 65 33 35 00 46 23 28 26 ff 7f 81 02 09 31 75 10 95 01 55 0d 65 33 35 00 46 11 19 26 ff 7f 81 02 05 0d 09 55 25 08 75 08 95 01 b1 02 c0 c0 05 01 09 01 a1 01 85 01 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 95 02 75 01 81 02 95 01 75 06 81 01 05 01 09 30 09 31 16 00 00 26 ff 0f 36 00 00 46 ff 0f 66 00 00 75 10 95 02 81 02 c0 c0 06 00 ff 09 01 a1 01 09 01 15 00 26 ff 00 85 03 75 08 95 3f 81 02 06 00 ff 09 01 15 00 26 ff 00 75 08 95 3f 91 02 c0 05 0d 09 0e a1 01 85 05 09 22 a1 00 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0",
1330*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x0EEF, 0xA001),
1331*0bb3ed71SBenjamin Tissoires            quirks=("SLOT_IS_CONTACTID", "VALID_IS_INRANGE"),
1332*0bb3ed71SBenjamin Tissoires        )
1333*0bb3ed71SBenjamin Tissoires
1334*0bb3ed71SBenjamin Tissoires
1335*0bb3ed71SBenjamin Tissoiresclass TestElo_touchsystems_04e7_0022(BaseTest.TestMultitouch):
1336*0bb3ed71SBenjamin Tissoires    def create_device(self):
1337*0bb3ed71SBenjamin Tissoires        return Digitizer(
1338*0bb3ed71SBenjamin Tissoires            "uhid test elo-touchsystems_04e7_0022",
1339*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 0f 75 10 55 0e 65 33 09 30 35 00 46 ff 0f 81 02 46 ff 0f 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 0f 75 10 55 00 65 00 09 30 35 00 46 ff 0f 81 02 46 ff 0f 09 31 81 02 c0 05 0d 09 54 25 10 95 01 75 08 81 02 85 08 09 55 25 02 b1 02 c0 09 0e a1 01 85 07 09 22 a1 00 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 06 00 ff 09 55 85 80 15 00 26 ff 00 75 08 95 01 b1 82 c0 05 01 09 02 a1 01 85 54 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 95 06 81 03 05 01 09 30 15 00 26 ff 0f 75 10 95 01 81 02 09 31 75 10 95 01 81 02 09 3b 16 00 00 26 00 01 36 00 00 46 00 01 66 00 00 75 10 95 01 81 62 c0 c0",
1340*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x04E7, 0x0022),
1341*0bb3ed71SBenjamin Tissoires        )
1342*0bb3ed71SBenjamin Tissoires
1343*0bb3ed71SBenjamin Tissoires
1344*0bb3ed71SBenjamin Tissoiresclass TestElo_touchsystems_04e7_0080(BaseTest.TestMultitouch):
1345*0bb3ed71SBenjamin Tissoires    def create_device(self):
1346*0bb3ed71SBenjamin Tissoires        return Digitizer(
1347*0bb3ed71SBenjamin Tissoires            "uhid test elo-touchsystems_04e7_0080",
1348*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 03 81 03 09 32 09 47 95 02 81 02 95 02 81 03 09 51 75 08 95 01 81 02 05 01 26 ff 7f 65 11 55 0e 46 7c 24 75 10 95 01 09 30 81 02 09 31 46 96 14 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 95 03 81 03 09 32 09 47 95 02 81 02 95 02 81 03 09 51 75 08 95 01 81 02 05 01 26 ff 7f 65 11 55 0e 46 7c 24 75 10 95 01 09 30 81 02 09 31 46 96 14 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 95 03 81 03 09 32 09 47 95 02 81 02 95 02 81 03 09 51 75 08 95 01 81 02 05 01 26 ff 7f 65 11 55 0e 46 7c 24 75 10 95 01 09 30 81 02 09 31 46 96 14 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 95 03 81 03 09 32 09 47 95 02 81 02 95 02 81 03 09 51 75 08 95 01 81 02 05 01 26 ff 7f 65 11 55 0e 46 7c 24 75 10 95 01 09 30 81 02 09 31 46 96 14 81 02 c0 05 0d 09 54 75 08 95 01 15 00 25 08 81 02 09 55 b1 02 c0",
1349*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x04E7, 0x0080),
1350*0bb3ed71SBenjamin Tissoires        )
1351*0bb3ed71SBenjamin Tissoires
1352*0bb3ed71SBenjamin Tissoires
1353*0bb3ed71SBenjamin Tissoiresclass TestFlatfrog_25b5_0002(BaseTest.TestMultitouch):
1354*0bb3ed71SBenjamin Tissoires    def create_device(self):
1355*0bb3ed71SBenjamin Tissoires        return Digitizer(
1356*0bb3ed71SBenjamin Tissoires            "uhid test flatfrog_25b5_0002",
1357*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 05 09 22 a1 02 05 0d 15 00 25 01 75 01 95 01 09 42 81 02 09 32 81 02 95 06 81 03 75 08 95 01 25 7f 09 51 81 02 05 01 65 11 55 0e 75 10 35 00 26 a6 2b 46 48 1b 09 30 81 02 26 90 18 46 59 0f 09 31 81 02 05 0d 65 11 55 0f 75 08 25 7f 45 7f 09 48 81 02 09 49 81 02 65 00 55 00 75 10 26 00 04 46 00 04 09 30 81 02 c0 05 0d 09 22 65 00 55 00 a1 02 05 0d 15 00 25 01 75 01 95 01 09 42 81 02 09 32 81 02 95 06 81 03 75 08 95 01 25 7f 09 51 81 02 05 01 65 11 55 0e 75 10 35 00 26 a6 2b 46 48 1b 09 30 81 02 26 90 18 46 59 0f 09 31 81 02 05 0d 65 11 55 0f 75 08 25 7f 45 7f 09 48 81 02 09 49 81 02 65 00 55 00 75 10 26 00 04 46 00 04 09 30 81 02 c0 05 0d 09 22 65 00 55 00 a1 02 05 0d 15 00 25 01 75 01 95 01 09 42 81 02 09 32 81 02 95 06 81 03 75 08 95 01 25 7f 09 51 81 02 05 01 65 11 55 0e 75 10 35 00 26 a6 2b 46 48 1b 09 30 81 02 26 90 18 46 59 0f 09 31 81 02 05 0d 65 11 55 0f 75 08 25 7f 45 7f 09 48 81 02 09 49 81 02 65 00 55 00 75 10 26 00 04 46 00 04 09 30 81 02 c0 05 0d 09 22 65 00 55 00 a1 02 05 0d 15 00 25 01 75 01 95 01 09 42 81 02 09 32 81 02 95 06 81 03 75 08 95 01 25 7f 09 51 81 02 05 01 65 11 55 0e 75 10 35 00 26 a6 2b 46 48 1b 09 30 81 02 26 90 18 46 59 0f 09 31 81 02 05 0d 65 11 55 0f 75 08 25 7f 45 7f 09 48 81 02 09 49 81 02 65 00 55 00 75 10 26 00 04 46 00 04 09 30 81 02 c0 05 0d 09 22 65 00 55 00 a1 02 05 0d 15 00 25 01 75 01 95 01 09 42 81 02 09 32 81 02 95 06 81 03 75 08 95 01 25 7f 09 51 81 02 05 01 65 11 55 0e 75 10 35 00 26 a6 2b 46 48 1b 09 30 81 02 26 90 18 46 59 0f 09 31 81 02 05 0d 65 11 55 0f 75 08 25 7f 45 7f 09 48 81 02 09 49 81 02 65 00 55 00 75 10 26 00 04 46 00 04 09 30 81 02 c0 05 0d 09 22 65 00 55 00 a1 02 05 0d 15 00 25 01 75 01 95 01 09 42 81 02 09 32 81 02 95 06 81 03 75 08 95 01 25 7f 09 51 81 02 05 01 65 11 55 0e 75 10 35 00 26 a6 2b 46 48 1b 09 30 81 02 26 90 18 46 59 0f 09 31 81 02 05 0d 65 11 55 0f 75 08 25 7f 45 7f 09 48 81 02 09 49 81 02 65 00 55 00 75 10 26 00 04 46 00 04 09 30 81 02 c0 05 0d 09 22 65 00 55 00 a1 02 05 0d 15 00 25 01 75 01 95 01 09 42 81 02 09 32 81 02 95 06 81 03 75 08 95 01 25 7f 09 51 81 02 05 01 65 11 55 0e 75 10 35 00 26 a6 2b 46 48 1b 09 30 81 02 26 90 18 46 59 0f 09 31 81 02 05 0d 65 11 55 0f 75 08 25 7f 45 7f 09 48 81 02 09 49 81 02 65 00 55 00 75 10 26 00 04 46 00 04 09 30 81 02 c0 05 0d 09 22 65 00 55 00 a1 02 05 0d 15 00 25 01 75 01 95 01 09 42 81 02 09 32 81 02 95 06 81 03 75 08 95 01 25 7f 09 51 81 02 05 01 65 11 55 0e 75 10 35 00 26 a6 2b 46 48 1b 09 30 81 02 26 90 18 46 59 0f 09 31 81 02 05 0d 65 11 55 0f 75 08 25 7f 45 7f 09 48 81 02 09 49 81 02 65 00 55 00 75 10 26 00 04 46 00 04 09 30 81 02 c0 05 0d 09 22 65 00 55 00 a1 02 05 0d 15 00 25 01 75 01 95 01 09 42 81 02 09 32 81 02 95 06 81 03 75 08 95 01 25 7f 09 51 81 02 05 01 65 11 55 0e 75 10 35 00 26 a6 2b 46 48 1b 09 30 81 02 26 90 18 46 59 0f 09 31 81 02 05 0d 65 11 55 0f 75 08 25 7f 45 7f 09 48 81 02 09 49 81 02 65 00 55 00 75 10 26 00 04 46 00 04 09 30 81 02 c0 05 0d 09 22 65 00 55 00 a1 02 05 0d 15 00 25 01 75 01 95 01 09 42 81 02 09 32 81 02 95 06 81 03 75 08 95 01 25 7f 09 51 81 02 05 01 65 11 55 0e 75 10 35 00 26 a6 2b 46 48 1b 09 30 81 02 26 90 18 46 59 0f 09 31 81 02 05 0d 65 11 55 0f 75 08 25 7f 45 7f 09 48 81 02 09 49 81 02 65 00 55 00 75 10 26 00 04 46 00 04 09 30 81 02 c0 05 0d 09 22 65 00 55 00 a1 02 05 0d 15 00 25 01 75 01 95 01 09 42 81 02 09 32 81 02 95 06 81 03 75 08 95 01 25 7f 09 51 81 02 05 01 65 11 55 0e 75 10 35 00 26 a6 2b 46 48 1b 09 30 81 02 26 90 18 46 59 0f 09 31 81 02 05 0d 65 11 55 0f 75 08 25 7f 45 7f 09 48 81 02 09 49 81 02 65 00 55 00 75 10 26 00 04 46 00 04 09 30 81 02 c0 05 0d 09 22 65 00 55 00 a1 02 05 0d 15 00 25 01 75 01 95 01 09 42 81 02 09 32 81 02 95 06 81 03 75 08 95 01 25 7f 09 51 81 02 05 01 65 11 55 0e 75 10 35 00 26 a6 2b 46 48 1b 09 30 81 02 26 90 18 46 59 0f 09 31 81 02 05 0d 65 11 55 0f 75 08 25 7f 45 7f 09 48 81 02 09 49 81 02 65 00 55 00 75 10 26 00 04 46 00 04 09 30 81 02 c0 05 0d 09 22 65 00 55 00 a1 02 05 0d 15 00 25 01 75 01 95 01 09 42 81 02 09 32 81 02 95 06 81 03 75 08 95 01 25 7f 09 51 81 02 05 01 65 11 55 0e 75 10 35 00 26 a6 2b 46 48 1b 09 30 81 02 26 90 18 46 59 0f 09 31 81 02 05 0d 65 11 55 0f 75 08 25 7f 45 7f 09 48 81 02 09 49 81 02 65 00 55 00 75 10 26 00 04 46 00 04 09 30 81 02 c0 05 0d 09 22 65 00 55 00 a1 02 05 0d 15 00 25 01 75 01 95 01 09 42 81 02 09 32 81 02 95 06 81 03 75 08 95 01 25 7f 09 51 81 02 05 01 65 11 55 0e 75 10 35 00 26 a6 2b 46 48 1b 09 30 81 02 26 90 18 46 59 0f 09 31 81 02 05 0d 65 11 55 0f 75 08 25 7f 45 7f 09 48 81 02 09 49 81 02 65 00 55 00 75 10 26 00 04 46 00 04 09 30 81 02 c0 05 0d 09 22 65 00 55 00 a1 02 05 0d 15 00 25 01 75 01 95 01 09 42 81 02 09 32 81 02 95 06 81 03 75 08 95 01 25 7f 09 51 81 02 05 01 65 11 55 0e 75 10 35 00 26 a6 2b 46 48 1b 09 30 81 02 26 90 18 46 59 0f 09 31 81 02 05 0d 65 11 55 0f 75 08 25 7f 45 7f 09 48 81 02 09 49 81 02 65 00 55 00 75 10 26 00 04 46 00 04 09 30 81 02 c0 05 0d 09 22 65 00 55 00 a1 02 05 0d 15 00 25 01 75 01 95 01 09 42 81 02 09 32 81 02 95 06 81 03 75 08 95 01 25 7f 09 51 81 02 05 01 65 11 55 0e 75 10 35 00 26 a6 2b 46 48 1b 09 30 81 02 26 90 18 46 59 0f 09 31 81 02 05 0d 65 11 55 0f 75 08 25 7f 45 7f 09 48 81 02 09 49 81 02 65 00 55 00 75 10 26 00 04 46 00 04 09 30 81 02 c0 05 0d 09 22 65 00 55 00 a1 02 05 0d 15 00 25 01 75 01 95 01 09 42 81 02 09 32 81 02 95 06 81 03 75 08 95 01 25 7f 09 51 81 02 05 01 65 11 55 0e 75 10 35 00 26 a6 2b 46 48 1b 09 30 81 02 26 90 18 46 59 0f 09 31 81 02 05 0d 65 11 55 0f 75 08 25 7f 45 7f 09 48 81 02 09 49 81 02 65 00 55 00 75 10 26 00 04 46 00 04 09 30 81 02 c0 05 0d 09 22 65 00 55 00 a1 02 05 0d 15 00 25 01 75 01 95 01 09 42 81 02 09 32 81 02 95 06 81 03 75 08 95 01 25 7f 09 51 81 02 05 01 65 11 55 0e 75 10 35 00 26 a6 2b 46 48 1b 09 30 81 02 26 90 18 46 59 0f 09 31 81 02 05 0d 65 11 55 0f 75 08 25 7f 45 7f 09 48 81 02 09 49 81 02 65 00 55 00 75 10 26 00 04 46 00 04 09 30 81 02 c0 05 0d 09 22 65 00 55 00 a1 02 05 0d 15 00 25 01 75 01 95 01 09 42 81 02 09 32 81 02 95 06 81 03 75 08 95 01 25 7f 09 51 81 02 05 01 65 11 55 0e 75 10 35 00 26 a6 2b 46 48 1b 09 30 81 02 26 90 18 46 59 0f 09 31 81 02 05 0d 65 11 55 0f 75 08 25 7f 45 7f 09 48 81 02 09 49 81 02 65 00 55 00 75 10 26 00 04 46 00 04 09 30 81 02 c0 05 0d 09 22 65 00 55 00 a1 02 05 0d 15 00 25 01 75 01 95 01 09 42 81 02 09 32 81 02 95 06 81 03 75 08 95 01 25 7f 09 51 81 02 05 01 65 11 55 0e 75 10 35 00 26 a6 2b 46 48 1b 09 30 81 02 26 90 18 46 59 0f 09 31 81 02 05 0d 65 11 55 0f 75 08 25 7f 45 7f 09 48 81 02 09 49 81 02 65 00 55 00 75 10 26 00 04 46 00 04 09 30 81 02 c0 65 00 55 00 05 0d 55 0c 66 01 10 75 20 95 01 27 ff ff ff 7f 45 00 09 56 81 02 75 08 95 01 15 00 25 28 09 54 81 02 09 55 85 06 25 28 b1 02 c0 65 00 55 00 45 00 09 0e a1 01 85 03 09 23 a1 02 09 52 15 02 25 02 75 08 95 01 b1 02 09 53 15 00 25 0a 75 08 95 01 b1 02 c0 c0",
1358*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x25B5, 0x0002),
1359*0bb3ed71SBenjamin Tissoires            quirks=("NOT_SEEN_MEANS_UP", "NO_AREA"),
1360*0bb3ed71SBenjamin Tissoires            max_contacts=40,
1361*0bb3ed71SBenjamin Tissoires        )
1362*0bb3ed71SBenjamin Tissoires
1363*0bb3ed71SBenjamin Tissoires
1364*0bb3ed71SBenjamin Tissoiresclass TestFocaltech_10c4_81b9(BaseTest.TestMultitouch):
1365*0bb3ed71SBenjamin Tissoires    def create_device(self):
1366*0bb3ed71SBenjamin Tissoires        return Digitizer(
1367*0bb3ed71SBenjamin Tissoires            "uhid test focaltech_10c4_81b9",
1368*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 00 04 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 26 58 02 09 31 46 00 00 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 00 04 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 26 58 02 09 31 46 00 00 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 00 04 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 26 58 02 09 31 46 00 00 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 00 04 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 26 58 02 09 31 46 00 00 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 00 04 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 26 58 02 09 31 46 00 00 81 02 c0 05 0d 09 54 95 01 75 08 15 00 25 08 81 02 85 02 09 55 75 08 95 01 b1 02 c0",
1369*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x10C4, 0x81B9),
1370*0bb3ed71SBenjamin Tissoires            quirks=("ALWAYS_VALID",),
1371*0bb3ed71SBenjamin Tissoires            max_contacts=5,
1372*0bb3ed71SBenjamin Tissoires        )
1373*0bb3ed71SBenjamin Tissoires
1374*0bb3ed71SBenjamin Tissoires
1375*0bb3ed71SBenjamin Tissoiresclass TestHanvon_20b3_0a18(BaseTest.TestMultitouch):
1376*0bb3ed71SBenjamin Tissoires    def create_device(self):
1377*0bb3ed71SBenjamin Tissoires        return Digitizer(
1378*0bb3ed71SBenjamin Tissoires            "uhid test hanvon_20b3_0a18",
1379*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 09 51 75 08 95 01 81 02 05 01 35 00 55 0e 65 33 75 10 95 01 09 30 26 ff 4b 46 70 03 81 02 09 31 26 ff 2b 46 f1 01 81 02 46 00 00 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 09 51 75 08 95 01 81 02 05 01 35 00 55 0e 65 33 75 10 95 01 09 30 26 ff 4b 46 70 03 81 02 09 31 26 ff 2b 46 f1 01 81 02 46 00 00 c0 05 0d 09 54 75 08 95 01 81 02 05 0d 85 02 09 55 25 02 75 08 95 01 b1 02 c0",
1380*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x20B3, 0x0A18),
1381*0bb3ed71SBenjamin Tissoires        )
1382*0bb3ed71SBenjamin Tissoires
1383*0bb3ed71SBenjamin Tissoires
1384*0bb3ed71SBenjamin Tissoiresclass TestHuitoo_03f7_0003(BaseTest.TestMultitouch):
1385*0bb3ed71SBenjamin Tissoires    def create_device(self):
1386*0bb3ed71SBenjamin Tissoires        return Digitizer(
1387*0bb3ed71SBenjamin Tissoires            "uhid test huitoo_03f7_0003",
1388*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 00 65 00 35 00 46 ff 0f 09 30 26 ff 0f 81 02 09 31 26 ff 0f 81 02 05 0d 09 48 26 ff 0f 81 02 09 49 26 ff 0f 81 02 c0 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 00 65 00 35 00 46 ff 0f 09 30 26 ff 0f 81 02 09 31 26 ff 0f 81 02 05 0d 09 48 26 ff 0f 81 02 09 49 26 ff 0f 81 02 c0 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 00 65 00 35 00 46 ff 0f 09 30 26 ff 0f 81 02 09 31 26 ff 0f 81 02 05 0d 09 48 26 ff 0f 81 02 09 49 26 ff 0f 81 02 c0 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 00 65 00 35 00 46 ff 0f 09 30 26 ff 0f 81 02 09 31 26 ff 0f 81 02 05 0d 09 48 26 ff 0f 81 02 09 49 26 ff 0f 81 02 c0 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 00 65 00 35 00 46 ff 0f 09 30 26 ff 0f 81 02 09 31 26 ff 0f 81 02 05 0d 09 48 26 ff 0f 81 02 09 49 26 ff 0f 81 02 c0 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 00 65 00 35 00 46 ff 0f 09 30 26 ff 0f 81 02 09 31 26 ff 0f 81 02 05 0d 09 48 26 ff 0f 81 02 09 49 26 ff 0f 81 02 c0 05 0d 09 54 95 01 75 08 15 00 25 08 81 02 09 55 b1 02 c0 09 0e a1 01 85 02 09 23 a1 02 09 52 09 53 15 00 25 10 75 08 95 02 b1 02 c0 c0 05 01 09 02 a1 01 85 03 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 95 03 75 01 81 02 95 01 75 05 81 01 05 01 09 30 09 31 15 00 26 ff 0f 35 00 46 ff 0f 75 10 95 02 81 02 c0 c0 06 00 ff 09 01 a1 01 85 04 15 00 26 ff 00 75 08 95 3f 09 02 81 02 95 3f 09 02 91 02 c0",
1389*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x03F7, 0x0003),
1390*0bb3ed71SBenjamin Tissoires        )
1391*0bb3ed71SBenjamin Tissoires
1392*0bb3ed71SBenjamin Tissoires
1393*0bb3ed71SBenjamin Tissoiresclass TestIdeacom_1cb6_6650(BaseTest.TestMultitouch):
1394*0bb3ed71SBenjamin Tissoires    def create_device(self):
1395*0bb3ed71SBenjamin Tissoires        return Digitizer(
1396*0bb3ed71SBenjamin Tissoires            "uhid test ideacom_1cb6_6650",
1397*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 0a 09 22 a1 00 09 42 09 32 15 00 25 01 95 02 75 01 81 02 95 06 81 03 05 01 26 ff 1f 75 10 95 01 55 0d 65 33 09 31 35 00 46 61 13 81 02 09 30 46 73 22 81 02 05 0d 75 08 95 01 09 30 26 ff 00 81 02 09 51 81 02 85 0c 09 55 25 02 95 01 b1 02 c0 06 00 ff 85 02 09 01 75 08 95 07 b1 02 85 03 09 02 75 08 95 07 b1 02 85 04 09 03 75 08 95 07 b1 02 85 05 09 04 75 08 95 07 b1 02 85 06 09 05 75 08 96 27 00 b1 02 85 07 09 06 75 08 96 27 00 b1 02 85 08 09 07 75 08 95 07 b1 02 85 09 09 08 75 08 95 07 b1 02 85 0b 09 09 75 08 96 07 00 b1 02 85 0d 09 0a 75 08 96 27 00 b1 02 c0 09 0e a1 01 85 0e 09 52 09 53 95 07 b1 02 c0 05 01 09 02 a1 01 85 01 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 75 06 95 01 81 01 05 01 09 31 09 30 15 00 27 ff 1f 00 00 75 10 95 02 81 02 c0 09 01 a1 02 15 00 26 ff 00 95 02 75 08 81 03 c0 c0",
1398*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x1CB6, 0x6650),
1399*0bb3ed71SBenjamin Tissoires        )
1400*0bb3ed71SBenjamin Tissoires
1401*0bb3ed71SBenjamin Tissoires
1402*0bb3ed71SBenjamin Tissoiresclass TestIdeacom_1cb6_6651(BaseTest.TestMultitouch):
1403*0bb3ed71SBenjamin Tissoires    def create_device(self):
1404*0bb3ed71SBenjamin Tissoires        return Digitizer(
1405*0bb3ed71SBenjamin Tissoires            "uhid test ideacom_1cb6_6651",
1406*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 0a 09 22 a1 02 09 42 09 32 15 00 25 01 95 02 75 01 81 02 95 06 81 03 05 01 26 ff 1f 75 10 95 01 55 0d 65 33 09 31 35 00 46 39 13 81 02 09 30 46 24 22 81 02 05 0d 75 08 95 01 09 30 26 ff 00 81 02 09 51 81 02 85 0c 09 55 25 02 95 01 b1 02 c0 06 00 ff 85 02 09 01 75 08 95 07 b1 02 85 03 09 02 75 08 95 07 b1 02 85 04 09 03 75 08 95 07 b1 02 85 05 09 04 75 08 95 07 b1 02 85 06 09 05 75 08 95 1f b1 02 85 07 09 06 75 08 96 1f 00 b1 02 85 08 09 07 75 08 95 07 b1 02 85 09 09 08 75 08 95 07 b1 02 85 0b 09 09 75 08 95 07 b1 02 85 0d 09 0a 75 08 96 1f 00 b1 02 c0 09 0e a1 01 85 0e 09 52 09 53 95 07 b1 02 c0 05 01 09 02 a1 01 85 01 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 75 06 95 01 81 01 05 01 09 31 09 30 15 00 27 ff 1f 00 00 75 10 95 02 81 02 c0 09 01 a1 02 15 00 26 ff 00 95 02 75 08 81 03 c0 c0",
1407*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x1CB6, 0x6651),
1408*0bb3ed71SBenjamin Tissoires        )
1409*0bb3ed71SBenjamin Tissoires
1410*0bb3ed71SBenjamin Tissoires
1411*0bb3ed71SBenjamin Tissoiresclass TestIkaist_2793_0001(BaseTest.TestMultitouch):
1412*0bb3ed71SBenjamin Tissoires    def create_device(self):
1413*0bb3ed71SBenjamin Tissoires        return Digitizer(
1414*0bb3ed71SBenjamin Tissoires            "uhid test ikaist_2793_0001",
1415*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 01 a1 01 85 01 09 01 a1 00 05 09 09 01 95 01 75 01 15 00 25 01 81 02 95 07 75 01 81 03 95 01 75 08 81 03 05 01 09 30 09 31 15 00 26 ff 7f 35 00 46 00 00 95 02 75 10 81 02 c0 a1 02 15 00 26 ff 00 09 01 95 39 75 08 81 03 c0 c0 05 0d 09 0e a1 01 85 11 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0 09 04 a1 01 85 13 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 51 07 81 02 09 31 46 96 04 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 51 07 81 02 09 31 46 96 04 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 51 07 81 02 09 31 46 96 04 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 51 07 81 02 09 31 46 96 04 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 51 07 81 02 09 31 46 96 04 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 51 07 81 02 09 31 46 96 04 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 51 07 81 02 09 31 46 96 04 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 51 07 81 02 09 31 46 96 04 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 51 07 81 02 09 31 46 96 04 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 33 09 30 35 00 46 51 07 81 02 09 31 46 96 04 81 02 c0 05 0d 09 54 95 01 75 08 15 00 25 3c 81 02 06 00 ff 09 01 15 00 26 ff 00 75 08 95 02 81 03 05 0d 85 12 09 55 95 01 75 08 15 00 25 3c b1 02 06 00 ff 15 00 26 ff 00 85 1e 09 01 75 08 95 80 b1 02 85 1f 09 01 75 08 96 3f 01 b1 02 c0",
1416*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x2793, 0x0001),
1417*0bb3ed71SBenjamin Tissoires        )
1418*0bb3ed71SBenjamin Tissoires
1419*0bb3ed71SBenjamin Tissoires
1420*0bb3ed71SBenjamin Tissoiresclass TestIrmtouch_23c9_5666(BaseTest.TestMultitouch):
1421*0bb3ed71SBenjamin Tissoires    def create_device(self):
1422*0bb3ed71SBenjamin Tissoires        return Digitizer(
1423*0bb3ed71SBenjamin Tissoires            "uhid test irmtouch_23c9_5666",
1424*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 0a 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 15 00 26 ff 7f 75 10 09 30 81 02 09 31 81 02 05 0d 09 48 09 49 95 02 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 15 00 26 ff 7f 75 10 09 30 81 02 09 31 81 02 05 0d 09 48 09 49 95 02 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 15 00 26 ff 7f 75 10 09 30 81 02 09 31 81 02 05 0d 09 48 09 49 95 02 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 15 00 26 ff 7f 75 10 09 30 81 02 09 31 81 02 05 0d 09 48 09 49 95 02 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 15 00 26 ff 7f 75 10 09 30 81 02 09 31 81 02 05 0d 09 48 09 49 95 02 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 15 00 26 ff 7f 75 10 09 30 81 02 09 31 81 02 05 0d 09 48 09 49 95 02 81 02 c0 05 0d 09 54 95 01 75 08 81 02 09 55 25 06 b1 02 c0 09 0e a1 01 85 0c 09 23 a1 02 09 52 15 00 25 06 75 08 95 01 b1 02 c0 c0",
1425*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x23C9, 0x5666),
1426*0bb3ed71SBenjamin Tissoires        )
1427*0bb3ed71SBenjamin Tissoires
1428*0bb3ed71SBenjamin Tissoires
1429*0bb3ed71SBenjamin Tissoiresclass TestIrtouch_6615_0070(BaseTest.TestMultitouch):
1430*0bb3ed71SBenjamin Tissoires    def create_device(self):
1431*0bb3ed71SBenjamin Tissoires        return Digitizer(
1432*0bb3ed71SBenjamin Tissoires            "uhid test irtouch_6615_0070",
1433*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 02 a1 01 85 10 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 95 02 75 01 81 02 95 06 81 03 05 01 09 30 09 31 15 00 26 ff 7f 75 10 95 02 81 02 c0 c0 05 0d 09 04 a1 01 85 30 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 09 51 75 08 95 01 81 02 05 01 09 30 26 ff 7f 55 0f 65 11 35 00 46 51 02 75 10 95 01 81 02 09 31 35 00 46 73 01 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 09 51 75 08 95 01 81 02 05 01 09 30 26 ff 7f 55 0f 65 11 35 00 46 51 02 75 10 95 01 81 02 09 31 35 00 46 73 01 81 02 c0 05 0d 09 54 15 00 26 02 00 75 08 95 01 81 02 85 03 09 55 15 00 26 ff 00 75 08 95 01 b1 02 c0 05 0d 09 0e a1 01 85 02 09 52 09 53 15 00 26 ff 00 75 08 95 02 b1 02 c0 05 0d 09 02 a1 01 85 20 09 20 a1 00 09 42 15 00 25 01 75 01 95 01 81 02 95 07 81 03 05 01 09 30 26 ff 7f 55 0f 65 11 35 00 46 51 02 75 10 95 01 81 02 09 31 35 00 46 73 01 81 02 85 01 06 00 ff 09 01 75 08 95 01 b1 02 c0 c0",
1434*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x6615, 0x0070),
1435*0bb3ed71SBenjamin Tissoires        )
1436*0bb3ed71SBenjamin Tissoires
1437*0bb3ed71SBenjamin Tissoires
1438*0bb3ed71SBenjamin Tissoiresclass TestIrtouch_6615_0081(BaseTest.TestMultitouch):
1439*0bb3ed71SBenjamin Tissoires    def create_device(self):
1440*0bb3ed71SBenjamin Tissoires        return Digitizer(
1441*0bb3ed71SBenjamin Tissoires            "uhid test irtouch_6615_0081",
1442*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 30 09 22 09 00 15 00 26 ff 00 75 08 95 05 81 02 a1 00 05 0d 09 51 15 00 26 ff 00 75 08 95 01 81 02 05 01 09 30 26 ff 7f 55 0e 65 13 35 00 46 b5 04 75 10 95 01 81 02 09 31 35 00 46 8a 03 81 02 09 32 35 00 46 8a 03 81 02 09 00 15 00 26 ff 7f 75 10 95 01 81 02 09 00 15 00 26 ff 7f 75 10 95 01 81 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 09 00 15 00 26 ff 00 75 08 95 01 81 02 c0 a1 00 05 0d 09 51 15 00 26 ff 00 75 08 95 01 81 02 05 01 09 30 26 ff 7f 55 0e 65 13 35 00 46 b5 04 75 10 95 01 81 02 09 31 35 00 46 8a 03 81 02 09 32 35 00 46 8a 03 81 02 09 00 15 00 26 ff 7f 75 10 95 01 81 02 09 00 15 00 26 ff 7f 75 10 95 01 81 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 09 00 15 00 26 ff 00 75 08 95 01 81 02 c0 a1 00 05 0d 09 51 15 00 26 ff 00 75 08 95 01 81 02 05 01 09 30 26 ff 7f 55 0e 65 13 35 00 46 b5 04 75 10 95 01 81 02 09 31 35 00 46 8a 03 81 02 09 32 35 00 46 8a 03 81 02 09 00 15 00 26 ff 7f 75 10 95 01 81 02 09 00 15 00 26 ff 7f 75 10 95 01 81 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 09 00 15 00 26 ff 00 75 08 95 01 81 02 c0 a1 00 05 0d 09 54 15 00 25 1f 75 05 95 01 81 02 09 00 15 00 25 07 75 03 95 01 81 02 09 00 15 00 26 ff 00 75 08 95 01 81 02 c0 09 55 85 03 15 00 26 ff 00 75 08 95 01 b1 02 c0 05 0d 09 0e a1 01 85 02 09 52 09 53 15 00 26 ff 00 75 08 95 02 b1 02 c0 06 00 ff 09 00 a1 01 09 02 a1 00 85 aa 09 06 15 00 26 ff 00 35 00 46 ff 00 75 08 95 3f b1 02 c0 c0 05 01 09 02 a1 01 85 10 09 01 a1 00 05 01 09 00 15 00 26 ff 00 75 08 95 05 81 02 09 30 09 31 09 32 15 00 26 ff 7f 75 10 95 03 81 02 05 09 19 01 29 08 15 00 25 01 95 08 75 01 81 02 09 00 15 00 26 ff 00 75 08 95 02 81 02 c0 c0 06 00 ff 09 00 a1 01 85 40 09 00 15 00 26 ff 00 75 08 95 2e 81 02 c0",
1443*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x6615, 0x0081),
1444*0bb3ed71SBenjamin Tissoires        )
1445*0bb3ed71SBenjamin Tissoires
1446*0bb3ed71SBenjamin Tissoires
1447*0bb3ed71SBenjamin Tissoiresclass TestLG_043e_9aa1(BaseTest.TestMultitouch):
1448*0bb3ed71SBenjamin Tissoires    def create_device(self):
1449*0bb3ed71SBenjamin Tissoires        return Digitizer(
1450*0bb3ed71SBenjamin Tissoires            "uhid test lg_043e_9aa1",
1451*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 09 31 46 78 0a 26 38 04 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 46 78 0a 26 38 04 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 46 78 0a 26 38 04 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 46 78 0a 26 38 04 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 46 78 0a 26 38 04 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 46 78 0a 26 38 04 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 46 78 0a 26 38 04 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 46 78 0a 26 38 04 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 46 78 0a 26 38 04 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 46 78 0a 26 38 04 09 31 81 02 c0 05 0d 09 54 95 01 75 08 15 00 25 0a 81 02 25 0a 09 55 b1 02 c0 09 0e a1 01 85 03 09 22 a1 00 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0 05 01 09 02 a1 01 85 04 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 95 06 81 03 05 01 09 30 75 10 95 01 15 00 26 7f 07 81 02 09 31 26 37 04 81 02 c0 c0 06 00 ff 09 01 a1 01 85 05 15 00 26 ff 00 75 08 95 19 09 01 b1 02 c0 05 14 09 2b a1 02 85 07 09 2b 15 00 25 0a 75 08 95 40 b1 02 09 4b 15 00 25 0a 75 08 95 02 91 02 c0 05 14 09 2c a1 02 85 08 09 2b 15 00 25 0a 75 08 95 05 81 02 09 4b 15 00 25 0a 75 08 95 47 91 02 c0",
1452*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x043E, 0x9AA1),
1453*0bb3ed71SBenjamin Tissoires        )
1454*0bb3ed71SBenjamin Tissoires
1455*0bb3ed71SBenjamin Tissoires
1456*0bb3ed71SBenjamin Tissoiresclass TestLG_043e_9aa3(BaseTest.TestMultitouch):
1457*0bb3ed71SBenjamin Tissoires    def create_device(self):
1458*0bb3ed71SBenjamin Tissoires        return Digitizer(
1459*0bb3ed71SBenjamin Tissoires            "uhid test lg_043e_9aa3",
1460*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 09 31 46 78 0a 26 38 04 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 46 78 0a 26 38 04 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 46 78 0a 26 38 04 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 46 78 0a 26 38 04 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 46 78 0a 26 38 04 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 46 78 0a 26 38 04 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 46 78 0a 26 38 04 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 46 78 0a 26 38 04 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 46 78 0a 26 38 04 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 46 78 0a 26 38 04 09 31 81 02 c0 05 0d 09 54 95 01 75 08 15 00 25 0a 81 02 25 0a 09 55 b1 02 c0 09 0e a1 01 85 03 09 22 a1 00 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0 05 01 09 02 a1 01 85 04 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 95 06 81 03 05 01 09 30 75 10 95 01 15 00 26 7f 07 81 02 09 31 26 37 04 81 02 c0 c0 06 00 ff 09 01 a1 01 85 05 15 00 26 ff 00 75 08 95 19 09 01 b1 02 c0 05 14 09 2b a1 02 85 07 09 2b 15 00 25 0a 75 08 95 40 b1 02 09 4b 15 00 25 0a 75 08 95 02 91 02 c0 05 14 09 2c a1 02 85 08 09 2b 15 00 25 0a 75 08 95 05 81 02 09 4b 15 00 25 0a 75 08 95 47 91 02 c0",
1461*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x043E, 0x9AA3),
1462*0bb3ed71SBenjamin Tissoires        )
1463*0bb3ed71SBenjamin Tissoires
1464*0bb3ed71SBenjamin Tissoires
1465*0bb3ed71SBenjamin Tissoiresclass TestLG_1fd2_0064(BaseTest.TestMultitouch):
1466*0bb3ed71SBenjamin Tissoires    def create_device(self):
1467*0bb3ed71SBenjamin Tissoires        return Digitizer(
1468*0bb3ed71SBenjamin Tissoires            "uhid test lg_1fd2_0064",
1469*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 a1 00 05 01 26 80 07 75 10 55 0e 65 33 09 30 35 00 46 53 07 81 02 26 38 04 46 20 04 09 31 81 02 45 00 c0 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 a1 00 05 01 26 80 07 75 10 55 0e 65 33 09 30 35 00 46 53 07 81 02 26 38 04 46 20 04 09 31 81 02 45 00 c0 c0 05 0d 09 54 95 01 75 08 81 02 85 08 09 55 95 01 25 02 b1 02 c0 09 0e a1 01 85 07 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0 05 01 09 02 a1 01 85 03 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 95 06 81 03 05 01 09 30 09 31 75 10 95 02 15 00 26 ff 7f 81 02 c0 c0",
1470*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x1FD2, 0x0064),
1471*0bb3ed71SBenjamin Tissoires        )
1472*0bb3ed71SBenjamin Tissoires
1473*0bb3ed71SBenjamin Tissoires
1474*0bb3ed71SBenjamin Tissoiresclass TestLumio_202e_0006(BaseTest.TestMultitouch):
1475*0bb3ed71SBenjamin Tissoires    def create_device(self):
1476*0bb3ed71SBenjamin Tissoires        return Digitizer(
1477*0bb3ed71SBenjamin Tissoires            "uhid test lumio_202e_0006",
1478*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 03 81 03 09 32 09 47 95 02 81 02 95 02 81 03 09 51 75 08 95 01 81 02 05 01 26 ff 7f 65 11 55 0e 46 b0 0e 75 10 95 01 09 30 81 02 09 31 46 c2 0b 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 95 03 81 03 09 32 09 47 95 02 81 02 95 02 81 03 09 51 75 08 95 01 81 02 05 01 26 ff 7f 65 11 55 0e 46 b0 0e 75 10 95 01 09 30 81 02 09 31 46 c2 0b 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 95 03 81 03 09 32 09 47 95 02 81 02 95 02 81 03 09 51 75 08 95 01 81 02 05 01 26 ff 7f 65 11 55 0e 46 b0 0e 75 10 95 01 09 30 81 02 09 31 46 c2 0b 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 95 03 81 03 09 32 09 47 95 02 81 02 95 02 81 03 09 51 75 08 95 01 81 02 05 01 26 ff 7f 65 11 55 0e 46 b0 0e 75 10 95 01 09 30 81 02 09 31 46 c2 0b 81 02 c0 05 0d 09 54 75 08 95 01 15 00 25 08 81 02 09 55 b1 02 c0",
1479*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x202E, 0x0006),
1480*0bb3ed71SBenjamin Tissoires            quirks=("VALID_IS_CONFIDENCE", "SLOT_IS_CONTACTID_MINUS_ONE"),
1481*0bb3ed71SBenjamin Tissoires        )
1482*0bb3ed71SBenjamin Tissoires
1483*0bb3ed71SBenjamin Tissoires
1484*0bb3ed71SBenjamin Tissoiresclass TestLumio_202e_0007(BaseTest.TestMultitouch):
1485*0bb3ed71SBenjamin Tissoires    def create_device(self):
1486*0bb3ed71SBenjamin Tissoires        return Digitizer(
1487*0bb3ed71SBenjamin Tissoires            "uhid test lumio_202e_0007",
1488*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 09 22 a1 00 09 42 15 00 25 01 75 01 95 01 81 02 95 03 81 03 09 32 09 47 95 02 81 02 95 0a 81 03 05 01 26 ff 7f 65 11 55 0e 46 ba 0e 75 10 95 01 09 30 81 02 09 31 46 ea 0b 81 02 05 0d 09 51 75 10 95 01 81 02 09 55 15 00 25 08 75 08 95 01 b1 02 c0 c0",
1489*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x202E, 0x0007),
1490*0bb3ed71SBenjamin Tissoires            quirks=("VALID_IS_CONFIDENCE", "SLOT_IS_CONTACTID_MINUS_ONE"),
1491*0bb3ed71SBenjamin Tissoires        )
1492*0bb3ed71SBenjamin Tissoires
1493*0bb3ed71SBenjamin Tissoires
1494*0bb3ed71SBenjamin Tissoiresclass TestNexio_1870_0100(BaseTest.TestMultitouch):
1495*0bb3ed71SBenjamin Tissoires    def create_device(self):
1496*0bb3ed71SBenjamin Tissoires        return Digitizer(
1497*0bb3ed71SBenjamin Tissoires            "uhid test nexio_1870_0100",
1498*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 0e 65 11 09 30 35 00 46 1e 19 81 02 26 ff 3f 09 31 35 00 46 be 0f 81 02 26 ff 3f c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 0e 65 11 09 30 35 00 46 1e 19 81 02 26 ff 3f 09 31 35 00 46 be 0f 81 02 26 ff 3f c0 05 0d 09 54 95 01 75 08 25 02 81 02 85 02 09 55 25 02 b1 02 c0 09 0e a1 01 85 03 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0 05 01 09 02 a1 01 09 01 a1 00 85 04 05 09 95 03 75 01 19 01 29 03 15 00 25 01 81 02 95 01 75 05 81 01 05 01 75 10 95 02 09 30 09 31 15 00 26 ff 7f 81 02 c0 c0 05 0d 09 02 a1 01 85 05 09 20 a1 00 09 42 09 32 15 00 25 01 75 01 95 02 81 02 95 0e 81 03 05 01 26 ff 3f 75 10 95 01 55 0e 65 11 09 30 35 00 46 1e 19 81 02 26 ff 3f 09 31 35 00 46 be 0f 81 02 26 ff 3f c0 c0 06 00 ff 09 01 a1 01 85 06 19 01 29 40 15 00 26 ff 00 75 08 95 40 81 00 19 01 29 40 91 00 c0",
1499*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x1870, 0x0100),
1500*0bb3ed71SBenjamin Tissoires        )
1501*0bb3ed71SBenjamin Tissoires
1502*0bb3ed71SBenjamin Tissoires
1503*0bb3ed71SBenjamin Tissoiresclass TestNexio_1870_010d(BaseTest.TestMultitouch):
1504*0bb3ed71SBenjamin Tissoires    def create_device(self):
1505*0bb3ed71SBenjamin Tissoires        return Digitizer(
1506*0bb3ed71SBenjamin Tissoires            "uhid test nexio_1870_010d",
1507*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 0d 65 00 09 30 35 00 46 00 00 81 02 26 ff 3f 09 31 35 00 46 00 00 81 02 26 ff 3f 05 0d 09 48 35 00 26 ff 3f 81 02 09 49 35 00 26 ff 3f 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 0d 65 00 09 30 35 00 46 00 00 81 02 26 ff 3f 09 31 35 00 46 00 00 81 02 26 ff 3f 05 0d 09 48 35 00 26 ff 3f 81 02 09 49 35 00 26 ff 3f 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 0d 65 00 09 30 35 00 46 00 00 81 02 26 ff 3f 09 31 35 00 46 00 00 81 02 26 ff 3f 05 0d 09 48 35 00 26 ff 3f 81 02 09 49 35 00 26 ff 3f 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 0d 65 00 09 30 35 00 46 00 00 81 02 26 ff 3f 09 31 35 00 46 00 00 81 02 26 ff 3f 05 0d 09 48 35 00 26 ff 3f 81 02 09 49 35 00 26 ff 3f 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 0d 65 00 09 30 35 00 46 00 00 81 02 26 ff 3f 09 31 35 00 46 00 00 81 02 26 ff 3f 05 0d 09 48 35 00 26 ff 3f 81 02 09 49 35 00 26 ff 3f 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 0d 65 00 09 30 35 00 46 00 00 81 02 26 ff 3f 09 31 35 00 46 00 00 81 02 26 ff 3f 05 0d 09 48 35 00 26 ff 3f 81 02 09 49 35 00 26 ff 3f 81 02 c0 05 0d 09 54 95 01 75 08 25 02 81 02 85 02 09 55 25 06 b1 02 c0 09 0e a1 01 85 03 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0 05 01 09 02 a1 01 09 01 a1 00 85 04 05 09 95 03 75 01 19 01 29 03 15 00 25 01 81 02 95 01 75 05 81 01 05 01 75 10 95 02 09 30 09 31 15 00 26 ff 7f 81 02 c0 c0 05 0d 09 02 a1 01 85 05 09 20 a1 00 09 42 09 32 15 00 25 01 75 01 95 02 81 02 95 0e 81 03 05 01 26 ff 3f 75 10 95 01 55 0e 65 11 09 30 35 00 46 1e 19 81 02 26 ff 3f 09 31 35 00 46 be 0f 81 02 26 ff 3f c0 c0 06 00 ff 09 01 a1 01 85 06 19 01 29 40 15 00 26 ff 00 75 08 95 3e 81 00 19 01 29 40 91 00 c0",
1508*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x1870, 0x010D),
1509*0bb3ed71SBenjamin Tissoires        )
1510*0bb3ed71SBenjamin Tissoires
1511*0bb3ed71SBenjamin Tissoires
1512*0bb3ed71SBenjamin Tissoiresclass TestNexio_1870_0119(BaseTest.TestMultitouch):
1513*0bb3ed71SBenjamin Tissoires    def create_device(self):
1514*0bb3ed71SBenjamin Tissoires        return Digitizer(
1515*0bb3ed71SBenjamin Tissoires            "uhid test nexio_1870_0119",
1516*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 0d 65 00 09 30 35 00 46 00 00 81 02 26 ff 3f 09 31 35 00 46 00 00 81 02 26 ff 3f 05 0d 09 48 35 00 26 ff 3f 81 02 09 49 35 00 26 ff 3f 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 0d 65 00 09 30 35 00 46 00 00 81 02 26 ff 3f 09 31 35 00 46 00 00 81 02 26 ff 3f 05 0d 09 48 35 00 26 ff 3f 81 02 09 49 35 00 26 ff 3f 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 0d 65 00 09 30 35 00 46 00 00 81 02 26 ff 3f 09 31 35 00 46 00 00 81 02 26 ff 3f 05 0d 09 48 35 00 26 ff 3f 81 02 09 49 35 00 26 ff 3f 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 0d 65 00 09 30 35 00 46 00 00 81 02 26 ff 3f 09 31 35 00 46 00 00 81 02 26 ff 3f 05 0d 09 48 35 00 26 ff 3f 81 02 09 49 35 00 26 ff 3f 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 0d 65 00 09 30 35 00 46 00 00 81 02 26 ff 3f 09 31 35 00 46 00 00 81 02 26 ff 3f 05 0d 09 48 35 00 26 ff 3f 81 02 09 49 35 00 26 ff 3f 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 0d 65 00 09 30 35 00 46 00 00 81 02 26 ff 3f 09 31 35 00 46 00 00 81 02 26 ff 3f 05 0d 09 48 35 00 26 ff 3f 81 02 09 49 35 00 26 ff 3f 81 02 c0 05 0d 09 54 95 01 75 08 25 02 81 02 85 02 09 55 25 06 b1 02 c0 09 0e a1 01 85 03 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0 05 01 09 02 a1 01 09 01 a1 00 85 04 05 09 95 03 75 01 19 01 29 03 15 00 25 01 81 02 95 01 75 05 81 01 05 01 75 10 95 02 09 30 09 31 15 00 26 ff 7f 81 02 c0 c0 05 0d 09 02 a1 01 85 05 09 20 a1 00 09 42 09 32 15 00 25 01 75 01 95 02 81 02 95 0e 81 03 05 01 26 ff 3f 75 10 95 01 55 0e 65 11 09 30 35 00 46 1e 19 81 02 26 ff 3f 09 31 35 00 46 be 0f 81 02 26 ff 3f c0 c0 06 00 ff 09 01 a1 01 85 06 19 01 29 40 15 00 26 ff 00 75 08 95 3e 81 00 19 01 29 40 91 00 c0",
1517*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x1870, 0x0119),
1518*0bb3ed71SBenjamin Tissoires        )
1519*0bb3ed71SBenjamin Tissoires
1520*0bb3ed71SBenjamin Tissoires
1521*0bb3ed71SBenjamin Tissoiresclass TestPenmount_14e1_3500(BaseTest.TestMultitouch):
1522*0bb3ed71SBenjamin Tissoires    def create_device(self):
1523*0bb3ed71SBenjamin Tissoires        return Digitizer(
1524*0bb3ed71SBenjamin Tissoires            "uhid test penmount_14e1_3500",
1525*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 09 22 a1 00 09 51 15 00 25 0f 75 04 95 01 81 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 81 01 05 01 75 10 95 01 09 30 26 ff 07 81 02 09 31 26 ff 07 81 02 05 0d 09 55 75 08 95 05 b1 02 c0 c0",
1526*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x14E1, 0x3500),
1527*0bb3ed71SBenjamin Tissoires            quirks=("VALID_IS_CONFIDENCE",),
1528*0bb3ed71SBenjamin Tissoires            max_contacts=10,
1529*0bb3ed71SBenjamin Tissoires        )
1530*0bb3ed71SBenjamin Tissoires
1531*0bb3ed71SBenjamin Tissoires
1532*0bb3ed71SBenjamin Tissoiresclass TestPixart_093a_8002(BaseTest.TestMultitouch):
1533*0bb3ed71SBenjamin Tissoires    def create_device(self):
1534*0bb3ed71SBenjamin Tissoires        return Digitizer(
1535*0bb3ed71SBenjamin Tissoires            "uhid test pixart_093a_8002",
1536*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 02 a1 01 85 0d 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 95 02 75 01 81 02 95 01 75 06 81 03 05 01 55 0e 65 11 75 10 95 01 35 00 46 5a 14 26 ff 7f 09 30 81 22 46 72 0b 26 ff 7f 09 31 81 22 95 08 75 08 81 03 c0 c0 05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 5a 14 26 ff 7f 81 02 09 31 46 72 0b 26 ff 7f 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 5a 14 26 ff 7f 81 02 46 72 0b 26 ff 7f 09 31 81 02 c0 05 0d 09 54 15 00 26 ff 00 95 01 75 08 81 02 09 55 25 02 95 01 85 02 b1 02 c0 05 0d 09 0e a1 01 06 00 ff 09 01 26 ff 00 75 08 95 47 85 03 b1 02 09 01 96 ff 03 85 04 b1 02 09 01 95 0b 85 05 b1 02 09 01 96 ff 03 85 06 b1 02 09 01 95 0f 85 07 b1 02 09 01 96 ff 03 85 08 b1 02 09 01 96 ff 03 85 09 b1 02 09 01 95 3f 85 0a b1 02 09 01 96 ff 03 85 0b b1 02 09 01 96 c3 03 85 0e b1 02 09 01 96 ff 03 85 0f b1 02 09 01 96 83 03 85 10 b1 02 09 01 96 93 00 85 11 b1 02 09 01 96 ff 03 85 12 b1 02 05 0d 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 85 0c b1 02 c0 c0",
1537*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x093A, 0x8002),
1538*0bb3ed71SBenjamin Tissoires            quirks=("VALID_IS_INRANGE", "SLOT_IS_CONTACTNUMBER"),
1539*0bb3ed71SBenjamin Tissoires        )
1540*0bb3ed71SBenjamin Tissoires
1541*0bb3ed71SBenjamin Tissoires
1542*0bb3ed71SBenjamin Tissoiresclass TestPqlabs_1ef1_0001(BaseTest.TestMultitouch):
1543*0bb3ed71SBenjamin Tissoires    def create_device(self):
1544*0bb3ed71SBenjamin Tissoires        return Digitizer(
1545*0bb3ed71SBenjamin Tissoires            "uhid test pqlabs_1ef1_0001",
1546*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 0e 65 11 09 30 35 00 46 1e 19 81 02 26 ff 3f 09 31 35 00 46 be 0f 81 02 26 ff 3f c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 0e 65 11 09 30 35 00 46 1e 19 81 02 26 ff 3f 09 31 35 00 46 be 0f 81 02 26 ff 3f c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 0e 65 11 09 30 35 00 46 1e 19 81 02 26 ff 3f 09 31 35 00 46 be 0f 81 02 26 ff 3f c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 0e 65 11 09 30 35 00 46 1e 19 81 02 26 ff 3f 09 31 35 00 46 be 0f 81 02 26 ff 3f c0 05 0d 09 54 95 01 75 08 25 02 81 02 85 02 09 55 25 02 b1 02 c0 09 0e a1 01 85 03 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0 05 01 09 02 a1 01 09 01 a1 00 85 04 05 09 95 03 75 01 19 01 29 03 15 00 25 01 81 02 95 01 75 05 81 01 05 01 75 10 95 02 09 30 09 31 15 00 26 ff 3f 81 02 c0 c0 05 8c 09 07 a1 01 85 11 09 02 15 00 26 ff 00 75 08 95 3f 81 02 85 10 09 10 91 02 c0",
1547*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x1EF1, 0x0001),
1548*0bb3ed71SBenjamin Tissoires        )
1549*0bb3ed71SBenjamin Tissoires
1550*0bb3ed71SBenjamin Tissoires
1551*0bb3ed71SBenjamin Tissoiresclass TestQuanta_0408_3000(BaseTest.TestMultitouch):
1552*0bb3ed71SBenjamin Tissoires    def create_device(self):
1553*0bb3ed71SBenjamin Tissoires        return Digitizer(
1554*0bb3ed71SBenjamin Tissoires            "uhid test quanta_0408_3000",
1555*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 e3 13 26 7f 07 81 02 09 31 46 2f 0b 26 37 04 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 e3 13 26 7f 07 81 02 46 2f 0b 26 37 04 09 31 81 02 c0 05 0d 09 54 15 00 26 ff 00 95 01 75 08 81 02 09 55 25 02 95 01 85 02 b1 02 06 00 ff 09 01 26 ff 00 75 08 95 2f 85 03 b1 02 09 01 96 ff 03 85 04 b1 02 09 01 95 0b 85 05 b1 02 09 01 96 ff 03 85 06 b1 02 c0",
1556*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x0408, 0x3000),
1557*0bb3ed71SBenjamin Tissoires        )
1558*0bb3ed71SBenjamin Tissoires
1559*0bb3ed71SBenjamin Tissoires
1560*0bb3ed71SBenjamin Tissoiresclass TestQuanta_0408_3001(BaseTest.TestMultitouch):
1561*0bb3ed71SBenjamin Tissoires    def create_device(self):
1562*0bb3ed71SBenjamin Tissoires        return Digitizer(
1563*0bb3ed71SBenjamin Tissoires            "uhid test quanta_0408_3001",
1564*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 09 31 46 78 0a 26 38 04 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 80 07 81 02 46 78 0a 26 38 04 09 31 81 02 c0 05 0d 09 54 15 00 26 ff 00 95 01 75 08 81 02 09 55 25 02 95 01 85 02 b1 02 06 00 ff 09 01 26 ff 00 75 08 95 47 85 03 b1 02 09 01 96 ff 03 85 04 b1 02 09 01 95 0b 85 05 b1 02 09 01 96 ff 03 85 06 b1 02 09 01 95 0f 85 07 b1 02 09 01 96 ff 03 85 08 b1 02 09 01 96 ff 03 85 09 b1 02 09 01 95 0f 85 0a b1 02 09 01 96 ff 03 85 0b b1 02 c0",
1565*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x0408, 0x3001),
1566*0bb3ed71SBenjamin Tissoires            quirks=("VALID_IS_CONFIDENCE", "SLOT_IS_CONTACTID"),
1567*0bb3ed71SBenjamin Tissoires        )
1568*0bb3ed71SBenjamin Tissoires
1569*0bb3ed71SBenjamin Tissoires
1570*0bb3ed71SBenjamin Tissoiresclass TestQuanta_0408_3008_1(BaseTest.TestMultitouch):
1571*0bb3ed71SBenjamin Tissoires    def create_device(self):
1572*0bb3ed71SBenjamin Tissoires        return Digitizer(
1573*0bb3ed71SBenjamin Tissoires            "uhid test quanta_0408_3008_1",
1574*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 02 a1 01 85 0d 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 95 02 75 01 81 02 95 01 75 06 81 03 05 01 55 0e 65 11 75 10 95 01 35 00 46 4c 11 26 7f 07 09 30 81 22 46 bb 09 26 37 04 09 31 81 22 95 08 75 08 81 03 c0 c0 05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 4c 11 26 7f 07 81 02 09 31 46 bb 09 26 37 04 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 4c 11 26 7f 07 81 02 46 bb 09 26 37 04 09 31 81 02 c0 05 0d 09 54 15 00 26 ff 00 95 01 75 08 81 02 09 55 25 02 95 01 85 02 b1 02 c0 05 0d 09 0e a1 01 06 00 ff 09 01 26 ff 00 75 08 95 47 85 03 b1 02 09 01 96 ff 03 85 04 b1 02 09 01 95 0b 85 05 b1 02 09 01 96 ff 03 85 06 b1 02 09 01 95 0f 85 07 b1 02 09 01 96 ff 03 85 08 b1 02 09 01 96 ff 03 85 09 b1 02 09 01 95 3f 85 0a b1 02 09 01 96 ff 03 85 0b b1 02 09 01 96 c3 03 85 0e b1 02 09 01 96 ff 03 85 0f b1 02 09 01 96 83 03 85 10 b1 02 09 01 96 93 00 85 11 b1 02 09 01 96 ff 03 85 12 b1 02 05 0d 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 85 0c b1 02 c0 c0",
1575*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x0408, 0x3008),
1576*0bb3ed71SBenjamin Tissoires        )
1577*0bb3ed71SBenjamin Tissoires
1578*0bb3ed71SBenjamin Tissoires
1579*0bb3ed71SBenjamin Tissoiresclass TestQuanta_0408_3008(BaseTest.TestMultitouch):
1580*0bb3ed71SBenjamin Tissoires    def create_device(self):
1581*0bb3ed71SBenjamin Tissoires        return Digitizer(
1582*0bb3ed71SBenjamin Tissoires            "uhid test quanta_0408_3008",
1583*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 02 a1 01 85 0d 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 95 02 75 01 81 02 95 01 75 06 81 03 05 01 55 0e 65 11 75 10 95 01 35 00 46 98 12 26 7f 07 09 30 81 22 46 78 0a 26 37 04 09 31 81 22 c0 c0 05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 7f 07 81 02 09 31 46 78 0a 26 37 04 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 7f 07 81 02 46 78 0a 26 37 04 09 31 81 02 c0 05 0d 09 54 15 00 26 ff 00 95 01 75 08 81 02 09 55 25 02 95 01 85 02 b1 02 c0 05 0d 09 0e a1 01 06 00 ff 09 01 26 ff 00 75 08 95 47 85 03 b1 02 09 01 96 ff 03 85 04 b1 02 09 01 95 0b 85 05 b1 02 09 01 96 ff 03 85 06 b1 02 09 01 95 0f 85 07 b1 02 09 01 96 ff 03 85 08 b1 02 09 01 96 ff 03 85 09 b1 02 09 01 95 3f 85 0a b1 02 09 01 96 ff 03 85 0b b1 02 09 01 96 c3 03 85 0e b1 02 09 01 96 ff 03 85 0f b1 02 09 01 96 83 03 85 10 b1 02 09 01 96 93 00 85 11 b1 02 09 01 96 ff 03 85 12 b1 02 05 0d 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 85 0c b1 02 c0 c0",
1584*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x0408, 0x3008),
1585*0bb3ed71SBenjamin Tissoires        )
1586*0bb3ed71SBenjamin Tissoires
1587*0bb3ed71SBenjamin Tissoires
1588*0bb3ed71SBenjamin Tissoiresclass TestRafi_05bd_0107(BaseTest.TestMultitouch):
1589*0bb3ed71SBenjamin Tissoires    def create_device(self):
1590*0bb3ed71SBenjamin Tissoires        return Digitizer(
1591*0bb3ed71SBenjamin Tissoires            "uhid test rafi_05bd_0107",
1592*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 65 00 55 00 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 25 09 95 01 81 02 05 01 46 9c 01 26 ff 03 35 00 75 10 09 30 81 02 46 e7 00 26 ff 03 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 25 09 95 01 81 02 05 01 46 9c 01 26 ff 03 35 00 75 10 09 30 81 02 46 e7 00 26 ff 03 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 25 09 95 01 81 02 05 01 46 9c 01 26 ff 03 35 00 75 10 09 30 81 02 46 e7 00 26 ff 03 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 25 09 95 01 81 02 05 01 46 9c 01 26 ff 03 35 00 75 10 09 30 81 02 46 e7 00 26 ff 03 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 25 09 95 01 81 02 05 01 46 9c 01 26 ff 03 35 00 75 10 09 30 81 02 46 e7 00 26 ff 03 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 25 09 95 01 81 02 05 01 46 9c 01 26 ff 03 35 00 75 10 09 30 81 02 46 e7 00 26 ff 03 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 25 09 95 01 81 02 05 01 46 9c 01 26 ff 03 35 00 75 10 09 30 81 02 46 e7 00 26 ff 03 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 25 09 95 01 81 02 05 01 46 9c 01 26 ff 03 35 00 75 10 09 30 81 02 46 e7 00 26 ff 03 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 25 09 95 01 81 02 05 01 46 9c 01 26 ff 03 35 00 75 10 09 30 81 02 46 e7 00 26 ff 03 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 25 09 95 01 81 02 05 01 46 9c 01 26 ff 03 35 00 75 10 09 30 81 02 46 e7 00 26 ff 03 09 31 81 02 c0 05 0d 09 54 95 01 75 08 15 00 25 09 81 02 05 0d 85 02 95 01 75 08 09 55 25 0a b1 02 c0 09 0e a1 01 85 03 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0 05 01 09 02 a1 01 09 01 a1 00 85 05 05 09 19 01 29 02 15 00 25 01 95 02 75 01 81 02 95 06 81 03 05 01 65 11 55 0f 09 30 26 ff 03 35 00 46 9c 01 75 10 95 01 81 02 09 31 26 ff 03 35 00 46 e7 00 81 02 c0 c0",
1593*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x05BD, 0x0107),
1594*0bb3ed71SBenjamin Tissoires        )
1595*0bb3ed71SBenjamin Tissoires
1596*0bb3ed71SBenjamin Tissoires
1597*0bb3ed71SBenjamin Tissoiresclass TestRndplus_2512_5003(BaseTest.TestMultitouch):
1598*0bb3ed71SBenjamin Tissoires    def create_device(self):
1599*0bb3ed71SBenjamin Tissoires        return Digitizer(
1600*0bb3ed71SBenjamin Tissoires            "uhid test rndplus_2512_5003",
1601*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 02 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 09 31 46 00 00 81 02 05 0d 09 48 09 49 75 10 95 02 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 09 31 46 00 00 81 02 05 0d 09 48 09 49 75 10 95 02 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 09 31 46 00 00 81 02 05 0d 09 48 09 49 75 10 95 02 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 09 31 46 00 00 81 02 05 0d 09 48 09 49 75 10 95 02 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 09 31 46 00 00 81 02 05 0d 09 48 09 49 75 10 95 02 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 09 31 46 00 00 81 02 05 0d 09 48 09 49 75 10 95 02 81 02 c0 05 0d 09 54 95 01 75 08 15 00 25 08 81 02 85 08 09 55 b1 02 c0 09 0e a1 01 85 07 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0 05 01 09 02 a1 01 85 03 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 95 03 75 01 81 02 95 01 75 05 81 01 05 01 09 30 09 31 16 00 00 26 ff 3f 36 00 00 46 ff 3f 66 00 00 75 10 95 02 81 62 c0 c0",
1602*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x2512, 0x5003),
1603*0bb3ed71SBenjamin Tissoires        )
1604*0bb3ed71SBenjamin Tissoires
1605*0bb3ed71SBenjamin Tissoires
1606*0bb3ed71SBenjamin Tissoiresclass TestRndplus_2512_5004(BaseTest.TestMultitouch):
1607*0bb3ed71SBenjamin Tissoires    def create_device(self):
1608*0bb3ed71SBenjamin Tissoires        return Digitizer(
1609*0bb3ed71SBenjamin Tissoires            "uhid test rndplus_2512_5004",
1610*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 04 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 09 31 46 00 00 81 02 05 0d 09 48 09 49 75 10 95 02 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 09 31 46 00 00 81 02 05 0d 09 48 09 49 75 10 95 02 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 09 31 46 00 00 81 02 05 0d 09 48 09 49 75 10 95 02 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 09 31 46 00 00 81 02 05 0d 09 48 09 49 75 10 95 02 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 09 31 46 00 00 81 02 05 0d 09 48 09 49 75 10 95 02 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 3f 75 10 55 00 65 00 09 30 35 00 46 00 00 81 02 09 31 46 00 00 81 02 05 0d 09 48 09 49 75 10 95 02 81 02 c0 05 0d 09 54 95 01 75 08 15 00 25 08 81 02 85 05 09 55 b1 02 c0 09 0e a1 01 85 06 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0 05 01 09 02 a1 01 85 03 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 95 03 75 01 81 02 95 01 75 05 81 01 05 01 09 30 09 31 16 00 00 26 ff 3f 36 00 00 46 ff 3f 66 00 00 75 10 95 02 81 62 c0 c0 06 00 ff 09 01 a1 01 85 01 09 01 15 00 26 ff 00 75 08 95 3f 82 00 01 85 02 09 01 15 00 26 ff 00 75 08 95 3f 92 00 01 c0",
1611*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x2512, 0x5004),
1612*0bb3ed71SBenjamin Tissoires        )
1613*0bb3ed71SBenjamin Tissoires
1614*0bb3ed71SBenjamin Tissoires
1615*0bb3ed71SBenjamin Tissoiresclass TestSitronix_1403_5001(BaseTest.TestMultitouch):
1616*0bb3ed71SBenjamin Tissoires    def create_device(self):
1617*0bb3ed71SBenjamin Tissoires        return Digitizer(
1618*0bb3ed71SBenjamin Tissoires            "uhid test sitronix_1403_5001",
1619*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 54 95 01 75 08 81 02 09 22 a1 02 09 51 75 06 95 01 81 02 09 42 09 32 15 00 25 01 75 01 95 02 81 02 05 01 26 90 04 75 0c 95 01 55 0f 65 11 a4 09 30 46 e1 00 81 02 26 50 03 09 31 45 7d 81 02 05 0d 75 08 95 02 09 48 09 49 81 02 c0 a1 02 09 51 75 06 95 01 81 02 09 42 09 32 15 00 25 01 75 01 95 02 81 02 b4 a4 09 30 46 e1 00 81 02 26 50 03 09 31 45 7d 81 02 05 0d 75 08 95 02 09 48 09 49 81 02 c0 a1 02 09 51 75 06 95 01 81 02 09 42 09 32 15 00 25 01 75 01 95 02 81 02 b4 a4 09 30 46 e1 00 81 02 26 50 03 09 31 45 7d 81 02 05 0d 75 08 95 02 09 48 09 49 81 02 c0 a1 02 09 51 75 06 95 01 81 02 09 42 09 32 15 00 25 01 75 01 95 02 81 02 b4 a4 09 30 46 e1 00 81 02 26 50 03 09 31 45 7d 81 02 05 0d 75 08 95 02 09 48 09 49 81 02 c0 a1 02 09 51 75 06 95 01 81 02 09 42 09 32 15 00 25 01 75 01 95 02 81 02 b4 a4 09 30 46 e1 00 81 02 26 50 03 09 31 45 7d 81 02 05 0d 75 08 95 02 09 48 09 49 81 02 c0 a1 02 09 51 75 06 95 01 81 02 09 42 09 32 15 00 25 01 75 01 95 02 81 02 b4 a4 09 30 46 e1 00 81 02 26 50 03 09 31 45 7d 81 02 05 0d 75 08 95 02 09 48 09 49 81 02 c0 a1 02 09 51 75 06 95 01 81 02 09 42 09 32 15 00 25 01 75 01 95 02 81 02 b4 a4 09 30 46 e1 00 81 02 26 50 03 09 31 45 7d 81 02 05 0d 75 08 95 02 09 48 09 49 81 02 c0 a1 02 09 51 75 06 95 01 81 02 09 42 09 32 15 00 25 01 75 01 95 02 81 02 b4 a4 09 30 46 e1 00 81 02 26 50 03 09 31 45 7d 81 02 05 0d 75 08 95 02 09 48 09 49 81 02 c0 a1 02 09 51 75 06 95 01 81 02 09 42 09 32 15 00 25 01 75 01 95 02 81 02 b4 a4 09 30 46 e1 00 81 02 26 50 03 09 31 45 7d 81 02 05 0d 75 08 95 02 09 48 09 49 81 02 c0 a1 02 09 51 75 06 95 01 81 02 09 42 09 32 15 00 25 01 75 01 95 02 81 02 b4 09 30 46 e1 00 81 02 26 50 03 09 31 45 7d 81 02 05 0d 75 08 95 04 09 48 09 49 81 02 c0 85 02 09 55 26 ff 00 75 08 95 01 b1 02 09 04 15 00 25 ff 75 08 95 07 91 02 c0 09 0e a1 01 85 03 09 23 a1 00 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0",
1620*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x1403, 0x5001),
1621*0bb3ed71SBenjamin Tissoires            max_contacts=10,
1622*0bb3ed71SBenjamin Tissoires        )
1623*0bb3ed71SBenjamin Tissoires
1624*0bb3ed71SBenjamin Tissoires
1625*0bb3ed71SBenjamin Tissoiresclass TestSmart_0b8c_0092(BaseTest.TestMultitouch):
1626*0bb3ed71SBenjamin Tissoires    def create_device(self):
1627*0bb3ed71SBenjamin Tissoires        return SmartTechDigitizer(
1628*0bb3ed71SBenjamin Tissoires            "uhid test smart_0b8c_0092", input_info=(BusType.USB, 0x0B8C, 0x0092)
1629*0bb3ed71SBenjamin Tissoires        )
1630*0bb3ed71SBenjamin Tissoires
1631*0bb3ed71SBenjamin Tissoires
1632*0bb3ed71SBenjamin Tissoiresclass TestStantum_1f87_0002(BaseTest.TestMultitouch):
1633*0bb3ed71SBenjamin Tissoires    def create_device(self):
1634*0bb3ed71SBenjamin Tissoires        return Digitizer(
1635*0bb3ed71SBenjamin Tissoires            "uhid test stantum_1f87_0002",
1636*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 03 05 0d 09 54 95 01 75 08 81 02 06 00 ff 75 02 09 01 81 01 75 0e 09 02 81 02 05 0d 09 22 a1 02 05 01 16 00 00 26 ff 07 75 0b 55 00 65 00 09 30 81 02 05 0d 25 1f 75 05 09 48 81 02 05 01 16 00 00 26 ff 07 75 0b 55 00 65 00 09 31 81 02 05 0d 25 1f 75 05 09 49 81 02 75 08 09 51 95 01 81 02 09 30 75 05 81 02 09 42 15 00 25 01 75 01 95 01 81 02 09 47 81 02 09 32 81 02 c0 a1 02 05 01 16 00 00 26 ff 07 75 0b 55 00 65 00 09 30 81 02 05 0d 25 1f 75 05 09 48 81 02 05 01 16 00 00 26 ff 07 75 0b 55 00 65 00 09 31 81 02 05 0d 25 1f 75 05 09 49 81 02 75 08 09 51 95 01 81 02 09 30 75 05 81 02 09 42 15 00 25 01 75 01 95 01 81 02 09 47 81 02 09 32 81 02 c0 a1 02 05 01 16 00 00 26 ff 07 75 0b 55 00 65 00 09 30 81 02 05 0d 25 1f 75 05 09 48 81 02 05 01 16 00 00 26 ff 07 75 0b 55 00 65 00 09 31 81 02 05 0d 25 1f 75 05 09 49 81 02 75 08 09 51 95 01 81 02 09 30 75 05 81 02 09 42 15 00 25 01 75 01 95 01 81 02 09 47 81 02 09 32 81 02 c0 a1 02 05 01 16 00 00 26 ff 07 75 0b 55 00 65 00 09 30 81 02 05 0d 25 1f 75 05 09 48 81 02 05 01 16 00 00 26 ff 07 75 0b 55 00 65 00 09 31 81 02 05 0d 25 1f 75 05 09 49 81 02 75 08 09 51 95 01 81 02 09 30 75 05 81 02 09 42 15 00 25 01 75 01 95 01 81 02 09 47 81 02 09 32 81 02 c0 a1 02 05 01 16 00 00 26 ff 07 75 0b 55 00 65 00 09 30 81 02 05 0d 25 1f 75 05 09 48 81 02 05 01 16 00 00 26 ff 07 75 0b 55 00 65 00 09 31 81 02 05 0d 25 1f 75 05 09 49 81 02 75 08 09 51 95 01 81 02 09 30 75 05 81 02 09 42 15 00 25 01 75 01 95 01 81 02 09 47 81 02 09 32 81 02 c0 a1 02 05 01 16 00 00 26 ff 07 75 0b 55 00 65 00 09 30 81 02 05 0d 25 1f 75 05 09 48 81 02 05 01 16 00 00 26 ff 07 75 0b 55 00 65 00 09 31 81 02 05 0d 25 1f 75 05 09 49 81 02 75 08 09 51 95 01 81 02 09 30 75 05 81 02 09 42 15 00 25 01 75 01 95 01 81 02 09 47 81 02 09 32 81 02 c0 a1 02 05 01 16 00 00 26 ff 07 75 0b 55 00 65 00 09 30 81 02 05 0d 25 1f 75 05 09 48 81 02 05 01 16 00 00 26 ff 07 75 0b 55 00 65 00 09 31 81 02 05 0d 25 1f 75 05 09 49 81 02 75 08 09 51 95 01 81 02 09 30 75 05 81 02 09 42 15 00 25 01 75 01 95 01 81 02 09 47 81 02 09 32 81 02 c0 a1 02 05 01 16 00 00 26 ff 07 75 0b 55 00 65 00 09 30 81 02 05 0d 25 1f 75 05 09 48 81 02 05 01 16 00 00 26 ff 07 75 0b 55 00 65 00 09 31 81 02 05 0d 25 1f 75 05 09 49 81 02 75 08 09 51 95 01 81 02 09 30 75 05 81 02 09 42 15 00 25 01 75 01 95 01 81 02 09 47 81 02 09 32 81 02 c0 a1 02 05 01 16 00 00 26 ff 07 75 0b 55 00 65 00 09 30 81 02 05 0d 25 1f 75 05 09 48 81 02 05 01 16 00 00 26 ff 07 75 0b 55 00 65 00 09 31 81 02 05 0d 25 1f 75 05 09 49 81 02 75 08 09 51 95 01 81 02 09 30 75 05 81 02 09 42 15 00 25 01 75 01 95 01 81 02 09 47 81 02 09 32 81 02 c0 a1 02 05 01 16 00 00 26 ff 07 75 0b 55 00 65 00 09 30 81 02 05 0d 25 1f 75 05 09 48 81 02 05 01 16 00 00 26 ff 07 75 0b 55 00 65 00 09 31 81 02 05 0d 25 1f 75 05 09 49 81 02 75 08 09 51 95 01 81 02 09 30 75 05 81 02 09 42 15 00 25 01 75 01 95 01 81 02 09 47 81 02 09 32 81 02 c0 85 08 05 0d 09 55 95 01 75 08 25 0a b1 02 c0",
1637*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x1F87, 0x0002),
1638*0bb3ed71SBenjamin Tissoires        )
1639*0bb3ed71SBenjamin Tissoires
1640*0bb3ed71SBenjamin Tissoires
1641*0bb3ed71SBenjamin Tissoiresclass TestTopseed_1784_0016(BaseTest.TestMultitouch):
1642*0bb3ed71SBenjamin Tissoires    def create_device(self):
1643*0bb3ed71SBenjamin Tissoires        return Digitizer(
1644*0bb3ed71SBenjamin Tissoires            "uhid test topseed_1784_0016",
1645*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 04 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 04 75 10 55 00 65 00 09 30 35 00 46 ff 04 81 02 09 31 46 ff 04 81 02 c0 05 0d 09 54 95 01 75 08 15 00 25 0a 81 02 09 55 b1 02 c0 05 0c 09 01 a1 01 85 03 a1 02 09 b5 15 00 25 01 75 01 95 01 81 02 09 b6 81 02 09 b7 81 02 09 cd 81 02 09 e2 81 02 09 e9 81 02 09 ea 81 02 05 01 09 82 81 02 c0 c0",
1646*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x1784, 0x0016),
1647*0bb3ed71SBenjamin Tissoires            max_contacts=2,
1648*0bb3ed71SBenjamin Tissoires        )
1649*0bb3ed71SBenjamin Tissoires
1650*0bb3ed71SBenjamin Tissoires
1651*0bb3ed71SBenjamin Tissoiresclass TestTpv_25aa_8883(BaseTest.TestMultitouch):
1652*0bb3ed71SBenjamin Tissoires    def create_device(self):
1653*0bb3ed71SBenjamin Tissoires        return Digitizer(
1654*0bb3ed71SBenjamin Tissoires            "uhid test tpv_25aa_8883",
1655*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 02 a1 01 85 0d 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 95 02 75 01 81 02 05 0d 09 32 95 01 75 01 81 02 95 01 75 05 81 03 05 01 55 0e 65 11 75 10 95 01 35 00 46 98 12 26 7f 07 09 30 81 22 46 78 0a 26 37 04 09 31 81 22 35 00 45 00 15 81 25 7f 75 08 95 01 09 38 81 06 09 00 75 08 95 07 81 03 c0 c0 05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 7f 07 81 02 09 31 46 78 0a 26 37 04 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0e 65 11 09 30 35 00 46 98 12 26 7f 07 81 02 46 78 0a 26 37 04 09 31 81 02 c0 05 0d 09 54 15 00 26 ff 00 95 01 75 08 81 02 09 55 25 02 95 01 85 02 b1 02 c0 05 0d 09 0e a1 01 06 00 ff 09 01 26 ff 00 75 08 95 47 85 03 b1 02 09 01 96 ff 03 85 04 b1 02 09 01 95 0b 85 05 b1 02 09 01 96 ff 03 85 06 b1 02 09 01 95 0f 85 07 b1 02 09 01 96 ff 03 85 08 b1 02 09 01 96 ff 03 85 09 b1 02 09 01 95 3f 85 0a b1 02 09 01 96 ff 03 85 0b b1 02 09 01 96 c3 03 85 0e b1 02 09 01 96 ff 03 85 0f b1 02 09 01 96 83 03 85 10 b1 02 09 01 96 93 00 85 11 b1 02 09 01 96 ff 03 85 12 b1 02 05 0d 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 85 0c b1 02 c0 c0",
1656*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x25AA, 0x8883),
1657*0bb3ed71SBenjamin Tissoires        )
1658*0bb3ed71SBenjamin Tissoires
1659*0bb3ed71SBenjamin Tissoires
1660*0bb3ed71SBenjamin Tissoiresclass TestTrs_star_238f_0001(BaseTest.TestMultitouch):
1661*0bb3ed71SBenjamin Tissoires    def create_device(self):
1662*0bb3ed71SBenjamin Tissoires        return Digitizer(
1663*0bb3ed71SBenjamin Tissoires            "uhid test trs-star_238f_0001",
1664*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 00 09 42 15 00 25 01 75 01 95 01 81 02 09 32 95 01 81 03 09 37 95 01 81 03 95 01 81 03 15 00 25 0f 75 04 09 51 95 01 81 02 09 54 95 01 81 02 09 55 95 01 81 02 05 01 26 ff 03 15 00 75 10 65 00 09 30 95 01 81 02 09 31 81 02 c0 05 0d 09 0e 85 02 09 23 a1 02 15 00 25 0a 09 52 75 08 95 01 b1 02 09 53 95 01 b1 02 09 55 95 01 b1 02 c0 c0",
1665*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x238F, 0x0001),
1666*0bb3ed71SBenjamin Tissoires        )
1667*0bb3ed71SBenjamin Tissoires
1668*0bb3ed71SBenjamin Tissoires
1669*0bb3ed71SBenjamin Tissoiresclass TestUnitec_227d_0103(BaseTest.TestMultitouch):
1670*0bb3ed71SBenjamin Tissoires    def create_device(self):
1671*0bb3ed71SBenjamin Tissoires        return Digitizer(
1672*0bb3ed71SBenjamin Tissoires            "uhid test unitec_227d_0103",
1673*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 09 51 75 08 95 01 81 02 05 01 35 00 55 0e 65 33 75 10 95 01 09 30 16 00 00 26 ff 4f 36 00 00 46 6c 03 81 02 09 31 16 00 00 26 ff 3b 36 00 00 46 ed 01 81 02 26 00 00 46 00 00 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 09 51 75 08 95 01 81 02 05 01 35 00 55 0e 65 33 75 10 95 01 09 30 16 00 00 26 ff 4f 36 00 00 46 6c 03 81 02 09 31 16 00 00 26 ff 3b 36 00 00 46 ed 01 81 02 26 00 00 46 00 00 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 09 51 75 08 95 01 81 02 05 01 35 00 55 0e 65 33 75 10 95 01 09 30 16 00 00 26 ff 4f 36 00 00 46 6c 03 81 02 09 31 16 00 00 26 ff 3b 36 00 00 46 ed 01 81 02 26 00 00 46 00 00 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 09 51 75 08 95 01 81 02 05 01 35 00 55 0e 65 33 75 10 95 01 09 30 16 00 00 26 ff 4f 36 00 00 46 6c 03 81 02 09 31 16 00 00 26 ff 3b 36 00 00 46 ed 01 81 02 26 00 00 46 00 00 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 09 51 75 08 95 01 81 02 05 01 35 00 55 0e 65 33 75 10 95 01 09 30 16 00 00 26 ff 4f 36 00 00 46 6c 03 81 02 09 31 16 00 00 26 ff 3b 36 00 00 46 ed 01 81 02 26 00 00 46 00 00 c0 05 0d 09 54 75 08 95 01 81 02 05 0d 85 03 09 55 25 05 75 08 95 01 b1 02 c0 05 0d 09 0e a1 01 85 04 09 53 15 00 25 05 75 08 95 01 b1 02 c0",
1674*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x227D, 0x0103),
1675*0bb3ed71SBenjamin Tissoires        )
1676*0bb3ed71SBenjamin Tissoires
1677*0bb3ed71SBenjamin Tissoires
1678*0bb3ed71SBenjamin Tissoiresclass TestZytronic_14c8_0005(BaseTest.TestMultitouch):
1679*0bb3ed71SBenjamin Tissoires    def create_device(self):
1680*0bb3ed71SBenjamin Tissoires        return Digitizer(
1681*0bb3ed71SBenjamin Tissoires            "uhid test zytronic_14c8_0005",
1682*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 95 01 81 02 95 06 81 01 05 01 26 00 10 75 10 95 01 65 00 09 30 81 02 09 31 46 00 10 81 02 05 0d 09 51 26 ff 00 75 08 95 01 81 02 c0 85 02 09 55 15 00 25 08 75 08 95 01 b1 02 c0 05 0d 09 0e a1 01 85 03 a1 02 09 23 09 52 09 53 15 00 25 08 75 08 95 02 b1 02 c0 c0 05 01 09 02 a1 01 09 01 a1 00 85 04 05 09 19 01 29 02 15 00 25 01 95 02 75 01 81 02 95 01 75 06 81 01 05 01 09 30 09 31 15 00 26 00 10 35 00 46 00 10 65 00 75 10 95 02 81 62 c0 c0 06 00 ff 09 01 a1 01 85 05 09 00 15 00 26 ff 00 75 08 95 3f b1 02 c0 06 00 ff 09 01 a1 01 85 06 09 00 15 00 26 ff 00 75 08 95 3f 81 02 c0",
1683*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x14C8, 0x0005),
1684*0bb3ed71SBenjamin Tissoires        )
1685*0bb3ed71SBenjamin Tissoires
1686*0bb3ed71SBenjamin Tissoires
1687*0bb3ed71SBenjamin Tissoiresclass TestZytronic_14c8_0006(BaseTest.TestMultitouch):
1688*0bb3ed71SBenjamin Tissoires    def create_device(self):
1689*0bb3ed71SBenjamin Tissoires        return Digitizer(
1690*0bb3ed71SBenjamin Tissoires            "uhid test zytronic_14c8_0006",
1691*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 00 10 75 10 09 30 81 02 09 31 81 02 05 0d c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 00 10 75 10 09 30 81 02 09 31 81 02 05 0d c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 00 10 75 10 09 30 81 02 09 31 81 02 05 0d c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 00 10 75 10 09 30 81 02 09 31 81 02 05 0d c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 00 10 75 10 09 30 81 02 09 31 81 02 05 0d c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 00 10 75 10 09 30 81 02 09 31 81 02 05 0d c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 00 10 75 10 09 30 81 02 09 31 81 02 05 0d c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 00 10 75 10 09 30 81 02 09 31 81 02 05 0d c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 00 10 75 10 09 30 81 02 09 31 81 02 05 0d c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 95 06 81 03 75 08 09 51 95 01 81 02 05 01 26 00 10 75 10 09 30 81 02 09 31 81 02 05 0d c0 05 0d 09 54 95 01 75 08 15 00 25 3c 81 02 05 0d 85 02 09 55 95 01 75 08 15 00 25 3c b1 02 c0 09 0e a1 01 85 03 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0 05 01 09 02 a1 01 09 01 a1 00 85 04 05 09 19 01 29 02 15 00 25 01 95 02 75 01 81 02 95 01 75 06 81 01 05 01 09 30 09 31 15 00 26 00 10 35 00 46 00 10 65 00 75 10 95 02 81 62 c0 c0 06 00 ff 09 01 a1 01 85 05 09 00 15 00 26 ff 00 75 08 95 3f b1 02 c0 06 00 ff 09 01 a1 01 85 06 09 00 15 00 26 ff 00 75 08 95 3f 81 02 c0",
1692*0bb3ed71SBenjamin Tissoires            input_info=(BusType.USB, 0x14C8, 0x0006),
1693*0bb3ed71SBenjamin Tissoires        )
1694*0bb3ed71SBenjamin Tissoires
1695*0bb3ed71SBenjamin Tissoires
1696*0bb3ed71SBenjamin Tissoires################################################################################
1697*0bb3ed71SBenjamin Tissoires#
1698*0bb3ed71SBenjamin Tissoires# Windows 8 compatible devices
1699*0bb3ed71SBenjamin Tissoires#
1700*0bb3ed71SBenjamin Tissoires################################################################################
1701*0bb3ed71SBenjamin Tissoires
1702*0bb3ed71SBenjamin Tissoires
1703*0bb3ed71SBenjamin Tissoiresclass TestMinWin8TSParallelTriple(BaseTest.TestWin8Multitouch):
1704*0bb3ed71SBenjamin Tissoires    def create_device(self):
1705*0bb3ed71SBenjamin Tissoires        return MinWin8TSParallel(3)
1706*0bb3ed71SBenjamin Tissoires
1707*0bb3ed71SBenjamin Tissoires
1708*0bb3ed71SBenjamin Tissoiresclass TestMinWin8TSParallel(BaseTest.TestWin8Multitouch):
1709*0bb3ed71SBenjamin Tissoires    def create_device(self):
1710*0bb3ed71SBenjamin Tissoires        return MinWin8TSParallel(10)
1711*0bb3ed71SBenjamin Tissoires
1712*0bb3ed71SBenjamin Tissoires
1713*0bb3ed71SBenjamin Tissoiresclass TestMinWin8TSHybrid(BaseTest.TestWin8Multitouch):
1714*0bb3ed71SBenjamin Tissoires    def create_device(self):
1715*0bb3ed71SBenjamin Tissoires        return MinWin8TSHybrid()
1716*0bb3ed71SBenjamin Tissoires
1717*0bb3ed71SBenjamin Tissoires
1718*0bb3ed71SBenjamin Tissoiresclass TestWin8TSConfidence(BaseTest.TestWin8Multitouch):
1719*0bb3ed71SBenjamin Tissoires    def create_device(self):
1720*0bb3ed71SBenjamin Tissoires        return Win8TSConfidence(5)
1721*0bb3ed71SBenjamin Tissoires
1722*0bb3ed71SBenjamin Tissoires    @pytest.mark.skip_if_uhdev(
1723*0bb3ed71SBenjamin Tissoires        lambda uhdev: "Confidence" not in uhdev.fields,
1724*0bb3ed71SBenjamin Tissoires        "Device not compatible, missing Confidence usage",
1725*0bb3ed71SBenjamin Tissoires    )
1726*0bb3ed71SBenjamin Tissoires    def test_mt_confidence_bad_release(self):
1727*0bb3ed71SBenjamin Tissoires        """Check for the validity of the confidence bit.
1728*0bb3ed71SBenjamin Tissoires        When a contact is marked as not confident, it should be detected
1729*0bb3ed71SBenjamin Tissoires        as a palm from the kernel POV and released.
1730*0bb3ed71SBenjamin Tissoires
1731*0bb3ed71SBenjamin Tissoires        Note: if the kernel exports ABS_MT_TOOL_TYPE, it shouldn't release
1732*0bb3ed71SBenjamin Tissoires        the touch but instead convert it to ABS_MT_TOOL_PALM."""
1733*0bb3ed71SBenjamin Tissoires        uhdev = self.uhdev
1734*0bb3ed71SBenjamin Tissoires        evdev = uhdev.get_evdev()
1735*0bb3ed71SBenjamin Tissoires
1736*0bb3ed71SBenjamin Tissoires        t0 = Touch(1, 150, 200)
1737*0bb3ed71SBenjamin Tissoires        r = uhdev.event([t0])
1738*0bb3ed71SBenjamin Tissoires        events = uhdev.next_sync_events()
1739*0bb3ed71SBenjamin Tissoires        self.debug_reports(r, uhdev, events)
1740*0bb3ed71SBenjamin Tissoires
1741*0bb3ed71SBenjamin Tissoires        t0.confidence = False
1742*0bb3ed71SBenjamin Tissoires        t0.tipswitch = False
1743*0bb3ed71SBenjamin Tissoires        r = uhdev.event([t0])
1744*0bb3ed71SBenjamin Tissoires        events = uhdev.next_sync_events()
1745*0bb3ed71SBenjamin Tissoires        self.debug_reports(r, uhdev, events)
1746*0bb3ed71SBenjamin Tissoires
1747*0bb3ed71SBenjamin Tissoires        if evdev.absinfo[libevdev.EV_ABS.ABS_MT_TOOL_TYPE] is not None:
1748*0bb3ed71SBenjamin Tissoires            # the kernel exports MT_TOOL_PALM
1749*0bb3ed71SBenjamin Tissoires            assert libevdev.InputEvent(libevdev.EV_ABS.ABS_MT_TOOL_TYPE, 2) in events
1750*0bb3ed71SBenjamin Tissoires
1751*0bb3ed71SBenjamin Tissoires        assert libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH, 0) in events
1752*0bb3ed71SBenjamin Tissoires        assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
1753*0bb3ed71SBenjamin Tissoires
1754*0bb3ed71SBenjamin Tissoires
1755*0bb3ed71SBenjamin Tissoiresclass TestElanXPS9360(BaseTest.TestWin8Multitouch):
1756*0bb3ed71SBenjamin Tissoires    def create_device(self):
1757*0bb3ed71SBenjamin Tissoires        return Digitizer(
1758*0bb3ed71SBenjamin Tissoires            "uhid test ElanXPS9360",
1759*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 a4 26 20 0d 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 50 07 46 a6 00 09 31 81 02 b4 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 a4 26 20 0d 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 50 07 46 a6 00 09 31 81 02 b4 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 a4 26 20 0d 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 50 07 46 a6 00 09 31 81 02 b4 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 a4 26 20 0d 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 50 07 46 a6 00 09 31 81 02 b4 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 a4 26 20 0d 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 50 07 46 a6 00 09 31 81 02 b4 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 a4 26 20 0d 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 50 07 46 a6 00 09 31 81 02 b4 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 a4 26 20 0d 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 50 07 46 a6 00 09 31 81 02 b4 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 a4 26 20 0d 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 50 07 46 a6 00 09 31 81 02 b4 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 a4 26 20 0d 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 50 07 46 a6 00 09 31 81 02 b4 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 a4 26 20 0d 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 50 07 46 a6 00 09 31 81 02 b4 c0 05 0d 09 56 55 00 65 00 27 ff ff ff 7f 95 01 75 20 81 02 09 54 25 7f 95 01 75 08 81 02 85 0a 09 55 25 0a b1 02 85 44 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 06 ff 01 09 01 a1 01 85 02 15 00 26 ff 00 75 08 95 40 09 00 81 02 c0 06 00 ff 09 01 a1 01 85 03 75 08 95 1f 09 01 91 02 c0 06 01 ff 09 01 a1 01 85 04 15 00 26 ff 00 75 08 95 13 09 00 81 02 c0",
1760*0bb3ed71SBenjamin Tissoires        )
1761*0bb3ed71SBenjamin Tissoires
1762*0bb3ed71SBenjamin Tissoires
1763*0bb3ed71SBenjamin Tissoiresclass TestTouchpadXPS9360(BaseTest.TestPTP):
1764*0bb3ed71SBenjamin Tissoires    def create_device(self):
1765*0bb3ed71SBenjamin Tissoires        return PTP(
1766*0bb3ed71SBenjamin Tissoires            "uhid test TouchpadXPS9360",
1767*0bb3ed71SBenjamin Tissoires            max_contacts=5,
1768*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 02 a1 01 85 02 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 95 06 81 01 05 01 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 c0 c0 05 0d 09 05 a1 01 85 03 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 c0 04 75 10 55 0e 65 11 09 30 35 00 46 f5 03 95 01 81 02 46 36 02 26 a8 02 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 c0 04 75 10 55 0e 65 11 09 30 35 00 46 f5 03 95 01 81 02 46 36 02 26 a8 02 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 c0 04 75 10 55 0e 65 11 09 30 35 00 46 f5 03 95 01 81 02 46 36 02 26 a8 02 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 c0 04 75 10 55 0e 65 11 09 30 35 00 46 f5 03 95 01 81 02 46 36 02 26 a8 02 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 c0 04 75 10 55 0e 65 11 09 30 35 00 46 f5 03 95 01 81 02 46 36 02 26 a8 02 09 31 81 02 c0 05 0d 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 09 54 25 7f 95 01 75 08 81 02 05 09 09 01 25 01 75 01 95 01 81 02 95 07 81 03 05 0d 85 08 09 55 09 59 75 04 95 02 25 0f b1 02 85 0d 09 60 75 01 95 01 15 00 25 01 b1 02 95 07 b1 03 85 07 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 0d 09 0e a1 01 85 04 09 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 00 85 06 09 57 09 58 75 01 95 02 25 01 b1 02 95 06 b1 03 c0 c0 06 00 ff 09 01 a1 01 85 09 09 02 15 00 26 ff 00 75 08 95 14 91 02 85 0a 09 03 15 00 26 ff 00 75 08 95 14 91 02 85 0b 09 04 15 00 26 ff 00 75 08 95 3d 81 02 85 0c 09 05 15 00 26 ff 00 75 08 95 3d 81 02 85 0f 09 06 15 00 26 ff 00 75 08 95 03 b1 02 85 0e 09 07 15 00 26 ff 00 75 08 95 01 b1 02 c0",
1769*0bb3ed71SBenjamin Tissoires        )
1770*0bb3ed71SBenjamin Tissoires
1771*0bb3ed71SBenjamin Tissoires
1772*0bb3ed71SBenjamin Tissoiresclass TestSurfaceBook2(BaseTest.TestPTP):
1773*0bb3ed71SBenjamin Tissoires    def create_device(self):
1774*0bb3ed71SBenjamin Tissoires        return PTP(
1775*0bb3ed71SBenjamin Tissoires            "uhid test SurfaceBook2",
1776*0bb3ed71SBenjamin Tissoires            max_contacts=5,
1777*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 06 A1 01 85 01 14 25 01 75 01 95 08 05 07 19 E0 29 E7 81 02 75 08 95 0A 18 29 91 26 FF 00 80 05 0C 0A C0 02 A1 02 1A C1 02 2A C6 02 95 06 B1 03 C0 05 08 19 01 29 03 75 01 95 03 25 01 91 02 95 05 91 01 C0 05 01 09 02 A1 01 85 02 05 09 19 01 29 05 81 02 95 01 75 03 81 03 15 81 25 7F 75 08 95 02 05 01 09 30 09 31 81 06 A1 02 09 48 14 25 01 35 01 45 10 75 02 95 01 A4 B1 02 09 38 15 81 25 7F 34 44 75 08 81 06 C0 A1 02 09 48 B4 B1 02 34 44 75 04 B1 03 05 0C 0A 38 02 15 81 25 7F 75 08 81 06 C0 C0 05 0C 09 01 A1 01 85 03 75 10 14 26 FF 03 18 2A FF 03 80 C0 06 05 FF 09 01 A1 01 85 0D 25 FF 95 02 75 08 09 20 81 02 09 22 91 02 15 81 25 7F 95 20 75 08 09 21 81 02 09 23 91 02 C0 09 02 A1 01 85 0C 14 25 FF 95 01 08 91 02 C0 05 0D 09 05 A1 01 85 04 09 22 A1 02 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 03 09 51 81 02 75 01 95 03 81 03 05 01 26 E4 07 75 10 55 0E 65 11 09 30 46 F2 03 95 01 81 02 46 94 02 26 29 05 09 31 81 02 44 54 64 C0 05 0D 09 22 A1 02 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 03 09 51 81 02 75 01 95 03 81 03 05 01 26 E4 07 75 10 55 0E 65 11 09 30 46 F2 03 95 01 81 02 46 94 02 26 29 05 09 31 81 02 44 54 64 C0 05 0D 09 22 A1 02 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 03 09 51 81 02 75 01 95 03 81 03 05 01 26 E4 07 75 10 55 0E 65 11 09 30 46 F2 03 95 01 81 02 46 94 02 26 29 05 09 31 81 02 C0 05 0D 09 22 A1 02 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 03 09 51 81 02 75 01 95 03 81 03 05 01 26 E4 07 75 10 55 0E 65 11 09 30 46 F2 03 95 01 81 02 46 94 02 26 29 05 09 31 81 02 44 54 64 C0 05 0D 09 22 A1 02 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 03 09 51 81 02 75 01 95 03 81 03 05 01 26 E4 07 75 10 55 0E 65 11 09 30 46 F2 03 95 01 81 02 46 94 02 26 29 05 09 31 81 02 C0 05 0D 55 0C 66 01 10 47 FF FF 00 00 27 FF FF 00 00 09 56 81 02 09 54 25 7F 75 08 81 02 05 09 09 01 25 01 75 01 81 02 95 07 81 03 05 0D 85 04 09 55 09 59 75 04 95 02 25 0F B1 02 06 00 FF 09 C6 85 05 14 25 08 75 08 95 01 B1 02 09 C7 26 FF 00 75 08 95 20 B1 02 C0 05 0D 09 0E A1 01 85 07 09 22 A1 02 09 52 14 25 0A 75 08 95 01 B1 02 C0 09 22 A0 85 08 09 57 09 58 75 01 95 02 25 01 B1 02 95 06 B1 03 C0 C0 06 07 FF 09 01 A1 01 85 0A 09 02 26 FF 00 75 08 95 14 91 02 85 09 09 03 91 02 85 0A 09 04 95 26 81 02 85 09 09 05 81 02 85 09 09 06 95 01 B1 02 85 0B 09 07 B1 02 C0 06 05 FF 09 04 A1 01 85 0E 09 31 91 02 09 31 81 03 09 30 91 02 09 30 81 02 95 39 09 32 92 02 01 09 32 82 02 01 C0 06 05 FF 09 50 A1 01 85 20 14 25 FF 75 08 95 3C 09 60 82 02 01 09 61 92 02 01 09 62 B2 02 01 85 21 09 63 82 02 01 09 64 92 02 01 09 65 B2 02 01 85 22 25 FF 75 20 95 04 19 66 29 69 81 02 19 6A 29 6D 91 02 19 6E 29 71 B1 02 85 23 19 72 29 75 81 02 19 76 29 79 91 02 19 7A 29 7D B1 02 85 24 19 7E 29 81 81 02 19 82 29 85 91 02 19 86 29 89 B1 02 85 25 19 8A 29 8D 81 02 19 8E 29 91 91 02 19 92 29 95 B1 02 85 26 19 96 29 99 81 02 19 9A 29 9D 91 02 19 9E 29 A1 B1 02 85 27 19 A2 29 A5 81 02 19 A6 29 A9 91 02 19 AA 29 AD B1 02 85 28 19 AE 29 B1 81 02 19 B2 29 B5 91 02 19 B6 29 B9 B1 02 85 29 19 BA 29 BD 81 02 19 BE 29 C1 91 02 19 C2 29 C5 B1 02 C0 06 00 FF 0A 00 F9 A1 01 85 32 75 10 95 02 14 27 FF FF 00 00 0A 01 F9 B1 02 75 20 95 01 25 FF 0A 02 F9 B1 02 75 08 95 08 26 FF 00 0A 03 F9 B2 02 01 95 10 0A 04 F9 B2 02 01 0A 05 F9 B2 02 01 95 01 75 10 27 FF FF 00 00 0A 06 F9 81 02 C0",
1778*0bb3ed71SBenjamin Tissoires        )
1779*0bb3ed71SBenjamin Tissoires
1780*0bb3ed71SBenjamin Tissoires
1781*0bb3ed71SBenjamin Tissoiresclass Test3m_0596_051c(BaseTest.TestWin8Multitouch):
1782*0bb3ed71SBenjamin Tissoires    def create_device(self):
1783*0bb3ed71SBenjamin Tissoires        return Digitizer(
1784*0bb3ed71SBenjamin Tissoires            "uhid test 3m_0596_051c",
1785*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 01 a1 01 85 01 09 01 a1 00 05 09 09 01 95 01 75 01 15 00 25 01 81 02 95 07 75 01 81 03 95 01 75 08 81 03 05 01 09 30 09 31 15 00 26 ff 7f 35 00 46 ff 7f 95 02 75 10 81 02 c0 a1 02 15 00 26 ff 00 09 01 95 39 75 08 81 03 c0 c0 05 0d 09 0e a1 01 85 11 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0 09 04 a1 01 85 13 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 81 03 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 d1 12 81 02 09 31 46 b2 0b 81 02 06 00 ff 75 10 95 02 09 01 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 81 03 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 d1 12 81 02 09 31 46 b2 0b 81 02 06 00 ff 75 10 95 02 09 01 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 81 03 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 d1 12 81 02 09 31 46 b2 0b 81 02 06 00 ff 75 10 95 02 09 01 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 81 03 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 d1 12 81 02 09 31 46 b2 0b 81 02 06 00 ff 75 10 95 02 09 01 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 81 03 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 d1 12 81 02 09 31 46 b2 0b 81 02 06 00 ff 75 10 95 02 09 01 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 81 03 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 d1 12 81 02 09 31 46 b2 0b 81 02 06 00 ff 75 10 95 02 09 01 81 02 c0 05 0d 09 54 95 01 75 08 15 00 25 14 81 02 05 0d 55 0c 66 01 10 35 00 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 05 0d 09 55 85 12 15 00 25 14 75 08 95 01 b1 02 85 44 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 06 00 ff 15 00 26 ff 00 85 03 09 01 75 08 95 07 b1 02 85 04 09 01 75 08 95 17 b1 02 85 05 09 01 75 08 95 47 b1 02 85 06 09 01 75 08 95 07 b1 02 85 73 09 01 75 08 95 07 b1 02 85 08 09 01 75 08 95 07 b1 02 85 09 09 01 75 08 95 3f b1 02 85 0f 09 01 75 08 96 07 02 b1 02 c0",
1786*0bb3ed71SBenjamin Tissoires        )
1787*0bb3ed71SBenjamin Tissoires
1788*0bb3ed71SBenjamin Tissoires
1789*0bb3ed71SBenjamin Tissoiresclass Testadvanced_silicon_04e8_2084(BaseTest.TestWin8Multitouch):
1790*0bb3ed71SBenjamin Tissoires    def create_device(self):
1791*0bb3ed71SBenjamin Tissoires        return Digitizer(
1792*0bb3ed71SBenjamin Tissoires            "uhid test advanced_silicon_04e8_2084",
1793*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 c0 14 81 02 46 ae 0b 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 c0 14 81 02 46 ae 0b 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 c0 14 81 02 46 ae 0b 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 c0 14 81 02 46 ae 0b 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 c0 14 81 02 46 ae 0b 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 c0 14 81 02 46 ae 0b 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 c0 14 81 02 46 ae 0b 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 c0 14 81 02 46 ae 0b 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 c0 14 81 02 46 ae 0b 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 c0 14 81 02 46 ae 0b 09 31 81 02 45 00 c0 05 0d 15 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 25 0a 75 08 09 54 81 02 85 44 09 55 b1 02 85 44 06 00 ff 09 c5 26 ff 00 96 00 01 b1 02 85 f0 09 01 95 04 b1 02 85 f2 09 03 b1 02 09 04 b1 02 09 05 b1 02 95 01 09 06 b1 02 09 07 b1 02 85 f1 09 02 95 07 91 02 85 f3 09 08 95 3d b1 02 c0",
1794*0bb3ed71SBenjamin Tissoires        )
1795*0bb3ed71SBenjamin Tissoires
1796*0bb3ed71SBenjamin Tissoires
1797*0bb3ed71SBenjamin Tissoiresclass Testadvanced_silicon_2149_2306(BaseTest.TestWin8Multitouch):
1798*0bb3ed71SBenjamin Tissoires    def create_device(self):
1799*0bb3ed71SBenjamin Tissoires        return Digitizer(
1800*0bb3ed71SBenjamin Tissoires            "uhid test advanced_silicon_2149_2306",
1801*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 f6 13 81 02 46 40 0b 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 f6 13 81 02 46 40 0b 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 f6 13 81 02 46 40 0b 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 f6 13 81 02 46 40 0b 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 f6 13 81 02 46 40 0b 09 31 81 02 45 00 c0 05 0d 15 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 25 0a 75 08 09 54 81 02 85 44 09 55 b1 02 85 44 06 00 ff 09 c5 26 ff 00 96 00 01 b1 02 85 f0 09 01 95 04 81 02 85 f2 09 03 b1 02 09 04 b1 02 09 05 b1 02 95 01 09 06 b1 02 09 07 b1 02 85 f1 09 02 95 07 91 02 85 f3 09 08 95 3d b1 02 c0",
1802*0bb3ed71SBenjamin Tissoires        )
1803*0bb3ed71SBenjamin Tissoires
1804*0bb3ed71SBenjamin Tissoires
1805*0bb3ed71SBenjamin Tissoiresclass Testadvanced_silicon_2149_230a(BaseTest.TestWin8Multitouch):
1806*0bb3ed71SBenjamin Tissoires    def create_device(self):
1807*0bb3ed71SBenjamin Tissoires        return Digitizer(
1808*0bb3ed71SBenjamin Tissoires            "uhid test advanced_silicon_2149_230a",
1809*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 f6 13 81 02 46 40 0b 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 f6 13 81 02 46 40 0b 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 f6 13 81 02 46 40 0b 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 f6 13 81 02 46 40 0b 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 f6 13 81 02 46 40 0b 09 31 81 02 45 00 c0 05 0d 15 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 25 0a 75 08 09 54 81 02 85 44 09 55 b1 02 85 44 06 00 ff 09 c5 26 ff 00 96 00 01 b1 02 85 f0 09 01 95 04 81 02 85 f2 09 03 b1 02 09 04 b1 02 09 05 b1 02 95 01 09 06 b1 02 09 07 b1 02 85 f1 09 02 95 07 91 02 85 f3 09 08 95 3d b1 02 c0",
1810*0bb3ed71SBenjamin Tissoires        )
1811*0bb3ed71SBenjamin Tissoires
1812*0bb3ed71SBenjamin Tissoires
1813*0bb3ed71SBenjamin Tissoiresclass Testadvanced_silicon_2149_231c(BaseTest.TestWin8Multitouch):
1814*0bb3ed71SBenjamin Tissoires    def create_device(self):
1815*0bb3ed71SBenjamin Tissoires        return Digitizer(
1816*0bb3ed71SBenjamin Tissoires            "uhid test advanced_silicon_2149_231c",
1817*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 e2 13 81 02 46 32 0b 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 e2 13 81 02 46 32 0b 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 e2 13 81 02 46 32 0b 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 e2 13 81 02 46 32 0b 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 e2 13 81 02 46 32 0b 09 31 81 02 45 00 c0 05 0d 15 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 25 0a 75 08 09 54 81 02 85 44 09 55 b1 02 85 44 06 00 ff 09 c5 26 ff 00 96 00 01 b1 02 85 f0 09 01 95 04 b1 02 85 f2 09 03 b1 02 09 04 b1 02 09 05 b1 02 95 01 09 06 b1 02 09 07 b1 02 85 f1 09 02 95 07 91 02 85 f3 09 08 95 3d b1 02 c0",
1818*0bb3ed71SBenjamin Tissoires        )
1819*0bb3ed71SBenjamin Tissoires
1820*0bb3ed71SBenjamin Tissoires
1821*0bb3ed71SBenjamin Tissoiresclass Testadvanced_silicon_2149_2703(BaseTest.TestWin8Multitouch):
1822*0bb3ed71SBenjamin Tissoires    def create_device(self):
1823*0bb3ed71SBenjamin Tissoires        return Digitizer(
1824*0bb3ed71SBenjamin Tissoires            "uhid test advanced_silicon_2149_2703",
1825*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 66 17 81 02 46 34 0d 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 66 17 81 02 46 34 0d 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 66 17 81 02 46 34 0d 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 66 17 81 02 46 34 0d 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 66 17 81 02 46 34 0d 09 31 81 02 45 00 c0 05 0d 15 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 25 0a 75 08 09 54 81 02 85 44 09 55 b1 02 85 44 06 00 ff 09 c5 26 ff 00 96 00 01 b1 02 85 f0 09 01 95 04 81 02 85 f2 09 03 b1 02 09 04 b1 02 09 05 b1 02 95 01 09 06 b1 02 09 07 b1 02 85 f1 09 02 95 07 91 02 85 f3 09 08 95 3d b1 02 c0",
1826*0bb3ed71SBenjamin Tissoires        )
1827*0bb3ed71SBenjamin Tissoires
1828*0bb3ed71SBenjamin Tissoires
1829*0bb3ed71SBenjamin Tissoiresclass Testadvanced_silicon_2149_270b(BaseTest.TestWin8Multitouch):
1830*0bb3ed71SBenjamin Tissoires    def create_device(self):
1831*0bb3ed71SBenjamin Tissoires        return Digitizer(
1832*0bb3ed71SBenjamin Tissoires            "uhid test advanced_silicon_2149_270b",
1833*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 52 17 81 02 46 20 0d 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 52 17 81 02 46 20 0d 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 52 17 81 02 46 20 0d 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 52 17 81 02 46 20 0d 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 52 17 81 02 46 20 0d 09 31 81 02 45 00 c0 05 0d 15 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 25 0a 75 08 09 54 81 02 85 44 09 55 b1 02 85 44 06 00 ff 09 c5 26 ff 00 96 00 01 b1 02 85 f0 09 01 95 04 b1 02 85 f2 09 03 b1 02 09 04 b1 02 09 05 b1 02 95 01 09 06 b1 02 09 07 b1 02 85 f1 09 02 95 07 91 02 85 f3 09 08 95 3d b1 02 c0",
1834*0bb3ed71SBenjamin Tissoires        )
1835*0bb3ed71SBenjamin Tissoires
1836*0bb3ed71SBenjamin Tissoires
1837*0bb3ed71SBenjamin Tissoiresclass Testadvanced_silicon_2575_0204(BaseTest.TestWin8Multitouch):
1838*0bb3ed71SBenjamin Tissoires    """found on the Dell Canvas 27"""
1839*0bb3ed71SBenjamin Tissoires
1840*0bb3ed71SBenjamin Tissoires    def create_device(self):
1841*0bb3ed71SBenjamin Tissoires        return Digitizer(
1842*0bb3ed71SBenjamin Tissoires            "uhid test advanced_silicon_2575_0204",
1843*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 25 7f 09 51 75 07 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 4f 17 81 02 46 1d 0d 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 25 7f 09 51 75 07 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 4f 17 81 02 46 1d 0d 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 25 7f 09 51 75 07 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 4f 17 81 02 46 1d 0d 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 25 7f 09 51 75 07 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 4f 17 81 02 46 1d 0d 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 25 7f 09 51 75 07 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 4f 17 81 02 46 1d 0d 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 25 7f 09 51 75 07 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 4f 17 81 02 46 1d 0d 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 25 7f 09 51 75 07 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 4f 17 81 02 46 1d 0d 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 25 7f 09 51 75 07 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 4f 17 81 02 46 1d 0d 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 25 7f 09 51 75 07 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 4f 17 81 02 46 1d 0d 09 31 81 02 45 00 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 25 7f 09 51 75 07 95 01 81 02 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 4f 17 81 02 46 1d 0d 09 31 81 02 45 00 c0 05 0d 15 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 25 0a 75 08 09 54 81 02 85 42 09 55 25 0a b1 02 85 44 06 00 ff 09 c5 26 ff 00 96 00 01 b1 02 c0 05 01 09 0e a1 01 85 05 05 01 09 08 a1 00 09 30 55 0e 65 11 15 00 26 ff 7f 35 00 46 4f 17 75 10 95 01 81 42 09 31 46 1d 0d 81 42 06 00 ff 09 01 75 20 81 03 05 01 09 37 55 00 65 14 16 98 fe 26 68 01 36 98 fe 46 68 01 75 0f 81 06 05 09 09 01 65 00 15 00 25 01 35 00 45 00 75 01 81 02 05 0d 09 42 81 02 09 51 75 07 25 7f 81 02 05 0d 09 48 55 0e 65 11 15 00 26 ff 7f 35 00 46 ff 7f 75 10 81 02 09 49 81 02 09 3f 55 00 65 14 15 00 26 67 01 35 00 46 67 01 81 0a c0 65 00 35 00 45 00 05 0d 15 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 25 05 75 08 09 54 81 02 85 47 09 55 25 05 b1 02 c0 06 00 ff 09 04 a1 01 85 f0 09 01 75 08 95 04 b1 02 85 f2 09 03 b1 02 09 04 b1 02 09 05 b1 02 85 c0 09 01 95 03 b1 02 85 c2 09 01 95 0f b1 02 85 c4 09 01 95 3e b1 02 85 c5 09 01 95 7e b1 02 85 c6 09 01 95 fe b1 02 85 c8 09 01 96 fe 03 b1 02 85 0a 09 01 95 3f b1 02 c0",
1844*0bb3ed71SBenjamin Tissoires        )
1845*0bb3ed71SBenjamin Tissoires
1846*0bb3ed71SBenjamin Tissoires
1847*0bb3ed71SBenjamin Tissoiresclass Testadvanced_silicon_2619_5610(BaseTest.TestWin8Multitouch):
1848*0bb3ed71SBenjamin Tissoires    def create_device(self):
1849*0bb3ed71SBenjamin Tissoires        return Digitizer(
1850*0bb3ed71SBenjamin Tissoires            "uhid test advanced_silicon_2619_5610",
1851*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 a1 00 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 f9 15 81 02 46 73 0c 09 31 81 02 45 00 c0 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 a1 00 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 f9 15 81 02 46 73 0c 09 31 81 02 45 00 c0 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 a1 00 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 f9 15 81 02 46 73 0c 09 31 81 02 45 00 c0 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 a1 00 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 f9 15 81 02 46 73 0c 09 31 81 02 45 00 c0 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 a1 00 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 f9 15 81 02 46 73 0c 09 31 81 02 45 00 c0 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 a1 00 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 f9 15 81 02 46 73 0c 09 31 81 02 45 00 c0 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 a1 00 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 f9 15 81 02 46 73 0c 09 31 81 02 45 00 c0 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 a1 00 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 f9 15 81 02 46 73 0c 09 31 81 02 45 00 c0 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 a1 00 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 f9 15 81 02 46 73 0c 09 31 81 02 45 00 c0 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 02 81 03 09 51 25 1f 75 05 95 01 81 02 a1 00 05 01 26 ff 7f 75 10 55 0e 65 11 09 30 35 00 46 f9 15 81 02 46 73 0c 09 31 81 02 45 00 c0 c0 05 0d 15 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 25 0a 75 08 09 54 81 02 85 44 09 55 b1 02 85 44 06 00 ff 09 c5 26 ff 00 96 00 01 b1 02 85 f0 09 01 95 04 81 02 85 f2 09 03 b1 02 09 04 b1 02 09 05 b1 02 95 01 09 06 b1 02 09 07 b1 02 85 f1 09 02 95 07 91 02 c0",
1852*0bb3ed71SBenjamin Tissoires        )
1853*0bb3ed71SBenjamin Tissoires
1854*0bb3ed71SBenjamin Tissoires
1855*0bb3ed71SBenjamin Tissoiresclass Testatmel_03eb_8409(BaseTest.TestWin8Multitouch):
1856*0bb3ed71SBenjamin Tissoires    def create_device(self):
1857*0bb3ed71SBenjamin Tissoires        return Digitizer(
1858*0bb3ed71SBenjamin Tissoires            "uhid test atmel_03eb_8409",
1859*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 01 81 03 95 01 81 03 25 1f 75 05 09 51 81 02 05 01 55 0e 65 11 35 00 75 10 95 02 46 c8 0a 26 6f 08 09 30 81 02 35 00 35 00 46 18 06 26 77 0f 09 31 81 02 35 00 35 00 05 0d 95 01 75 08 15 00 26 ff 00 46 ff 00 09 48 81 02 09 49 81 02 c0 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 01 81 03 95 01 81 03 25 1f 75 05 09 51 81 02 05 01 55 0e 65 11 35 00 75 10 95 02 46 c8 0a 26 6f 08 09 30 81 02 35 00 35 00 46 18 06 26 77 0f 09 31 81 02 35 00 35 00 05 0d 95 01 75 08 15 00 26 ff 00 46 ff 00 09 48 81 02 09 49 81 02 c0 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 01 81 03 95 01 81 03 25 1f 75 05 09 51 81 02 05 01 55 0e 65 11 35 00 75 10 95 02 46 c8 0a 26 6f 08 09 30 81 02 35 00 35 00 46 18 06 26 77 0f 09 31 81 02 35 00 35 00 05 0d 95 01 75 08 15 00 26 ff 00 46 ff 00 09 48 81 02 09 49 81 02 c0 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 01 81 03 95 01 81 03 25 1f 75 05 09 51 81 02 05 01 55 0e 65 11 35 00 75 10 95 02 46 c8 0a 26 6f 08 09 30 81 02 35 00 35 00 46 18 06 26 77 0f 09 31 81 02 35 00 35 00 05 0d 95 01 75 08 15 00 26 ff 00 46 ff 00 09 48 81 02 09 49 81 02 c0 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 01 81 03 95 01 81 03 25 1f 75 05 09 51 81 02 05 01 55 0e 65 11 35 00 75 10 95 02 46 c8 0a 26 6f 08 09 30 81 02 35 00 35 00 46 18 06 26 77 0f 09 31 81 02 35 00 35 00 05 0d 95 01 75 08 15 00 26 ff 00 46 ff 00 09 48 81 02 09 49 81 02 c0 05 0d 27 ff ff 00 00 75 10 95 01 09 56 81 02 15 00 25 1f 75 05 09 54 95 01 81 02 75 03 25 01 95 01 81 03 75 08 85 02 09 55 25 10 b1 02 06 00 ff 85 05 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 0d 09 00 a1 01 85 03 09 20 a1 00 15 00 25 01 75 01 95 01 09 42 81 02 09 44 81 02 09 45 81 02 81 03 09 32 81 02 95 03 81 03 05 01 55 0e 65 11 35 00 75 10 95 02 46 c8 0a 26 6f 08 09 30 81 02 46 18 06 26 77 0f 09 31 81 02 05 0d 09 30 15 01 26 ff 00 75 08 95 01 81 02 c0 c0",
1860*0bb3ed71SBenjamin Tissoires        )
1861*0bb3ed71SBenjamin Tissoires
1862*0bb3ed71SBenjamin Tissoires
1863*0bb3ed71SBenjamin Tissoiresclass Testatmel_03eb_840b(BaseTest.TestWin8Multitouch):
1864*0bb3ed71SBenjamin Tissoires    def create_device(self):
1865*0bb3ed71SBenjamin Tissoires        return Digitizer(
1866*0bb3ed71SBenjamin Tissoires            "uhid test atmel_03eb_840b",
1867*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 01 81 03 95 01 81 03 25 1f 75 05 09 51 81 02 05 01 55 0e 65 11 35 00 75 10 95 01 46 00 0a 26 ff 0f 09 30 81 02 09 00 81 03 46 a0 05 26 ff 0f 09 31 81 02 09 00 81 03 05 0d 95 01 75 08 15 00 26 ff 00 46 ff 00 09 00 81 03 09 00 81 03 c0 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 01 81 03 95 01 81 03 25 1f 75 05 09 51 81 02 05 01 55 0e 65 11 35 00 75 10 95 01 46 00 0a 26 ff 0f 09 30 81 02 09 00 81 03 46 a0 05 26 ff 0f 09 31 81 02 09 00 81 03 05 0d 95 01 75 08 15 00 26 ff 00 46 ff 00 09 00 81 03 09 00 81 03 c0 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 01 81 03 95 01 81 03 25 1f 75 05 09 51 81 02 05 01 55 0e 65 11 35 00 75 10 95 01 46 00 0a 26 ff 0f 09 30 81 02 09 00 81 03 46 a0 05 26 ff 0f 09 31 81 02 09 00 81 03 05 0d 95 01 75 08 15 00 26 ff 00 46 ff 00 09 00 81 03 09 00 81 03 c0 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 01 81 03 95 01 81 03 25 1f 75 05 09 51 81 02 05 01 55 0e 65 11 35 00 75 10 95 01 46 00 0a 26 ff 0f 09 30 81 02 09 00 81 03 46 a0 05 26 ff 0f 09 31 81 02 09 00 81 03 05 0d 95 01 75 08 15 00 26 ff 00 46 ff 00 09 00 81 03 09 00 81 03 c0 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 01 81 03 95 01 81 03 25 1f 75 05 09 51 81 02 05 01 55 0e 65 11 35 00 75 10 95 01 46 00 0a 26 ff 0f 09 30 81 02 09 00 81 03 46 a0 05 26 ff 0f 09 31 81 02 09 00 81 03 05 0d 95 01 75 08 15 00 26 ff 00 46 ff 00 09 00 81 03 09 00 81 03 c0 05 0d 27 ff ff 00 00 75 10 95 01 09 56 81 02 15 00 25 1f 75 05 09 54 95 01 81 02 75 03 25 01 95 01 81 03 75 08 85 02 09 55 25 10 b1 02 06 00 ff 85 05 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 0d 09 02 a1 01 85 03 09 20 a1 00 15 00 25 01 75 01 95 01 09 42 81 02 09 44 81 02 09 45 81 02 81 03 09 32 81 02 95 03 81 03 05 01 55 0e 65 11 35 00 75 10 95 02 46 00 0a 26 ff 0f 09 30 81 02 46 a0 05 26 ff 0f 09 31 81 02 05 0d 09 30 15 01 26 ff 00 75 08 95 01 81 02 c0 c0",
1868*0bb3ed71SBenjamin Tissoires        )
1869*0bb3ed71SBenjamin Tissoires
1870*0bb3ed71SBenjamin Tissoires
1871*0bb3ed71SBenjamin Tissoiresclass Testdell_044e_1220(BaseTest.TestPTP):
1872*0bb3ed71SBenjamin Tissoires    def create_device(self):
1873*0bb3ed71SBenjamin Tissoires        return PTP(
1874*0bb3ed71SBenjamin Tissoires            "uhid test dell_044e_1220",
1875*0bb3ed71SBenjamin Tissoires            type="pressurepad",
1876*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 02 a1 01 85 01 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 75 01 95 03 81 02 95 05 81 01 05 01 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 09 38 95 01 81 06 05 0c 0a 38 02 81 06 c0 c0 05 0d 09 05 a1 01 85 08 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 af 04 75 10 55 0e 65 11 09 30 35 00 46 e8 03 95 01 81 02 26 7b 02 46 12 02 09 31 81 02 c0 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 05 0d 09 56 81 02 09 54 25 05 95 01 75 08 81 02 05 09 19 01 29 03 25 01 75 01 95 03 81 02 95 05 81 03 05 0d 85 09 09 55 75 08 95 01 25 05 b1 02 06 00 ff 85 0a 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 06 01 ff 09 01 a1 01 85 03 09 01 15 00 26 ff 00 95 1b 81 02 85 04 09 02 95 50 81 02 85 05 09 03 95 07 b1 02 85 06 09 04 81 02 c0 06 02 ff 09 01 a1 01 85 07 09 02 95 86 75 08 b1 02 c0 05 0d 09 0e a1 01 85 0b 09 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 00 85 0c 09 57 09 58 75 01 95 02 25 01 b1 02 95 06 b1 03 c0 c0",
1877*0bb3ed71SBenjamin Tissoires        )
1878*0bb3ed71SBenjamin Tissoires
1879*0bb3ed71SBenjamin Tissoires
1880*0bb3ed71SBenjamin Tissoiresclass Testdell_06cb_75db(BaseTest.TestPTP):
1881*0bb3ed71SBenjamin Tissoires    def create_device(self):
1882*0bb3ed71SBenjamin Tissoires        return PTP(
1883*0bb3ed71SBenjamin Tissoires            "uhid test dell_06cb_75db",
1884*0bb3ed71SBenjamin Tissoires            max_contacts=3,
1885*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 02 a1 01 85 02 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 95 06 81 01 05 01 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 c0 c0 05 0d 09 05 a1 01 85 03 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 c8 04 75 10 55 0e 65 11 09 30 35 00 46 fb 03 95 01 81 02 46 6c 02 26 e8 02 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 c8 04 75 10 55 0e 65 11 09 30 35 00 46 fb 03 95 01 81 02 46 6c 02 26 e8 02 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 c8 04 75 10 55 0e 65 11 09 30 35 00 46 fb 03 95 01 81 02 46 6c 02 26 e8 02 09 31 81 02 05 0d c0 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 09 54 25 7f 95 01 75 08 81 02 05 09 09 01 25 01 75 01 95 01 81 02 95 07 81 03 05 0d 85 08 09 55 09 59 75 04 95 02 25 0f b1 02 85 0d 09 60 75 01 95 01 15 00 25 01 b1 02 95 07 b1 03 85 07 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 0d 09 0e a1 01 85 04 09 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 00 85 06 09 57 09 58 75 01 95 02 25 01 b1 02 95 06 b1 03 c0 c0 06 00 ff 09 01 a1 01 85 09 09 02 15 00 26 ff 00 75 08 95 14 91 02 85 0a 09 03 15 00 26 ff 00 75 08 95 14 91 02 85 0b 09 04 15 00 26 ff 00 75 08 95 1a 81 02 85 0c 09 05 15 00 26 ff 00 75 08 95 1a 81 02 85 0f 09 06 15 00 26 ff 00 75 08 95 01 b1 02 85 0e 09 07 15 00 26 ff 00 75 08 95 01 b1 02 c0",
1886*0bb3ed71SBenjamin Tissoires        )
1887*0bb3ed71SBenjamin Tissoires
1888*0bb3ed71SBenjamin Tissoires
1889*0bb3ed71SBenjamin Tissoiresclass Testegalax_capacitive_0eef_790a(BaseTest.TestWin8Multitouch):
1890*0bb3ed71SBenjamin Tissoires    def create_device(self):
1891*0bb3ed71SBenjamin Tissoires        return Digitizer(
1892*0bb3ed71SBenjamin Tissoires            "uhid test egalax_capacitive_0eef_790a",
1893*0bb3ed71SBenjamin Tissoires            max_contacts=10,
1894*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 06 05 0d 09 54 75 08 15 00 25 0c 95 01 81 02 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 07 81 03 75 08 09 51 95 01 15 00 25 20 81 02 05 01 26 ff 0f 75 10 55 0e 65 11 09 30 35 00 46 13 0c 81 02 46 cb 06 09 31 81 02 75 08 95 02 81 03 81 03 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 07 81 03 75 08 09 51 95 01 15 00 25 20 81 02 05 01 26 ff 0f 75 10 55 0e 65 11 09 30 35 00 46 13 0c 81 02 46 cb 06 09 31 81 02 75 08 95 02 81 03 81 03 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 07 81 03 75 08 09 51 95 01 15 00 25 20 81 02 05 01 26 ff 0f 75 10 55 0e 65 11 09 30 35 00 46 13 0c 81 02 46 cb 06 09 31 81 02 75 08 95 02 81 03 81 03 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 07 81 03 75 08 09 51 95 01 15 00 25 20 81 02 05 01 26 ff 0f 75 10 55 0e 65 11 09 30 35 00 46 13 0c 81 02 46 cb 06 09 31 81 02 75 08 95 02 81 03 81 03 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 07 81 03 75 08 09 51 95 01 15 00 25 20 81 02 05 01 26 ff 0f 75 10 55 0e 65 11 09 30 35 00 46 13 0c 81 02 46 cb 06 09 31 81 02 75 08 95 02 81 03 81 03 c0 05 0d 17 00 00 00 00 27 ff ff ff 7f 75 20 95 01 55 00 65 00 09 56 81 02 09 55 09 53 75 08 95 02 26 ff 00 b1 02 06 00 ff 09 c5 85 07 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 01 09 01 a1 01 85 01 09 01 a1 02 05 09 19 01 29 02 15 00 25 01 95 02 75 01 81 02 95 01 75 06 81 01 05 01 09 30 09 31 16 00 00 26 ff 0f 36 00 00 46 ff 0f 66 00 00 75 10 95 02 81 02 c0 c0 06 00 ff 09 01 a1 01 09 01 15 00 26 ff 00 85 03 75 08 95 3f 81 02 06 00 ff 09 01 15 00 26 ff 00 75 08 95 3f 91 02 c0 05 0d 09 0e a1 01 85 05 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0",
1895*0bb3ed71SBenjamin Tissoires        )
1896*0bb3ed71SBenjamin Tissoires
1897*0bb3ed71SBenjamin Tissoires
1898*0bb3ed71SBenjamin Tissoiresclass Testelan_04f3_000a(BaseTest.TestWin8Multitouch):
1899*0bb3ed71SBenjamin Tissoires    def create_device(self):
1900*0bb3ed71SBenjamin Tissoires        return Digitizer(
1901*0bb3ed71SBenjamin Tissoires            "uhid test elan_04f3_000a",
1902*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 00 08 46 a6 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 00 08 46 a6 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 00 08 46 a6 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 00 08 46 a6 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 00 08 46 a6 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 00 08 46 a6 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 00 08 46 a6 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 00 08 46 a6 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 00 08 46 a6 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 00 08 46 a6 00 09 31 81 02 c0 05 0d 09 56 55 00 65 00 27 ff ff ff 7f 95 01 75 20 81 02 09 54 25 7f 95 01 75 08 81 02 85 0a 09 55 25 0a b1 02 85 44 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 06 ff 01 09 01 a1 01 85 02 15 00 26 ff 00 75 08 95 40 09 00 81 02 c0 06 00 ff 09 01 a1 01 85 03 75 08 95 1f 09 01 91 02 c0 06 01 ff 09 01 a1 01 85 04 15 00 26 ff 00 75 08 95 13 09 00 81 02 c0",
1903*0bb3ed71SBenjamin Tissoires        )
1904*0bb3ed71SBenjamin Tissoires
1905*0bb3ed71SBenjamin Tissoires
1906*0bb3ed71SBenjamin Tissoiresclass Testelan_04f3_000c(BaseTest.TestWin8Multitouch):
1907*0bb3ed71SBenjamin Tissoires    def create_device(self):
1908*0bb3ed71SBenjamin Tissoires        return Digitizer(
1909*0bb3ed71SBenjamin Tissoires            "uhid test elan_04f3_000c",
1910*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 40 0e 75 10 55 0f 65 11 09 30 35 00 46 01 01 95 02 81 02 26 00 08 46 91 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 40 0e 75 10 55 0f 65 11 09 30 35 00 46 01 01 95 02 81 02 26 00 08 46 91 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 40 0e 75 10 55 0f 65 11 09 30 35 00 46 01 01 95 02 81 02 26 00 08 46 91 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 40 0e 75 10 55 0f 65 11 09 30 35 00 46 01 01 95 02 81 02 26 00 08 46 91 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 40 0e 75 10 55 0f 65 11 09 30 35 00 46 01 01 95 02 81 02 26 00 08 46 91 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 40 0e 75 10 55 0f 65 11 09 30 35 00 46 01 01 95 02 81 02 26 00 08 46 91 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 40 0e 75 10 55 0f 65 11 09 30 35 00 46 01 01 95 02 81 02 26 00 08 46 91 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 40 0e 75 10 55 0f 65 11 09 30 35 00 46 01 01 95 02 81 02 26 00 08 46 91 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 40 0e 75 10 55 0f 65 11 09 30 35 00 46 01 01 95 02 81 02 26 00 08 46 91 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 40 0e 75 10 55 0f 65 11 09 30 35 00 46 01 01 95 02 81 02 26 00 08 46 91 00 09 31 81 02 c0 05 0d 09 56 55 00 65 00 27 ff ff ff 7f 95 01 75 20 81 02 09 54 25 7f 95 01 75 08 81 02 85 0a 09 55 25 0a b1 02 85 44 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 06 ff 01 09 01 a1 01 85 02 15 00 26 ff 00 75 08 95 40 09 00 81 02 c0 06 00 ff 09 01 a1 01 85 03 75 08 95 1f 09 01 91 02 c0 06 01 ff 09 01 a1 01 85 04 15 00 26 ff 00 75 08 95 13 09 00 81 02 c0",
1911*0bb3ed71SBenjamin Tissoires        )
1912*0bb3ed71SBenjamin Tissoires
1913*0bb3ed71SBenjamin Tissoires
1914*0bb3ed71SBenjamin Tissoiresclass Testelan_04f3_010c(BaseTest.TestWin8Multitouch):
1915*0bb3ed71SBenjamin Tissoires    def create_device(self):
1916*0bb3ed71SBenjamin Tissoires        return Digitizer(
1917*0bb3ed71SBenjamin Tissoires            "uhid test elan_04f3_010c",
1918*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 f0 0c 75 10 55 0f 65 11 09 30 35 00 46 58 01 95 02 81 02 26 50 07 46 c2 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 f0 0c 75 10 55 0f 65 11 09 30 35 00 46 58 01 95 02 81 02 26 50 07 46 c2 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 f0 0c 75 10 55 0f 65 11 09 30 35 00 46 58 01 95 02 81 02 26 50 07 46 c2 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 f0 0c 75 10 55 0f 65 11 09 30 35 00 46 58 01 95 02 81 02 26 50 07 46 c2 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 f0 0c 75 10 55 0f 65 11 09 30 35 00 46 58 01 95 02 81 02 26 50 07 46 c2 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 f0 0c 75 10 55 0f 65 11 09 30 35 00 46 58 01 95 02 81 02 26 50 07 46 c2 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 f0 0c 75 10 55 0f 65 11 09 30 35 00 46 58 01 95 02 81 02 26 50 07 46 c2 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 f0 0c 75 10 55 0f 65 11 09 30 35 00 46 58 01 95 02 81 02 26 50 07 46 c2 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 f0 0c 75 10 55 0f 65 11 09 30 35 00 46 58 01 95 02 81 02 26 50 07 46 c2 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 f0 0c 75 10 55 0f 65 11 09 30 35 00 46 58 01 95 02 81 02 26 50 07 46 c2 00 09 31 81 02 c0 05 0d 09 56 55 00 65 00 27 ff ff ff 7f 95 01 75 20 81 02 09 54 25 7f 95 01 75 08 81 02 85 0a 09 55 25 0a b1 02 85 44 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 06 ff 01 09 01 a1 01 85 02 15 00 26 ff 00 75 08 95 40 09 00 81 02 c0 06 00 ff 09 01 a1 01 85 03 75 08 95 1f 09 01 91 02 c0 06 01 ff 09 01 a1 01 85 04 15 00 26 ff 00 75 08 95 13 09 00 81 02 c0",
1919*0bb3ed71SBenjamin Tissoires        )
1920*0bb3ed71SBenjamin Tissoires
1921*0bb3ed71SBenjamin Tissoires
1922*0bb3ed71SBenjamin Tissoiresclass Testelan_04f3_0125(BaseTest.TestWin8Multitouch):
1923*0bb3ed71SBenjamin Tissoires    def create_device(self):
1924*0bb3ed71SBenjamin Tissoires        return Digitizer(
1925*0bb3ed71SBenjamin Tissoires            "uhid test elan_04f3_0125",
1926*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 f0 0c 75 10 55 0f 65 11 09 30 35 00 46 58 01 95 02 81 02 26 50 07 46 c1 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 f0 0c 75 10 55 0f 65 11 09 30 35 00 46 58 01 95 02 81 02 26 50 07 46 c1 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 f0 0c 75 10 55 0f 65 11 09 30 35 00 46 58 01 95 02 81 02 26 50 07 46 c1 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 f0 0c 75 10 55 0f 65 11 09 30 35 00 46 58 01 95 02 81 02 26 50 07 46 c1 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 f0 0c 75 10 55 0f 65 11 09 30 35 00 46 58 01 95 02 81 02 26 50 07 46 c1 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 f0 0c 75 10 55 0f 65 11 09 30 35 00 46 58 01 95 02 81 02 26 50 07 46 c1 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 f0 0c 75 10 55 0f 65 11 09 30 35 00 46 58 01 95 02 81 02 26 50 07 46 c1 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 f0 0c 75 10 55 0f 65 11 09 30 35 00 46 58 01 95 02 81 02 26 50 07 46 c1 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 f0 0c 75 10 55 0f 65 11 09 30 35 00 46 58 01 95 02 81 02 26 50 07 46 c1 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 f0 0c 75 10 55 0f 65 11 09 30 35 00 46 58 01 95 02 81 02 26 50 07 46 c1 00 09 31 81 02 c0 05 0d 09 56 55 00 65 00 27 ff ff ff 7f 95 01 75 20 81 02 09 54 25 7f 95 01 75 08 81 02 85 0a 09 55 25 0a b1 02 85 44 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 06 ff 01 09 01 a1 01 85 02 15 00 26 ff 00 75 08 95 40 09 00 81 02 c0 06 00 ff 09 01 a1 01 85 03 75 08 95 1f 09 01 91 02 c0 06 01 ff 09 01 a1 01 85 04 15 00 26 ff 00 75 08 95 13 09 00 81 02 c0",
1927*0bb3ed71SBenjamin Tissoires        )
1928*0bb3ed71SBenjamin Tissoires
1929*0bb3ed71SBenjamin Tissoires
1930*0bb3ed71SBenjamin Tissoiresclass Testelan_04f3_016f(BaseTest.TestWin8Multitouch):
1931*0bb3ed71SBenjamin Tissoires    def create_device(self):
1932*0bb3ed71SBenjamin Tissoires        return Digitizer(
1933*0bb3ed71SBenjamin Tissoires            "uhid test elan_04f3_016f",
1934*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 40 08 46 a6 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 40 08 46 a6 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 40 08 46 a6 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 40 08 46 a6 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 40 08 46 a6 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 40 08 46 a6 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 40 08 46 a6 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 40 08 46 a6 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 40 08 46 a6 00 09 31 81 02 c0 05 0d 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 75 01 81 03 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 40 08 46 a6 00 09 31 81 02 c0 05 0d 09 56 55 00 65 00 27 ff ff ff 7f 95 01 75 20 81 02 09 54 25 7f 95 01 75 08 81 02 85 0a 09 55 25 0a b1 02 85 44 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 06 ff 01 09 01 a1 01 85 02 15 00 26 ff 00 75 08 95 40 09 00 81 02 c0 06 00 ff 09 01 a1 01 85 03 75 08 95 1f 09 01 91 02 c0 06 01 ff 09 01 a1 01 85 04 15 00 26 ff 00 75 08 95 13 09 00 81 02 c0",
1935*0bb3ed71SBenjamin Tissoires        )
1936*0bb3ed71SBenjamin Tissoires
1937*0bb3ed71SBenjamin Tissoires
1938*0bb3ed71SBenjamin Tissoiresclass Testelan_04f3_0732(BaseTest.TestWin8Multitouch):
1939*0bb3ed71SBenjamin Tissoires    def create_device(self):
1940*0bb3ed71SBenjamin Tissoires        return Digitizer(
1941*0bb3ed71SBenjamin Tissoires            "uhid test elan_04f3_0732",
1942*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0b 75 10 55 0f 65 11 09 30 35 00 46 ff 00 95 02 81 02 26 40 07 46 85 00 09 31 81 02 c0 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0b 75 10 55 0f 65 11 09 30 35 00 46 ff 00 95 02 81 02 26 40 07 46 85 00 09 31 81 02 c0 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0b 75 10 55 0f 65 11 09 30 35 00 46 ff 00 95 02 81 02 26 40 07 46 85 00 09 31 81 02 c0 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0b 75 10 55 0f 65 11 09 30 35 00 46 ff 00 95 02 81 02 26 40 07 46 85 00 09 31 81 02 c0 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0b 75 10 55 0f 65 11 09 30 35 00 46 ff 00 95 02 81 02 26 40 07 46 85 00 09 31 81 02 c0 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0b 75 10 55 0f 65 11 09 30 35 00 46 ff 00 95 02 81 02 26 40 07 46 85 00 09 31 81 02 c0 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0b 75 10 55 0f 65 11 09 30 35 00 46 ff 00 95 02 81 02 26 40 07 46 85 00 09 31 81 02 c0 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0b 75 10 55 0f 65 11 09 30 35 00 46 ff 00 95 02 81 02 26 40 07 46 85 00 09 31 81 02 c0 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0b 75 10 55 0f 65 11 09 30 35 00 46 ff 00 95 02 81 02 26 40 07 46 85 00 09 31 81 02 c0 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0b 75 10 55 0f 65 11 09 30 35 00 46 ff 00 95 02 81 02 26 40 07 46 85 00 09 31 81 02 c0 05 0d 09 56 55 00 65 00 27 ff ff 00 00 95 01 75 20 81 02 09 54 25 7f 95 01 75 08 81 02 85 0a 09 55 25 0a b1 02 85 44 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 06 ff 01 09 01 a1 01 85 02 15 00 25 ff 75 08 95 40 09 00 81 02 c0 06 00 ff 09 01 a1 01 85 03 75 08 95 1f 09 01 91 02 c0",
1943*0bb3ed71SBenjamin Tissoires        )
1944*0bb3ed71SBenjamin Tissoires
1945*0bb3ed71SBenjamin Tissoires
1946*0bb3ed71SBenjamin Tissoiresclass Testelan_04f3_200a(BaseTest.TestWin8Multitouch):
1947*0bb3ed71SBenjamin Tissoires    def create_device(self):
1948*0bb3ed71SBenjamin Tissoires        return Digitizer(
1949*0bb3ed71SBenjamin Tissoires            "uhid test elan_04f3_200a",
1950*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 01 09 22 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 40 08 46 a6 00 09 31 81 02 c0 a1 02 05 0d 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 75 06 09 51 25 3f 81 02 26 ff 00 75 08 09 48 81 02 09 49 81 02 95 01 05 01 26 c0 0e 75 10 55 0f 65 11 09 30 35 00 46 26 01 95 02 81 02 26 40 08 46 a6 00 09 31 81 02 c0 05 0d 09 56 55 00 65 00 27 ff ff 00 00 95 01 75 20 81 02 09 54 25 7f 95 01 75 08 81 02 85 0a 09 55 25 0a b1 02 85 0e 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0",
1951*0bb3ed71SBenjamin Tissoires        )
1952*0bb3ed71SBenjamin Tissoires
1953*0bb3ed71SBenjamin Tissoires
1954*0bb3ed71SBenjamin Tissoiresclass Testelan_04f3_300b(BaseTest.TestPTP):
1955*0bb3ed71SBenjamin Tissoires    def create_device(self):
1956*0bb3ed71SBenjamin Tissoires        return PTP(
1957*0bb3ed71SBenjamin Tissoires            "uhid test elan_04f3_300b",
1958*0bb3ed71SBenjamin Tissoires            max_contacts=3,
1959*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 02 a1 01 85 01 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 95 06 81 03 05 01 09 30 09 31 09 38 15 81 25 7f 75 08 95 03 81 06 05 0c 0a 38 02 95 01 81 06 75 08 95 03 81 03 c0 06 00 ff 85 0d 09 c5 15 00 26 ff 00 75 08 95 04 b1 02 85 0c 09 c6 96 76 02 75 08 b1 02 85 0b 09 c7 95 42 75 08 b1 02 09 01 85 5d 95 1f 75 08 81 06 c0 05 0d 09 05 a1 01 85 04 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 02 25 02 09 51 81 02 75 01 95 04 81 03 05 01 15 00 26 a7 0c 75 10 55 0e 65 13 09 30 35 00 46 9d 01 95 01 81 02 46 25 01 26 2b 09 26 2b 09 09 31 81 02 05 0d 15 00 25 64 95 03 c0 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 09 54 25 7f 95 01 75 08 81 02 05 09 09 01 25 01 75 01 95 01 81 02 95 07 81 03 05 0d 85 02 09 55 09 59 75 04 95 02 25 0f b1 02 85 07 09 60 75 01 95 01 15 00 25 01 b1 02 95 0f b1 03 06 00 ff 06 00 ff 85 06 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 0d 09 0e a1 01 85 03 09 22 a1 00 09 52 15 00 25 0a 75 08 95 02 b1 02 c0 09 22 a1 00 85 05 09 57 09 58 15 00 75 01 95 02 25 03 b1 02 95 0e b1 03 c0 c0",
1960*0bb3ed71SBenjamin Tissoires        )
1961*0bb3ed71SBenjamin Tissoires
1962*0bb3ed71SBenjamin Tissoires
1963*0bb3ed71SBenjamin Tissoiresclass Testelan_04f3_3045(BaseTest.TestPTP):
1964*0bb3ed71SBenjamin Tissoires    def create_device(self):
1965*0bb3ed71SBenjamin Tissoires        return PTP(
1966*0bb3ed71SBenjamin Tissoires            "uhid test elan_04f3_3045",
1967*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 02 a1 01 85 01 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 95 06 81 03 05 01 09 30 09 31 09 38 15 81 25 7f 75 08 95 03 81 06 05 0c 0a 38 02 95 01 81 06 75 08 95 03 81 03 c0 c0 05 0d 09 05 a1 01 85 04 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 75 01 95 02 81 03 95 01 75 04 25 0f 09 51 81 02 05 01 15 00 26 80 0c 75 10 55 0e 65 13 09 30 35 00 46 90 01 95 01 81 02 46 13 01 26 96 08 26 96 08 09 31 81 02 05 0d 15 00 25 64 95 03 c0 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 09 54 25 7f 95 01 75 08 81 02 05 09 09 01 25 01 75 01 95 01 81 02 95 07 81 03 09 c5 75 08 95 04 81 03 05 0d 85 02 09 55 09 59 75 04 95 02 25 0f b1 02 85 07 09 60 75 01 95 01 15 00 25 01 b1 02 95 0f b1 03 06 00 ff 06 00 ff 85 06 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 85 0d 09 c5 15 00 26 ff 00 75 08 95 04 b1 02 85 0c 09 c6 96 8a 02 75 08 b1 02 85 0b 09 c7 95 80 75 08 b1 02 c0 05 0d 09 0e a1 01 85 03 09 22 a1 00 09 52 15 00 25 0a 75 08 95 02 b1 02 c0 09 22 a1 00 85 05 09 57 09 58 15 00 75 01 95 02 25 03 b1 02 95 0e b1 03 c0 c0",
1968*0bb3ed71SBenjamin Tissoires        )
1969*0bb3ed71SBenjamin Tissoires
1970*0bb3ed71SBenjamin Tissoires
1971*0bb3ed71SBenjamin Tissoiresclass Testelan_04f3_313a(BaseTest.TestPTP):
1972*0bb3ed71SBenjamin Tissoires    def create_device(self):
1973*0bb3ed71SBenjamin Tissoires        return PTP(
1974*0bb3ed71SBenjamin Tissoires            "uhid test elan_04f3_313a",
1975*0bb3ed71SBenjamin Tissoires            type="touchpad",
1976*0bb3ed71SBenjamin Tissoires            input_info=(BusType.I2C, 0x04F3, 0x313A),
1977*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 02 a1 01 85 01 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 75 01 95 03 81 02 95 05 81 03 05 01 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 75 08 95 05 81 03 c0 06 00 ff 09 01 85 0e 09 c5 15 00 26 ff 00 75 08 95 04 b1 02 85 0a 09 c6 15 00 26 ff 00 75 08 95 04 b1 02 c0 06 00 ff 09 01 a1 01 85 5c 09 01 95 0b 75 08 81 06 85 0d 09 c5 15 00 26 ff 00 75 08 95 04 b1 02 85 0c 09 c6 96 80 03 75 08 b1 02 85 0b 09 c7 95 82 75 08 b1 02 c0 05 0d 09 05 a1 01 85 04 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 05 09 09 02 09 03 15 00 25 01 75 01 95 02 81 02 05 0d 95 01 75 04 25 0f 09 51 81 02 05 01 15 00 26 d7 0e 75 10 55 0d 65 11 09 30 35 00 46 44 2f 95 01 81 02 46 12 16 26 eb 06 26 eb 06 09 31 81 02 05 0d 15 00 25 64 95 03 c0 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 09 54 25 7f 95 01 75 08 81 02 25 01 75 01 95 08 81 03 09 c5 75 08 95 02 81 03 05 0d 85 02 09 55 09 59 75 04 95 02 25 0f b1 02 85 07 09 60 75 01 95 01 15 00 25 01 b1 02 95 0f b1 03 06 00 ff 06 00 ff 85 06 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 0d 09 0e a1 01 85 03 09 22 a1 00 09 52 15 00 25 0a 75 10 95 01 b1 02 c0 09 22 a1 00 85 05 09 57 09 58 75 01 95 02 25 01 b1 02 95 0e b1 03 c0 c0 05 01 09 02 a1 01 85 2a 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 75 01 95 03 81 02 95 05 81 03 05 01 09 30 09 31 15 81 25 7f 35 81 45 7f 55 00 65 13 75 08 95 02 81 06 75 08 95 05 81 03 c0 c0",
1978*0bb3ed71SBenjamin Tissoires        )
1979*0bb3ed71SBenjamin Tissoires
1980*0bb3ed71SBenjamin Tissoires
1981*0bb3ed71SBenjamin Tissoiresclass Testelo_04e7_0080(BaseTest.TestWin8Multitouch):
1982*0bb3ed71SBenjamin Tissoires    def create_device(self):
1983*0bb3ed71SBenjamin Tissoires        return Digitizer(
1984*0bb3ed71SBenjamin Tissoires            "uhid test elo_04e7_0080",
1985*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 03 81 03 09 32 95 02 81 02 95 02 81 03 09 51 75 08 95 01 81 02 05 01 26 ff 7f 65 11 55 0e 75 10 09 30 46 7c 24 81 02 09 31 46 96 14 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 03 81 03 09 32 95 02 81 02 95 02 81 03 09 51 75 08 95 01 81 02 05 01 26 ff 7f 65 11 55 0e 75 10 09 30 46 7c 24 81 02 09 31 46 96 14 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 03 81 03 09 32 95 02 81 02 95 02 81 03 09 51 75 08 95 01 81 02 05 01 26 ff 7f 65 11 55 0e 75 10 09 30 46 7c 24 81 02 09 31 46 96 14 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 03 81 03 09 32 95 02 81 02 95 02 81 03 09 51 75 08 95 01 81 02 05 01 26 ff 7f 65 11 55 0e 75 10 09 30 46 7c 24 81 02 09 31 46 96 14 81 02 c0 05 0d 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 09 54 75 08 95 01 15 00 25 08 81 02 09 55 b1 02 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0",
1986*0bb3ed71SBenjamin Tissoires        )
1987*0bb3ed71SBenjamin Tissoires
1988*0bb3ed71SBenjamin Tissoires
1989*0bb3ed71SBenjamin Tissoiresclass Testilitek_222a_0015(BaseTest.TestWin8Multitouch):
1990*0bb3ed71SBenjamin Tissoires    def create_device(self):
1991*0bb3ed71SBenjamin Tissoires        return Digitizer(
1992*0bb3ed71SBenjamin Tissoires            "uhid test ilitek_222a_0015",
1993*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 04 09 22 a1 02 05 0d 95 01 75 06 09 51 15 00 25 3f 81 02 09 42 25 01 75 01 95 01 81 02 75 01 95 01 81 03 05 01 75 10 55 0e 65 11 09 30 26 c2 16 35 00 46 b3 08 81 42 09 31 26 c2 0c 46 e4 04 81 42 c0 05 0d 09 22 a1 02 05 0d 95 01 75 06 09 51 15 00 25 3f 81 02 09 42 25 01 75 01 95 01 81 02 75 01 95 01 81 03 05 01 75 10 55 0e 65 11 09 30 26 c2 16 35 00 46 b3 08 81 42 09 31 26 c2 0c 46 e4 04 81 42 c0 05 0d 09 22 a1 02 05 0d 95 01 75 06 09 51 15 00 25 3f 81 02 09 42 25 01 75 01 95 01 81 02 75 01 95 01 81 03 05 01 75 10 55 0e 65 11 09 30 26 c2 16 35 00 46 b3 08 81 42 09 31 26 c2 0c 46 e4 04 81 42 c0 05 0d 09 22 a1 02 05 0d 95 01 75 06 09 51 15 00 25 3f 81 02 09 42 25 01 75 01 95 01 81 02 75 01 95 01 81 03 05 01 75 10 55 0e 65 11 09 30 26 c2 16 35 00 46 b3 08 81 42 09 31 26 c2 0c 46 e4 04 81 42 c0 05 0d 09 22 a1 02 05 0d 95 01 75 06 09 51 15 00 25 3f 81 02 09 42 25 01 75 01 95 01 81 02 75 01 95 01 81 03 05 01 75 10 55 0e 65 11 09 30 26 c2 16 35 00 46 b3 08 81 42 09 31 26 c2 0c 46 e4 04 81 42 c0 05 0d 09 22 a1 02 05 0d 95 01 75 06 09 51 15 00 25 3f 81 02 09 42 25 01 75 01 95 01 81 02 75 01 95 01 81 03 05 01 75 10 55 0e 65 11 09 30 26 c2 16 35 00 46 b3 08 81 42 09 31 26 c2 0c 46 e4 04 81 42 c0 05 0d 09 22 a1 02 05 0d 95 01 75 06 09 51 15 00 25 3f 81 02 09 42 25 01 75 01 95 01 81 02 75 01 95 01 81 03 05 01 75 10 55 0e 65 11 09 30 26 c2 16 35 00 46 b3 08 81 42 09 31 26 c2 0c 46 e4 04 81 42 c0 05 0d 09 22 a1 02 05 0d 95 01 75 06 09 51 15 00 25 3f 81 02 09 42 25 01 75 01 95 01 81 02 75 01 95 01 81 03 05 01 75 10 55 0e 65 11 09 30 26 c2 16 35 00 46 b3 08 81 42 09 31 26 c2 0c 46 e4 04 81 42 c0 05 0d 09 22 a1 02 05 0d 95 01 75 06 09 51 15 00 25 3f 81 02 09 42 25 01 75 01 95 01 81 02 75 01 95 01 81 03 05 01 75 10 55 0e 65 11 09 30 26 c2 16 35 00 46 b3 08 81 42 09 31 26 c2 0c 46 e4 04 81 42 c0 05 0d 09 22 a1 02 05 0d 95 01 75 06 09 51 15 00 25 3f 81 02 09 42 25 01 75 01 95 01 81 02 75 01 95 01 81 03 05 01 75 10 55 0e 65 11 09 30 26 c2 16 35 00 46 b3 08 81 42 09 31 26 c2 0c 46 e4 04 81 42 c0 05 0d 09 56 55 00 65 00 27 ff ff ff 7f 95 01 75 20 81 02 09 54 25 7f 95 01 75 08 81 02 85 02 09 55 25 0a b1 02 06 00 ff 09 c5 85 06 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 06 00 ff 09 01 a1 01 09 01 85 03 15 00 26 ff 00 75 08 95 3f 81 02 06 00 ff 09 01 15 00 26 ff 00 75 08 95 3f 91 02 c0",
1994*0bb3ed71SBenjamin Tissoires        )
1995*0bb3ed71SBenjamin Tissoires
1996*0bb3ed71SBenjamin Tissoires
1997*0bb3ed71SBenjamin Tissoiresclass Testilitek_222a_001c(BaseTest.TestWin8Multitouch):
1998*0bb3ed71SBenjamin Tissoires    def create_device(self):
1999*0bb3ed71SBenjamin Tissoires        return Digitizer(
2000*0bb3ed71SBenjamin Tissoires            "uhid test ilitek_222a_001c",
2001*0bb3ed71SBenjamin Tissoires            rdesc="05 0d 09 04 a1 01 85 04 09 22 a1 02 05 0d 95 01 75 06 09 51 15 00 25 3f 81 02 09 42 25 01 75 01 95 01 81 02 75 01 95 01 81 03 05 01 75 10 55 0e 65 11 09 30 26 74 1d 35 00 46 70 0d 81 42 09 31 26 74 10 46 8f 07 81 42 c0 05 0d 09 22 a1 02 05 0d 95 01 75 06 09 51 15 00 25 3f 81 02 09 42 25 01 75 01 95 01 81 02 75 01 95 01 81 03 05 01 75 10 55 0e 65 11 09 30 26 74 1d 35 00 46 70 0d 81 42 09 31 26 74 10 46 8f 07 81 42 c0 05 0d 09 22 a1 02 05 0d 95 01 75 06 09 51 15 00 25 3f 81 02 09 42 25 01 75 01 95 01 81 02 75 01 95 01 81 03 05 01 75 10 55 0e 65 11 09 30 26 74 1d 35 00 46 70 0d 81 42 09 31 26 74 10 46 8f 07 81 42 c0 05 0d 09 22 a1 02 05 0d 95 01 75 06 09 51 15 00 25 3f 81 02 09 42 25 01 75 01 95 01 81 02 75 01 95 01 81 03 05 01 75 10 55 0e 65 11 09 30 26 74 1d 35 00 46 70 0d 81 42 09 31 26 74 10 46 8f 07 81 42 c0 05 0d 09 22 a1 02 05 0d 95 01 75 06 09 51 15 00 25 3f 81 02 09 42 25 01 75 01 95 01 81 02 75 01 95 01 81 03 05 01 75 10 55 0e 65 11 09 30 26 74 1d 35 00 46 70 0d 81 42 09 31 26 74 10 46 8f 07 81 42 c0 05 0d 09 22 a1 02 05 0d 95 01 75 06 09 51 15 00 25 3f 81 02 09 42 25 01 75 01 95 01 81 02 75 01 95 01 81 03 05 01 75 10 55 0e 65 11 09 30 26 74 1d 35 00 46 70 0d 81 42 09 31 26 74 10 46 8f 07 81 42 c0 05 0d 09 22 a1 02 05 0d 95 01 75 06 09 51 15 00 25 3f 81 02 09 42 25 01 75 01 95 01 81 02 75 01 95 01 81 03 05 01 75 10 55 0e 65 11 09 30 26 74 1d 35 00 46 70 0d 81 42 09 31 26 74 10 46 8f 07 81 42 c0 05 0d 09 22 a1 02 05 0d 95 01 75 06 09 51 15 00 25 3f 81 02 09 42 25 01 75 01 95 01 81 02 75 01 95 01 81 03 05 01 75 10 55 0e 65 11 09 30 26 74 1d 35 00 46 70 0d 81 42 09 31 26 74 10 46 8f 07 81 42 c0 05 0d 09 22 a1 02 05 0d 95 01 75 06 09 51 15 00 25 3f 81 02 09 42 25 01 75 01 95 01 81 02 75 01 95 01 81 03 05 01 75 10 55 0e 65 11 09 30 26 74 1d 35 00 46 70 0d 81 42 09 31 26 74 10 46 8f 07 81 42 c0 05 0d 09 22 a1 02 05 0d 95 01 75 06 09 51 15 00 25 3f 81 02 09 42 25 01 75 01 95 01 81 02 75 01 95 01 81 03 05 01 75 10 55 0e 65 11 09 30 26 74 1d 35 00 46 70 0d 81 42 09 31 26 74 10 46 8f 07 81 42 c0 05 0d 09 56 55 00 65 00 27 ff ff ff 7f 95 01 75 20 81 02 09 54 25 7f 95 01 75 08 81 02 85 02 09 55 25 0a b1 02 06 00 ff 09 c5 85 06 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 06 00 ff 09 01 a1 01 09 01 85 03 15 00 26 ff 00 75 08 95 3f 81 02 06 00 ff 09 01 15 00 26 ff 00 75 08 95 3f 91 02 c0",
2002*0bb3ed71SBenjamin Tissoires        )
2003*0bb3ed71SBenjamin Tissoires
2004*0bb3ed71SBenjamin Tissoires
2005*0bb3ed71SBenjamin Tissoiresclass Testite_06cb_2968(BaseTest.TestPTP):
2006*0bb3ed71SBenjamin Tissoires    def create_device(self):
2007*0bb3ed71SBenjamin Tissoires        return PTP(
2008*0bb3ed71SBenjamin Tissoires            "uhid test ite_06cb_2968",
2009*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 02 a1 01 85 02 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 95 06 81 01 05 01 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 c0 c0 05 0d 09 05 a1 01 85 03 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 1b 04 75 10 55 0e 65 11 09 30 35 00 46 6c 03 95 01 81 02 46 db 01 26 3b 02 09 31 81 02 05 0d c0 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 09 54 25 7f 95 01 75 08 81 02 05 09 09 01 25 01 75 01 95 01 81 02 95 07 81 03 05 0d 85 08 09 55 09 59 75 04 95 02 25 0f b1 02 85 0d 09 60 75 01 95 01 15 00 25 01 b1 02 95 07 b1 03 85 07 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 0d 09 0e a1 01 85 04 09 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 00 85 06 09 57 09 58 75 01 95 02 25 01 b1 02 95 06 b1 03 c0 c0 06 00 ff 09 01 a1 01 85 09 09 02 15 00 26 ff 00 75 08 95 14 91 02 85 0a 09 03 15 00 26 ff 00 75 08 95 14 91 02 85 0b 09 04 15 00 26 ff 00 75 08 95 1a 81 02 85 0c 09 05 15 00 26 ff 00 75 08 95 1a 81 02 85 0f 09 06 15 00 26 ff 00 75 08 95 01 b1 02 85 0e 09 07 15 00 26 ff 00 75 08 95 01 b1 02 c0",
2010*0bb3ed71SBenjamin Tissoires            max_contacts=5,
2011*0bb3ed71SBenjamin Tissoires            input_info=(0x3, 0x06CB, 0x2968),
2012*0bb3ed71SBenjamin Tissoires        )
2013*0bb3ed71SBenjamin Tissoires
2014*0bb3ed71SBenjamin Tissoires
2015*0bb3ed71SBenjamin Tissoiresclass Testn_trig_1b96_0c01(BaseTest.TestWin8Multitouch):
2016*0bb3ed71SBenjamin Tissoires    def create_device(self):
2017*0bb3ed71SBenjamin Tissoires        return Digitizer(
2018*0bb3ed71SBenjamin Tissoires            "uhid test n_trig_1b96_0c01",
2019*0bb3ed71SBenjamin Tissoires            rdesc="75 08 15 00 26 ff 00 06 0b ff 09 0b a1 01 95 0f 09 29 85 29 b1 02 95 1f 09 2a 85 2a b1 02 95 3e 09 2b 85 2b b1 02 95 fe 09 2c 85 2c b1 02 96 fe 01 09 2d 85 2d b1 02 95 02 09 48 85 48 b1 02 95 0f 09 2e 85 2e 81 02 95 1f 09 2f 85 2f 81 02 95 3e 09 30 85 30 81 02 95 fe 09 31 85 31 81 02 96 fe 01 09 32 85 32 81 02 75 08 96 fe 0f 09 35 85 35 81 02 c0 05 0d 09 02 a1 01 85 01 09 20 35 00 a1 00 09 32 09 42 09 44 09 3c 09 45 15 00 25 01 75 01 95 05 81 02 95 03 81 03 05 01 09 30 75 10 95 01 a4 55 0e 65 11 46 15 0a 26 80 25 81 02 09 31 46 b4 05 26 20 1c 81 02 b4 05 0d 09 30 26 00 01 81 02 06 00 ff 09 01 81 02 c0 85 0c 06 00 ff 09 0c 75 08 95 06 26 ff 00 b1 02 85 0b 09 0b 95 02 b1 02 85 11 09 11 b1 02 85 15 09 15 95 05 b1 02 85 18 09 18 95 0c b1 02 c0 05 0d 09 04 a1 01 85 03 06 00 ff 09 01 75 10 95 01 15 00 27 ff ff 00 00 81 02 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 10 09 51 27 ff ff 00 00 95 01 81 02 05 01 09 30 75 10 95 02 a4 55 0e 65 11 46 15 0a 26 80 25 81 02 09 31 46 b4 05 26 20 1c 81 02 05 0d 09 48 95 01 26 80 25 81 02 09 49 26 20 1c 81 02 b4 06 00 ff 09 02 75 08 95 04 15 00 26 ff 00 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 10 09 51 27 ff ff 00 00 95 01 81 02 05 01 09 30 75 10 95 02 a4 55 0e 65 11 46 15 0a 26 80 25 81 02 09 31 46 b4 05 26 20 1c 81 02 05 0d 09 48 95 01 26 80 25 81 02 09 49 26 20 1c 81 02 b4 06 00 ff 09 02 75 08 95 04 15 00 26 ff 00 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 10 09 51 27 ff ff 00 00 95 01 81 02 05 01 09 30 75 10 95 02 a4 55 0e 65 11 46 15 0a 26 80 25 81 02 09 31 46 b4 05 26 20 1c 81 02 05 0d 09 48 95 01 26 80 25 81 02 09 49 26 20 1c 81 02 b4 06 00 ff 09 02 75 08 95 04 15 00 26 ff 00 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 10 09 51 27 ff ff 00 00 95 01 81 02 05 01 09 30 75 10 95 02 a4 55 0e 65 11 46 15 0a 26 80 25 81 02 09 31 46 b4 05 26 20 1c 81 02 05 0d 09 48 95 01 26 80 25 81 02 09 49 26 20 1c 81 02 b4 06 00 ff 09 02 75 08 95 04 15 00 26 ff 00 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 10 09 51 27 ff ff 00 00 95 01 81 02 05 01 09 30 75 10 95 02 a4 55 0e 65 11 46 15 0a 26 80 25 81 02 09 31 46 b4 05 26 20 1c 81 02 05 0d 09 48 95 01 26 80 25 81 02 09 49 26 20 1c 81 02 b4 06 00 ff 09 02 75 08 95 04 15 00 26 ff 00 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 10 09 51 27 ff ff 00 00 95 01 81 02 05 01 09 30 75 10 95 02 a4 55 0e 65 11 46 15 0a 26 80 25 81 02 09 31 46 b4 05 26 20 1c 81 02 05 0d 09 48 95 01 26 80 25 81 02 09 49 26 20 1c 81 02 b4 06 00 ff 09 02 75 08 95 04 15 00 26 ff 00 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 10 09 51 27 ff ff 00 00 95 01 81 02 05 01 09 30 75 10 95 02 a4 55 0e 65 11 46 15 0a 26 80 25 81 02 09 31 46 b4 05 26 20 1c 81 02 05 0d 09 48 95 01 26 80 25 81 02 09 49 26 20 1c 81 02 b4 06 00 ff 09 02 75 08 95 04 15 00 26 ff 00 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 10 09 51 27 ff ff 00 00 95 01 81 02 05 01 09 30 75 10 95 02 a4 55 0e 65 11 46 15 0a 26 80 25 81 02 09 31 46 b4 05 26 20 1c 81 02 05 0d 09 48 95 01 26 80 25 81 02 09 49 26 20 1c 81 02 b4 06 00 ff 09 02 75 08 95 04 15 00 26 ff 00 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 10 09 51 27 ff ff 00 00 95 01 81 02 05 01 09 30 75 10 95 02 a4 55 0e 65 11 46 15 0a 26 80 25 81 02 09 31 46 b4 05 26 20 1c 81 02 05 0d 09 48 95 01 26 80 25 81 02 09 49 26 20 1c 81 02 b4 06 00 ff 09 02 75 08 95 04 15 00 26 ff 00 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 10 09 51 27 ff ff 00 00 95 01 81 02 05 01 09 30 75 10 95 02 a4 55 0e 65 11 46 15 0a 26 80 25 81 02 09 31 46 b4 05 26 20 1c 81 02 05 0d 09 48 95 01 26 80 25 81 02 09 49 26 20 1c 81 02 b4 06 00 ff 09 02 75 08 95 04 15 00 26 ff 00 81 02 c0 05 0d 09 54 95 01 75 08 81 02 09 56 75 20 95 01 27 ff ff ff 0f 81 02 85 04 09 55 75 08 95 01 25 0b b1 02 85 0a 06 00 ff 09 03 15 00 b1 02 85 1b 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 01 09 02 a1 01 85 02 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 95 06 81 03 05 01 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 c0 c0",
2020*0bb3ed71SBenjamin Tissoires        )
2021*0bb3ed71SBenjamin Tissoires
2022*0bb3ed71SBenjamin Tissoires
2023*0bb3ed71SBenjamin Tissoiresclass Testn_trig_1b96_0c03(BaseTest.TestWin8Multitouch):
2024*0bb3ed71SBenjamin Tissoires    def create_device(self):
2025*0bb3ed71SBenjamin Tissoires        return Digitizer(
2026*0bb3ed71SBenjamin Tissoires            "uhid test n_trig_1b96_0c03",
2027*0bb3ed71SBenjamin Tissoires            rdesc="75 08 15 00 26 ff 00 06 0b ff 09 0b a1 01 95 0f 09 29 85 29 b1 02 95 1f 09 2a 85 2a b1 02 95 3e 09 2b 85 2b b1 02 95 fe 09 2c 85 2c b1 02 96 fe 01 09 2d 85 2d b1 02 95 02 09 48 85 48 b1 02 95 0f 09 2e 85 2e 81 02 95 1f 09 2f 85 2f 81 02 95 3e 09 30 85 30 81 02 95 fe 09 31 85 31 81 02 96 fe 01 09 32 85 32 81 02 75 08 96 fe 0f 09 35 85 35 81 02 c0 05 0d 09 02 a1 01 85 01 09 20 35 00 a1 00 09 32 09 42 09 44 09 3c 09 45 15 00 25 01 75 01 95 05 81 02 95 03 81 03 05 01 09 30 75 10 95 01 a4 55 0e 65 11 46 15 0a 26 80 25 81 02 09 31 46 b4 05 26 20 1c 81 02 b4 05 0d 09 30 26 00 01 81 02 06 00 ff 09 01 81 02 c0 85 0c 06 00 ff 09 0c 75 08 95 06 26 ff 00 b1 02 85 0b 09 0b 95 02 b1 02 85 11 09 11 b1 02 85 15 09 15 95 05 b1 02 85 18 09 18 95 0c b1 02 c0 05 0d 09 04 a1 01 85 03 06 00 ff 09 01 75 10 95 01 15 00 27 ff ff 00 00 81 02 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 01 81 03 09 47 81 02 95 05 81 03 75 10 09 51 27 ff ff 00 00 95 01 81 02 05 01 09 30 75 10 95 02 a4 55 0e 65 11 46 15 0a 26 80 25 81 02 09 31 46 b4 05 26 20 1c 81 02 05 0d 09 48 95 01 26 80 25 81 02 09 49 26 20 1c 81 02 b4 06 00 ff 09 02 75 08 95 04 15 00 26 ff 00 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 01 81 03 09 47 81 02 95 05 81 03 75 10 09 51 27 ff ff 00 00 95 01 81 02 05 01 09 30 75 10 95 02 a4 55 0e 65 11 46 15 0a 26 80 25 81 02 09 31 46 b4 05 26 20 1c 81 02 05 0d 09 48 95 01 26 80 25 81 02 09 49 26 20 1c 81 02 b4 06 00 ff 09 02 75 08 95 04 15 00 26 ff 00 81 02 c0 05 0d 09 54 95 01 75 08 81 02 09 56 75 20 95 01 27 ff ff ff 0f 81 02 85 04 09 55 75 08 95 01 25 0b b1 02 85 0a 06 00 ff 09 03 15 00 b1 02 85 1b 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 01 09 02 a1 01 85 02 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 95 06 81 03 05 01 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 c0 c0",
2028*0bb3ed71SBenjamin Tissoires        )
2029*0bb3ed71SBenjamin Tissoires
2030*0bb3ed71SBenjamin Tissoires
2031*0bb3ed71SBenjamin Tissoiresclass Testn_trig_1b96_0f00(BaseTest.TestWin8Multitouch):
2032*0bb3ed71SBenjamin Tissoires    def create_device(self):
2033*0bb3ed71SBenjamin Tissoires        return Digitizer(
2034*0bb3ed71SBenjamin Tissoires            "uhid test n_trig_1b96_0f00",
2035*0bb3ed71SBenjamin Tissoires            rdesc="75 08 15 00 26 ff 00 06 0b ff 09 0b a1 01 95 0f 09 29 85 29 b1 02 95 1f 09 2a 85 2a b1 02 95 3e 09 2b 85 2b b1 02 95 fe 09 2c 85 2c b1 02 96 fe 01 09 2d 85 2d b1 02 95 02 09 48 85 48 b1 02 95 0f 09 2e 85 2e 81 02 95 1f 09 2f 85 2f 81 02 95 3e 09 30 85 30 81 02 95 fe 09 31 85 31 81 02 96 fe 01 09 32 85 32 81 02 75 08 96 fe 0f 09 35 85 35 81 02 c0 05 0d 09 02 a1 01 85 01 09 20 35 00 a1 00 09 32 09 42 09 44 09 3c 09 45 15 00 25 01 75 01 95 05 81 02 95 03 81 03 05 01 09 30 75 10 95 01 a4 55 0e 65 11 46 03 0a 26 80 25 81 02 09 31 46 a1 05 26 20 1c 81 02 b4 05 0d 09 30 26 00 01 81 02 06 00 ff 09 01 81 02 c0 85 0c 06 00 ff 09 0c 75 08 95 06 26 ff 00 b1 02 85 0b 09 0b 95 02 b1 02 85 11 09 11 b1 02 85 15 09 15 95 05 b1 02 85 18 09 18 95 0c b1 02 c0 05 0d 09 04 a1 01 85 03 06 00 ff 09 01 75 10 95 01 15 00 27 ff ff 00 00 81 02 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 01 81 03 09 47 81 02 95 05 81 03 75 10 09 51 27 ff ff 00 00 95 01 81 02 05 01 09 30 75 10 95 02 a4 55 0e 65 11 46 03 0a 26 80 25 81 02 09 31 46 a1 05 26 20 1c 81 02 05 0d 09 48 95 01 26 80 25 81 02 09 49 26 20 1c 81 02 b4 06 00 ff 09 02 75 08 95 04 15 00 26 ff 00 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 01 81 03 09 47 81 02 95 05 81 03 75 10 09 51 27 ff ff 00 00 95 01 81 02 05 01 09 30 75 10 95 02 a4 55 0e 65 11 46 03 0a 26 80 25 81 02 09 31 46 a1 05 26 20 1c 81 02 05 0d 09 48 95 01 26 80 25 81 02 09 49 26 20 1c 81 02 b4 06 00 ff 09 02 75 08 95 04 15 00 26 ff 00 81 02 c0 05 0d 09 54 95 01 75 08 81 02 09 56 75 20 95 01 27 ff ff ff 0f 81 02 85 04 09 55 75 08 95 01 25 0b b1 02 85 0a 06 00 ff 09 03 15 00 b1 02 85 1b 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 01 09 02 a1 01 85 02 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 95 06 81 03 05 01 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 c0 c0",
2036*0bb3ed71SBenjamin Tissoires        )
2037*0bb3ed71SBenjamin Tissoires
2038*0bb3ed71SBenjamin Tissoires
2039*0bb3ed71SBenjamin Tissoiresclass Testn_trig_1b96_0f04(BaseTest.TestWin8Multitouch):
2040*0bb3ed71SBenjamin Tissoires    def create_device(self):
2041*0bb3ed71SBenjamin Tissoires        return Digitizer(
2042*0bb3ed71SBenjamin Tissoires            "uhid test n_trig_1b96_0f04",
2043*0bb3ed71SBenjamin Tissoires            rdesc="75 08 15 00 26 ff 00 06 0b ff 09 0b a1 01 95 0f 09 29 85 29 b1 02 95 1f 09 2a 85 2a b1 02 95 3e 09 2b 85 2b b1 02 95 fe 09 2c 85 2c b1 02 96 fe 01 09 2d 85 2d b1 02 95 02 09 48 85 48 b1 02 95 0f 09 2e 85 2e 81 02 95 1f 09 2f 85 2f 81 02 95 3e 09 30 85 30 81 02 95 fe 09 31 85 31 81 02 96 fe 01 09 32 85 32 81 02 75 08 96 fe 0f 09 35 85 35 81 02 c0 05 0d 09 02 a1 01 85 01 09 20 35 00 a1 00 09 32 09 42 09 44 09 3c 09 45 15 00 25 01 75 01 95 05 81 02 95 03 81 03 05 01 09 30 75 10 95 01 a4 55 0e 65 11 46 7f 0b 26 80 25 81 02 09 31 46 78 06 26 20 1c 81 02 b4 05 0d 09 30 26 00 01 81 02 06 00 ff 09 01 81 02 c0 85 0c 06 00 ff 09 0c 75 08 95 06 26 ff 00 b1 02 85 0b 09 0b 95 02 b1 02 85 11 09 11 b1 02 85 15 09 15 95 05 b1 02 85 18 09 18 95 0c b1 02 c0 05 0d 09 04 a1 01 85 03 06 00 ff 09 01 75 10 95 01 15 00 27 ff ff 00 00 81 02 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 01 81 03 09 47 81 02 95 05 81 03 75 10 09 51 27 ff ff 00 00 95 01 81 02 05 01 09 30 75 10 95 02 a4 55 0e 65 11 46 7f 0b 26 80 25 81 02 09 31 46 78 06 26 20 1c 81 02 05 0d 09 48 95 01 26 80 25 81 02 09 49 26 20 1c 81 02 b4 06 00 ff 09 02 75 08 95 04 15 00 26 ff 00 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 01 81 03 09 47 81 02 95 05 81 03 75 10 09 51 27 ff ff 00 00 95 01 81 02 05 01 09 30 75 10 95 02 a4 55 0e 65 11 46 7f 0b 26 80 25 81 02 09 31 46 78 06 26 20 1c 81 02 05 0d 09 48 95 01 26 80 25 81 02 09 49 26 20 1c 81 02 b4 06 00 ff 09 02 75 08 95 04 15 00 26 ff 00 81 02 c0 05 0d 09 54 95 01 75 08 81 02 09 56 75 20 95 01 27 ff ff ff 0f 81 02 85 04 09 55 75 08 95 01 25 0b b1 02 85 0a 06 00 ff 09 03 15 00 b1 02 85 1b 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 01 09 02 a1 01 85 02 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 95 06 81 03 05 01 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 c0 c0",
2044*0bb3ed71SBenjamin Tissoires        )
2045*0bb3ed71SBenjamin Tissoires
2046*0bb3ed71SBenjamin Tissoires
2047*0bb3ed71SBenjamin Tissoiresclass Testn_trig_1b96_1000(BaseTest.TestWin8Multitouch):
2048*0bb3ed71SBenjamin Tissoires    def create_device(self):
2049*0bb3ed71SBenjamin Tissoires        return Digitizer(
2050*0bb3ed71SBenjamin Tissoires            "uhid test n_trig_1b96_1000",
2051*0bb3ed71SBenjamin Tissoires            rdesc="75 08 15 00 26 ff 00 06 0b ff 09 0b a1 01 95 0f 09 29 85 29 b1 02 95 1f 09 2a 85 2a b1 02 95 3e 09 2b 85 2b b1 02 95 fe 09 2c 85 2c b1 02 96 fe 01 09 2d 85 2d b1 02 95 02 09 48 85 48 b1 02 95 0f 09 2e 85 2e 81 02 95 1f 09 2f 85 2f 81 02 95 3e 09 30 85 30 81 02 95 fe 09 31 85 31 81 02 96 fe 01 09 32 85 32 81 02 75 08 96 fe 0f 09 35 85 35 81 02 c0 05 0d 09 02 a1 01 85 01 09 20 35 00 a1 00 09 32 09 42 09 44 09 3c 09 45 15 00 25 01 75 01 95 05 81 02 95 03 81 03 05 01 09 30 75 10 95 01 a4 55 0e 65 11 46 03 0a 26 80 25 81 02 09 31 46 a1 05 26 20 1c 81 02 b4 05 0d 09 30 26 00 01 81 02 06 00 ff 09 01 81 02 c0 85 0c 06 00 ff 09 0c 75 08 95 06 26 ff 00 b1 02 85 0b 09 0b 95 02 b1 02 85 11 09 11 b1 02 85 15 09 15 95 05 b1 02 85 18 09 18 95 0c b1 02 c0 05 0d 09 04 a1 01 85 03 06 00 ff 09 01 75 10 95 01 15 00 27 ff ff 00 00 81 02 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 01 81 03 09 47 81 02 95 05 81 03 75 10 09 51 27 ff ff 00 00 95 01 81 02 05 01 09 30 75 10 95 02 a4 55 0e 65 11 46 03 0a 26 80 25 81 02 09 31 46 a1 05 26 20 1c 81 02 05 0d 09 48 95 01 26 80 25 81 02 09 49 26 20 1c 81 02 b4 06 00 ff 09 02 75 08 95 04 15 00 26 ff 00 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 01 81 03 09 47 81 02 95 05 81 03 75 10 09 51 27 ff ff 00 00 95 01 81 02 05 01 09 30 75 10 95 02 a4 55 0e 65 11 46 03 0a 26 80 25 81 02 09 31 46 a1 05 26 20 1c 81 02 05 0d 09 48 95 01 26 80 25 81 02 09 49 26 20 1c 81 02 b4 06 00 ff 09 02 75 08 95 04 15 00 26 ff 00 81 02 c0 05 0d 09 54 95 01 75 08 81 02 09 56 75 20 95 01 27 ff ff ff 0f 81 02 85 04 09 55 75 08 95 01 25 0b b1 02 85 0a 06 00 ff 09 03 15 00 b1 02 85 1b 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 01 09 02 a1 01 85 02 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 95 06 81 03 05 01 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 c0 c0",
2052*0bb3ed71SBenjamin Tissoires        )
2053*0bb3ed71SBenjamin Tissoires
2054*0bb3ed71SBenjamin Tissoires
2055*0bb3ed71SBenjamin Tissoiresclass Testsharp_04dd_9681(BaseTest.TestWin8Multitouch):
2056*0bb3ed71SBenjamin Tissoires    def create_device(self):
2057*0bb3ed71SBenjamin Tissoires        return Digitizer(
2058*0bb3ed71SBenjamin Tissoires            "uhid test sharp_04dd_9681",
2059*0bb3ed71SBenjamin Tissoires            rdesc="06 00 ff 09 01 a1 01 75 08 26 ff 00 15 00 85 06 95 3f 09 01 91 02 85 05 95 3f 09 01 81 02 c0 05 0d 09 04 a1 01 85 81 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 07 81 03 75 08 09 51 95 01 81 02 05 01 65 11 55 0f 35 00 46 b0 01 26 80 07 75 10 09 30 81 02 46 f3 00 26 38 04 09 31 81 02 05 0d 09 48 09 49 26 ff 00 95 02 75 08 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 07 81 03 75 08 09 51 95 01 81 02 05 01 65 11 55 0f 35 00 46 b0 01 26 80 07 75 10 09 30 81 02 46 f3 00 26 38 04 09 31 81 02 05 0d 09 48 09 49 26 ff 00 95 02 75 08 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 07 81 03 75 08 09 51 95 01 81 02 05 01 65 11 55 0f 35 00 46 b0 01 26 80 07 75 10 09 30 81 02 46 f3 00 26 38 04 09 31 81 02 05 0d 09 48 09 49 26 ff 00 95 02 75 08 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 07 81 03 75 08 09 51 95 01 81 02 05 01 65 11 55 0f 35 00 46 b0 01 26 80 07 75 10 09 30 81 02 46 f3 00 26 38 04 09 31 81 02 05 0d 09 48 09 49 26 ff 00 95 02 75 08 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 07 81 03 75 08 09 51 95 01 81 02 05 01 65 11 55 0f 35 00 46 b0 01 26 80 07 75 10 09 30 81 02 46 f3 00 26 38 04 09 31 81 02 05 0d 09 48 09 49 26 ff 00 95 02 75 08 81 02 c0 05 0d 09 56 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 81 02 09 54 95 01 75 08 15 00 25 0a 81 02 85 84 09 55 b1 02 85 87 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 09 0e a1 01 85 83 09 23 a1 02 09 52 09 53 15 00 25 0a 75 08 95 02 b1 02 c0 c0 05 01 09 02 a1 01 09 01 a1 00 85 80 05 09 19 01 29 01 15 00 25 01 95 01 75 01 81 02 95 01 75 07 81 01 05 01 65 11 55 0f 09 30 26 80 07 35 00 46 66 00 75 10 95 01 81 02 09 31 26 38 04 35 00 46 4d 00 81 02 c0 c0",
2060*0bb3ed71SBenjamin Tissoires        )
2061*0bb3ed71SBenjamin Tissoires
2062*0bb3ed71SBenjamin Tissoires
2063*0bb3ed71SBenjamin Tissoiresclass Testsipodev_0603_0002(BaseTest.TestPTP):
2064*0bb3ed71SBenjamin Tissoires    def create_device(self):
2065*0bb3ed71SBenjamin Tissoires        return PTP(
2066*0bb3ed71SBenjamin Tissoires            "uhid test sipodev_0603_0002",
2067*0bb3ed71SBenjamin Tissoires            type="clickpad",
2068*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 02 a1 01 85 03 09 01 a1 00 05 09 19 01 29 02 25 01 75 01 95 02 81 02 95 06 81 03 05 01 09 30 09 31 15 80 25 7f 75 08 95 02 81 06 c0 c0 05 0d 09 05 a1 01 85 04 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 75 01 95 02 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 44 0a 75 0c 55 0e 65 11 09 30 35 00 46 ac 03 95 01 81 02 46 fe 01 26 34 05 75 0c 09 31 81 02 05 0d c0 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 09 54 25 0a 95 01 75 04 81 02 75 01 95 03 81 03 05 09 09 01 25 01 75 01 95 01 81 02 05 0d 85 0a 09 55 09 59 75 04 95 02 25 0f b1 02 85 0b 09 60 75 01 95 01 15 00 25 01 b1 02 95 07 b1 03 85 09 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 0d 09 0e a1 01 85 06 09 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 00 85 07 09 57 09 58 75 01 95 02 25 01 b1 02 95 06 b1 03 c0 c0 05 01 09 0c a1 01 85 08 15 00 25 01 09 c6 75 01 95 01 81 06 75 07 81 03 c0 05 01 09 80 a1 01 85 01 15 00 25 01 75 01 0a 81 00 0a 82 00 0a 83 00 95 03 81 06 95 05 81 01 c0 06 0c 00 09 01 a1 01 85 02 25 01 15 00 75 01 0a b5 00 0a b6 00 0a b7 00 0a cd 00 0a e2 00 0a a2 00 0a e9 00 0a ea 00 95 08 81 02 0a 83 01 0a 6f 00 0a 70 00 0a 88 01 0a 8a 01 0a 92 01 0a a8 02 0a 24 02 95 08 81 02 0a 21 02 0a 23 02 0a 96 01 0a 25 02 0a 26 02 0a 27 02 0a 23 02 0a b1 02 95 08 81 02 c0 06 00 ff 09 01 a1 01 85 05 15 00 26 ff 00 19 01 29 02 75 08 95 05 b1 02 c0",
2069*0bb3ed71SBenjamin Tissoires        )
2070*0bb3ed71SBenjamin Tissoires
2071*0bb3ed71SBenjamin Tissoires
2072*0bb3ed71SBenjamin Tissoiresclass Testsynaptics_06cb_1d10(BaseTest.TestWin8Multitouch):
2073*0bb3ed71SBenjamin Tissoires    def create_device(self):
2074*0bb3ed71SBenjamin Tissoires        return Digitizer(
2075*0bb3ed71SBenjamin Tissoires            "uhid test synaptics_06cb_1d10",
2076*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 02 a1 01 85 02 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 95 06 81 03 05 01 09 30 09 31 75 08 95 02 15 81 25 7f 35 81 45 7f 55 0e 65 11 81 06 c0 c0 05 0d 09 04 a1 01 85 01 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 07 81 03 75 08 09 51 15 01 26 ff 00 95 01 81 42 05 01 15 00 26 3c 0c 75 10 55 0e 65 11 09 30 35 12 46 2a 0c 81 02 09 31 15 00 26 f1 06 35 12 46 df 06 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 07 81 03 75 08 09 51 15 01 26 ff 00 95 01 81 42 05 01 15 00 26 3c 0c 75 10 55 0e 65 11 09 30 35 12 46 2a 0c 81 02 09 31 15 00 26 f1 06 35 12 46 df 06 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 07 81 03 75 08 09 51 15 01 26 ff 00 95 01 81 42 05 01 15 00 26 3c 0c 75 10 55 0e 65 11 09 30 35 12 46 2a 0c 81 02 09 31 15 00 26 f1 06 35 12 46 df 06 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 07 81 03 75 08 09 51 15 01 26 ff 00 95 01 81 42 05 01 15 00 26 3c 0c 75 10 55 0e 65 11 09 30 35 12 46 2a 0c 81 02 09 31 15 00 26 f1 06 35 12 46 df 06 81 02 c0 05 0d 09 22 a1 02 09 42 15 00 25 01 75 01 95 01 81 02 95 07 81 03 75 08 09 51 15 01 26 ff 00 95 01 81 42 05 01 15 00 26 3c 0c 75 10 55 0e 65 11 09 30 35 12 46 2a 0c 81 02 09 31 15 00 26 f1 06 35 12 46 df 06 81 02 c0 05 0d 05 0d 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 09 54 95 01 75 08 15 00 25 0f 81 02 85 08 09 55 b1 03 85 07 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 06 00 ff 09 01 a1 01 85 09 09 02 15 00 26 ff 00 75 08 95 3f 91 02 85 0a 09 03 15 00 26 ff 00 75 08 95 05 91 02 85 0b 09 04 15 00 26 ff 00 75 08 95 3d 81 02 85 0c 09 05 15 00 26 ff 00 75 08 95 01 81 02 85 0f 09 06 15 00 26 ff 00 75 08 95 01 b1 02 c0",
2077*0bb3ed71SBenjamin Tissoires        )
2078*0bb3ed71SBenjamin Tissoires
2079*0bb3ed71SBenjamin Tissoires
2080*0bb3ed71SBenjamin Tissoiresclass Testsynaptics_06cb_ce08(BaseTest.TestPTP):
2081*0bb3ed71SBenjamin Tissoires    def create_device(self):
2082*0bb3ed71SBenjamin Tissoires        return PTP(
2083*0bb3ed71SBenjamin Tissoires            "uhid test synaptics_06cb_ce08",
2084*0bb3ed71SBenjamin Tissoires            max_contacts=5,
2085*0bb3ed71SBenjamin Tissoires            physical="Vendor Usage 1",
2086*0bb3ed71SBenjamin Tissoires            input_info=(BusType.I2C, 0x06CB, 0xCE08),
2087*0bb3ed71SBenjamin Tissoires            rdesc="05 01 09 02 a1 01 85 02 09 01 a1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 95 06 81 01 05 01 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 c0 c0 05 01 09 02 a1 01 85 18 09 01 a1 00 05 09 19 01 29 03 46 00 00 15 00 25 01 75 01 95 03 81 02 95 05 81 01 05 01 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 c0 c0 06 00 ff 09 02 a1 01 85 20 09 01 a1 00 09 03 15 00 26 ff 00 35 00 46 ff 00 75 08 95 05 81 02 c0 c0 05 0d 09 05 a1 01 85 03 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 f8 04 75 10 55 0e 65 11 09 30 35 00 46 24 04 95 01 81 02 46 30 02 26 a0 02 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 f8 04 75 10 55 0e 65 11 09 30 35 00 46 24 04 95 01 81 02 46 30 02 26 a0 02 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 f8 04 75 10 55 0e 65 11 09 30 35 00 46 24 04 95 01 81 02 46 30 02 26 a0 02 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 f8 04 75 10 55 0e 65 11 09 30 35 00 46 24 04 95 01 81 02 46 30 02 26 a0 02 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 f8 04 75 10 55 0e 65 11 09 30 35 00 46 24 04 95 01 81 02 46 30 02 26 a0 02 09 31 81 02 c0 05 0d 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 09 54 25 7f 95 01 75 08 81 02 05 09 09 01 25 01 75 01 95 01 81 02 95 07 81 03 05 0d 85 08 09 55 09 59 75 04 95 02 25 0f b1 02 85 0d 09 60 75 01 95 01 15 00 25 01 b1 02 95 07 b1 03 85 07 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 0d 09 0e a1 01 85 04 09 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 00 85 06 09 57 09 58 75 01 95 02 25 01 b1 02 95 06 b1 03 c0 c0 06 00 ff 09 01 a1 01 85 09 09 02 15 00 26 ff 00 75 08 95 14 91 02 85 0a 09 03 15 00 26 ff 00 75 08 95 14 91 02 85 0b 09 04 15 00 26 ff 00 75 08 95 45 81 02 85 0c 09 05 15 00 26 ff 00 75 08 95 45 81 02 85 0f 09 06 15 00 26 ff 00 75 08 95 03 b1 02 85 0e 09 07 15 00 26 ff 00 75 08 95 01 b1 02 c0",
2088*0bb3ed71SBenjamin Tissoires        )
2089