1 /* 2 * HID driver for Waltop devices not fully compliant with HID standard 3 * 4 * Copyright (c) 2010 Nikolai Kondrashov 5 */ 6 7 /* 8 * This program is free software; you can redistribute it and/or modify it 9 * under the terms of the GNU General Public License as published by the Free 10 * Software Foundation; either version 2 of the License, or (at your option) 11 * any later version. 12 */ 13 14 #include <linux/device.h> 15 #include <linux/hid.h> 16 #include <linux/module.h> 17 18 #include "hid-ids.h" 19 20 /* 21 * There exists an official driver on the manufacturer's website, which 22 * wasn't submitted to the kernel, for some reason. The official driver 23 * doesn't seem to support extra features of some tablets, like wheels. 24 * 25 * It shows that the feature report ID 2 could be used to control any waltop 26 * tablet input mode, switching it between "default", "tablet" and "ink". 27 * 28 * This driver only uses "default" mode for all the supported tablets. This 29 * mode tries to be HID-compatible (not very successfully), but cripples the 30 * resolution of some tablets. 31 * 32 * The "tablet" mode uses some proprietary, yet decipherable protocol, which 33 * represents the correct resolution, but is possibly HID-incompatible (i.e. 34 * indescribable by a report descriptor). 35 * 36 * The purpose of the "ink" mode is unknown. 37 * 38 * The feature reports needed for switching to each mode are these: 39 * 40 * 02 16 00 default 41 * 02 16 01 tablet 42 * 02 16 02 ink 43 */ 44 45 /* 46 * Original Slim Tablet 5.8 inch report descriptor. 47 * 48 * All the reports except the report with ID 16 (the stylus) are unused, 49 * possibly because the tablet is not configured to, or because they were 50 * just copied from a more capable model. The full purpose of features 51 * described for report ID 2 is unknown. 52 * 53 * The stylus buttons are described as three bit fields, whereas actually 54 * it's an "array", i.e. they're reported as button numbers (1, 2 and 3). 55 * The "eraser" field is not used. There is also a "push" without a "pop" in 56 * the stylus description. 57 * 58 * Usage Page (Desktop), ; Generic desktop controls (01h) 59 * Usage (Mouse), ; Mouse (02h, application collection) 60 * Collection (Application), 61 * Report ID (1), 62 * Usage (Pointer), ; Pointer (01h, physical collection) 63 * Collection (Physical), 64 * Usage Page (Button), ; Button (09h) 65 * Usage Minimum (01h), 66 * Usage Maximum (05h), 67 * Logical Minimum (0), 68 * Logical Maximum (1), 69 * Report Size (1), 70 * Report Count (5), 71 * Input (Variable), 72 * Report Size (3), 73 * Report Count (1), 74 * Input (Constant, Variable), 75 * Usage Page (Desktop), ; Generic desktop controls (01h) 76 * Usage (X), ; X (30h, dynamic value) 77 * Usage (Y), ; Y (31h, dynamic value) 78 * Usage (Wheel), ; Wheel (38h, dynamic value) 79 * Logical Minimum (-127), 80 * Logical Maximum (127), 81 * Report Size (8), 82 * Report Count (3), 83 * Input (Variable, Relative), 84 * End Collection, 85 * End Collection, 86 * Usage Page (Digitizer), ; Digitizer (0Dh) 87 * Usage (Pen), ; Pen (02h, application collection) 88 * Collection (Application), 89 * Report ID (2), 90 * Usage (Stylus), ; Stylus (20h, logical collection) 91 * Collection (Physical), 92 * Usage (00h), 93 * Logical Minimum (0), 94 * Logical Maximum (255), 95 * Report Size (8), 96 * Report Count (7), 97 * Input (Variable), 98 * Usage (Azimuth), ; Azimuth (3Fh, dynamic value) 99 * Usage (Altitude), ; Altitude (40h, dynamic value) 100 * Logical Minimum (0), 101 * Logical Maximum (255), 102 * Report Size (8), 103 * Report Count (2), 104 * Feature (Variable), 105 * End Collection, 106 * Report ID (5), 107 * Usage Page (Digitizer), ; Digitizer (0Dh) 108 * Usage (Stylus), ; Stylus (20h, logical collection) 109 * Collection (Physical), 110 * Usage (00h), 111 * Logical Minimum (0), 112 * Logical Maximum (255), 113 * Report Size (8), 114 * Report Count (7), 115 * Input (Variable), 116 * End Collection, 117 * Report ID (10), 118 * Usage Page (Digitizer), ; Digitizer (0Dh) 119 * Usage (Stylus), ; Stylus (20h, logical collection) 120 * Collection (Physical), 121 * Usage (00h), 122 * Logical Minimum (0), 123 * Logical Maximum (255), 124 * Report Size (8), 125 * Report Count (3), 126 * Input (Variable), 127 * End Collection, 128 * Report ID (16), 129 * Usage (Stylus), ; Stylus (20h, logical collection) 130 * Collection (Physical), 131 * Usage (Tip Switch), ; Tip switch (42h, momentary control) 132 * Usage (Barrel Switch), ; Barrel switch (44h, momentary control) 133 * Usage (Invert), ; Invert (3Ch, momentary control) 134 * Usage (Eraser), ; Eraser (45h, momentary control) 135 * Usage (In Range), ; In range (32h, momentary control) 136 * Logical Minimum (0), 137 * Logical Maximum (1), 138 * Report Size (1), 139 * Report Count (5), 140 * Input (Variable), 141 * Report Count (3), 142 * Input (Constant, Variable), 143 * Usage Page (Desktop), ; Generic desktop controls (01h) 144 * Usage (X), ; X (30h, dynamic value) 145 * Report Size (16), 146 * Report Count (1), 147 * Push, 148 * Unit Exponent (13), 149 * Unit (Inch^3), 150 * Logical Minimum (0), 151 * Logical Maximum (10000), 152 * Physical Minimum (0), 153 * Physical Maximum (10000), 154 * Input (Variable), 155 * Usage (Y), ; Y (31h, dynamic value) 156 * Logical Maximum (6000), 157 * Physical Maximum (6000), 158 * Input (Variable), 159 * Usage Page (Digitizer), ; Digitizer (0Dh) 160 * Usage (Tip Pressure), ; Tip pressure (30h, dynamic value) 161 * Logical Minimum (0), 162 * Logical Maximum (1023), 163 * Physical Minimum (0), 164 * Physical Maximum (1023), 165 * Input (Variable), 166 * End Collection, 167 * End Collection 168 */ 169 170 /* Size of the original report descriptor of Slim Tablet 5.8 inch */ 171 #define SLIM_TABLET_5_8_INCH_RDESC_ORIG_SIZE 222 172 173 /* 174 * Fixed Slim Tablet 5.8 inch descriptor. 175 * 176 * All the reports except the stylus report (ID 16) were removed as unused. 177 * The stylus buttons description was fixed. 178 */ 179 static __u8 slim_tablet_5_8_inch_rdesc_fixed[] = { 180 0x05, 0x0D, /* Usage Page (Digitizer), */ 181 0x09, 0x02, /* Usage (Pen), */ 182 0xA1, 0x01, /* Collection (Application), */ 183 0x85, 0x10, /* Report ID (16), */ 184 0x09, 0x20, /* Usage (Stylus), */ 185 0xA0, /* Collection (Physical), */ 186 0x09, 0x42, /* Usage (Tip Switch), */ 187 0x09, 0x44, /* Usage (Barrel Switch), */ 188 0x09, 0x46, /* Usage (Tablet Pick), */ 189 0x15, 0x01, /* Logical Minimum (1), */ 190 0x25, 0x03, /* Logical Maximum (3), */ 191 0x75, 0x04, /* Report Size (4), */ 192 0x95, 0x01, /* Report Count (1), */ 193 0x80, /* Input, */ 194 0x09, 0x32, /* Usage (In Range), */ 195 0x14, /* Logical Minimum (0), */ 196 0x25, 0x01, /* Logical Maximum (1), */ 197 0x75, 0x01, /* Report Size (1), */ 198 0x95, 0x01, /* Report Count (1), */ 199 0x81, 0x02, /* Input (Variable), */ 200 0x95, 0x03, /* Report Count (3), */ 201 0x81, 0x03, /* Input (Constant, Variable), */ 202 0x75, 0x10, /* Report Size (16), */ 203 0x95, 0x01, /* Report Count (1), */ 204 0x14, /* Logical Minimum (0), */ 205 0xA4, /* Push, */ 206 0x05, 0x01, /* Usage Page (Desktop), */ 207 0x65, 0x13, /* Unit (Inch), */ 208 0x55, 0xFD, /* Unit Exponent (-3), */ 209 0x34, /* Physical Minimum (0), */ 210 0x09, 0x30, /* Usage (X), */ 211 0x46, 0x88, 0x13, /* Physical Maximum (5000), */ 212 0x26, 0x10, 0x27, /* Logical Maximum (10000), */ 213 0x81, 0x02, /* Input (Variable), */ 214 0x09, 0x31, /* Usage (Y), */ 215 0x46, 0xB8, 0x0B, /* Physical Maximum (3000), */ 216 0x26, 0x70, 0x17, /* Logical Maximum (6000), */ 217 0x81, 0x02, /* Input (Variable), */ 218 0xB4, /* Pop, */ 219 0x09, 0x30, /* Usage (Tip Pressure), */ 220 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */ 221 0x81, 0x02, /* Input (Variable), */ 222 0xC0, /* End Collection, */ 223 0xC0 /* End Collection */ 224 }; 225 226 /* 227 * Original Slim Tablet 12.1 inch report descriptor. 228 * 229 * The descriptor is similar to the Slim Tablet 5.8 inch descriptor with the 230 * addition of a keyboard report, seemingly unused. It may have get here 231 * from a Media Tablet - probably an unimplemented feature. 232 * 233 * Usage Page (Desktop), ; Generic desktop controls (01h) 234 * Usage (Mouse), ; Mouse (02h, application collection) 235 * Collection (Application), 236 * Report ID (1), 237 * Usage (Pointer), ; Pointer (01h, physical collection) 238 * Collection (Physical), 239 * Usage Page (Button), ; Button (09h) 240 * Usage Minimum (01h), 241 * Usage Maximum (05h), 242 * Logical Minimum (0), 243 * Logical Maximum (1), 244 * Report Size (1), 245 * Report Count (5), 246 * Input (Variable), 247 * Report Size (3), 248 * Report Count (1), 249 * Input (Constant, Variable), 250 * Usage Page (Desktop), ; Generic desktop controls (01h) 251 * Usage (X), ; X (30h, dynamic value) 252 * Usage (Y), ; Y (31h, dynamic value) 253 * Usage (Wheel), ; Wheel (38h, dynamic value) 254 * Logical Minimum (-127), 255 * Logical Maximum (127), 256 * Report Size (8), 257 * Report Count (3), 258 * Input (Variable, Relative), 259 * End Collection, 260 * End Collection, 261 * Usage Page (Digitizer), ; Digitizer (0Dh) 262 * Usage (Pen), ; Pen (02h, application collection) 263 * Collection (Application), 264 * Report ID (2), 265 * Usage (Stylus), ; Stylus (20h, logical collection) 266 * Collection (Physical), 267 * Usage (00h), 268 * Logical Minimum (0), 269 * Logical Maximum (255), 270 * Report Size (8), 271 * Report Count (7), 272 * Input (Variable), 273 * Usage (Azimuth), ; Azimuth (3Fh, dynamic value) 274 * Usage (Altitude), ; Altitude (40h, dynamic value) 275 * Logical Minimum (0), 276 * Logical Maximum (255), 277 * Report Size (8), 278 * Report Count (2), 279 * Feature (Variable), 280 * End Collection, 281 * Report ID (5), 282 * Usage Page (Digitizer), ; Digitizer (0Dh) 283 * Usage (Stylus), ; Stylus (20h, logical collection) 284 * Collection (Physical), 285 * Usage (00h), 286 * Logical Minimum (0), 287 * Logical Maximum (255), 288 * Report Size (8), 289 * Report Count (7), 290 * Input (Variable), 291 * End Collection, 292 * Report ID (10), 293 * Usage Page (Digitizer), ; Digitizer (0Dh) 294 * Usage (Stylus), ; Stylus (20h, logical collection) 295 * Collection (Physical), 296 * Usage (00h), 297 * Logical Minimum (0), 298 * Logical Maximum (255), 299 * Report Size (8), 300 * Report Count (3), 301 * Input (Variable), 302 * End Collection, 303 * Report ID (16), 304 * Usage (Stylus), ; Stylus (20h, logical collection) 305 * Collection (Physical), 306 * Usage (Tip Switch), ; Tip switch (42h, momentary control) 307 * Usage (Barrel Switch), ; Barrel switch (44h, momentary control) 308 * Usage (Invert), ; Invert (3Ch, momentary control) 309 * Usage (Eraser), ; Eraser (45h, momentary control) 310 * Usage (In Range), ; In range (32h, momentary control) 311 * Logical Minimum (0), 312 * Logical Maximum (1), 313 * Report Size (1), 314 * Report Count (5), 315 * Input (Variable), 316 * Report Count (3), 317 * Input (Constant, Variable), 318 * Usage Page (Desktop), ; Generic desktop controls (01h) 319 * Usage (X), ; X (30h, dynamic value) 320 * Report Size (16), 321 * Report Count (1), 322 * Push, 323 * Unit Exponent (13), 324 * Unit (Inch^3), 325 * Logical Minimum (0), 326 * Logical Maximum (20000), 327 * Physical Minimum (0), 328 * Physical Maximum (20000), 329 * Input (Variable), 330 * Usage (Y), ; Y (31h, dynamic value) 331 * Logical Maximum (12500), 332 * Physical Maximum (12500), 333 * Input (Variable), 334 * Usage Page (Digitizer), ; Digitizer (0Dh) 335 * Usage (Tip Pressure), ; Tip pressure (30h, dynamic value) 336 * Logical Minimum (0), 337 * Logical Maximum (1023), 338 * Physical Minimum (0), 339 * Physical Maximum (1023), 340 * Input (Variable), 341 * End Collection, 342 * End Collection, 343 * Usage Page (Desktop), ; Generic desktop controls (01h) 344 * Usage (Keyboard), ; Keyboard (06h, application collection) 345 * Collection (Application), 346 * Report ID (13), 347 * Usage Page (Keyboard), ; Keyboard/keypad (07h) 348 * Usage Minimum (KB Leftcontrol), ; Keyboard left control 349 * ; (E0h, dynamic value) 350 * Usage Maximum (KB Right GUI), ; Keyboard right GUI (E7h, dynamic value) 351 * Logical Minimum (0), 352 * Logical Maximum (1), 353 * Report Size (1), 354 * Report Count (8), 355 * Input (Variable), 356 * Report Size (8), 357 * Report Count (1), 358 * Input (Constant), 359 * Usage Page (Keyboard), ; Keyboard/keypad (07h) 360 * Usage Minimum (None), ; No event (00h, selector) 361 * Usage Maximum (KB Application), ; Keyboard Application (65h, selector) 362 * Logical Minimum (0), 363 * Logical Maximum (101), 364 * Report Size (8), 365 * Report Count (5), 366 * Input, 367 * End Collection 368 */ 369 370 /* Size of the original report descriptor of Slim Tablet 12.1 inch */ 371 #define SLIM_TABLET_12_1_INCH_RDESC_ORIG_SIZE 269 372 373 /* 374 * Fixed Slim Tablet 12.1 inch descriptor. 375 * 376 * All the reports except the stylus report (ID 16) were removed as unused. 377 * The stylus buttons description was fixed. 378 */ 379 static __u8 slim_tablet_12_1_inch_rdesc_fixed[] = { 380 0x05, 0x0D, /* Usage Page (Digitizer), */ 381 0x09, 0x02, /* Usage (Pen), */ 382 0xA1, 0x01, /* Collection (Application), */ 383 0x85, 0x10, /* Report ID (16), */ 384 0x09, 0x20, /* Usage (Stylus), */ 385 0xA0, /* Collection (Physical), */ 386 0x09, 0x42, /* Usage (Tip Switch), */ 387 0x09, 0x44, /* Usage (Barrel Switch), */ 388 0x09, 0x46, /* Usage (Tablet Pick), */ 389 0x15, 0x01, /* Logical Minimum (1), */ 390 0x25, 0x03, /* Logical Maximum (3), */ 391 0x75, 0x04, /* Report Size (4), */ 392 0x95, 0x01, /* Report Count (1), */ 393 0x80, /* Input, */ 394 0x09, 0x32, /* Usage (In Range), */ 395 0x14, /* Logical Minimum (0), */ 396 0x25, 0x01, /* Logical Maximum (1), */ 397 0x75, 0x01, /* Report Size (1), */ 398 0x95, 0x01, /* Report Count (1), */ 399 0x81, 0x02, /* Input (Variable), */ 400 0x95, 0x03, /* Report Count (3), */ 401 0x81, 0x03, /* Input (Constant, Variable), */ 402 0x75, 0x10, /* Report Size (16), */ 403 0x95, 0x01, /* Report Count (1), */ 404 0x14, /* Logical Minimum (0), */ 405 0xA4, /* Push, */ 406 0x05, 0x01, /* Usage Page (Desktop), */ 407 0x65, 0x13, /* Unit (Inch), */ 408 0x55, 0xFD, /* Unit Exponent (-3), */ 409 0x34, /* Physical Minimum (0), */ 410 0x09, 0x30, /* Usage (X), */ 411 0x46, 0x10, 0x27, /* Physical Maximum (10000), */ 412 0x26, 0x20, 0x4E, /* Logical Maximum (20000), */ 413 0x81, 0x02, /* Input (Variable), */ 414 0x09, 0x31, /* Usage (Y), */ 415 0x46, 0x6A, 0x18, /* Physical Maximum (6250), */ 416 0x26, 0xD4, 0x30, /* Logical Maximum (12500), */ 417 0x81, 0x02, /* Input (Variable), */ 418 0xB4, /* Pop, */ 419 0x09, 0x30, /* Usage (Tip Pressure), */ 420 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */ 421 0x81, 0x02, /* Input (Variable), */ 422 0xC0, /* End Collection, */ 423 0xC0 /* End Collection */ 424 }; 425 426 /* 427 * Original Media Tablet 10.6 inch report descriptor. 428 * 429 * There are at least two versions of this model in the wild. They are 430 * represented by Genius G-Pen M609 (older version) and Genius G-Pen M609X 431 * (newer version). 432 * 433 * Both versions have the usual pen with two barrel buttons and two 434 * identical wheels with center buttons in the top corners of the tablet 435 * base. They also have buttons on the top, between the wheels, for 436 * selecting the wheels' functions and wide/standard mode. In the wide mode 437 * the whole working surface is sensed, in the standard mode a narrower area 438 * is sensed, but the logical report extents remain the same. These modes 439 * correspond roughly to 16:9 and 4:3 aspect ratios respectively. 440 * 441 * The older version has three wheel function buttons ("scroll", "zoom" and 442 * "volume") and two separate buttons for wide and standard mode. The newer 443 * version has four wheel function buttons (plus "brush") and only one 444 * button is used for selecting wide/standard mode. So, the total number of 445 * buttons remains the same, but one of the mode buttons is repurposed as a 446 * wheels' function button in the newer version. 447 * 448 * The wheel functions are: 449 * scroll - the wheels act as scroll wheels, the center buttons switch 450 * between vertical and horizontal scrolling; 451 * zoom - the wheels zoom in/out, the buttons supposedly reset to 100%; 452 * volume - the wheels control the sound volume, the buttons mute; 453 * brush - the wheels are supposed to control brush width in a graphics 454 * editor, the buttons do nothing. 455 * 456 * Below is the newer version's report descriptor. It may very well be that 457 * the older version's descriptor is different and thus it won't be 458 * supported. 459 * 460 * The mouse report (ID 1) only uses the wheel field for reporting the tablet 461 * wheels' scroll mode. The keyboard report (ID 13) is used to report the 462 * wheels' zoom and brush control functions as key presses. The report ID 12 463 * is used to report the wheels' volume control functions. The stylus report 464 * (ID 16) has the same problems as the Slim Tablet 5.8 inch report has. 465 * 466 * The rest of the reports are unused, at least in the default configuration. 467 * The purpose of the features is unknown. 468 * 469 * Usage Page (Desktop), 470 * Usage (Mouse), 471 * Collection (Application), 472 * Report ID (1), 473 * Usage (Pointer), 474 * Collection (Physical), 475 * Usage Page (Button), 476 * Usage Minimum (01h), 477 * Usage Maximum (05h), 478 * Logical Minimum (0), 479 * Logical Maximum (1), 480 * Report Size (1), 481 * Report Count (5), 482 * Input (Variable), 483 * Report Size (3), 484 * Report Count (1), 485 * Input (Constant, Variable), 486 * Usage Page (Desktop), 487 * Usage (X), 488 * Usage (Y), 489 * Usage (Wheel), 490 * Logical Minimum (-127), 491 * Logical Maximum (127), 492 * Report Size (8), 493 * Report Count (3), 494 * Input (Variable, Relative), 495 * End Collection, 496 * End Collection, 497 * Usage Page (Digitizer), 498 * Usage (Pen), 499 * Collection (Application), 500 * Report ID (2), 501 * Usage (Stylus), 502 * Collection (Physical), 503 * Usage (00h), 504 * Logical Minimum (0), 505 * Logical Maximum (255), 506 * Report Size (8), 507 * Report Count (7), 508 * Input (Variable), 509 * Usage (Azimuth), 510 * Usage (Altitude), 511 * Logical Minimum (0), 512 * Logical Maximum (255), 513 * Report Size (8), 514 * Report Count (2), 515 * Feature (Variable), 516 * End Collection, 517 * Report ID (5), 518 * Usage Page (Digitizer), 519 * Usage (Stylus), 520 * Collection (Physical), 521 * Usage (00h), 522 * Logical Minimum (0), 523 * Logical Maximum (255), 524 * Report Size (8), 525 * Report Count (7), 526 * Input (Variable), 527 * End Collection, 528 * Report ID (10), 529 * Usage Page (Digitizer), 530 * Usage (Stylus), 531 * Collection (Physical), 532 * Usage (00h), 533 * Logical Minimum (0), 534 * Logical Maximum (255), 535 * Report Size (8), 536 * Report Count (7), 537 * Input (Variable), 538 * End Collection, 539 * Report ID (16), 540 * Usage (Stylus), 541 * Collection (Physical), 542 * Usage (Tip Switch), 543 * Usage (Barrel Switch), 544 * Usage (Invert), 545 * Usage (Eraser), 546 * Usage (In Range), 547 * Logical Minimum (0), 548 * Logical Maximum (1), 549 * Report Size (1), 550 * Report Count (5), 551 * Input (Variable), 552 * Report Count (3), 553 * Input (Constant, Variable), 554 * Usage Page (Desktop), 555 * Usage (X), 556 * Report Size (16), 557 * Report Count (1), 558 * Push, 559 * Unit Exponent (13), 560 * Unit (Inch^3), 561 * Logical Minimum (0), 562 * Logical Maximum (18000), 563 * Physical Minimum (0), 564 * Physical Maximum (18000), 565 * Input (Variable), 566 * Usage (Y), 567 * Logical Maximum (11000), 568 * Physical Maximum (11000), 569 * Input (Variable), 570 * Usage Page (Digitizer), 571 * Usage (Tip Pressure), 572 * Logical Minimum (0), 573 * Logical Maximum (1023), 574 * Physical Minimum (0), 575 * Physical Maximum (1023), 576 * Input (Variable), 577 * End Collection, 578 * End Collection, 579 * Usage Page (Desktop), 580 * Usage (Keyboard), 581 * Collection (Application), 582 * Report ID (13), 583 * Usage Page (Keyboard), 584 * Usage Minimum (KB Leftcontrol), 585 * Usage Maximum (KB Right GUI), 586 * Logical Minimum (0), 587 * Logical Maximum (1), 588 * Report Size (1), 589 * Report Count (8), 590 * Input (Variable), 591 * Report Size (8), 592 * Report Count (1), 593 * Input (Constant), 594 * Usage Page (Keyboard), 595 * Usage Minimum (None), 596 * Usage Maximum (KB Application), 597 * Logical Minimum (0), 598 * Logical Maximum (101), 599 * Report Size (8), 600 * Report Count (5), 601 * Input, 602 * End Collection, 603 * Usage Page (Consumer), 604 * Usage (Consumer Control), 605 * Collection (Application), 606 * Report ID (12), 607 * Usage (Volume Inc), 608 * Usage (Volume Dec), 609 * Usage (Mute), 610 * Logical Minimum (0), 611 * Logical Maximum (1), 612 * Report Size (1), 613 * Report Count (3), 614 * Input (Variable, Relative), 615 * Report Size (5), 616 * Report Count (1), 617 * Input (Constant, Variable, Relative), 618 * End Collection 619 */ 620 621 /* Size of the original report descriptor of Media Tablet 10.6 inch */ 622 #define MEDIA_TABLET_10_6_INCH_RDESC_ORIG_SIZE 300 623 624 /* 625 * Fixed Media Tablet 10.6 inch descriptor. 626 * 627 * The descriptions of reports unused in the default configuration are 628 * removed. The stylus report (ID 16) is fixed similarly to Slim Tablet 5.8 629 * inch. The unused mouse report (ID 1) fields are replaced with constant 630 * padding. 631 * 632 * The keyboard report (ID 13) is hacked to instead have an "array" field 633 * reporting consumer page controls, and all the unused bits are masked out 634 * with constant padding. The "brush" wheels' function is represented as "Scan 635 * Previous/Next Track" controls due to the lack of brush controls in the 636 * usage tables specification. 637 */ 638 static __u8 media_tablet_10_6_inch_rdesc_fixed[] = { 639 0x05, 0x0D, /* Usage Page (Digitizer), */ 640 0x09, 0x02, /* Usage (Pen), */ 641 0xA1, 0x01, /* Collection (Application), */ 642 0x85, 0x10, /* Report ID (16), */ 643 0x09, 0x20, /* Usage (Stylus), */ 644 0xA0, /* Collection (Physical), */ 645 0x09, 0x42, /* Usage (Tip Switch), */ 646 0x09, 0x44, /* Usage (Barrel Switch), */ 647 0x09, 0x46, /* Usage (Tablet Pick), */ 648 0x15, 0x01, /* Logical Minimum (1), */ 649 0x25, 0x03, /* Logical Maximum (3), */ 650 0x75, 0x04, /* Report Size (4), */ 651 0x95, 0x01, /* Report Count (1), */ 652 0x80, /* Input, */ 653 0x75, 0x01, /* Report Size (1), */ 654 0x09, 0x32, /* Usage (In Range), */ 655 0x14, /* Logical Minimum (0), */ 656 0x25, 0x01, /* Logical Maximum (1), */ 657 0x95, 0x01, /* Report Count (1), */ 658 0x81, 0x02, /* Input (Variable), */ 659 0x95, 0x03, /* Report Count (3), */ 660 0x81, 0x03, /* Input (Constant, Variable), */ 661 0x75, 0x10, /* Report Size (16), */ 662 0x95, 0x01, /* Report Count (1), */ 663 0x14, /* Logical Minimum (0), */ 664 0xA4, /* Push, */ 665 0x05, 0x01, /* Usage Page (Desktop), */ 666 0x65, 0x13, /* Unit (Inch), */ 667 0x55, 0xFD, /* Unit Exponent (-3), */ 668 0x34, /* Physical Minimum (0), */ 669 0x09, 0x30, /* Usage (X), */ 670 0x46, 0x28, 0x23, /* Physical Maximum (9000), */ 671 0x26, 0x50, 0x46, /* Logical Maximum (18000), */ 672 0x81, 0x02, /* Input (Variable), */ 673 0x09, 0x31, /* Usage (Y), */ 674 0x46, 0x7C, 0x15, /* Physical Maximum (5500), */ 675 0x26, 0xF8, 0x2A, /* Logical Maximum (11000), */ 676 0x81, 0x02, /* Input (Variable), */ 677 0xB4, /* Pop, */ 678 0x09, 0x30, /* Usage (Tip Pressure), */ 679 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */ 680 0x81, 0x02, /* Input (Variable), */ 681 0xC0, /* End Collection, */ 682 0xC0, /* End Collection, */ 683 0x05, 0x01, /* Usage Page (Desktop), */ 684 0x09, 0x02, /* Usage (Mouse), */ 685 0xA1, 0x01, /* Collection (Application), */ 686 0x85, 0x01, /* Report ID (1), */ 687 0x09, 0x01, /* Usage (Pointer), */ 688 0xA0, /* Collection (Physical), */ 689 0x75, 0x08, /* Report Size (8), */ 690 0x95, 0x03, /* Report Count (3), */ 691 0x81, 0x03, /* Input (Constant, Variable), */ 692 0x95, 0x02, /* Report Count (2), */ 693 0x15, 0xFF, /* Logical Minimum (-1), */ 694 0x25, 0x01, /* Logical Maximum (1), */ 695 0x09, 0x38, /* Usage (Wheel), */ 696 0x0B, 0x38, 0x02, /* Usage (Consumer AC Pan), */ 697 0x0C, 0x00, 698 0x81, 0x06, /* Input (Variable, Relative), */ 699 0x95, 0x02, /* Report Count (2), */ 700 0x81, 0x03, /* Input (Constant, Variable), */ 701 0xC0, /* End Collection, */ 702 0xC0, /* End Collection, */ 703 0x05, 0x0C, /* Usage Page (Consumer), */ 704 0x09, 0x01, /* Usage (Consumer Control), */ 705 0xA1, 0x01, /* Collection (Application), */ 706 0x85, 0x0D, /* Report ID (13), */ 707 0x95, 0x01, /* Report Count (1), */ 708 0x75, 0x10, /* Report Size (16), */ 709 0x81, 0x03, /* Input (Constant, Variable), */ 710 0x0A, 0x2F, 0x02, /* Usage (AC Zoom), */ 711 0x0A, 0x2E, 0x02, /* Usage (AC Zoom Out), */ 712 0x0A, 0x2D, 0x02, /* Usage (AC Zoom In), */ 713 0x09, 0xB6, /* Usage (Scan Previous Track), */ 714 0x09, 0xB5, /* Usage (Scan Next Track), */ 715 0x08, /* Usage (00h), */ 716 0x08, /* Usage (00h), */ 717 0x08, /* Usage (00h), */ 718 0x08, /* Usage (00h), */ 719 0x08, /* Usage (00h), */ 720 0x0A, 0x2E, 0x02, /* Usage (AC Zoom Out), */ 721 0x0A, 0x2D, 0x02, /* Usage (AC Zoom In), */ 722 0x15, 0x0C, /* Logical Minimum (12), */ 723 0x25, 0x17, /* Logical Maximum (23), */ 724 0x75, 0x05, /* Report Size (5), */ 725 0x80, /* Input, */ 726 0x75, 0x03, /* Report Size (3), */ 727 0x81, 0x03, /* Input (Constant, Variable), */ 728 0x75, 0x20, /* Report Size (32), */ 729 0x81, 0x03, /* Input (Constant, Variable), */ 730 0xC0, /* End Collection, */ 731 0x09, 0x01, /* Usage (Consumer Control), */ 732 0xA1, 0x01, /* Collection (Application), */ 733 0x85, 0x0C, /* Report ID (12), */ 734 0x75, 0x01, /* Report Size (1), */ 735 0x09, 0xE9, /* Usage (Volume Inc), */ 736 0x09, 0xEA, /* Usage (Volume Dec), */ 737 0x09, 0xE2, /* Usage (Mute), */ 738 0x14, /* Logical Minimum (0), */ 739 0x25, 0x01, /* Logical Maximum (1), */ 740 0x95, 0x03, /* Report Count (3), */ 741 0x81, 0x06, /* Input (Variable, Relative), */ 742 0x95, 0x35, /* Report Count (53), */ 743 0x81, 0x03, /* Input (Constant, Variable), */ 744 0xC0 /* End Collection */ 745 }; 746 747 /* 748 * Original Media Tablet 14.1 inch report descriptor. 749 * 750 * There are at least two versions of this model in the wild. They are 751 * represented by Genius G-Pen M712 (older version) and Genius G-Pen M712X 752 * (newer version). The hardware difference between these versions is the same 753 * as between older and newer versions of Media Tablet 10.6 inch. The report 754 * descriptors are identical for both versions. 755 * 756 * The function, behavior and report descriptor of this tablet is similar to 757 * that of Media Tablet 10.6 inch. However, there is one more field (with 758 * Consumer AC Pan usage) in the mouse description. Then the tablet X and Y 759 * logical extents both get scaled to 0..16383 range (a hardware limit?), 760 * which kind of defeats the advertised 4000 LPI resolution, considering the 761 * physical extents of 12x7.25 inches. Plus, reports 5, 10 and 255 are used 762 * sometimes (while moving the pen) with unknown purpose. Also, the key codes 763 * generated for zoom in/out are different. 764 * 765 * Usage Page (Desktop), 766 * Usage (Mouse), 767 * Collection (Application), 768 * Report ID (1), 769 * Usage (Pointer), 770 * Collection (Physical), 771 * Usage Page (Button), 772 * Usage Minimum (01h), 773 * Usage Maximum (05h), 774 * Logical Minimum (0), 775 * Logical Maximum (1), 776 * Report Size (1), 777 * Report Count (5), 778 * Input (Variable), 779 * Report Size (3), 780 * Report Count (1), 781 * Input (Constant, Variable), 782 * Usage Page (Desktop), 783 * Usage (X), 784 * Usage (Y), 785 * Usage (Wheel), 786 * Logical Minimum (-127), 787 * Logical Maximum (127), 788 * Report Size (8), 789 * Report Count (3), 790 * Input (Variable, Relative), 791 * Usage Page (Consumer), 792 * Logical Minimum (-127), 793 * Logical Maximum (127), 794 * Report Size (8), 795 * Report Count (1), 796 * Usage (AC Pan), 797 * Input (Variable, Relative), 798 * End Collection, 799 * End Collection, 800 * Usage Page (Digitizer), 801 * Usage (Pen), 802 * Collection (Application), 803 * Report ID (2), 804 * Usage (Stylus), 805 * Collection (Physical), 806 * Usage (00h), 807 * Logical Minimum (0), 808 * Logical Maximum (255), 809 * Report Size (8), 810 * Report Count (7), 811 * Input (Variable), 812 * Usage (Azimuth), 813 * Usage (Altitude), 814 * Logical Minimum (0), 815 * Logical Maximum (255), 816 * Report Size (8), 817 * Report Count (2), 818 * Feature (Variable), 819 * End Collection, 820 * Report ID (5), 821 * Usage Page (Digitizer), 822 * Usage (Stylus), 823 * Collection (Physical), 824 * Usage (00h), 825 * Logical Minimum (0), 826 * Logical Maximum (255), 827 * Report Size (8), 828 * Report Count (7), 829 * Input (Variable), 830 * End Collection, 831 * Report ID (10), 832 * Usage Page (Digitizer), 833 * Usage (Stylus), 834 * Collection (Physical), 835 * Usage (00h), 836 * Logical Minimum (0), 837 * Logical Maximum (255), 838 * Report Size (8), 839 * Report Count (7), 840 * Input (Variable), 841 * End Collection, 842 * Report ID (16), 843 * Usage (Stylus), 844 * Collection (Physical), 845 * Usage (Tip Switch), 846 * Usage (Barrel Switch), 847 * Usage (Invert), 848 * Usage (Eraser), 849 * Usage (In Range), 850 * Logical Minimum (0), 851 * Logical Maximum (1), 852 * Report Size (1), 853 * Report Count (5), 854 * Input (Variable), 855 * Report Count (3), 856 * Input (Constant, Variable), 857 * Usage Page (Desktop), 858 * Usage (X), 859 * Report Size (16), 860 * Report Count (1), 861 * Push, 862 * Unit Exponent (13), 863 * Unit (Inch^3), 864 * Logical Minimum (0), 865 * Logical Maximum (16383), 866 * Physical Minimum (0), 867 * Physical Maximum (16383), 868 * Input (Variable), 869 * Usage (Y), 870 * Input (Variable), 871 * Usage Page (Digitizer), 872 * Usage (Tip Pressure), 873 * Logical Minimum (0), 874 * Logical Maximum (1023), 875 * Physical Minimum (0), 876 * Physical Maximum (1023), 877 * Input (Variable), 878 * End Collection, 879 * End Collection, 880 * Usage Page (Desktop), 881 * Usage (Keyboard), 882 * Collection (Application), 883 * Report ID (13), 884 * Usage Page (Keyboard), 885 * Usage Minimum (KB Leftcontrol), 886 * Usage Maximum (KB Right GUI), 887 * Logical Minimum (0), 888 * Logical Maximum (1), 889 * Report Size (1), 890 * Report Count (8), 891 * Input (Variable), 892 * Report Size (8), 893 * Report Count (1), 894 * Input (Constant), 895 * Usage Page (Keyboard), 896 * Usage Minimum (None), 897 * Usage Maximum (KB Application), 898 * Logical Minimum (0), 899 * Logical Maximum (101), 900 * Report Size (8), 901 * Report Count (5), 902 * Input, 903 * End Collection, 904 * Usage Page (Consumer), 905 * Usage (Consumer Control), 906 * Collection (Application), 907 * Report ID (12), 908 * Usage (Volume Inc), 909 * Usage (Volume Dec), 910 * Usage (Mute), 911 * Logical Minimum (0), 912 * Logical Maximum (1), 913 * Report Size (1), 914 * Report Count (3), 915 * Input (Variable, Relative), 916 * Report Size (5), 917 * Report Count (1), 918 * Input (Constant, Variable, Relative), 919 * End Collection 920 */ 921 922 /* Size of the original report descriptor of Media Tablet 14.1 inch */ 923 #define MEDIA_TABLET_14_1_INCH_RDESC_ORIG_SIZE 309 924 925 /* 926 * Fixed Media Tablet 14.1 inch descriptor. 927 * It is fixed similarly to the Media Tablet 10.6 inch descriptor. 928 */ 929 static __u8 media_tablet_14_1_inch_rdesc_fixed[] = { 930 0x05, 0x0D, /* Usage Page (Digitizer), */ 931 0x09, 0x02, /* Usage (Pen), */ 932 0xA1, 0x01, /* Collection (Application), */ 933 0x85, 0x10, /* Report ID (16), */ 934 0x09, 0x20, /* Usage (Stylus), */ 935 0xA0, /* Collection (Physical), */ 936 0x09, 0x42, /* Usage (Tip Switch), */ 937 0x09, 0x44, /* Usage (Barrel Switch), */ 938 0x09, 0x46, /* Usage (Tablet Pick), */ 939 0x15, 0x01, /* Logical Minimum (1), */ 940 0x25, 0x03, /* Logical Maximum (3), */ 941 0x75, 0x04, /* Report Size (4), */ 942 0x95, 0x01, /* Report Count (1), */ 943 0x80, /* Input, */ 944 0x75, 0x01, /* Report Size (1), */ 945 0x09, 0x32, /* Usage (In Range), */ 946 0x14, /* Logical Minimum (0), */ 947 0x25, 0x01, /* Logical Maximum (1), */ 948 0x95, 0x01, /* Report Count (1), */ 949 0x81, 0x02, /* Input (Variable), */ 950 0x95, 0x03, /* Report Count (3), */ 951 0x81, 0x03, /* Input (Constant, Variable), */ 952 0x75, 0x10, /* Report Size (16), */ 953 0x95, 0x01, /* Report Count (1), */ 954 0x14, /* Logical Minimum (0), */ 955 0xA4, /* Push, */ 956 0x05, 0x01, /* Usage Page (Desktop), */ 957 0x65, 0x13, /* Unit (Inch), */ 958 0x55, 0xFD, /* Unit Exponent (-3), */ 959 0x34, /* Physical Minimum (0), */ 960 0x09, 0x30, /* Usage (X), */ 961 0x46, 0xE0, 0x2E, /* Physical Maximum (12000), */ 962 0x26, 0xFF, 0x3F, /* Logical Maximum (16383), */ 963 0x81, 0x02, /* Input (Variable), */ 964 0x09, 0x31, /* Usage (Y), */ 965 0x46, 0x52, 0x1C, /* Physical Maximum (7250), */ 966 0x26, 0xFF, 0x3F, /* Logical Maximum (16383), */ 967 0x81, 0x02, /* Input (Variable), */ 968 0xB4, /* Pop, */ 969 0x09, 0x30, /* Usage (Tip Pressure), */ 970 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */ 971 0x81, 0x02, /* Input (Variable), */ 972 0xC0, /* End Collection, */ 973 0xC0, /* End Collection, */ 974 0x05, 0x01, /* Usage Page (Desktop), */ 975 0x09, 0x02, /* Usage (Mouse), */ 976 0xA1, 0x01, /* Collection (Application), */ 977 0x85, 0x01, /* Report ID (1), */ 978 0x09, 0x01, /* Usage (Pointer), */ 979 0xA0, /* Collection (Physical), */ 980 0x75, 0x08, /* Report Size (8), */ 981 0x95, 0x03, /* Report Count (3), */ 982 0x81, 0x03, /* Input (Constant, Variable), */ 983 0x95, 0x02, /* Report Count (2), */ 984 0x15, 0xFF, /* Logical Minimum (-1), */ 985 0x25, 0x01, /* Logical Maximum (1), */ 986 0x09, 0x38, /* Usage (Wheel), */ 987 0x0B, 0x38, 0x02, /* Usage (Consumer AC Pan), */ 988 0x0C, 0x00, 989 0x81, 0x06, /* Input (Variable, Relative), */ 990 0xC0, /* End Collection, */ 991 0xC0, /* End Collection, */ 992 0x05, 0x0C, /* Usage Page (Consumer), */ 993 0x09, 0x01, /* Usage (Consumer Control), */ 994 0xA1, 0x01, /* Collection (Application), */ 995 0x85, 0x0D, /* Report ID (13), */ 996 0x95, 0x01, /* Report Count (1), */ 997 0x75, 0x10, /* Report Size (16), */ 998 0x81, 0x03, /* Input (Constant, Variable), */ 999 0x0A, 0x2F, 0x02, /* Usage (AC Zoom), */ 1000 0x0A, 0x2E, 0x02, /* Usage (AC Zoom Out), */ 1001 0x0A, 0x2D, 0x02, /* Usage (AC Zoom In), */ 1002 0x09, 0xB6, /* Usage (Scan Previous Track), */ 1003 0x09, 0xB5, /* Usage (Scan Next Track), */ 1004 0x08, /* Usage (00h), */ 1005 0x08, /* Usage (00h), */ 1006 0x08, /* Usage (00h), */ 1007 0x08, /* Usage (00h), */ 1008 0x08, /* Usage (00h), */ 1009 0x0A, 0x2E, 0x02, /* Usage (AC Zoom Out), */ 1010 0x0A, 0x2D, 0x02, /* Usage (AC Zoom In), */ 1011 0x15, 0x0C, /* Logical Minimum (12), */ 1012 0x25, 0x17, /* Logical Maximum (23), */ 1013 0x75, 0x05, /* Report Size (5), */ 1014 0x80, /* Input, */ 1015 0x75, 0x03, /* Report Size (3), */ 1016 0x81, 0x03, /* Input (Constant, Variable), */ 1017 0x75, 0x20, /* Report Size (32), */ 1018 0x81, 0x03, /* Input (Constant, Variable), */ 1019 0xC0, /* End Collection, */ 1020 0x09, 0x01, /* Usage (Consumer Control), */ 1021 0xA1, 0x01, /* Collection (Application), */ 1022 0x85, 0x0C, /* Report ID (12), */ 1023 0x75, 0x01, /* Report Size (1), */ 1024 0x09, 0xE9, /* Usage (Volume Inc), */ 1025 0x09, 0xEA, /* Usage (Volume Dec), */ 1026 0x09, 0xE2, /* Usage (Mute), */ 1027 0x14, /* Logical Minimum (0), */ 1028 0x25, 0x01, /* Logical Maximum (1), */ 1029 0x95, 0x03, /* Report Count (3), */ 1030 0x81, 0x06, /* Input (Variable, Relative), */ 1031 0x75, 0x05, /* Report Size (5), */ 1032 0x81, 0x03, /* Input (Constant, Variable), */ 1033 0xC0 /* End Collection */ 1034 }; 1035 1036 static __u8 *waltop_report_fixup(struct hid_device *hdev, __u8 *rdesc, 1037 unsigned int *rsize) 1038 { 1039 switch (hdev->product) { 1040 case USB_DEVICE_ID_WALTOP_SLIM_TABLET_5_8_INCH: 1041 if (*rsize == SLIM_TABLET_5_8_INCH_RDESC_ORIG_SIZE) { 1042 rdesc = slim_tablet_5_8_inch_rdesc_fixed; 1043 *rsize = sizeof(slim_tablet_5_8_inch_rdesc_fixed); 1044 } 1045 break; 1046 case USB_DEVICE_ID_WALTOP_SLIM_TABLET_12_1_INCH: 1047 if (*rsize == SLIM_TABLET_12_1_INCH_RDESC_ORIG_SIZE) { 1048 rdesc = slim_tablet_12_1_inch_rdesc_fixed; 1049 *rsize = sizeof(slim_tablet_12_1_inch_rdesc_fixed); 1050 } 1051 break; 1052 case USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH: 1053 if (*rsize == MEDIA_TABLET_10_6_INCH_RDESC_ORIG_SIZE) { 1054 rdesc = media_tablet_10_6_inch_rdesc_fixed; 1055 *rsize = sizeof(media_tablet_10_6_inch_rdesc_fixed); 1056 } 1057 break; 1058 case USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH: 1059 if (*rsize == MEDIA_TABLET_14_1_INCH_RDESC_ORIG_SIZE) { 1060 rdesc = media_tablet_14_1_inch_rdesc_fixed; 1061 *rsize = sizeof(media_tablet_14_1_inch_rdesc_fixed); 1062 } 1063 break; 1064 } 1065 return rdesc; 1066 } 1067 1068 static const struct hid_device_id waltop_devices[] = { 1069 { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, 1070 USB_DEVICE_ID_WALTOP_SLIM_TABLET_5_8_INCH) }, 1071 { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, 1072 USB_DEVICE_ID_WALTOP_SLIM_TABLET_12_1_INCH) }, 1073 { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, 1074 USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH) }, 1075 { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, 1076 USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH) }, 1077 { } 1078 }; 1079 MODULE_DEVICE_TABLE(hid, waltop_devices); 1080 1081 static struct hid_driver waltop_driver = { 1082 .name = "waltop", 1083 .id_table = waltop_devices, 1084 .report_fixup = waltop_report_fixup, 1085 }; 1086 1087 static int __init waltop_init(void) 1088 { 1089 return hid_register_driver(&waltop_driver); 1090 } 1091 1092 static void __exit waltop_exit(void) 1093 { 1094 hid_unregister_driver(&waltop_driver); 1095 } 1096 1097 module_init(waltop_init); 1098 module_exit(waltop_exit); 1099 MODULE_LICENSE("GPL"); 1100