xref: /btstack/src/classic/hid_device.h (revision 8aee7be2bb0c8b43bca4bd821fe34961b31db7aa)
1 /*
2  * Copyright (C) 2014 BlueKitchen GmbH
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the copyright holders nor the names of
14  *    contributors may be used to endorse or promote products derived
15  *    from this software without specific prior written permission.
16  * 4. Any redistribution, use, or modification is done solely for
17  *    personal benefit and not for any commercial purpose or for
18  *    monetary gain.
19  *
20  * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
21  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
24  * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
27  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
30  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  * Please inquire about commercial licensing options at
34  * [email protected]
35  *
36  */
37 
38 #ifndef __HID_DEVICE_H
39 #define __HID_DEVICE_H
40 
41 #include <stdint.h>
42 #include "btstack_defines.h"
43 #include "bluetooth.h"
44 
45 #if defined __cplusplus
46 extern "C" {
47 #endif
48 
49 /* API_START */
50 
51 typedef enum {
52     HID_MESSAGE_TYPE_HANDSHAKE = 0,
53     HID_MESSAGE_TYPE_HID_CONTROL,
54     HID_MESSAGE_TYPE_RESERVED_2,
55     HID_MESSAGE_TYPE_RESERVED_3,
56     HID_MESSAGE_TYPE_GET_REPORT,
57     HID_MESSAGE_TYPE_SET_REPORT,
58     HID_MESSAGE_TYPE_GET_PROTOCOL,
59     HID_MESSAGE_TYPE_SET_PROTOCOL,
60     HID_MESSAGE_TYPE_GET_IDLE_DEPRECATED,
61     HID_MESSAGE_TYPE_SET_IDLE_DEPRECATED,
62     HID_MESSAGE_TYPE_DATA,
63     HID_MESSAGE_TYPE_DATC_DEPRECATED
64 } hid_message_type_t;
65 
66 typedef enum {
67     HID_HANDSHAKE_PARAM_TYPE_SUCCESSFUL = 0x00,        // This code is used to acknowledge requests. A device that has correctly received SET_REPORT, SET_IDLE or SET_PROTOCOL payload transmits an acknowledgment to the host.
68     HID_HANDSHAKE_PARAM_TYPE_NOT_READY,                // This code indicates that a device is too busy to accept data. The Bluetooth HID Host should retransmit the data the next time it communicates with the device.
69     HID_HANDSHAKE_PARAM_TYPE_ERR_INVALID_REPORT_ID,    // Invalid report ID transmitted.
70     HID_HANDSHAKE_PARAM_TYPE_ERR_UNSUPPORTED_REQUEST,  // The device does not support the request. This result code shall be used if the HIDP message type is unsupported.
71     HID_HANDSHAKE_PARAM_TYPE_ERR_INVALID_PARAMETER,    // A parameter value is out of range or inappropriate for the request.
72     HID_HANDSHAKE_PARAM_TYPE_ERR_UNKNOWN = 0x0E        // Device could not identify the error condition. 0xF = ERR_FATAL. Restart is essential to resume functionality.
73 } hid_handshake_param_type_t;
74 
75 typedef enum {
76     HID_CONTROL_NOP_DEPRECATED = 0,                    // Deprecated: No Operation.
77     HID_CONTROL_HARD_RESET_DEPRECATED,                 // Deprecated: Device performs Power On System Test (POST) then initializes all internal variables and initiates normal operations.
78     HID_CONTROL_SOFT_RESET_DEPRECATED,                 // Deprecated: Device initializes all internal variables and initiates normal operations.
79     HID_CONTROL_SUSPEND = 0x03,                        // Go to reduced power mode.
80     HID_CONTROL_EXIT_SUSPEND,                          // Exit reduced power mode.
81     HID_CONTROL_VIRTUAL_CABLE_UNPLUG
82 } hid_control_param_t;
83 
84 typedef enum {
85     HID_REPORT_TYPE_RESERVED = 0,
86     HID_REPORT_TYPE_INPUT,
87     HID_REPORT_TYPE_OUTPUT,
88     HID_REPORT_TYPE_FEATURE
89 } hid_report_type_t;
90 
91 
92 /**
93  * @brief Create HID Device SDP service record.
94  * @param service Empty buffer in which a new service record will be stored.
95  * @param have_remote_audio_control
96  * @param service
97  * @param service_record_handle
98  * @param hid_device_subclass
99  * @param hid_country_code
100  * @param hid_virtual_cable
101  * @param hid_reconnect_initiate
102  * @param hid_boot_device
103  * @param hid_descriptor
104  * @param hid_descriptor_size size of hid_descriptor
105  * @param device_name
106  */
107 void hid_create_sdp_record(
108     uint8_t *       service,
109     uint32_t        service_record_handle,
110     uint16_t        hid_device_subclass,
111     uint8_t         hid_country_code,
112     uint8_t         hid_virtual_cable,
113     uint8_t         hid_reconnect_initiate,
114     uint8_t         hid_boot_device,
115     const uint8_t * hid_descriptor,
116     uint16_t 		hid_descriptor_size,
117     const char *    device_name);
118 
119 
120 /**
121  * @brief Set up HID Device
122  */
123 void hid_device_init(void);
124 
125 /**
126  * @brief Register callback for the HID Device client.
127  * @param callback
128  */
129 void hid_device_register_packet_handler(btstack_packet_handler_t callback);
130 
131 /**
132  * @brief Register callback for the HID Device client.
133  * @param callback
134  */
135 void hid_device_register_report_request_callback(void (*callback) (uint16_t hid_cid, hid_report_type_t report_type, uint16_t report_id, uint8_t report_max_size, int * out_report_size, uint8_t * out_report));
136 
137 /*
138  * @brief Create HID connection to HID Host
139  * @param addr
140  * @param hid_cid to use for other commands
141  * @result status
142  */
143 uint8_t hid_device_connect(bd_addr_t addr, uint16_t * hid_cid);
144 
145 /**
146  * @brief Request can send now event to send HID Report
147  * Generates an HID_SUBEVENT_CAN_SEND_NOW subevent
148  * @param hid_cid
149  */
150 void hid_device_request_can_send_now_event(uint16_t hid_cid);
151 
152 /**
153  * @brief Send HID messageon interrupt channel
154  * @param hid_cid
155  */
156 void hid_device_send_interrupt_message(uint16_t hid_cid, const uint8_t * message, uint16_t message_len);
157 
158 /**
159  * @brief Send HID messageon control channel
160  * @param hid_cid
161  */
162 void hid_device_send_control_message(uint16_t hid_cid, const uint8_t * message, uint16_t message_len);
163 
164 
165 /* API_END */
166 
167 #if defined __cplusplus
168 }
169 #endif
170 
171 #endif
172