xref: /btstack/src/btstack_hid.c (revision 2fca4dad957cd7b88f4657ed51e89c12615dda72)
13cbedd43SMatthias Ringwald /*
23cbedd43SMatthias Ringwald  * Copyright (C) 2021 BlueKitchen GmbH
33cbedd43SMatthias Ringwald  *
43cbedd43SMatthias Ringwald  * Redistribution and use in source and binary forms, with or without
53cbedd43SMatthias Ringwald  * modification, are permitted provided that the following conditions
63cbedd43SMatthias Ringwald  * are met:
73cbedd43SMatthias Ringwald  *
83cbedd43SMatthias Ringwald  * 1. Redistributions of source code must retain the above copyright
93cbedd43SMatthias Ringwald  *    notice, this list of conditions and the following disclaimer.
103cbedd43SMatthias Ringwald  * 2. Redistributions in binary form must reproduce the above copyright
113cbedd43SMatthias Ringwald  *    notice, this list of conditions and the following disclaimer in the
123cbedd43SMatthias Ringwald  *    documentation and/or other materials provided with the distribution.
133cbedd43SMatthias Ringwald  * 3. Neither the name of the copyright holders nor the names of
143cbedd43SMatthias Ringwald  *    contributors may be used to endorse or promote products derived
153cbedd43SMatthias Ringwald  *    from this software without specific prior written permission.
163cbedd43SMatthias Ringwald  * 4. Any redistribution, use, or modification is done solely for
173cbedd43SMatthias Ringwald  *    personal benefit and not for any commercial purpose or for
183cbedd43SMatthias Ringwald  *    monetary gain.
193cbedd43SMatthias Ringwald  *
203cbedd43SMatthias Ringwald  * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
213cbedd43SMatthias Ringwald  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
223cbedd43SMatthias Ringwald  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23*2fca4dadSMilanka Ringwald  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN
24*2fca4dadSMilanka Ringwald  * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
253cbedd43SMatthias Ringwald  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
263cbedd43SMatthias Ringwald  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
273cbedd43SMatthias Ringwald  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
283cbedd43SMatthias Ringwald  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
293cbedd43SMatthias Ringwald  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
303cbedd43SMatthias Ringwald  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
313cbedd43SMatthias Ringwald  * SUCH DAMAGE.
323cbedd43SMatthias Ringwald  *
333cbedd43SMatthias Ringwald  * Please inquire about commercial licensing options at
343cbedd43SMatthias Ringwald  * [email protected]
353cbedd43SMatthias Ringwald  *
363cbedd43SMatthias Ringwald  */
373cbedd43SMatthias Ringwald 
383cbedd43SMatthias Ringwald #include "btstack_hid.h"
393cbedd43SMatthias Ringwald 
403cbedd43SMatthias Ringwald 
413cbedd43SMatthias Ringwald // from USB HID Specification 1.1, Appendix B.1
42e9933dfeSMatthias Ringwald const uint8_t btstack_hid_descriptor_boot_mode[] = {
433cbedd43SMatthias Ringwald     // Keyboard
443cbedd43SMatthias Ringwald 
453cbedd43SMatthias Ringwald     0x05, 0x01,                    // Usage Page (Generic Desktop)
463cbedd43SMatthias Ringwald     0x09, 0x06,                    // Usage (Keyboard)
473cbedd43SMatthias Ringwald     0xa1, 0x01,                    // Collection (Application)
483cbedd43SMatthias Ringwald 
493cbedd43SMatthias Ringwald     0x85,  0x01,                   // Report ID 1
503cbedd43SMatthias Ringwald 
513cbedd43SMatthias Ringwald     // Modifier byte
523cbedd43SMatthias Ringwald 
533cbedd43SMatthias Ringwald     0x75, 0x01,                    //   Report Size (1)
543cbedd43SMatthias Ringwald     0x95, 0x08,                    //   Report Count (8)
553cbedd43SMatthias Ringwald     0x05, 0x07,                    //   Usage Page (Key codes)
563cbedd43SMatthias Ringwald     0x19, 0xe0,                    //   Usage Minimum (Keyboard LeftControl)
573cbedd43SMatthias Ringwald     0x29, 0xe7,                    //   Usage Maxium (Keyboard Right GUI)
583cbedd43SMatthias Ringwald     0x15, 0x00,                    //   Logical Minimum (0)
593cbedd43SMatthias Ringwald     0x25, 0x01,                    //   Logical Maximum (1)
603cbedd43SMatthias Ringwald     0x81, 0x02,                    //   Input (Data, Variable, Absolute)
613cbedd43SMatthias Ringwald 
623cbedd43SMatthias Ringwald     // Reserved byte
633cbedd43SMatthias Ringwald 
643cbedd43SMatthias Ringwald     0x75, 0x01,                    //   Report Size (1)
653cbedd43SMatthias Ringwald     0x95, 0x08,                    //   Report Count (8)
663cbedd43SMatthias Ringwald     0x81, 0x03,                    //   Input (Constant, Variable, Absolute)
673cbedd43SMatthias Ringwald 
683cbedd43SMatthias Ringwald     // LED report + padding
693cbedd43SMatthias Ringwald 
703cbedd43SMatthias Ringwald     0x95, 0x05,                    //   Report Count (5)
713cbedd43SMatthias Ringwald     0x75, 0x01,                    //   Report Size (1)
723cbedd43SMatthias Ringwald     0x05, 0x08,                    //   Usage Page (LEDs)
733cbedd43SMatthias Ringwald     0x19, 0x01,                    //   Usage Minimum (Num Lock)
743cbedd43SMatthias Ringwald     0x29, 0x05,                    //   Usage Maxium (Kana)
753cbedd43SMatthias Ringwald     0x91, 0x02,                    //   Output (Data, Variable, Absolute)
763cbedd43SMatthias Ringwald 
773cbedd43SMatthias Ringwald     0x95, 0x01,                    //   Report Count (1)
783cbedd43SMatthias Ringwald     0x75, 0x03,                    //   Report Size (3)
793cbedd43SMatthias Ringwald     0x91, 0x03,                    //   Output (Constant, Variable, Absolute)
803cbedd43SMatthias Ringwald 
813cbedd43SMatthias Ringwald     // Keycodes
823cbedd43SMatthias Ringwald 
833cbedd43SMatthias Ringwald     0x95, 0x06,                    //   Report Count (6)
843cbedd43SMatthias Ringwald     0x75, 0x08,                    //   Report Size (8)
853cbedd43SMatthias Ringwald     0x15, 0x00,                    //   Logical Minimum (0)
863cbedd43SMatthias Ringwald     0x25, 0xff,                    //   Logical Maximum (1)
873cbedd43SMatthias Ringwald     0x05, 0x07,                    //   Usage Page (Key codes)
883cbedd43SMatthias Ringwald     0x19, 0x00,                    //   Usage Minimum (Reserved (no event indicated))
893cbedd43SMatthias Ringwald     0x29, 0xff,                    //   Usage Maxium (Reserved)
903cbedd43SMatthias Ringwald     0x81, 0x00,                    //   Input (Data, Array)
913cbedd43SMatthias Ringwald 
923cbedd43SMatthias Ringwald     0xc0,                          // End collection
933cbedd43SMatthias Ringwald 
943cbedd43SMatthias Ringwald     // Mouse
953cbedd43SMatthias Ringwald     0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
963cbedd43SMatthias Ringwald     0x09, 0x02,                    // USAGE (Mouse)
973cbedd43SMatthias Ringwald     0xa1, 0x01,                    // COLLECTION (Application)
983cbedd43SMatthias Ringwald 
993cbedd43SMatthias Ringwald     0x85,  0x01,                    // Report ID 1
1003cbedd43SMatthias Ringwald 
1013cbedd43SMatthias Ringwald     0x09, 0x01,                    //   USAGE (Pointer)
1023cbedd43SMatthias Ringwald 
1033cbedd43SMatthias Ringwald     0xa1, 0x00,                    //   COLLECTION (Physical)
1043cbedd43SMatthias Ringwald 
1053cbedd43SMatthias Ringwald #if 1
1063cbedd43SMatthias Ringwald     0x05, 0x09,                    //     USAGE_PAGE (Button)
1073cbedd43SMatthias Ringwald     0x19, 0x01,                    //     USAGE_MINIMUM (Button 1)
1083cbedd43SMatthias Ringwald     0x29, 0x03,                    //     USAGE_MAXIMUM (Button 3)
1093cbedd43SMatthias Ringwald     0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
1103cbedd43SMatthias Ringwald     0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)
1113cbedd43SMatthias Ringwald     0x95, 0x03,                    //     REPORT_COUNT (3)
1123cbedd43SMatthias Ringwald     0x75, 0x01,                    //     REPORT_SIZE (1)
1133cbedd43SMatthias Ringwald     0x81, 0x02,                    //     INPUT (Data,Var,Abs)
1143cbedd43SMatthias Ringwald     0x95, 0x01,                    //     REPORT_COUNT (1)
1153cbedd43SMatthias Ringwald     0x75, 0x05,                    //     REPORT_SIZE (5)
1163cbedd43SMatthias Ringwald     0x81, 0x03,                    //     INPUT (Cnst,Var,Abs)
1173cbedd43SMatthias Ringwald #endif
1183cbedd43SMatthias Ringwald 
1193cbedd43SMatthias Ringwald #if 1
1203cbedd43SMatthias Ringwald     0x05, 0x01,                    //     USAGE_PAGE (Generic Desktop)
1213cbedd43SMatthias Ringwald     0x09, 0x30,                    //     USAGE (X)
1223cbedd43SMatthias Ringwald     0x09, 0x31,                    //     USAGE (Y)
1233cbedd43SMatthias Ringwald     0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)
1243cbedd43SMatthias Ringwald     0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)
1253cbedd43SMatthias Ringwald     0x75, 0x08,                    //     REPORT_SIZE (8)
1263cbedd43SMatthias Ringwald     0x95, 0x02,                    //     REPORT_COUNT (2)
1273cbedd43SMatthias Ringwald     0x81, 0x06,                    //     INPUT (Data,Var,Rel)
1283cbedd43SMatthias Ringwald #endif
1293cbedd43SMatthias Ringwald 
1303cbedd43SMatthias Ringwald     0xc0,                          //   END_COLLECTION
1313cbedd43SMatthias Ringwald     0xc0                           // END_COLLECTION
1323cbedd43SMatthias Ringwald };
1333cbedd43SMatthias Ringwald 
btstack_hid_get_boot_descriptor_data(void)134e9933dfeSMatthias Ringwald const uint8_t * btstack_hid_get_boot_descriptor_data(void){
135e9933dfeSMatthias Ringwald     return &btstack_hid_descriptor_boot_mode[0];
1363cbedd43SMatthias Ringwald }
1373cbedd43SMatthias Ringwald 
btstack_hid_get_boot_descriptor_len(void)138e9933dfeSMatthias Ringwald uint16_t btstack_hid_get_boot_descriptor_len(void){
139e9933dfeSMatthias Ringwald     return sizeof(btstack_hid_descriptor_boot_mode);
1403cbedd43SMatthias Ringwald }
1413cbedd43SMatthias Ringwald 
142