1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause 3 * 4 * Copyright (c) 2020 Vladimir Kondratyev <wulf@FreeBSD.org> 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * 27 * This a proxy file for replacements for broken HID report descriptors. 28 */ 29 30 #define UHID_GRAPHIRE_REPORT_DESCR(...) \ 31 0x05, 0x0d, /* USAGE_PAGE (Digitizers) */\ 32 0x09, 0x01, /* USAGE (Digitizer) */\ 33 0xa1, 0x01, /* COLLECTION (Application) */\ 34 0x85, 0x02, /* REPORT_ID (2) */\ 35 0x05, 0x0d, /* USAGE_PAGE (Digitizers) */\ 36 0x09, 0x01, /* USAGE (Digitizer) */\ 37 0xa1, 0x00, /* COLLECTION (Physical) */\ 38 0x15, 0x00, /* LOGICAL_MINIMUM (0) */\ 39 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */\ 40 0x09, 0x33, /* USAGE (Touch) */\ 41 0x95, 0x01, /* REPORT_COUNT (1) */\ 42 0x75, 0x01, /* REPORT_SIZE (1) */\ 43 0x81, 0x02, /* INPUT (Data,Var,Abs) */\ 44 0x09, 0x44, /* USAGE (Barrel Switch) */\ 45 0x95, 0x02, /* REPORT_COUNT (2) */\ 46 0x75, 0x01, /* REPORT_SIZE (1) */\ 47 0x81, 0x02, /* INPUT (Data,Var,Abs) */\ 48 0x09, 0x00, /* USAGE (Undefined) */\ 49 0x95, 0x02, /* REPORT_COUNT (2) */\ 50 0x75, 0x01, /* REPORT_SIZE (1) */\ 51 0x81, 0x03, /* INPUT (Cnst,Var,Abs) */\ 52 0x09, 0x3c, /* USAGE (Invert) */\ 53 0x95, 0x01, /* REPORT_COUNT (1) */\ 54 0x75, 0x01, /* REPORT_SIZE (1) */\ 55 0x81, 0x02, /* INPUT (Data,Var,Abs) */\ 56 0x09, 0x38, /* USAGE (Transducer Index) */\ 57 0x95, 0x01, /* REPORT_COUNT (1) */\ 58 0x75, 0x01, /* REPORT_SIZE (1) */\ 59 0x81, 0x02, /* INPUT (Data,Var,Abs) */\ 60 0x09, 0x32, /* USAGE (In Range) */\ 61 0x95, 0x01, /* REPORT_COUNT (1) */\ 62 0x75, 0x01, /* REPORT_SIZE (1) */\ 63 0x81, 0x02, /* INPUT (Data,Var,Abs) */\ 64 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */\ 65 0x09, 0x30, /* USAGE (X) */\ 66 0x15, 0x00, /* LOGICAL_MINIMUM (0) */\ 67 0x26, 0xde, 0x27, /* LOGICAL_MAXIMUM (10206) */\ 68 0x95, 0x01, /* REPORT_COUNT (1) */\ 69 0x75, 0x10, /* REPORT_SIZE (16) */\ 70 0x81, 0x02, /* INPUT (Data,Var,Abs) */\ 71 0x09, 0x31, /* USAGE (Y) */\ 72 0x26, 0xfe, 0x1c, /* LOGICAL_MAXIMUM (7422) */\ 73 0x95, 0x01, /* REPORT_COUNT (1) */\ 74 0x75, 0x10, /* REPORT_SIZE (16) */\ 75 0x81, 0x02, /* INPUT (Data,Var,Abs) */\ 76 0x05, 0x0d, /* USAGE_PAGE (Digitizers) */\ 77 0x09, 0x30, /* USAGE (Tip Pressure) */\ 78 0x26, 0xff, 0x01, /* LOGICAL_MAXIMUM (511) */\ 79 0x95, 0x01, /* REPORT_COUNT (1) */\ 80 0x75, 0x10, /* REPORT_SIZE (16) */\ 81 0x81, 0x02, /* INPUT (Data,Var,Abs) */\ 82 0xc0, /* END_COLLECTION */\ 83 0x05, 0x0d, /* USAGE_PAGE (Digitizers) */\ 84 0x09, 0x00, /* USAGE (Undefined) */\ 85 0x85, 0x02, /* REPORT_ID (2) */\ 86 0x95, 0x01, /* REPORT_COUNT (1) */\ 87 0xb1, 0x02, /* FEATURE (Data,Var,Abs) */\ 88 0x09, 0x00, /* USAGE (Undefined) */\ 89 0x85, 0x03, /* REPORT_ID (3) */\ 90 0x95, 0x01, /* REPORT_COUNT (1) */\ 91 0xb1, 0x02, /* FEATURE (Data,Var,Abs) */\ 92 0xc0, /* END_COLLECTION */\ 93 94 #define UHID_GRAPHIRE3_4X5_REPORT_DESCR(...) \ 95 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */\ 96 0x09, 0x02, /* USAGE (Mouse) */\ 97 0xa1, 0x01, /* COLLECTION (Application) */\ 98 0x85, 0x01, /* REPORT_ID (1) */\ 99 0x09, 0x01, /* USAGE (Pointer) */\ 100 0xa1, 0x00, /* COLLECTION (Physical) */\ 101 0x05, 0x09, /* USAGE_PAGE (Button) */\ 102 0x19, 0x01, /* USAGE_MINIMUM (Button 1) */\ 103 0x29, 0x03, /* USAGE_MAXIMUM (Button 3) */\ 104 0x15, 0x00, /* LOGICAL_MINIMUM (0) */\ 105 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */\ 106 0x95, 0x03, /* REPORT_COUNT (3) */\ 107 0x75, 0x01, /* REPORT_SIZE (1) */\ 108 0x81, 0x02, /* INPUT (Data,Var,Abs) */\ 109 0x95, 0x01, /* REPORT_COUNT (1) */\ 110 0x75, 0x05, /* REPORT_SIZE (5) */\ 111 0x81, 0x01, /* INPUT (Cnst,Ary,Abs) */\ 112 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */\ 113 0x09, 0x30, /* USAGE (X) */\ 114 0x09, 0x31, /* USAGE (Y) */\ 115 0x09, 0x38, /* USAGE (Wheel) */\ 116 0x15, 0x81, /* LOGICAL_MINIMUM (-127) */\ 117 0x25, 0x7f, /* LOGICAL_MAXIMUM (127) */\ 118 0x75, 0x08, /* REPORT_SIZE (8) */\ 119 0x95, 0x03, /* REPORT_COUNT (3) */\ 120 0x81, 0x06, /* INPUT (Data,Var,Rel) */\ 121 0xc0, /* END_COLLECTION */\ 122 0xc0, /* END_COLLECTION */\ 123 0x05, 0x0d, /* USAGE_PAGE (Digitizers) */\ 124 0x09, 0x01, /* USAGE (Pointer) */\ 125 0xa1, 0x01, /* COLLECTION (Applicaption) */\ 126 0x85, 0x02, /* REPORT_ID (2) */\ 127 0x05, 0x0d, /* USAGE_PAGE (Digitizers) */\ 128 0x09, 0x01, /* USAGE (Digitizer) */\ 129 0xa1, 0x00, /* COLLECTION (Physical) */\ 130 0x09, 0x33, /* USAGE (Touch) */\ 131 0x09, 0x44, /* USAGE (Barrel Switch) */\ 132 0x09, 0x44, /* USAGE (Barrel Switch) */\ 133 0x15, 0x00, /* LOGICAL_MINIMUM (0) */\ 134 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */\ 135 0x75, 0x01, /* REPORT_SIZE (1) */\ 136 0x95, 0x03, /* REPORT_COUNT (3) */\ 137 0x81, 0x02, /* INPUT (Data,Var,Abs) */\ 138 0x75, 0x01, /* REPORT_SIZE (1) */\ 139 0x95, 0x02, /* REPORT_COUNT (2) */\ 140 0x81, 0x01, /* INPUT (Cnst,Ary,Abs) */\ 141 0x09, 0x3c, /* USAGE (Invert) */\ 142 0x09, 0x38, /* USAGE (Transducer Index) */\ 143 0x09, 0x32, /* USAGE (In Range) */\ 144 0x75, 0x01, /* REPORT_SIZE (1) */\ 145 0x95, 0x03, /* REPORT_COUNT (3) */\ 146 0x81, 0x02, /* INPUT (Data,Var,Abs) */\ 147 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */\ 148 0x09, 0x30, /* USAGE (X) */\ 149 0x15, 0x00, /* LOGICAL_MINIMUM (0) */\ 150 0x26, 0xde, 0x27, /* LOGICAL_MAXIMUM (10206) */\ 151 0x75, 0x10, /* REPORT_SIZE (16) */\ 152 0x95, 0x01, /* REPORT_COUNT (1) */\ 153 0x81, 0x02, /* INPUT (Data,Var,Abs) */\ 154 0x09, 0x31, /* USAGE (Y) */\ 155 0x26, 0xfe, 0x1c, /* LOGICAL_MAXIMUM (7422) */\ 156 0x75, 0x10, /* REPORT_SIZE (16) */\ 157 0x95, 0x01, /* REPORT_COUNT (1) */\ 158 0x81, 0x02, /* INPUT (Data,Var,Abs) */\ 159 0x05, 0x0d, /* USAGE_PAGE (Digitizers) */\ 160 0x09, 0x30, /* USAGE (Tip Pressure) */\ 161 0x26, 0xff, 0x01, /* LOGICAL_MAXIMUM (511) */\ 162 0x75, 0x10, /* REPORT_SIZE (16) */\ 163 0x95, 0x01, /* REPORT_COUNT (1) */\ 164 0x81, 0x02, /* INPUT (Data,Var,Abs) */\ 165 0xc0, /* END_COLLECTION */\ 166 0x05, 0x0d, /* USAGE_PAGE (Digitizers) */\ 167 0x09, 0x00, /* USAGE (Undefined) */\ 168 0x85, 0x02, /* REPORT_ID (2) */\ 169 0x95, 0x01, /* REPORT_COUNT (1) */\ 170 0xb1, 0x02, /* FEATURE (Data,Var,Abs) */\ 171 0x09, 0x00, /* USAGE (Undefined) */\ 172 0x85, 0x03, /* REPORT_ID (3) */\ 173 0x95, 0x01, /* REPORT_COUNT (1) */\ 174 0xb1, 0x02, /* FEATURE (Data,Var,Abs) */\ 175 0xc0 /* END_COLLECTION */\ 176 177 /* 178 * The descriptor has no output report format, thus preventing you from 179 * controlling the LEDs and the built-in rumblers. 180 */ 181 #define UHID_XB360GP_REPORT_DESCR(...) \ 182 0x05, 0x01, /* USAGE PAGE (Generic Desktop) */\ 183 0x09, 0x05, /* USAGE (Gamepad) */\ 184 0xa1, 0x01, /* COLLECTION (Application) */\ 185 /* Unused */\ 186 0x75, 0x08, /* REPORT SIZE (8) */\ 187 0x95, 0x01, /* REPORT COUNT (1) */\ 188 0x81, 0x01, /* INPUT (Constant) */\ 189 /* Byte count */\ 190 0x75, 0x08, /* REPORT SIZE (8) */\ 191 0x95, 0x01, /* REPORT COUNT (1) */\ 192 0x05, 0x01, /* USAGE PAGE (Generic Desktop) */\ 193 0x09, 0x3b, /* USAGE (Byte Count) */\ 194 0x81, 0x01, /* INPUT (Constant) */\ 195 /* D-Pad */\ 196 0x05, 0x01, /* USAGE PAGE (Generic Desktop) */\ 197 0x09, 0x01, /* USAGE (Pointer) */\ 198 0xa1, 0x00, /* COLLECTION (Physical) */\ 199 0x75, 0x01, /* REPORT SIZE (1) */\ 200 0x15, 0x00, /* LOGICAL MINIMUM (0) */\ 201 0x25, 0x01, /* LOGICAL MAXIMUM (1) */\ 202 0x35, 0x00, /* PHYSICAL MINIMUM (0) */\ 203 0x45, 0x01, /* PHYSICAL MAXIMUM (1) */\ 204 0x95, 0x04, /* REPORT COUNT (4) */\ 205 0x05, 0x01, /* USAGE PAGE (Generic Desktop) */\ 206 0x09, 0x90, /* USAGE (D-Pad Up) */\ 207 0x09, 0x91, /* USAGE (D-Pad Down) */\ 208 0x09, 0x93, /* USAGE (D-Pad Left) */\ 209 0x09, 0x92, /* USAGE (D-Pad Right) */\ 210 0x81, 0x02, /* INPUT (Data, Variable, Absolute) */\ 211 0xc0, /* END COLLECTION */\ 212 /* Buttons 5-11 */\ 213 0x75, 0x01, /* REPORT SIZE (1) */\ 214 0x15, 0x00, /* LOGICAL MINIMUM (0) */\ 215 0x25, 0x01, /* LOGICAL MAXIMUM (1) */\ 216 0x35, 0x00, /* PHYSICAL MINIMUM (0) */\ 217 0x45, 0x01, /* PHYSICAL MAXIMUM (1) */\ 218 0x95, 0x07, /* REPORT COUNT (7) */\ 219 0x05, 0x09, /* USAGE PAGE (Button) */\ 220 0x09, 0x08, /* USAGE (Button 8) */\ 221 0x09, 0x07, /* USAGE (Button 7) */\ 222 0x09, 0x09, /* USAGE (Button 9) */\ 223 0x09, 0x0a, /* USAGE (Button 10) */\ 224 0x09, 0x05, /* USAGE (Button 5) */\ 225 0x09, 0x06, /* USAGE (Button 6) */\ 226 0x09, 0x0b, /* USAGE (Button 11) */\ 227 0x81, 0x02, /* INPUT (Data, Variable, Absolute) */\ 228 /* Unused */\ 229 0x75, 0x01, /* REPORT SIZE (1) */\ 230 0x95, 0x01, /* REPORT COUNT (1) */\ 231 0x81, 0x01, /* INPUT (Constant) */\ 232 /* Buttons 1-4 */\ 233 0x75, 0x01, /* REPORT SIZE (1) */\ 234 0x15, 0x00, /* LOGICAL MINIMUM (0) */\ 235 0x25, 0x01, /* LOGICAL MAXIMUM (1) */\ 236 0x35, 0x00, /* PHYSICAL MINIMUM (0) */\ 237 0x45, 0x01, /* PHYSICAL MAXIMUM (1) */\ 238 0x95, 0x04, /* REPORT COUNT (4) */\ 239 0x05, 0x09, /* USAGE PAGE (Button) */\ 240 0x19, 0x01, /* USAGE MINIMUM (Button 1) */\ 241 0x29, 0x04, /* USAGE MAXIMUM (Button 4) */\ 242 0x81, 0x02, /* INPUT (Data, Variable, Absolute) */\ 243 /* Triggers */\ 244 0x75, 0x08, /* REPORT SIZE (8) */\ 245 0x15, 0x00, /* LOGICAL MINIMUM (0) */\ 246 0x26, 0xff, 0x00, /* LOGICAL MAXIMUM (255) */\ 247 0x35, 0x00, /* PHYSICAL MINIMUM (0) */\ 248 0x46, 0xff, 0x00, /* PHYSICAL MAXIMUM (255) */\ 249 0x95, 0x02, /* REPORT SIZE (2) */\ 250 0x05, 0x01, /* USAGE PAGE (Generic Desktop) */\ 251 0x09, 0x32, /* USAGE (Z) */\ 252 0x09, 0x35, /* USAGE (Rz) */\ 253 0x81, 0x02, /* INPUT (Data, Variable, Absolute) */\ 254 /* Sticks */\ 255 0x75, 0x10, /* REPORT SIZE (16) */\ 256 0x16, 0x00, 0x80, /* LOGICAL MINIMUM (-32768) */\ 257 0x26, 0xff, 0x7f, /* LOGICAL MAXIMUM (32767) */\ 258 0x36, 0x00, 0x80, /* PHYSICAL MINIMUM (-32768) */\ 259 0x46, 0xff, 0x7f, /* PHYSICAL MAXIMUM (32767) */\ 260 0x95, 0x04, /* REPORT COUNT (4) */\ 261 0x05, 0x01, /* USAGE PAGE (Generic Desktop) */\ 262 0x09, 0x30, /* USAGE (X) */\ 263 0x09, 0x31, /* USAGE (Y) */\ 264 0x09, 0x33, /* USAGE (Rx) */\ 265 0x09, 0x34, /* USAGE (Ry) */\ 266 0x81, 0x02, /* INPUT (Data, Variable, Absolute) */\ 267 /* Unused */\ 268 0x75, 0x30, /* REPORT SIZE (48) */\ 269 0x95, 0x01, /* REPORT COUNT (1) */\ 270 0x81, 0x01, /* INPUT (Constant) */\ 271 0xc0 /* END COLLECTION */\ 272 273