^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * HID driver for UC-Logic devices not fully compliant with HID standard
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * - original and fixed report descriptors
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (c) 2010-2017 Nikolai Kondrashov
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (c) 2013 Martin Rusko
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * This program is free software; you can redistribute it and/or modify it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * under the terms of the GNU General Public License as published by the Free
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * Software Foundation; either version 2 of the License, or (at your option)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * any later version.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include "hid-uclogic-rdesc.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <asm/unaligned.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) /* Fixed WP4030U report descriptor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) __u8 uclogic_rdesc_wp4030u_fixed_arr[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) 0x05, 0x0D, /* Usage Page (Digitizer), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) 0x09, 0x02, /* Usage (Pen), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) 0xA1, 0x01, /* Collection (Application), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) 0x85, 0x09, /* Report ID (9), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) 0x09, 0x20, /* Usage (Stylus), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) 0xA0, /* Collection (Physical), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) 0x09, 0x42, /* Usage (Tip Switch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) 0x09, 0x44, /* Usage (Barrel Switch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) 0x09, 0x46, /* Usage (Tablet Pick), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) 0x95, 0x03, /* Report Count (3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) 0x95, 0x05, /* Report Count (5), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) 0x81, 0x01, /* Input (Constant), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) 0x75, 0x10, /* Report Size (16), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) 0xA4, /* Push, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) 0x55, 0xFD, /* Unit Exponent (-3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) 0x65, 0x13, /* Unit (Inch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) 0x34, /* Physical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) 0x09, 0x30, /* Usage (X), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) 0x46, 0xA0, 0x0F, /* Physical Maximum (4000), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) 0x09, 0x31, /* Usage (Y), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) 0x46, 0xB8, 0x0B, /* Physical Maximum (3000), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) 0xB4, /* Pop, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) 0x09, 0x30, /* Usage (Tip Pressure), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) 0xC0, /* End Collection, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) 0xC0 /* End Collection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) const size_t uclogic_rdesc_wp4030u_fixed_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) sizeof(uclogic_rdesc_wp4030u_fixed_arr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) /* Fixed WP5540U report descriptor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) __u8 uclogic_rdesc_wp5540u_fixed_arr[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) 0x05, 0x0D, /* Usage Page (Digitizer), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) 0x09, 0x02, /* Usage (Pen), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) 0xA1, 0x01, /* Collection (Application), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) 0x85, 0x09, /* Report ID (9), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) 0x09, 0x20, /* Usage (Stylus), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) 0xA0, /* Collection (Physical), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) 0x09, 0x42, /* Usage (Tip Switch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) 0x09, 0x44, /* Usage (Barrel Switch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) 0x09, 0x46, /* Usage (Tablet Pick), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) 0x95, 0x03, /* Report Count (3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) 0x95, 0x05, /* Report Count (5), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) 0x81, 0x01, /* Input (Constant), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) 0x75, 0x10, /* Report Size (16), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) 0xA4, /* Push, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) 0x55, 0xFD, /* Unit Exponent (-3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) 0x65, 0x13, /* Unit (Inch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) 0x34, /* Physical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) 0x09, 0x30, /* Usage (X), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) 0x46, 0x7C, 0x15, /* Physical Maximum (5500), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) 0x09, 0x31, /* Usage (Y), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) 0x46, 0xA0, 0x0F, /* Physical Maximum (4000), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 0xB4, /* Pop, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 0x09, 0x30, /* Usage (Tip Pressure), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 0xC0, /* End Collection, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 0xC0, /* End Collection, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 0x09, 0x02, /* Usage (Mouse), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 0xA1, 0x01, /* Collection (Application), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 0x85, 0x08, /* Report ID (8), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 0x09, 0x01, /* Usage (Pointer), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 0xA0, /* Collection (Physical), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 0x05, 0x09, /* Usage Page (Button), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 0x19, 0x01, /* Usage Minimum (01h), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 0x29, 0x03, /* Usage Maximum (03h), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 0x95, 0x03, /* Report Count (3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 0x95, 0x05, /* Report Count (5), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 0x81, 0x01, /* Input (Constant), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 0x75, 0x08, /* Report Size (8), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 0x09, 0x30, /* Usage (X), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 0x09, 0x31, /* Usage (Y), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 0x15, 0x81, /* Logical Minimum (-127), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 0x25, 0x7F, /* Logical Maximum (127), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 0x95, 0x02, /* Report Count (2), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 0x81, 0x06, /* Input (Variable, Relative), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 0x09, 0x38, /* Usage (Wheel), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 0x15, 0xFF, /* Logical Minimum (-1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 0x81, 0x06, /* Input (Variable, Relative), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 0x81, 0x01, /* Input (Constant), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 0xC0, /* End Collection, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 0xC0 /* End Collection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) const size_t uclogic_rdesc_wp5540u_fixed_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) sizeof(uclogic_rdesc_wp5540u_fixed_arr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) /* Fixed WP8060U report descriptor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) __u8 uclogic_rdesc_wp8060u_fixed_arr[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 0x05, 0x0D, /* Usage Page (Digitizer), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 0x09, 0x02, /* Usage (Pen), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 0xA1, 0x01, /* Collection (Application), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 0x85, 0x09, /* Report ID (9), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 0x09, 0x20, /* Usage (Stylus), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 0xA0, /* Collection (Physical), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 0x09, 0x42, /* Usage (Tip Switch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 0x09, 0x44, /* Usage (Barrel Switch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 0x09, 0x46, /* Usage (Tablet Pick), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 0x95, 0x03, /* Report Count (3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 0x95, 0x05, /* Report Count (5), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 0x81, 0x01, /* Input (Constant), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 0x75, 0x10, /* Report Size (16), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 0xA4, /* Push, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 0x55, 0xFD, /* Unit Exponent (-3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 0x65, 0x13, /* Unit (Inch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 0x34, /* Physical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 0x09, 0x30, /* Usage (X), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 0x46, 0x40, 0x1F, /* Physical Maximum (8000), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 0x09, 0x31, /* Usage (Y), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 0x46, 0x70, 0x17, /* Physical Maximum (6000), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 0xB4, /* Pop, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 0x09, 0x30, /* Usage (Tip Pressure), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 0xC0, /* End Collection, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 0xC0, /* End Collection, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 0x09, 0x02, /* Usage (Mouse), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 0xA1, 0x01, /* Collection (Application), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 0x85, 0x08, /* Report ID (8), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 0x09, 0x01, /* Usage (Pointer), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 0xA0, /* Collection (Physical), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 0x05, 0x09, /* Usage Page (Button), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 0x19, 0x01, /* Usage Minimum (01h), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 0x29, 0x03, /* Usage Maximum (03h), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 0x95, 0x03, /* Report Count (3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 0x95, 0x05, /* Report Count (5), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 0x81, 0x01, /* Input (Constant), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 0x75, 0x08, /* Report Size (8), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 0x09, 0x30, /* Usage (X), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 0x09, 0x31, /* Usage (Y), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 0x15, 0x81, /* Logical Minimum (-127), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 0x25, 0x7F, /* Logical Maximum (127), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 0x95, 0x02, /* Report Count (2), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 0x81, 0x06, /* Input (Variable, Relative), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 0x09, 0x38, /* Usage (Wheel), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 0x15, 0xFF, /* Logical Minimum (-1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 0x81, 0x06, /* Input (Variable, Relative), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 0x81, 0x01, /* Input (Constant), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 0xC0, /* End Collection, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 0xC0 /* End Collection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) const size_t uclogic_rdesc_wp8060u_fixed_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) sizeof(uclogic_rdesc_wp8060u_fixed_arr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) /* Fixed WP1062 report descriptor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) __u8 uclogic_rdesc_wp1062_fixed_arr[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 0x05, 0x0D, /* Usage Page (Digitizer), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 0x09, 0x02, /* Usage (Pen), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 0xA1, 0x01, /* Collection (Application), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 0x85, 0x09, /* Report ID (9), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 0x09, 0x20, /* Usage (Stylus), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 0xA0, /* Collection (Physical), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 0x09, 0x42, /* Usage (Tip Switch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 0x09, 0x44, /* Usage (Barrel Switch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 0x09, 0x46, /* Usage (Tablet Pick), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 0x95, 0x03, /* Report Count (3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 0x95, 0x04, /* Report Count (4), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 0x81, 0x01, /* Input (Constant), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 0x09, 0x32, /* Usage (In Range), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 0x75, 0x10, /* Report Size (16), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 0xA4, /* Push, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 0x55, 0xFD, /* Unit Exponent (-3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 0x65, 0x13, /* Unit (Inch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 0x34, /* Physical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 0x09, 0x30, /* Usage (X), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 0x46, 0x10, 0x27, /* Physical Maximum (10000), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 0x26, 0x20, 0x4E, /* Logical Maximum (20000), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 0x09, 0x31, /* Usage (Y), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 0x46, 0xB7, 0x19, /* Physical Maximum (6583), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 0x26, 0x6E, 0x33, /* Logical Maximum (13166), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 0xB4, /* Pop, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 0x09, 0x30, /* Usage (Tip Pressure), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 0xC0, /* End Collection, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 0xC0 /* End Collection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) const size_t uclogic_rdesc_wp1062_fixed_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) sizeof(uclogic_rdesc_wp1062_fixed_arr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) /* Fixed PF1209 report descriptor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) __u8 uclogic_rdesc_pf1209_fixed_arr[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 0x05, 0x0D, /* Usage Page (Digitizer), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 0x09, 0x02, /* Usage (Pen), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 0xA1, 0x01, /* Collection (Application), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 0x85, 0x09, /* Report ID (9), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 0x09, 0x20, /* Usage (Stylus), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 0xA0, /* Collection (Physical), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 0x09, 0x42, /* Usage (Tip Switch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 0x09, 0x44, /* Usage (Barrel Switch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 0x09, 0x46, /* Usage (Tablet Pick), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 0x95, 0x03, /* Report Count (3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 0x95, 0x05, /* Report Count (5), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 0x81, 0x01, /* Input (Constant), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 0x75, 0x10, /* Report Size (16), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 0xA4, /* Push, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 0x55, 0xFD, /* Unit Exponent (-3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 0x65, 0x13, /* Unit (Inch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 0x34, /* Physical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 0x09, 0x30, /* Usage (X), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 0x46, 0xE0, 0x2E, /* Physical Maximum (12000), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 0x09, 0x31, /* Usage (Y), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 0x46, 0x28, 0x23, /* Physical Maximum (9000), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 0xB4, /* Pop, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 0x09, 0x30, /* Usage (Tip Pressure), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 0xC0, /* End Collection, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 0xC0, /* End Collection, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 0x09, 0x02, /* Usage (Mouse), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 0xA1, 0x01, /* Collection (Application), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 0x85, 0x08, /* Report ID (8), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 0x09, 0x01, /* Usage (Pointer), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 0xA0, /* Collection (Physical), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 0x05, 0x09, /* Usage Page (Button), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 0x19, 0x01, /* Usage Minimum (01h), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 0x29, 0x03, /* Usage Maximum (03h), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 0x95, 0x03, /* Report Count (3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 0x95, 0x05, /* Report Count (5), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 0x81, 0x01, /* Input (Constant), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 0x75, 0x08, /* Report Size (8), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 0x09, 0x30, /* Usage (X), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 0x09, 0x31, /* Usage (Y), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 0x15, 0x81, /* Logical Minimum (-127), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 0x25, 0x7F, /* Logical Maximum (127), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 0x95, 0x02, /* Report Count (2), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 0x81, 0x06, /* Input (Variable, Relative), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 0x09, 0x38, /* Usage (Wheel), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 0x15, 0xFF, /* Logical Minimum (-1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 0x81, 0x06, /* Input (Variable, Relative), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 0x81, 0x01, /* Input (Constant), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 0xC0, /* End Collection, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 0xC0 /* End Collection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) const size_t uclogic_rdesc_pf1209_fixed_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) sizeof(uclogic_rdesc_pf1209_fixed_arr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) /* Fixed PID 0522 tablet report descriptor, interface 0 (stylus) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) __u8 uclogic_rdesc_twhl850_fixed0_arr[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 0x05, 0x0D, /* Usage Page (Digitizer), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 0x09, 0x02, /* Usage (Pen), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 0xA1, 0x01, /* Collection (Application), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 0x85, 0x09, /* Report ID (9), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 0x09, 0x20, /* Usage (Stylus), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 0xA0, /* Collection (Physical), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 0x95, 0x03, /* Report Count (3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 0x09, 0x42, /* Usage (Tip Switch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 0x09, 0x44, /* Usage (Barrel Switch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 0x09, 0x46, /* Usage (Tablet Pick), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 0x81, 0x03, /* Input (Constant, Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 0x09, 0x32, /* Usage (In Range), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 0x81, 0x03, /* Input (Constant, Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 0x75, 0x10, /* Report Size (16), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 0xA4, /* Push, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 0x65, 0x13, /* Unit (Inch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 0x55, 0xFD, /* Unit Exponent (-3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 0x34, /* Physical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 0x09, 0x30, /* Usage (X), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 0x46, 0x40, 0x1F, /* Physical Maximum (8000), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 0x26, 0x00, 0x7D, /* Logical Maximum (32000), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 0x09, 0x31, /* Usage (Y), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 0x46, 0x88, 0x13, /* Physical Maximum (5000), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 0x26, 0x20, 0x4E, /* Logical Maximum (20000), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 0xB4, /* Pop, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 0x09, 0x30, /* Usage (Tip Pressure), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 0xC0, /* End Collection, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) 0xC0 /* End Collection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) const size_t uclogic_rdesc_twhl850_fixed0_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) sizeof(uclogic_rdesc_twhl850_fixed0_arr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) /* Fixed PID 0522 tablet report descriptor, interface 1 (mouse) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) __u8 uclogic_rdesc_twhl850_fixed1_arr[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 0x09, 0x02, /* Usage (Mouse), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 0xA1, 0x01, /* Collection (Application), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 0x85, 0x01, /* Report ID (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 0x09, 0x01, /* Usage (Pointer), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 0xA0, /* Collection (Physical), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 0x05, 0x09, /* Usage Page (Button), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) 0x95, 0x03, /* Report Count (3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 0x19, 0x01, /* Usage Minimum (01h), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) 0x29, 0x03, /* Usage Maximum (03h), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 0x95, 0x05, /* Report Count (5), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 0x81, 0x03, /* Input (Constant, Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 0x09, 0x30, /* Usage (X), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 0x09, 0x31, /* Usage (Y), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 0x16, 0x00, 0x80, /* Logical Minimum (-32768), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 0x75, 0x10, /* Report Size (16), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 0x95, 0x02, /* Report Count (2), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 0x81, 0x06, /* Input (Variable, Relative), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 0x09, 0x38, /* Usage (Wheel), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 0x15, 0xFF, /* Logical Minimum (-1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 0x75, 0x08, /* Report Size (8), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 0x81, 0x06, /* Input (Variable, Relative), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 0x81, 0x03, /* Input (Constant, Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 0xC0, /* End Collection, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 0xC0 /* End Collection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) const size_t uclogic_rdesc_twhl850_fixed1_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) sizeof(uclogic_rdesc_twhl850_fixed1_arr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) /* Fixed PID 0522 tablet report descriptor, interface 2 (frame buttons) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) __u8 uclogic_rdesc_twhl850_fixed2_arr[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 0x09, 0x06, /* Usage (Keyboard), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) 0xA1, 0x01, /* Collection (Application), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 0x85, 0x03, /* Report ID (3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 0x05, 0x07, /* Usage Page (Keyboard), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 0x19, 0xE0, /* Usage Minimum (KB Leftcontrol), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 0x29, 0xE7, /* Usage Maximum (KB Right GUI), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 0x95, 0x08, /* Report Count (8), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 0x18, /* Usage Minimum (None), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 0x29, 0xFF, /* Usage Maximum (FFh), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 0x75, 0x08, /* Report Size (8), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) 0x95, 0x06, /* Report Count (6), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) 0x80, /* Input, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 0xC0 /* End Collection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) const size_t uclogic_rdesc_twhl850_fixed2_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) sizeof(uclogic_rdesc_twhl850_fixed2_arr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) /* Fixed TWHA60 report descriptor, interface 0 (stylus) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) __u8 uclogic_rdesc_twha60_fixed0_arr[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 0x05, 0x0D, /* Usage Page (Digitizer), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) 0x09, 0x02, /* Usage (Pen), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 0xA1, 0x01, /* Collection (Application), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 0x85, 0x09, /* Report ID (9), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) 0x09, 0x20, /* Usage (Stylus), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 0xA0, /* Collection (Physical), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) 0x09, 0x42, /* Usage (Tip Switch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) 0x09, 0x44, /* Usage (Barrel Switch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) 0x09, 0x46, /* Usage (Tablet Pick), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) 0x95, 0x03, /* Report Count (3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) 0x95, 0x04, /* Report Count (4), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) 0x81, 0x01, /* Input (Constant), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) 0x09, 0x32, /* Usage (In Range), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) 0x75, 0x10, /* Report Size (16), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) 0xA4, /* Push, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) 0x55, 0xFD, /* Unit Exponent (-3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) 0x65, 0x13, /* Unit (Inch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) 0x34, /* Physical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) 0x09, 0x30, /* Usage (X), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) 0x46, 0x10, 0x27, /* Physical Maximum (10000), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) 0x27, 0x3F, 0x9C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) 0x00, 0x00, /* Logical Maximum (39999), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) 0x09, 0x31, /* Usage (Y), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) 0x46, 0x6A, 0x18, /* Physical Maximum (6250), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 0x26, 0xA7, 0x61, /* Logical Maximum (24999), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) 0xB4, /* Pop, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) 0x09, 0x30, /* Usage (Tip Pressure), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) 0xC0, /* End Collection, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) 0xC0 /* End Collection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) const size_t uclogic_rdesc_twha60_fixed0_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) sizeof(uclogic_rdesc_twha60_fixed0_arr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) /* Fixed TWHA60 report descriptor, interface 1 (frame buttons) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) __u8 uclogic_rdesc_twha60_fixed1_arr[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) 0x09, 0x06, /* Usage (Keyboard), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) 0xA1, 0x01, /* Collection (Application), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) 0x85, 0x05, /* Report ID (5), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) 0x05, 0x07, /* Usage Page (Keyboard), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) 0x95, 0x08, /* Report Count (8), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) 0x81, 0x01, /* Input (Constant), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) 0x95, 0x0C, /* Report Count (12), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) 0x19, 0x3A, /* Usage Minimum (KB F1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) 0x29, 0x45, /* Usage Maximum (KB F12), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) 0x95, 0x0C, /* Report Count (12), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) 0x19, 0x68, /* Usage Minimum (KB F13), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) 0x29, 0x73, /* Usage Maximum (KB F24), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) 0x95, 0x08, /* Report Count (8), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) 0x81, 0x01, /* Input (Constant), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) 0xC0 /* End Collection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) const size_t uclogic_rdesc_twha60_fixed1_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) sizeof(uclogic_rdesc_twha60_fixed1_arr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) /* Fixed report descriptor template for (tweaked) v1 pen reports */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) const __u8 uclogic_rdesc_pen_v1_template_arr[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) 0x05, 0x0D, /* Usage Page (Digitizer), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) 0x09, 0x02, /* Usage (Pen), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) 0xA1, 0x01, /* Collection (Application), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) 0x85, 0x07, /* Report ID (7), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) 0x09, 0x20, /* Usage (Stylus), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) 0xA0, /* Collection (Physical), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) 0x09, 0x42, /* Usage (Tip Switch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) 0x09, 0x44, /* Usage (Barrel Switch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) 0x09, 0x46, /* Usage (Tablet Pick), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) 0x95, 0x03, /* Report Count (3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) 0x95, 0x03, /* Report Count (3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) 0x81, 0x03, /* Input (Constant, Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) 0x09, 0x32, /* Usage (In Range), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) 0x81, 0x03, /* Input (Constant, Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) 0x75, 0x10, /* Report Size (16), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) 0xA4, /* Push, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) 0x65, 0x13, /* Unit (Inch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) 0x55, 0xFD, /* Unit Exponent (-3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) 0x34, /* Physical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) 0x09, 0x30, /* Usage (X), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) 0x27, UCLOGIC_RDESC_PEN_PH(X_LM),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) /* Logical Maximum (PLACEHOLDER), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) 0x47, UCLOGIC_RDESC_PEN_PH(X_PM),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) /* Physical Maximum (PLACEHOLDER), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) 0x09, 0x31, /* Usage (Y), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) 0x27, UCLOGIC_RDESC_PEN_PH(Y_LM),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) /* Logical Maximum (PLACEHOLDER), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) 0x47, UCLOGIC_RDESC_PEN_PH(Y_PM),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) /* Physical Maximum (PLACEHOLDER), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) 0xB4, /* Pop, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) 0x09, 0x30, /* Usage (Tip Pressure), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) 0x27, UCLOGIC_RDESC_PEN_PH(PRESSURE_LM),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) /* Logical Maximum (PLACEHOLDER), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) 0xC0, /* End Collection, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) 0xC0 /* End Collection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) const size_t uclogic_rdesc_pen_v1_template_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) sizeof(uclogic_rdesc_pen_v1_template_arr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) /* Fixed report descriptor template for (tweaked) v2 pen reports */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) const __u8 uclogic_rdesc_pen_v2_template_arr[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) 0x05, 0x0D, /* Usage Page (Digitizer), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) 0x09, 0x02, /* Usage (Pen), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) 0xA1, 0x01, /* Collection (Application), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) 0x85, 0x08, /* Report ID (8), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) 0x09, 0x20, /* Usage (Stylus), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) 0xA0, /* Collection (Physical), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) 0x09, 0x42, /* Usage (Tip Switch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) 0x09, 0x44, /* Usage (Barrel Switch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) 0x09, 0x46, /* Usage (Tablet Pick), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) 0x95, 0x03, /* Report Count (3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) 0x95, 0x03, /* Report Count (3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) 0x81, 0x03, /* Input (Constant, Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) 0x09, 0x32, /* Usage (In Range), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) 0x81, 0x03, /* Input (Constant, Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) 0xA4, /* Push, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) 0x65, 0x13, /* Unit (Inch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) 0x55, 0xFD, /* Unit Exponent (-3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) 0x75, 0x18, /* Report Size (24), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) 0x34, /* Physical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) 0x09, 0x30, /* Usage (X), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) 0x27, UCLOGIC_RDESC_PEN_PH(X_LM),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) /* Logical Maximum (PLACEHOLDER), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) 0x47, UCLOGIC_RDESC_PEN_PH(X_PM),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) /* Physical Maximum (PLACEHOLDER), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) 0x09, 0x31, /* Usage (Y), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) 0x27, UCLOGIC_RDESC_PEN_PH(Y_LM),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) /* Logical Maximum (PLACEHOLDER), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) 0x47, UCLOGIC_RDESC_PEN_PH(Y_PM),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) /* Physical Maximum (PLACEHOLDER), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) 0xB4, /* Pop, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) 0x09, 0x30, /* Usage (Tip Pressure), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) 0x75, 0x10, /* Report Size (16), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) 0x27, UCLOGIC_RDESC_PEN_PH(PRESSURE_LM),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) /* Logical Maximum (PLACEHOLDER), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) 0x81, 0x03, /* Input (Constant, Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) 0xC0, /* End Collection, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) 0xC0 /* End Collection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) const size_t uclogic_rdesc_pen_v2_template_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) sizeof(uclogic_rdesc_pen_v2_template_arr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) * Expand to the contents of a generic buttonpad report descriptor.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) * @_padding: Padding from the end of button bits at bit 44, until
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) * the end of the report, in bits.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) #define UCLOGIC_RDESC_BUTTONPAD_BYTES(_padding) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) 0x05, 0x01, /* Usage Page (Desktop), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) 0x09, 0x07, /* Usage (Keypad), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) 0xA1, 0x01, /* Collection (Application), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) 0x85, 0xF7, /* Report ID (247), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) 0x14, /* Logical Minimum (0), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) 0x25, 0x01, /* Logical Maximum (1), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) 0x75, 0x01, /* Report Size (1), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) 0x05, 0x0D, /* Usage Page (Digitizer), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) 0x09, 0x39, /* Usage (Tablet Function Keys), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) 0xA0, /* Collection (Physical), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) 0x09, 0x44, /* Usage (Barrel Switch), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) 0x95, 0x01, /* Report Count (1), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) 0x81, 0x02, /* Input (Variable), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) 0x05, 0x01, /* Usage Page (Desktop), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) 0x09, 0x30, /* Usage (X), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) 0x09, 0x31, /* Usage (Y), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) 0x95, 0x02, /* Report Count (2), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) 0x81, 0x02, /* Input (Variable), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) 0x95, 0x15, /* Report Count (21), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) 0x81, 0x01, /* Input (Constant), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) 0x05, 0x09, /* Usage Page (Button), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) 0x19, 0x01, /* Usage Minimum (01h), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) 0x29, 0x0A, /* Usage Maximum (0Ah), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) 0x95, 0x0A, /* Report Count (10), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) 0x81, 0x02, /* Input (Variable), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) 0xC0, /* End Collection, */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) 0x05, 0x01, /* Usage Page (Desktop), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) 0x09, 0x05, /* Usage (Gamepad), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) 0xA0, /* Collection (Physical), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) 0x05, 0x09, /* Usage Page (Button), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) 0x19, 0x01, /* Usage Minimum (01h), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) 0x29, 0x02, /* Usage Maximum (02h), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) 0x95, 0x02, /* Report Count (2), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) 0x81, 0x02, /* Input (Variable), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) 0x95, _padding, /* Report Count (_padding), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) 0x81, 0x01, /* Input (Constant), */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) 0xC0, /* End Collection, */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) 0xC0 /* End Collection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) /* Fixed report descriptor for (tweaked) v1 buttonpad reports */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) const __u8 uclogic_rdesc_buttonpad_v1_arr[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) UCLOGIC_RDESC_BUTTONPAD_BYTES(20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) const size_t uclogic_rdesc_buttonpad_v1_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) sizeof(uclogic_rdesc_buttonpad_v1_arr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) /* Fixed report descriptor for (tweaked) v2 buttonpad reports */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) const __u8 uclogic_rdesc_buttonpad_v2_arr[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) UCLOGIC_RDESC_BUTTONPAD_BYTES(52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) const size_t uclogic_rdesc_buttonpad_v2_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) sizeof(uclogic_rdesc_buttonpad_v2_arr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) /* Fixed report descriptor for Ugee EX07 buttonpad */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) const __u8 uclogic_rdesc_ugee_ex07_buttonpad_arr[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) 0x09, 0x07, /* Usage (Keypad), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) 0xA1, 0x01, /* Collection (Application), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) 0x85, 0x06, /* Report ID (6), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) 0x05, 0x0D, /* Usage Page (Digitizer), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) 0x09, 0x39, /* Usage (Tablet Function Keys), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) 0xA0, /* Collection (Physical), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) 0x05, 0x09, /* Usage Page (Button), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) 0x19, 0x03, /* Usage Minimum (03h), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) 0x29, 0x06, /* Usage Maximum (06h), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) 0x95, 0x04, /* Report Count (4), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) 0x95, 0x1A, /* Report Count (26), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) 0x81, 0x03, /* Input (Constant, Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) 0x19, 0x01, /* Usage Minimum (01h), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) 0x29, 0x02, /* Usage Maximum (02h), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) 0x95, 0x02, /* Report Count (2), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) 0xC0, /* End Collection, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) 0xC0 /* End Collection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) const size_t uclogic_rdesc_ugee_ex07_buttonpad_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) sizeof(uclogic_rdesc_ugee_ex07_buttonpad_arr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) /* Fixed report descriptor for Ugee G5 frame controls */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) const __u8 uclogic_rdesc_ugee_g5_frame_arr[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) 0x09, 0x07, /* Usage (Keypad), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) 0xA1, 0x01, /* Collection (Application), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) 0x85, 0x06, /* Report ID (6), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) 0x05, 0x0D, /* Usage Page (Digitizer), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) 0x09, 0x39, /* Usage (Tablet Function Keys), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) 0xA0, /* Collection (Physical), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) 0x05, 0x09, /* Usage Page (Button), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) 0x19, 0x01, /* Usage Minimum (01h), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) 0x29, 0x05, /* Usage Maximum (05h), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) 0x95, 0x05, /* Report Count (5), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) 0x95, 0x03, /* Report Count (3), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) 0x81, 0x01, /* Input (Constant), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) 0x05, 0x0D, /* Usage Page (Digitizer), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) 0x0A, 0xFF, 0xFF, /* Usage (FFFFh), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) 0x75, 0x08, /* Report Size (8), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) 0x09, 0x44, /* Usage (Barrel Switch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) 0x09, 0x30, /* Usage (X), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) 0x09, 0x31, /* Usage (Y), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) 0x95, 0x02, /* Report Count (2), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) 0x95, 0x0B, /* Report Count (11), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) 0x81, 0x01, /* Input (Constant), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) 0x09, 0x38, /* Usage (Wheel), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) 0x15, 0xFF, /* Logical Minimum (-1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) 0x75, 0x02, /* Report Size (2), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) 0x81, 0x06, /* Input (Variable, Relative), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) 0xC0, /* End Collection, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) 0xC0 /* End Collection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) const size_t uclogic_rdesc_ugee_g5_frame_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) sizeof(uclogic_rdesc_ugee_g5_frame_arr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) /* Fixed report descriptor for XP-Pen Deco 01 frame controls */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) const __u8 uclogic_rdesc_xppen_deco01_frame_arr[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) 0x09, 0x07, /* Usage (Keypad), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) 0xA1, 0x01, /* Collection (Application), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) 0x85, 0x06, /* Report ID (6), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) 0x14, /* Logical Minimum (0), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) 0x25, 0x01, /* Logical Maximum (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) 0x75, 0x01, /* Report Size (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) 0x05, 0x0D, /* Usage Page (Digitizer), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) 0x09, 0x39, /* Usage (Tablet Function Keys), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) 0xA0, /* Collection (Physical), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) 0x05, 0x09, /* Usage Page (Button), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) 0x19, 0x01, /* Usage Minimum (01h), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) 0x29, 0x08, /* Usage Maximum (08h), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) 0x95, 0x08, /* Report Count (8), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) 0x05, 0x0D, /* Usage Page (Digitizer), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) 0x09, 0x44, /* Usage (Barrel Switch), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) 0x95, 0x01, /* Report Count (1), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) 0x05, 0x01, /* Usage Page (Desktop), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) 0x09, 0x30, /* Usage (X), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) 0x09, 0x31, /* Usage (Y), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) 0x95, 0x02, /* Report Count (2), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) 0x81, 0x02, /* Input (Variable), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) 0x95, 0x15, /* Report Count (21), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) 0x81, 0x01, /* Input (Constant), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) 0xC0, /* End Collection, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) 0xC0 /* End Collection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) const size_t uclogic_rdesc_xppen_deco01_frame_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) sizeof(uclogic_rdesc_xppen_deco01_frame_arr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) * uclogic_rdesc_template_apply() - apply report descriptor parameters to a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) * report descriptor template, creating a report descriptor. Copies the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) * template over to the new report descriptor and replaces every occurrence of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) * UCLOGIC_RDESC_PH_HEAD, followed by an index byte, with the value from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) * parameter list at that index.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) * @template_ptr: Pointer to the template buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) * @template_size: Size of the template buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) * @param_list: List of template parameters.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) * @param_num: Number of parameters in the list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) * Kmalloc-allocated pointer to the created report descriptor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) * or NULL if allocation failed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) __u8 *uclogic_rdesc_template_apply(const __u8 *template_ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) size_t template_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) const s32 *param_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) size_t param_num)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) static const __u8 head[] = {UCLOGIC_RDESC_PH_HEAD};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) __u8 *rdesc_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) __u8 *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) s32 v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) rdesc_ptr = kmemdup(template_ptr, template_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) if (rdesc_ptr == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) for (p = rdesc_ptr; p + sizeof(head) < rdesc_ptr + template_size;) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) if (memcmp(p, head, sizeof(head)) == 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) p[sizeof(head)] < param_num) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) v = param_list[p[sizeof(head)]];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) put_unaligned(cpu_to_le32(v), (s32 *)p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) p += sizeof(head) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) p++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) return rdesc_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) }