1// Copyright 2017 The Fuchsia Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include <hid/samsung.h> 6#include <zircon/device/input.h> 7#include <zircon/errors.h> 8#include <string.h> 9 10static const uint8_t samsung_touch_report_desc[] = { 11 0x05, 0x0D, // Usage Page (Digitizer) 12 0x09, 0x04, // Usage (Touch Screen) 13 0xA1, 0x01, // Collection (Application) 14 0x85, 0x01, // Report ID (1) 15 0x05, 0x0D, // Usage Page (Digitizer) 16 0x09, 0x22, // Usage (Finger) 17 0xA1, 0x02, // Collection (Logical) 18 0x09, 0x42, // Usage (Tip Switch) 19 0x15, 0x00, // Logical Minimum (0) 20 0x25, 0x01, // Logical Maximum (1) 21 0x75, 0x01, // Report Size (1) 22 0x95, 0x01, // Report Count (1) 23 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 24 0x09, 0x51, // Usage (0x51) 25 0x25, 0x7F, // Logical Maximum (127) 26 0x75, 0x07, // Report Size (7) 27 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 28 0x75, 0x08, // Report Size (8) 29 0x26, 0xFF, 0x00, // Logical Maximum (255) 30 0x09, 0x48, // Usage (0x48) 31 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 32 0x09, 0x49, // Usage (0x49) 33 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 34 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 35 0x26, 0xFF, 0x7F, // Logical Maximum (32767) 36 0x75, 0x10, // Report Size (16) 37 0x09, 0x30, // Usage (X) 38 0x46, 0x97, 0x01, // Physical Maximum (407) 39 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 40 0x46, 0xF3, 0x00, // Physical Maximum (243) 41 0x09, 0x31, // Usage (Y) 42 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 43 0xC0, // End Collection 44 0x05, 0x0D, // Usage Page (Digitizer) 45 0x09, 0x22, // Usage (Finger) 46 0xA1, 0x02, // Collection (Logical) 47 0x09, 0x42, // Usage (Tip Switch) 48 0x15, 0x00, // Logical Minimum (0) 49 0x25, 0x01, // Logical Maximum (1) 50 0x75, 0x01, // Report Size (1) 51 0x95, 0x01, // Report Count (1) 52 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 53 0x09, 0x51, // Usage (0x51) 54 0x25, 0x7F, // Logical Maximum (127) 55 0x75, 0x07, // Report Size (7) 56 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 57 0x75, 0x08, // Report Size (8) 58 0x26, 0xFF, 0x00, // Logical Maximum (255) 59 0x09, 0x48, // Usage (0x48) 60 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 61 0x09, 0x49, // Usage (0x49) 62 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 63 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 64 0x26, 0xFF, 0x7F, // Logical Maximum (32767) 65 0x75, 0x10, // Report Size (16) 66 0x09, 0x30, // Usage (X) 67 0x46, 0x97, 0x01, // Physical Maximum (407) 68 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 69 0x46, 0xF3, 0x00, // Physical Maximum (243) 70 0x09, 0x31, // Usage (Y) 71 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 72 0xC0, // End Collection 73 0x05, 0x0D, // Usage Page (Digitizer) 74 0x09, 0x22, // Usage (Finger) 75 0xA1, 0x02, // Collection (Logical) 76 0x09, 0x42, // Usage (Tip Switch) 77 0x15, 0x00, // Logical Minimum (0) 78 0x25, 0x01, // Logical Maximum (1) 79 0x75, 0x01, // Report Size (1) 80 0x95, 0x01, // Report Count (1) 81 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 82 0x09, 0x51, // Usage (0x51) 83 0x25, 0x7F, // Logical Maximum (127) 84 0x75, 0x07, // Report Size (7) 85 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 86 0x75, 0x08, // Report Size (8) 87 0x26, 0xFF, 0x00, // Logical Maximum (255) 88 0x09, 0x48, // Usage (0x48) 89 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 90 0x09, 0x49, // Usage (0x49) 91 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 92 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 93 0x26, 0xFF, 0x7F, // Logical Maximum (32767) 94 0x75, 0x10, // Report Size (16) 95 0x09, 0x30, // Usage (X) 96 0x46, 0x97, 0x01, // Physical Maximum (407) 97 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 98 0x46, 0xF3, 0x00, // Physical Maximum (243) 99 0x09, 0x31, // Usage (Y) 100 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 101 0xC0, // End Collection 102 0x05, 0x0D, // Usage Page (Digitizer) 103 0x09, 0x22, // Usage (Finger) 104 0xA1, 0x02, // Collection (Logical) 105 0x09, 0x42, // Usage (Tip Switch) 106 0x15, 0x00, // Logical Minimum (0) 107 0x25, 0x01, // Logical Maximum (1) 108 0x75, 0x01, // Report Size (1) 109 0x95, 0x01, // Report Count (1) 110 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 111 0x09, 0x51, // Usage (0x51) 112 0x25, 0x7F, // Logical Maximum (127) 113 0x75, 0x07, // Report Size (7) 114 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 115 0x75, 0x08, // Report Size (8) 116 0x26, 0xFF, 0x00, // Logical Maximum (255) 117 0x09, 0x48, // Usage (0x48) 118 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 119 0x09, 0x49, // Usage (0x49) 120 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 121 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 122 0x26, 0xFF, 0x7F, // Logical Maximum (32767) 123 0x75, 0x10, // Report Size (16) 124 0x09, 0x30, // Usage (X) 125 0x46, 0x97, 0x01, // Physical Maximum (407) 126 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 127 0x46, 0xF3, 0x00, // Physical Maximum (243) 128 0x09, 0x31, // Usage (Y) 129 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 130 0xC0, // End Collection 131 0x05, 0x0D, // Usage Page (Digitizer) 132 0x09, 0x22, // Usage (Finger) 133 0xA1, 0x02, // Collection (Logical) 134 0x09, 0x42, // Usage (Tip Switch) 135 0x15, 0x00, // Logical Minimum (0) 136 0x25, 0x01, // Logical Maximum (1) 137 0x75, 0x01, // Report Size (1) 138 0x95, 0x01, // Report Count (1) 139 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 140 0x09, 0x51, // Usage (0x51) 141 0x25, 0x7F, // Logical Maximum (127) 142 0x75, 0x07, // Report Size (7) 143 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 144 0x75, 0x08, // Report Size (8) 145 0x26, 0xFF, 0x00, // Logical Maximum (255) 146 0x09, 0x48, // Usage (0x48) 147 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 148 0x09, 0x49, // Usage (0x49) 149 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 150 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 151 0x26, 0xFF, 0x7F, // Logical Maximum (32767) 152 0x75, 0x10, // Report Size (16) 153 0x09, 0x30, // Usage (X) 154 0x46, 0x97, 0x01, // Physical Maximum (407) 155 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 156 0x46, 0xF3, 0x00, // Physical Maximum (243) 157 0x09, 0x31, // Usage (Y) 158 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 159 0xC0, // End Collection 160 0x05, 0x0D, // Usage Page (Digitizer) 161 0x09, 0x22, // Usage (Finger) 162 0xA1, 0x02, // Collection (Logical) 163 0x09, 0x42, // Usage (Tip Switch) 164 0x15, 0x00, // Logical Minimum (0) 165 0x25, 0x01, // Logical Maximum (1) 166 0x75, 0x01, // Report Size (1) 167 0x95, 0x01, // Report Count (1) 168 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 169 0x09, 0x51, // Usage (0x51) 170 0x25, 0x7F, // Logical Maximum (127) 171 0x75, 0x07, // Report Size (7) 172 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 173 0x75, 0x08, // Report Size (8) 174 0x26, 0xFF, 0x00, // Logical Maximum (255) 175 0x09, 0x48, // Usage (0x48) 176 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 177 0x09, 0x49, // Usage (0x49) 178 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 179 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 180 0x26, 0xFF, 0x7F, // Logical Maximum (32767) 181 0x75, 0x10, // Report Size (16) 182 0x09, 0x30, // Usage (X) 183 0x46, 0x97, 0x01, // Physical Maximum (407) 184 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 185 0x46, 0xF3, 0x00, // Physical Maximum (243) 186 0x09, 0x31, // Usage (Y) 187 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 188 0xC0, // End Collection 189 0x05, 0x0D, // Usage Page (Digitizer) 190 0x09, 0x22, // Usage (Finger) 191 0xA1, 0x02, // Collection (Logical) 192 0x09, 0x42, // Usage (Tip Switch) 193 0x15, 0x00, // Logical Minimum (0) 194 0x25, 0x01, // Logical Maximum (1) 195 0x75, 0x01, // Report Size (1) 196 0x95, 0x01, // Report Count (1) 197 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 198 0x09, 0x51, // Usage (0x51) 199 0x25, 0x7F, // Logical Maximum (127) 200 0x75, 0x07, // Report Size (7) 201 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 202 0x75, 0x08, // Report Size (8) 203 0x26, 0xFF, 0x00, // Logical Maximum (255) 204 0x09, 0x48, // Usage (0x48) 205 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 206 0x09, 0x49, // Usage (0x49) 207 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 208 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 209 0x26, 0xFF, 0x7F, // Logical Maximum (32767) 210 0x75, 0x10, // Report Size (16) 211 0x09, 0x30, // Usage (X) 212 0x46, 0x97, 0x01, // Physical Maximum (407) 213 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 214 0x46, 0xF3, 0x00, // Physical Maximum (243) 215 0x09, 0x31, // Usage (Y) 216 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 217 0xC0, // End Collection 218 0x05, 0x0D, // Usage Page (Digitizer) 219 0x09, 0x22, // Usage (Finger) 220 0xA1, 0x02, // Collection (Logical) 221 0x09, 0x42, // Usage (Tip Switch) 222 0x15, 0x00, // Logical Minimum (0) 223 0x25, 0x01, // Logical Maximum (1) 224 0x75, 0x01, // Report Size (1) 225 0x95, 0x01, // Report Count (1) 226 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 227 0x09, 0x51, // Usage (0x51) 228 0x25, 0x7F, // Logical Maximum (127) 229 0x75, 0x07, // Report Size (7) 230 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 231 0x75, 0x08, // Report Size (8) 232 0x26, 0xFF, 0x00, // Logical Maximum (255) 233 0x09, 0x48, // Usage (0x48) 234 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 235 0x09, 0x49, // Usage (0x49) 236 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 237 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 238 0x26, 0xFF, 0x7F, // Logical Maximum (32767) 239 0x75, 0x10, // Report Size (16) 240 0x09, 0x30, // Usage (X) 241 0x46, 0x97, 0x01, // Physical Maximum (407) 242 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 243 0x46, 0xF3, 0x00, // Physical Maximum (243) 244 0x09, 0x31, // Usage (Y) 245 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 246 0xC0, // End Collection 247 0x05, 0x0D, // Usage Page (Digitizer) 248 0x09, 0x22, // Usage (Finger) 249 0xA1, 0x02, // Collection (Logical) 250 0x09, 0x42, // Usage (Tip Switch) 251 0x15, 0x00, // Logical Minimum (0) 252 0x25, 0x01, // Logical Maximum (1) 253 0x75, 0x01, // Report Size (1) 254 0x95, 0x01, // Report Count (1) 255 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 256 0x09, 0x51, // Usage (0x51) 257 0x25, 0x7F, // Logical Maximum (127) 258 0x75, 0x07, // Report Size (7) 259 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 260 0x75, 0x08, // Report Size (8) 261 0x26, 0xFF, 0x00, // Logical Maximum (255) 262 0x09, 0x48, // Usage (0x48) 263 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 264 0x09, 0x49, // Usage (0x49) 265 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 266 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 267 0x26, 0xFF, 0x7F, // Logical Maximum (32767) 268 0x75, 0x10, // Report Size (16) 269 0x09, 0x30, // Usage (X) 270 0x46, 0x97, 0x01, // Physical Maximum (407) 271 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 272 0x46, 0xF3, 0x00, // Physical Maximum (243) 273 0x09, 0x31, // Usage (Y) 274 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 275 0xC0, // End Collection 276 0x05, 0x0D, // Usage Page (Digitizer) 277 0x09, 0x22, // Usage (Finger) 278 0xA1, 0x02, // Collection (Logical) 279 0x09, 0x42, // Usage (Tip Switch) 280 0x15, 0x00, // Logical Minimum (0) 281 0x25, 0x01, // Logical Maximum (1) 282 0x75, 0x01, // Report Size (1) 283 0x95, 0x01, // Report Count (1) 284 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 285 0x09, 0x51, // Usage (0x51) 286 0x25, 0x7F, // Logical Maximum (127) 287 0x75, 0x07, // Report Size (7) 288 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 289 0x75, 0x08, // Report Size (8) 290 0x26, 0xFF, 0x00, // Logical Maximum (255) 291 0x09, 0x48, // Usage (0x48) 292 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 293 0x09, 0x49, // Usage (0x49) 294 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 295 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 296 0x26, 0xFF, 0x7F, // Logical Maximum (32767) 297 0x75, 0x10, // Report Size (16) 298 0x09, 0x30, // Usage (X) 299 0x46, 0x97, 0x01, // Physical Maximum (407) 300 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 301 0x46, 0xF3, 0x00, // Physical Maximum (243) 302 0x09, 0x31, // Usage (Y) 303 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 304 0xC0, // End Collection 305 0x05, 0x0D, // Usage Page (Digitizer) 306 0x27, 0xFF, 0xFF, 0x00, 0x00, // Logical Maximum (65534) 307 0x75, 0x10, // Report Size (16) 308 0x95, 0x01, // Report Count (1) 309 0x09, 0x56, // Usage (0x56) 310 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 311 0x25, 0x0A, // Logical Maximum (10) 312 0x75, 0x08, // Report Size (8) 313 0x09, 0x54, // Usage (0x54) 314 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 315 0x85, 0x42, // Report ID (66) 316 0x09, 0x55, // Usage (0x55) 317 0x25, 0x0A, // Logical Maximum (10) 318 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 319 0x85, 0x44, // Report ID (68) 320 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) 321 0x09, 0xC5, // Usage (0xC5) 322 0x26, 0xFF, 0x00, // Logical Maximum (255) 323 0x96, 0x00, 0x01, // Report Count (256) 324 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 325 0x85, 0xF0, // Report ID (-16) 326 0x09, 0x01, // Usage (0x01) 327 0x95, 0x04, // Report Count (4) 328 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 329 0x85, 0xF2, // Report ID (-14) 330 0x09, 0x03, // Usage (0x03) 331 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 332 0x09, 0x04, // Usage (0x04) 333 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 334 0x09, 0x05, // Usage (0x05) 335 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 336 0x95, 0x01, // Report Count (1) 337 0x09, 0x06, // Usage (0x06) 338 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 339 0x09, 0x07, // Usage (0x07) 340 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 341 0x85, 0xF1, // Report ID (-15) 342 0x09, 0x02, // Usage (0x02) 343 0x95, 0x07, // Report Count (7) 344 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 345 0x85, 0xC0, // Report ID (-64) 346 0x09, 0x01, // Usage (0x01) 347 0x95, 0x03, // Report Count (3) 348 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 349 0x85, 0xC2, // Report ID (-62) 350 0x09, 0x01, // Usage (0x01) 351 0x95, 0x0F, // Report Count (15) 352 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 353 0x85, 0xC4, // Report ID (-60) 354 0x09, 0x01, // Usage (0x01) 355 0x95, 0x3E, // Report Count (62) 356 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 357 0x85, 0xC5, // Report ID (-59) 358 0x09, 0x01, // Usage (0x01) 359 0x95, 0x7E, // Report Count (126) 360 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 361 0x85, 0xC6, // Report ID (-58) 362 0x09, 0x01, // Usage (0x01) 363 0x95, 0xFE, // Report Count (-2) 364 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 365 0x85, 0xC8, // Report ID (-56) 366 0x09, 0x01, // Usage (0x01) 367 0x96, 0xFE, 0x03, // Report Count (1022) 368 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 369 0xC0, // End Collection 370 0x05, 0x0D, // Usage Page (Digitizer) 371 0x09, 0x0E, // Usage (0x0E) 372 0xA1, 0x01, // Collection (Application) 373 0x85, 0x43, // Report ID (67) 374 0x09, 0x23, // Usage (0x23) 375 0xA1, 0x02, // Collection (Logical) 376 0x09, 0x52, // Usage (0x52) 377 0x09, 0x53, // Usage (0x53) 378 0x15, 0x00, // Logical Minimum (0) 379 0x25, 0x0A, // Logical Maximum (10) 380 0x75, 0x08, // Report Size (8) 381 0x95, 0x02, // Report Count (2) 382 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 383 0xC0, // End Collection 384 0xC0, // End Collection 385 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 386 0x09, 0x02, // Usage (Mouse) 387 0xA1, 0x01, // Collection (Application) 388 0x85, 0x04, // Report ID (4) 389 0x09, 0x01, // Usage (Pointer) 390 0xA1, 0x00, // Collection (Physical) 391 0x05, 0x09, // Usage Page (Button) 392 0x19, 0x01, // Usage Minimum (0x01) 393 0x29, 0x03, // Usage Maximum (0x03) 394 0x15, 0x00, // Logical Minimum (0) 395 0x25, 0x01, // Logical Maximum (1) 396 0x95, 0x03, // Report Count (3) 397 0x75, 0x01, // Report Size (1) 398 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 399 0x95, 0x01, // Report Count (1) 400 0x75, 0x05, // Report Size (5) 401 0x81, 0x01, // Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) 402 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 403 0x09, 0x30, // Usage (X) 404 0x16, 0x00, 0x00, // Logical Minimum (0) 405 0x26, 0xFF, 0x7F, // Logical Maximum (32767) 406 0x36, 0x00, 0x00, // Physical Minimum (0) 407 0x46, 0xFF, 0x7F, // Physical Maximum (32767) 408 0x66, 0x00, 0x00, // Unit (None) 409 0x75, 0x10, // Report Size (16) 410 0x95, 0x01, // Report Count (1) 411 0x81, 0x62, // Input (Data,Var,Abs,No Wrap,Linear,No Preferred State,Null State) 412 0x09, 0x31, // Usage (Y) 413 0x16, 0x00, 0x00, // Logical Minimum (0) 414 0x26, 0xFF, 0x7F, // Logical Maximum (32767) 415 0x36, 0x00, 0x00, // Physical Minimum (0) 416 0x46, 0xFF, 0x7F, // Physical Maximum (32767) 417 0x66, 0x00, 0x00, // Unit (None) 418 0x75, 0x10, // Report Size (16) 419 0x95, 0x01, // Report Count (1) 420 0x81, 0x62, // Input (Data,Var,Abs,No Wrap,Linear,No Preferred State,Null State) 421 0xC0, // End Collection 422 0xC0, // End Collection 423}; 424 425bool is_samsung_touch_report_desc(const uint8_t* data, size_t len) { 426 if (!data) 427 return false; 428 429 if (len != sizeof(samsung_touch_report_desc)) 430 return false; 431 432 return (memcmp(data, samsung_touch_report_desc, len) == 0); 433} 434 435zx_status_t setup_samsung_touch(int fd) { 436 if (fd < 0) 437 return ZX_ERR_INVALID_ARGS; 438 439 uint8_t buf[sizeof(input_set_report_t) + 3]; 440 input_set_report_t* enable_multitouch = (input_set_report_t*)buf; 441 442 enable_multitouch->id = 67; 443 enable_multitouch->type = INPUT_REPORT_FEATURE; 444 enable_multitouch->data[0] = 67; 445 enable_multitouch->data[1] = 2; 446 enable_multitouch->data[2] = 0; 447 448 ssize_t res = ioctl_input_set_report(fd, enable_multitouch, sizeof(buf)); 449 return (res >= 0) ? ZX_OK : (zx_status_t)res; 450} 451 452