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