gcpad_rdesc.h revision 1.1
11.1Sjmcneill/* $NetBSD: gcpad_rdesc.h,v 1.1 2025/12/08 23:00:22 jmcneill Exp $ */
21.1Sjmcneill
31.1Sjmcneill/*-
41.1Sjmcneill * Copyright (c) 2025 Jared McNeill <jmcneill@invisible.ca>
51.1Sjmcneill * All rights reserved.
61.1Sjmcneill *
71.1Sjmcneill * Redistribution and use in source and binary forms, with or without
81.1Sjmcneill * modification, are permitted provided that the following conditions
91.1Sjmcneill * are met:
101.1Sjmcneill * 1. Redistributions of source code must retain the above copyright
111.1Sjmcneill *    notice, this list of conditions and the following disclaimer.
121.1Sjmcneill * 2. Redistributions in binary form must reproduce the above copyright
131.1Sjmcneill *    notice, this list of conditions and the following disclaimer in the
141.1Sjmcneill *    documentation and/or other materials provided with the distribution.
151.1Sjmcneill *
161.1Sjmcneill * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
171.1Sjmcneill * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
181.1Sjmcneill * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
191.1Sjmcneill * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
201.1Sjmcneill * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
211.1Sjmcneill * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
221.1Sjmcneill * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
231.1Sjmcneill * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
241.1Sjmcneill * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
251.1Sjmcneill * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
261.1Sjmcneill * SUCH DAMAGE.
271.1Sjmcneill */
281.1Sjmcneill
291.1Sjmcneillstatic uint8_t gcpad_report_descr[] = {
301.1Sjmcneill    0x05, 0x01,          // UsagePage(Generic Desktop[0x0001])
311.1Sjmcneill    0x09, 0x05,          // UsageId(Gamepad[0x0005])
321.1Sjmcneill    0xA1, 0x01,          // Collection(Application)
331.1Sjmcneill    0x85, 0x01,          //     ReportId(1)
341.1Sjmcneill    0x05, 0x09,          //     UsagePage(Button[0x0009])
351.1Sjmcneill    0x09, 0x03,          //     UsageId(Button 3[0x0003])
361.1Sjmcneill    0x09, 0x01,          //     UsageId(Button 1[0x0001])
371.1Sjmcneill    0x09, 0x02,          //     UsageId(Button 2[0x0002])
381.1Sjmcneill    0x09, 0x04,          //     UsageId(Button 4[0x0004])
391.1Sjmcneill    0x09, 0x0B,          //     UsageId(Button 11[0x000B])
401.1Sjmcneill    0x09, 0x0C,          //     UsageId(Button 12[0x000C])
411.1Sjmcneill    0x15, 0x00,          //     LogicalMinimum(0)
421.1Sjmcneill    0x25, 0x01,          //     LogicalMaximum(1)
431.1Sjmcneill    0x95, 0x06,          //     ReportCount(6)
441.1Sjmcneill    0x75, 0x01,          //     ReportSize(1)
451.1Sjmcneill    0x81, 0x02,          //     Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
461.1Sjmcneill    0x95, 0x01,          //     ReportCount(1)
471.1Sjmcneill    0x81, 0x03,          //     Input(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
481.1Sjmcneill    0x09, 0x0A,          //     UsageId(Button 10[0x000A])
491.1Sjmcneill    0x81, 0x02,          //     Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
501.1Sjmcneill    0x81, 0x03,          //     Input(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
511.1Sjmcneill    0x09, 0x09,          //     UsageId(Button 9[0x0009])
521.1Sjmcneill    0x81, 0x02,          //     Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
531.1Sjmcneill    0x75, 0x02,          //     ReportSize(2)
541.1Sjmcneill    0x81, 0x03,          //     Input(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
551.1Sjmcneill    0x09, 0x08,          //     UsageId(Button 8[0x0008])
561.1Sjmcneill    0x09, 0x06,          //     UsageId(Button 6[0x0006])
571.1Sjmcneill    0x09, 0x07,          //     UsageId(Button 7[0x0007])
581.1Sjmcneill    0x09, 0x05,          //     UsageId(Button 5[0x0005])
591.1Sjmcneill    0x95, 0x04,          //     ReportCount(4)
601.1Sjmcneill    0x75, 0x01,          //     ReportSize(1)
611.1Sjmcneill    0x81, 0x02,          //     Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
621.1Sjmcneill    0x05, 0x01,          //     UsagePage(Generic Desktop[0x0001])
631.1Sjmcneill    0x09, 0x01,          //     UsageId(Pointer[0x0001])
641.1Sjmcneill    0xA1, 0x00,          //     Collection(Physical)
651.1Sjmcneill    0x09, 0x30,          //         UsageId(X[0x0030])
661.1Sjmcneill    0x09, 0x31,          //         UsageId(Y[0x0031])
671.1Sjmcneill    0x26, 0xFF, 0x00,    //         LogicalMaximum(255)
681.1Sjmcneill    0x95, 0x02,          //         ReportCount(2)
691.1Sjmcneill    0x75, 0x08,          //         ReportSize(8)
701.1Sjmcneill    0x81, 0x02,          //         Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
711.1Sjmcneill    0xC0,                //     EndCollection()
721.1Sjmcneill    0x09, 0x01,          //     UsageId(Pointer[0x0001])
731.1Sjmcneill    0xA1, 0x00,          //     Collection(Physical)
741.1Sjmcneill    0x09, 0x32,          //         UsageId(Z[0x0032])
751.1Sjmcneill    0x09, 0x35,          //         UsageId(Rz[0x0035])
761.1Sjmcneill    0x81, 0x02,          //         Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
771.1Sjmcneill    0xC0,                //     EndCollection()
781.1Sjmcneill    0x09, 0x33,          //     UsageId(Rx[0x0033])
791.1Sjmcneill    0x09, 0x34,          //     UsageId(Ry[0x0034])
801.1Sjmcneill    0x81, 0x02,          //     Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
811.1Sjmcneill    0x95, 0x01,          //     ReportCount(1)
821.1Sjmcneill    0x81, 0x03,          //     Input(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
831.1Sjmcneill    0x85, 0x02,          //     ReportId(2)
841.1Sjmcneill    0x05, 0x09,          //     UsagePage(Button[0x0009])
851.1Sjmcneill    0x09, 0x03,          //     UsageId(Button 3[0x0003])
861.1Sjmcneill    0x09, 0x01,          //     UsageId(Button 1[0x0001])
871.1Sjmcneill    0x09, 0x02,          //     UsageId(Button 2[0x0002])
881.1Sjmcneill    0x09, 0x04,          //     UsageId(Button 4[0x0004])
891.1Sjmcneill    0x09, 0x0B,          //     UsageId(Button 11[0x000B])
901.1Sjmcneill    0x09, 0x0C,          //     UsageId(Button 12[0x000C])
911.1Sjmcneill    0x25, 0x01,          //     LogicalMaximum(1)
921.1Sjmcneill    0x95, 0x06,          //     ReportCount(6)
931.1Sjmcneill    0x75, 0x01,          //     ReportSize(1)
941.1Sjmcneill    0x81, 0x02,          //     Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
951.1Sjmcneill    0x95, 0x01,          //     ReportCount(1)
961.1Sjmcneill    0x81, 0x03,          //     Input(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
971.1Sjmcneill    0x09, 0x0A,          //     UsageId(Button 10[0x000A])
981.1Sjmcneill    0x81, 0x02,          //     Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
991.1Sjmcneill    0x81, 0x03,          //     Input(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1001.1Sjmcneill    0x09, 0x09,          //     UsageId(Button 9[0x0009])
1011.1Sjmcneill    0x81, 0x02,          //     Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1021.1Sjmcneill    0x75, 0x02,          //     ReportSize(2)
1031.1Sjmcneill    0x81, 0x03,          //     Input(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1041.1Sjmcneill    0x09, 0x08,          //     UsageId(Button 8[0x0008])
1051.1Sjmcneill    0x09, 0x06,          //     UsageId(Button 6[0x0006])
1061.1Sjmcneill    0x09, 0x07,          //     UsageId(Button 7[0x0007])
1071.1Sjmcneill    0x09, 0x05,          //     UsageId(Button 5[0x0005])
1081.1Sjmcneill    0x95, 0x04,          //     ReportCount(4)
1091.1Sjmcneill    0x75, 0x01,          //     ReportSize(1)
1101.1Sjmcneill    0x81, 0x02,          //     Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1111.1Sjmcneill    0x05, 0x01,          //     UsagePage(Generic Desktop[0x0001])
1121.1Sjmcneill    0x09, 0x01,          //     UsageId(Pointer[0x0001])
1131.1Sjmcneill    0xA1, 0x00,          //     Collection(Physical)
1141.1Sjmcneill    0x09, 0x30,          //         UsageId(X[0x0030])
1151.1Sjmcneill    0x09, 0x31,          //         UsageId(Y[0x0031])
1161.1Sjmcneill    0x26, 0xFF, 0x00,    //         LogicalMaximum(255)
1171.1Sjmcneill    0x95, 0x02,          //         ReportCount(2)
1181.1Sjmcneill    0x75, 0x08,          //         ReportSize(8)
1191.1Sjmcneill    0x81, 0x02,          //         Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1201.1Sjmcneill    0xC0,                //     EndCollection()
1211.1Sjmcneill    0x09, 0x01,          //     UsageId(Pointer[0x0001])
1221.1Sjmcneill    0xA1, 0x00,          //     Collection(Physical)
1231.1Sjmcneill    0x09, 0x32,          //         UsageId(Z[0x0032])
1241.1Sjmcneill    0x09, 0x35,          //         UsageId(Rz[0x0035])
1251.1Sjmcneill    0x81, 0x02,          //         Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1261.1Sjmcneill    0xC0,                //     EndCollection()
1271.1Sjmcneill    0x09, 0x33,          //     UsageId(Rx[0x0033])
1281.1Sjmcneill    0x09, 0x34,          //     UsageId(Ry[0x0034])
1291.1Sjmcneill    0x81, 0x02,          //     Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1301.1Sjmcneill    0x95, 0x01,          //     ReportCount(1)
1311.1Sjmcneill    0x81, 0x03,          //     Input(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1321.1Sjmcneill    0x85, 0x03,          //     ReportId(3)
1331.1Sjmcneill    0x05, 0x09,          //     UsagePage(Button[0x0009])
1341.1Sjmcneill    0x09, 0x03,          //     UsageId(Button 3[0x0003])
1351.1Sjmcneill    0x09, 0x01,          //     UsageId(Button 1[0x0001])
1361.1Sjmcneill    0x09, 0x02,          //     UsageId(Button 2[0x0002])
1371.1Sjmcneill    0x09, 0x04,          //     UsageId(Button 4[0x0004])
1381.1Sjmcneill    0x09, 0x0B,          //     UsageId(Button 11[0x000B])
1391.1Sjmcneill    0x09, 0x0C,          //     UsageId(Button 12[0x000C])
1401.1Sjmcneill    0x25, 0x01,          //     LogicalMaximum(1)
1411.1Sjmcneill    0x95, 0x06,          //     ReportCount(6)
1421.1Sjmcneill    0x75, 0x01,          //     ReportSize(1)
1431.1Sjmcneill    0x81, 0x02,          //     Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1441.1Sjmcneill    0x95, 0x01,          //     ReportCount(1)
1451.1Sjmcneill    0x81, 0x03,          //     Input(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1461.1Sjmcneill    0x09, 0x0A,          //     UsageId(Button 10[0x000A])
1471.1Sjmcneill    0x81, 0x02,          //     Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1481.1Sjmcneill    0x81, 0x03,          //     Input(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1491.1Sjmcneill    0x09, 0x09,          //     UsageId(Button 9[0x0009])
1501.1Sjmcneill    0x81, 0x02,          //     Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1511.1Sjmcneill    0x75, 0x02,          //     ReportSize(2)
1521.1Sjmcneill    0x81, 0x03,          //     Input(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1531.1Sjmcneill    0x09, 0x08,          //     UsageId(Button 8[0x0008])
1541.1Sjmcneill    0x09, 0x06,          //     UsageId(Button 6[0x0006])
1551.1Sjmcneill    0x09, 0x07,          //     UsageId(Button 7[0x0007])
1561.1Sjmcneill    0x09, 0x05,          //     UsageId(Button 5[0x0005])
1571.1Sjmcneill    0x95, 0x04,          //     ReportCount(4)
1581.1Sjmcneill    0x75, 0x01,          //     ReportSize(1)
1591.1Sjmcneill    0x81, 0x02,          //     Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1601.1Sjmcneill    0x05, 0x01,          //     UsagePage(Generic Desktop[0x0001])
1611.1Sjmcneill    0x09, 0x01,          //     UsageId(Pointer[0x0001])
1621.1Sjmcneill    0xA1, 0x00,          //     Collection(Physical)
1631.1Sjmcneill    0x09, 0x30,          //         UsageId(X[0x0030])
1641.1Sjmcneill    0x09, 0x31,          //         UsageId(Y[0x0031])
1651.1Sjmcneill    0x26, 0xFF, 0x00,    //         LogicalMaximum(255)
1661.1Sjmcneill    0x95, 0x02,          //         ReportCount(2)
1671.1Sjmcneill    0x75, 0x08,          //         ReportSize(8)
1681.1Sjmcneill    0x81, 0x02,          //         Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1691.1Sjmcneill    0xC0,                //     EndCollection()
1701.1Sjmcneill    0x09, 0x01,          //     UsageId(Pointer[0x0001])
1711.1Sjmcneill    0xA1, 0x00,          //     Collection(Physical)
1721.1Sjmcneill    0x09, 0x32,          //         UsageId(Z[0x0032])
1731.1Sjmcneill    0x09, 0x35,          //         UsageId(Rz[0x0035])
1741.1Sjmcneill    0x81, 0x02,          //         Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1751.1Sjmcneill    0xC0,                //     EndCollection()
1761.1Sjmcneill    0x09, 0x33,          //     UsageId(Rx[0x0033])
1771.1Sjmcneill    0x09, 0x34,          //     UsageId(Ry[0x0034])
1781.1Sjmcneill    0x81, 0x02,          //     Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1791.1Sjmcneill    0x95, 0x01,          //     ReportCount(1)
1801.1Sjmcneill    0x81, 0x03,          //     Input(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1811.1Sjmcneill    0x85, 0x04,          //     ReportId(4)
1821.1Sjmcneill    0x05, 0x09,          //     UsagePage(Button[0x0009])
1831.1Sjmcneill    0x09, 0x03,          //     UsageId(Button 3[0x0003])
1841.1Sjmcneill    0x09, 0x01,          //     UsageId(Button 1[0x0001])
1851.1Sjmcneill    0x09, 0x02,          //     UsageId(Button 2[0x0002])
1861.1Sjmcneill    0x09, 0x04,          //     UsageId(Button 4[0x0004])
1871.1Sjmcneill    0x09, 0x0B,          //     UsageId(Button 11[0x000B])
1881.1Sjmcneill    0x09, 0x0C,          //     UsageId(Button 12[0x000C])
1891.1Sjmcneill    0x25, 0x01,          //     LogicalMaximum(1)
1901.1Sjmcneill    0x95, 0x06,          //     ReportCount(6)
1911.1Sjmcneill    0x75, 0x01,          //     ReportSize(1)
1921.1Sjmcneill    0x81, 0x02,          //     Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1931.1Sjmcneill    0x95, 0x01,          //     ReportCount(1)
1941.1Sjmcneill    0x81, 0x03,          //     Input(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1951.1Sjmcneill    0x09, 0x0A,          //     UsageId(Button 10[0x000A])
1961.1Sjmcneill    0x81, 0x02,          //     Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1971.1Sjmcneill    0x81, 0x03,          //     Input(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
1981.1Sjmcneill    0x09, 0x09,          //     UsageId(Button 9[0x0009])
1991.1Sjmcneill    0x81, 0x02,          //     Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
2001.1Sjmcneill    0x75, 0x02,          //     ReportSize(2)
2011.1Sjmcneill    0x81, 0x03,          //     Input(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
2021.1Sjmcneill    0x09, 0x08,          //     UsageId(Button 8[0x0008])
2031.1Sjmcneill    0x09, 0x06,          //     UsageId(Button 6[0x0006])
2041.1Sjmcneill    0x09, 0x07,          //     UsageId(Button 7[0x0007])
2051.1Sjmcneill    0x09, 0x05,          //     UsageId(Button 5[0x0005])
2061.1Sjmcneill    0x95, 0x04,          //     ReportCount(4)
2071.1Sjmcneill    0x75, 0x01,          //     ReportSize(1)
2081.1Sjmcneill    0x81, 0x02,          //     Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
2091.1Sjmcneill    0x05, 0x01,          //     UsagePage(Generic Desktop[0x0001])
2101.1Sjmcneill    0x09, 0x01,          //     UsageId(Pointer[0x0001])
2111.1Sjmcneill    0xA1, 0x00,          //     Collection(Physical)
2121.1Sjmcneill    0x09, 0x30,          //         UsageId(X[0x0030])
2131.1Sjmcneill    0x09, 0x31,          //         UsageId(Y[0x0031])
2141.1Sjmcneill    0x26, 0xFF, 0x00,    //         LogicalMaximum(255)
2151.1Sjmcneill    0x95, 0x02,          //         ReportCount(2)
2161.1Sjmcneill    0x75, 0x08,          //         ReportSize(8)
2171.1Sjmcneill    0x81, 0x02,          //         Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
2181.1Sjmcneill    0xC0,                //     EndCollection()
2191.1Sjmcneill    0x09, 0x01,          //     UsageId(Pointer[0x0001])
2201.1Sjmcneill    0xA1, 0x00,          //     Collection(Physical)
2211.1Sjmcneill    0x09, 0x32,          //         UsageId(Z[0x0032])
2221.1Sjmcneill    0x09, 0x35,          //         UsageId(Rz[0x0035])
2231.1Sjmcneill    0x81, 0x02,          //         Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
2241.1Sjmcneill    0xC0,                //     EndCollection()
2251.1Sjmcneill    0x09, 0x33,          //     UsageId(Rx[0x0033])
2261.1Sjmcneill    0x09, 0x34,          //     UsageId(Ry[0x0034])
2271.1Sjmcneill    0x81, 0x02,          //     Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
2281.1Sjmcneill    0x95, 0x01,          //     ReportCount(1)
2291.1Sjmcneill    0x81, 0x03,          //     Input(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
2301.1Sjmcneill    0xC0,                // EndCollection()
2311.1Sjmcneill};
232