1// Copyright 2016 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/acer12.h> 6#include <zircon/errors.h> 7#include <string.h> 8 9static const uint8_t acer12_touch_report_desc[] = { 10 0x05, 0x0D, // Usage Page (Digitizer) 11 0x09, 0x04, // Usage (Touch Screen) 12 0xA1, 0x01, // Collection (Application) 13 0x85, 0x01, // Report ID (1) 14 0x09, 0x22, // Usage (Finger) 15 0xA1, 0x02, // Collection (Logical) 16 0x09, 0x42, // Usage (Tip Switch) 17 0x15, 0x00, // Logical Minimum (0) 18 0x25, 0x01, // Logical Maximum (1) 19 0x75, 0x01, // Report Size (1) 20 0x95, 0x01, // Report Count (1) 21 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 22 0x75, 0x01, // Report Size (1) 23 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 24 0x75, 0x06, // Report Size (6) 25 0x09, 0x51, // Usage (0x51) 26 0x25, 0x3F, // Logical Maximum (63) 27 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 28 0x26, 0xFF, 0x00, // Logical Maximum (255) 29 0x75, 0x08, // Report Size (8) 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 0x95, 0x01, // Report Count (1) 35 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 36 0xA4, // Push 37 0x26, 0xD0, 0x0B, // Logical Maximum (3024) 38 0x75, 0x10, // Report Size (16) 39 0x55, 0x0F, // Unit Exponent (-1) 40 0x65, 0x11, // Unit (System: SI Linear, Length: Centimeter) 41 0x09, 0x30, // Usage (X) 42 0x35, 0x00, // Physical Minimum (0) 43 0x46, 0xFE, 0x00, // Physical Maximum (254) 44 0x95, 0x02, // Report Count (2) 45 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 46 0x26, 0x10, 0x08, // Logical Maximum (2064) 47 0x46, 0xA9, 0x00, // Physical Maximum (169) 48 0x09, 0x31, // Usage (Y) 49 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 50 0xB4, // Pop 51 0xC0, // End Collection 52 0x05, 0x0D, // Usage Page (Digitizer) 53 0x09, 0x22, // Usage (Finger) 54 0xA1, 0x02, // Collection (Logical) 55 0x05, 0x0D, // Usage Page (Digitizer) 56 0x09, 0x42, // Usage (Tip Switch) 57 0x15, 0x00, // Logical Minimum (0) 58 0x25, 0x01, // Logical Maximum (1) 59 0x75, 0x01, // Report Size (1) 60 0x95, 0x01, // Report Count (1) 61 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 62 0x75, 0x01, // Report Size (1) 63 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 64 0x75, 0x06, // Report Size (6) 65 0x09, 0x51, // Usage (0x51) 66 0x25, 0x3F, // Logical Maximum (63) 67 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 68 0x26, 0xFF, 0x00, // Logical Maximum (255) 69 0x75, 0x08, // Report Size (8) 70 0x09, 0x48, // Usage (0x48) 71 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 72 0x09, 0x49, // Usage (0x49) 73 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 74 0x95, 0x01, // Report Count (1) 75 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 76 0xA4, // Push 77 0x26, 0xD0, 0x0B, // Logical Maximum (3024) 78 0x75, 0x10, // Report Size (16) 79 0x55, 0x0F, // Unit Exponent (-1) 80 0x65, 0x11, // Unit (System: SI Linear, Length: Centimeter) 81 0x09, 0x30, // Usage (X) 82 0x35, 0x00, // Physical Minimum (0) 83 0x46, 0xFE, 0x00, // Physical Maximum (254) 84 0x95, 0x02, // Report Count (2) 85 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 86 0x26, 0x10, 0x08, // Logical Maximum (2064) 87 0x46, 0xA9, 0x00, // Physical Maximum (169) 88 0x09, 0x31, // Usage (Y) 89 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 90 0xB4, // Pop 91 0xC0, // End Collection 92 0x05, 0x0D, // Usage Page (Digitizer) 93 0x09, 0x22, // Usage (Finger) 94 0xA1, 0x02, // Collection (Logical) 95 0x05, 0x0D, // Usage Page (Digitizer) 96 0x09, 0x42, // Usage (Tip Switch) 97 0x15, 0x00, // Logical Minimum (0) 98 0x25, 0x01, // Logical Maximum (1) 99 0x75, 0x01, // Report Size (1) 100 0x95, 0x01, // Report Count (1) 101 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 102 0x75, 0x01, // Report Size (1) 103 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 104 0x75, 0x06, // Report Size (6) 105 0x09, 0x51, // Usage (0x51) 106 0x25, 0x3F, // Logical Maximum (63) 107 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 108 0x26, 0xFF, 0x00, // Logical Maximum (255) 109 0x75, 0x08, // Report Size (8) 110 0x09, 0x48, // Usage (0x48) 111 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 112 0x09, 0x49, // Usage (0x49) 113 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 114 0x95, 0x01, // Report Count (1) 115 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 116 0xA4, // Push 117 0x26, 0xD0, 0x0B, // Logical Maximum (3024) 118 0x75, 0x10, // Report Size (16) 119 0x55, 0x0F, // Unit Exponent (-1) 120 0x65, 0x11, // Unit (System: SI Linear, Length: Centimeter) 121 0x09, 0x30, // Usage (X) 122 0x35, 0x00, // Physical Minimum (0) 123 0x46, 0xFE, 0x00, // Physical Maximum (254) 124 0x95, 0x02, // Report Count (2) 125 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 126 0x26, 0x10, 0x08, // Logical Maximum (2064) 127 0x46, 0xA9, 0x00, // Physical Maximum (169) 128 0x09, 0x31, // Usage (Y) 129 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 130 0xB4, // Pop 131 0xC0, // End Collection 132 0x05, 0x0D, // Usage Page (Digitizer) 133 0x09, 0x22, // Usage (Finger) 134 0xA1, 0x02, // Collection (Logical) 135 0x05, 0x0D, // Usage Page (Digitizer) 136 0x09, 0x42, // Usage (Tip Switch) 137 0x15, 0x00, // Logical Minimum (0) 138 0x25, 0x01, // Logical Maximum (1) 139 0x75, 0x01, // Report Size (1) 140 0x95, 0x01, // Report Count (1) 141 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 142 0x75, 0x01, // Report Size (1) 143 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 144 0x75, 0x06, // Report Size (6) 145 0x09, 0x51, // Usage (0x51) 146 0x25, 0x3F, // Logical Maximum (63) 147 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 148 0x26, 0xFF, 0x00, // Logical Maximum (255) 149 0x75, 0x08, // Report Size (8) 150 0x09, 0x48, // Usage (0x48) 151 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 152 0x09, 0x49, // Usage (0x49) 153 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 154 0x95, 0x01, // Report Count (1) 155 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 156 0xA4, // Push 157 0x26, 0xD0, 0x0B, // Logical Maximum (3024) 158 0x75, 0x10, // Report Size (16) 159 0x55, 0x0F, // Unit Exponent (-1) 160 0x65, 0x11, // Unit (System: SI Linear, Length: Centimeter) 161 0x09, 0x30, // Usage (X) 162 0x35, 0x00, // Physical Minimum (0) 163 0x46, 0xFE, 0x00, // Physical Maximum (254) 164 0x95, 0x02, // Report Count (2) 165 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 166 0x26, 0x10, 0x08, // Logical Maximum (2064) 167 0x46, 0xA9, 0x00, // Physical Maximum (169) 168 0x09, 0x31, // Usage (Y) 169 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 170 0xB4, // Pop 171 0xC0, // End Collection 172 0x05, 0x0D, // Usage Page (Digitizer) 173 0x09, 0x22, // Usage (Finger) 174 0xA1, 0x02, // Collection (Logical) 175 0x05, 0x0D, // Usage Page (Digitizer) 176 0x09, 0x42, // Usage (Tip Switch) 177 0x15, 0x00, // Logical Minimum (0) 178 0x25, 0x01, // Logical Maximum (1) 179 0x75, 0x01, // Report Size (1) 180 0x95, 0x01, // Report Count (1) 181 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 182 0x75, 0x01, // Report Size (1) 183 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 184 0x75, 0x06, // Report Size (6) 185 0x09, 0x51, // Usage (0x51) 186 0x25, 0x3F, // Logical Maximum (63) 187 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 188 0x26, 0xFF, 0x00, // Logical Maximum (255) 189 0x75, 0x08, // Report Size (8) 190 0x09, 0x48, // Usage (0x48) 191 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 192 0x09, 0x49, // Usage (0x49) 193 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 194 0x95, 0x01, // Report Count (1) 195 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 196 0xA4, // Push 197 0x26, 0xD0, 0x0B, // Logical Maximum (3024) 198 0x75, 0x10, // Report Size (16) 199 0x55, 0x0F, // Unit Exponent (-1) 200 0x65, 0x11, // Unit (System: SI Linear, Length: Centimeter) 201 0x09, 0x30, // Usage (X) 202 0x35, 0x00, // Physical Minimum (0) 203 0x46, 0xFE, 0x00, // Physical Maximum (254) 204 0x95, 0x02, // Report Count (2) 205 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 206 0x26, 0x10, 0x08, // Logical Maximum (2064) 207 0x46, 0xA9, 0x00, // Physical Maximum (169) 208 0x09, 0x31, // Usage (Y) 209 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 210 0xB4, // Pop 211 0xC0, // End Collection 212 0x05, 0x0D, // Usage Page (Digitizer) 213 0x09, 0x56, // Usage (0x56) 214 0x55, 0x00, // Unit Exponent (0) 215 0x65, 0x00, // Unit (None) 216 0x27, 0xFF, 0xFF, 0xFF, 0x7F, // Logical Maximum (2147483647) 217 0x95, 0x01, // Report Count (1) 218 0x75, 0x20, // Report Size (32) 219 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 220 0x09, 0x54, // Usage (0x54) 221 0x25, 0x7F, // Logical Maximum (127) 222 0x95, 0x01, // Report Count (1) 223 0x75, 0x08, // Report Size (8) 224 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 225 0x85, 0x0A, // Report ID (10) 226 0x09, 0x55, // Usage (0x55) 227 0x25, 0x0A, // Logical Maximum (10) 228 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 229 0x85, 0x0E, // Report ID (14) 230 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) 231 0x09, 0xC5, // Usage (0xC5) 232 0x15, 0x00, // Logical Minimum (0) 233 0x26, 0xFF, 0x00, // Logical Maximum (255) 234 0x75, 0x08, // Report Size (8) 235 0x96, 0x00, 0x01, // Report Count (256) 236 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 237 0xC0, // End Collection 238 0x06, 0xFF, 0x01, // Usage Page (Reserved 0x01FF) 239 0x09, 0x01, // Usage (0x01) 240 0xA1, 0x01, // Collection (Application) 241 0x85, 0x02, // Report ID (2) 242 0x15, 0x00, // Logical Minimum (0) 243 0x26, 0xFF, 0x00, // Logical Maximum (255) 244 0x75, 0x08, // Report Size (8) 245 0x95, 0x40, // Report Count (64) 246 0x09, 0x00, // Usage (0x00) 247 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 248 0xC0, // End Collection 249 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) 250 0x09, 0x01, // Usage (0x01) 251 0xA1, 0x01, // Collection (Application) 252 0x85, 0x03, // Report ID (3) 253 0x75, 0x08, // Report Size (8) 254 0x95, 0x20, // Report Count (32) 255 0x09, 0x01, // Usage (0x01) 256 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 257 0xC0, // End Collection 258 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) 259 0x09, 0x01, // Usage (0x01) 260 0xA1, 0x01, // Collection (Application) 261 0x85, 0x06, // Report ID (6) 262 0x09, 0x03, // Usage (0x03) 263 0x75, 0x08, // Report Size (8) 264 0x95, 0x12, // Report Count (18) 265 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 266 0x09, 0x04, // Usage (0x04) 267 0x75, 0x08, // Report Size (8) 268 0x95, 0x03, // Report Count (3) 269 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 270 0xC0, // End Collection 271 0x06, 0x01, 0xFF, // Usage Page (Vendor Defined 0xFF01) 272 0x09, 0x01, // Usage (0x01) 273 0xA1, 0x01, // Collection (Application) 274 0x85, 0x04, // Report ID (4) 275 0x15, 0x00, // Logical Minimum (0) 276 0x26, 0xFF, 0x00, // Logical Maximum (255) 277 0x75, 0x08, // Report Size (8) 278 0x95, 0x13, // Report Count (19) 279 0x09, 0x00, // Usage (0x00) 280 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 281 0xC0, // End Collection 282 0x05, 0x0D, // Usage Page (Digitizer) 283 0x09, 0x02, // Usage (Pen) 284 0xA1, 0x01, // Collection (Application) 285 0x85, 0x07, // Report ID (7) 286 0x35, 0x00, // Physical Minimum (0) 287 0x09, 0x20, // Usage (Stylus) 288 0xA1, 0x00, // Collection (Physical) 289 0x09, 0x32, // Usage (In Range) 290 0x09, 0x42, // Usage (Tip Switch) 291 0x09, 0x44, // Usage (Barrel Switch) 292 0x09, 0x3C, // Usage (Invert) 293 0x09, 0x45, // Usage (Eraser) 294 0x15, 0x00, // Logical Minimum (0) 295 0x25, 0x01, // Logical Maximum (1) 296 0x75, 0x01, // Report Size (1) 297 0x95, 0x05, // Report Count (5) 298 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 299 0x95, 0x03, // Report Count (3) 300 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 301 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 302 0x09, 0x30, // Usage (X) 303 0x75, 0x10, // Report Size (16) 304 0x95, 0x01, // Report Count (1) 305 0xA4, // Push 306 0x55, 0x0F, // Unit Exponent (-1) 307 0x65, 0x11, // Unit (System: SI Linear, Length: Centimeter) 308 0x46, 0xFE, 0x00, // Physical Maximum (254) 309 0x26, 0xC0, 0x0F, // Logical Maximum (4032) 310 0x81, 0x42, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,Null State) 311 0x09, 0x31, // Usage (Y) 312 0x46, 0xA9, 0x00, // Physical Maximum (169) 313 0x26, 0xC0, 0x0A, // Logical Maximum (2752) 314 0x81, 0x42, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,Null State) 315 0xB4, // Pop 316 0x05, 0x0D, // Usage Page (Digitizer) 317 0x09, 0x30, // Usage (Tip Pressure) 318 0x26, 0x00, 0x01, // Logical Maximum (256) 319 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 320 0xC0, // End Collection 321 0xC0, // End Collection 322 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) 323 0x09, 0x01, // Usage (0x01) 324 0xA1, 0x01, // Collection (Application) 325 0x85, 0x17, // Report ID (23) 326 0x75, 0x08, // Report Size (8) 327 0x95, 0x1F, // Report Count (31) 328 0x09, 0x05, // Usage (0x05) 329 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 330 0xC0, // End Collection 331 332 // 660 bytes 333}; 334 335bool is_acer12_touch_report_desc(const uint8_t* data, size_t len) { 336 if (!data) 337 return false; 338 339 if (len != sizeof(acer12_touch_report_desc)) 340 return false; 341 342 return (memcmp(data, acer12_touch_report_desc, len) == 0); 343} 344 345zx_status_t setup_acer12_touch(int fd) { 346 if (fd < 0) 347 return ZX_ERR_INVALID_ARGS; 348 349 return ZX_OK; 350} 351