xref: /btstack/src/classic/hid_device.c (revision 6c8af51cd8ad0a0d53fc3934daf633474c3bec06)
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 BLUEKITCHEN
24  * GMBH 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 #define BTSTACK_FILE__ "hid_device.c"
39 
40 #include <string.h>
41 
42 #include "bluetooth.h"
43 #include "bluetooth_psm.h"
44 #include "bluetooth_sdp.h"
45 #include "btstack_debug.h"
46 #include "btstack_event.h"
47 #include "btstack_hid_parser.h"
48 #include "classic/hid_device.h"
49 #include "classic/sdp_util.h"
50 #include "l2cap.h"
51 
52 // prototypes
53 static int dummy_write_report(uint16_t hid_cid, hid_report_type_t report_type, uint16_t report_id, int * out_report_size, uint8_t * out_report);
54 static void dummy_set_report(uint16_t hid_cid, hid_report_type_t report_type, int report_size, uint8_t * report);
55 static void dummy_report_data(uint16_t hid_cid, hid_report_type_t report_type, uint16_t report_id, int report_size, uint8_t * report);
56 
57 typedef enum {
58     HID_DEVICE_IDLE,
59     HID_DEVICE_CONNECTED,
60     HID_DEVICE_W2_GET_REPORT,
61     HID_DEVICE_W2_SET_REPORT,
62     HID_DEVICE_W2_GET_PROTOCOL,
63     HID_DEVICE_W2_SET_PROTOCOL,
64     HID_DEVICE_W2_ANSWER_SET_PROTOCOL,
65     HID_DEVICE_W2_SEND_UNSUPPORTED_REQUEST,
66 } hid_device_state_t;
67 
68 // hid device state
69 typedef struct hid_device {
70     uint16_t  cid;
71     bd_addr_t bd_addr;
72     hci_con_handle_t con_handle;
73     uint16_t  control_cid;
74     uint16_t  interrupt_cid;
75     uint8_t   incoming;
76     uint8_t   connected;
77     hid_device_state_t state;
78     hid_report_type_t report_type;
79     uint8_t   report_id;
80     uint16_t  expected_report_size;
81     uint16_t  report_size;
82     uint8_t   user_request_can_send_now;
83 
84     hid_handshake_param_type_t report_status;
85     hid_protocol_mode_t protocol_mode;
86 } hid_device_t;
87 
88 // higher layer callbacks
89 static btstack_packet_handler_t hid_device_callback;
90 static int  (*hci_device_get_report)   (uint16_t hid_cid, hid_report_type_t report_type, uint16_t report_id, int * out_report_size, uint8_t * out_report) = dummy_write_report;
91 static void (*hci_device_set_report)   (uint16_t hid_cid, hid_report_type_t report_type, int report_size, uint8_t * report) = dummy_set_report;
92 static void (*hci_device_report_data)  (uint16_t hid_cid, hid_report_type_t report_type, uint16_t report_id, int report_size, uint8_t * report) = dummy_report_data;
93 
94 static hid_device_t    hid_device_singleton;
95 
96 static bool            hid_device_boot_protocol_mode_supported;
97 static const uint8_t * hid_device_descriptor;
98 static uint16_t        hid_device_descriptor_len;
99 
100 
101 static uint16_t hid_device_cid = 0;
102 
103 
104 static int dummy_write_report(uint16_t hid_cid, hid_report_type_t report_type, uint16_t report_id, int * out_report_size, uint8_t * out_report){
105     UNUSED(hid_cid);
106     UNUSED(report_type);
107     UNUSED(report_id);
108     UNUSED(out_report_size);
109     UNUSED(out_report);
110     return -1;
111 }
112 
113 static void dummy_set_report(uint16_t hid_cid, hid_report_type_t report_type, int report_size, uint8_t * report){
114     UNUSED(hid_cid);
115     UNUSED(report_type);
116     UNUSED(report_size);
117     UNUSED(report);
118 }
119 
120 static void dummy_report_data(uint16_t hid_cid, hid_report_type_t report_type, uint16_t report_id, int report_size, uint8_t * report){
121     UNUSED(hid_cid);
122     UNUSED(report_type);
123     UNUSED(report_id);
124     UNUSED(report_size);
125     UNUSED(report);
126 }
127 static uint16_t hid_device_get_next_cid(void){
128     hid_device_cid++;
129     if (!hid_device_cid){
130         hid_device_cid = 1;
131     }
132     return hid_device_cid;
133 }
134 
135 // TODO: store hid device connection into list
136 static hid_device_t * hid_device_get_instance_for_l2cap_cid(uint16_t cid){
137     if ((hid_device_singleton.control_cid == cid) || (hid_device_singleton.interrupt_cid == cid)){
138         return &hid_device_singleton;
139     }
140     return NULL;
141 }
142 
143 static hid_device_t * hid_device_get_instance_for_hid_cid(uint16_t hid_cid){
144     if (hid_device_singleton.cid == hid_cid){
145         return &hid_device_singleton;
146     }
147     return NULL;
148 }
149 
150 static void hid_device_setup_instance(hid_device_t *hid_device, const uint8_t *bd_addr) {
151     (void)memcpy(hid_device->bd_addr, bd_addr, 6);
152     hid_device->cid = hid_device_get_next_cid();
153     // reset state
154     hid_device->protocol_mode = HID_PROTOCOL_MODE_REPORT;
155     hid_device->con_handle    = HCI_CON_HANDLE_INVALID;
156     hid_device->incoming      = 0;
157     hid_device->connected     = 0;
158     hid_device->control_cid   = 0;
159     hid_device->interrupt_cid = 0;
160 }
161 
162 static hid_device_t * hid_device_provide_instance_for_bd_addr(bd_addr_t bd_addr){
163     if (!hid_device_singleton.cid){
164         hid_device_setup_instance(&hid_device_singleton, bd_addr);
165     }
166     return &hid_device_singleton;
167 }
168 
169 static hid_device_t * hid_device_create_instance(void){
170 
171     return &hid_device_singleton;
172 }
173 
174 void hid_create_sdp_record(uint8_t *service, uint32_t service_record_handle, const hid_sdp_record_t * params){
175     uint8_t * attribute;
176     de_create_sequence(service);
177 
178     de_add_number(service, DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_SERVICE_RECORD_HANDLE);
179     de_add_number(service, DE_UINT, DE_SIZE_32, service_record_handle);
180 
181     de_add_number(service, DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_SERVICE_CLASS_ID_LIST);
182     attribute = de_push_sequence(service);
183     {
184         de_add_number(attribute,  DE_UUID, DE_SIZE_16, BLUETOOTH_SERVICE_CLASS_HUMAN_INTERFACE_DEVICE_SERVICE);
185     }
186     de_pop_sequence(service, attribute);
187 
188     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_PROTOCOL_DESCRIPTOR_LIST);
189     attribute = de_push_sequence(service);
190     {
191         uint8_t * l2cpProtocol = de_push_sequence(attribute);
192         {
193             de_add_number(l2cpProtocol,  DE_UUID, DE_SIZE_16, BLUETOOTH_PROTOCOL_L2CAP);
194             de_add_number(l2cpProtocol,  DE_UINT, DE_SIZE_16, BLUETOOTH_PSM_HID_CONTROL);
195         }
196         de_pop_sequence(attribute, l2cpProtocol);
197 
198         uint8_t * hidProtocol = de_push_sequence(attribute);
199         {
200             de_add_number(hidProtocol,  DE_UUID, DE_SIZE_16, BLUETOOTH_PROTOCOL_HIDP);
201         }
202         de_pop_sequence(attribute, hidProtocol);
203     }
204     de_pop_sequence(service, attribute);
205 
206     // TODO?
207     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_LANGUAGE_BASE_ATTRIBUTE_ID_LIST);
208     attribute = de_push_sequence(service);
209     {
210         de_add_number(attribute, DE_UINT, DE_SIZE_16, 0x656e);
211         de_add_number(attribute, DE_UINT, DE_SIZE_16, 0x006a);
212         de_add_number(attribute, DE_UINT, DE_SIZE_16, 0x0100);
213     }
214     de_pop_sequence(service, attribute);
215 
216     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_ADDITIONAL_PROTOCOL_DESCRIPTOR_LISTS);
217     attribute = de_push_sequence(service);
218     {
219         uint8_t * additionalDescriptorAttribute = de_push_sequence(attribute);
220         {
221             uint8_t * l2cpProtocol = de_push_sequence(additionalDescriptorAttribute);
222             {
223                 de_add_number(l2cpProtocol,  DE_UUID, DE_SIZE_16, BLUETOOTH_PROTOCOL_L2CAP);
224                 de_add_number(l2cpProtocol,  DE_UINT, DE_SIZE_16, BLUETOOTH_PSM_HID_INTERRUPT);
225             }
226             de_pop_sequence(additionalDescriptorAttribute, l2cpProtocol);
227 
228             uint8_t * hidProtocol = de_push_sequence(additionalDescriptorAttribute);
229             {
230                 de_add_number(hidProtocol,  DE_UUID, DE_SIZE_16, BLUETOOTH_PROTOCOL_HIDP);
231             }
232             de_pop_sequence(additionalDescriptorAttribute, hidProtocol);
233         }
234         de_pop_sequence(attribute, additionalDescriptorAttribute);
235     }
236     de_pop_sequence(service, attribute);
237 
238     // 0x0100 "ServiceName"
239     de_add_number(service,  DE_UINT, DE_SIZE_16, 0x0100);
240     de_add_data(service,  DE_STRING, (uint16_t) strlen(params->device_name), (uint8_t *) params->device_name);
241 
242     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_BLUETOOTH_PROFILE_DESCRIPTOR_LIST);
243     attribute = de_push_sequence(service);
244     {
245         uint8_t * hidProfile = de_push_sequence(attribute);
246         {
247             de_add_number(hidProfile,  DE_UUID, DE_SIZE_16, BLUETOOTH_SERVICE_CLASS_HUMAN_INTERFACE_DEVICE_SERVICE);
248             de_add_number(hidProfile,  DE_UINT, DE_SIZE_16, 0x0101);    // Version 1.1
249         }
250         de_pop_sequence(attribute, hidProfile);
251     }
252     de_pop_sequence(service, attribute);
253 
254     // Deprecated in v1.1.1
255     // de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_HID_DEVICE_RELEASE_NUMBER);
256     // de_add_number(service,  DE_UINT, DE_SIZE_16, 0x0101);
257 
258     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_HID_PARSER_VERSION);
259     de_add_number(service,  DE_UINT, DE_SIZE_16, 0x0111);  // v1.1.1
260 
261     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_HID_DEVICE_SUBCLASS);
262     de_add_number(service,  DE_UINT, DE_SIZE_8,  params->hid_device_subclass);
263 
264     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_HID_COUNTRY_CODE);
265     de_add_number(service,  DE_UINT, DE_SIZE_8,  params->hid_country_code);
266 
267     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_HID_VIRTUAL_CABLE);
268     de_add_number(service,  DE_BOOL, DE_SIZE_8,  params->hid_virtual_cable);
269 
270     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_HID_RECONNECT_INITIATE);
271     de_add_number(service,  DE_BOOL, DE_SIZE_8,  params->hid_reconnect_initiate);
272 
273     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_HID_DESCRIPTOR_LIST);
274     attribute = de_push_sequence(service);
275     {
276         uint8_t* hidDescriptor = de_push_sequence(attribute);
277         {
278             de_add_number(hidDescriptor,  DE_UINT, DE_SIZE_8, 0x22);    // Report Descriptor
279             de_add_data(hidDescriptor,  DE_STRING, params->hid_descriptor_size, (uint8_t *) params->hid_descriptor);
280         }
281         de_pop_sequence(attribute, hidDescriptor);
282     }
283     de_pop_sequence(service, attribute);
284 
285     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_HIDLANGID_BASE_LIST);
286     attribute = de_push_sequence(service);
287     {
288         uint8_t* hig_lang_base = de_push_sequence(attribute);
289         {
290             // see: http://www.usb.org/developers/docs/USB_LANGIDs.pdf
291             de_add_number(hig_lang_base,  DE_UINT, DE_SIZE_16, 0x0409);    // HIDLANGID = English (US)
292             de_add_number(hig_lang_base,  DE_UINT, DE_SIZE_16, 0x0100);    // HIDLanguageBase = 0x0100 default
293         }
294         de_pop_sequence(attribute, hig_lang_base);
295     }
296     de_pop_sequence(service, attribute);
297 
298     // battery power
299 
300     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_HID_REMOTE_WAKE);
301     de_add_number(service,  DE_BOOL, DE_SIZE_8,  params->hid_remote_wake ? 1 : 0);
302 
303     // supervision timeout
304     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_HID_SUPERVISION_TIMEOUT);
305     de_add_number(service,  DE_UINT, DE_SIZE_16, params->hid_supervision_timeout);
306 
307     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_HID_NORMALLY_CONNECTABLE);
308     de_add_number(service,  DE_BOOL, DE_SIZE_8,  params->hid_normally_connectable);
309 
310     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_HID_BOOT_DEVICE);
311     de_add_number(service,  DE_BOOL, DE_SIZE_8,  params->hid_boot_device ? 1 : 0);
312 
313     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_HIDSSR_HOST_MAX_LATENCY);
314     de_add_number(service,  DE_UINT, DE_SIZE_16, params->hid_ssr_host_max_latency);
315 
316     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_HIDSSR_HOST_MIN_TIMEOUT);
317     de_add_number(service,  DE_UINT, DE_SIZE_16, params->hid_ssr_host_min_timeout);
318 }
319 
320 static inline void hid_device_emit_connected_event(hid_device_t * context, uint8_t status){
321     uint8_t event[15];
322     int pos = 0;
323     event[pos++] = HCI_EVENT_HID_META;
324     pos++;  // skip len
325     event[pos++] = HID_SUBEVENT_CONNECTION_OPENED;
326     little_endian_store_16(event,pos,context->cid);
327     pos+=2;
328     event[pos++] = status;
329     reverse_bd_addr(context->bd_addr, &event[pos]);
330     pos += 6;
331     little_endian_store_16(event,pos,context->con_handle);
332     pos += 2;
333     event[pos++] = context->incoming;
334     event[1] = pos - 2;
335     hid_device_callback(HCI_EVENT_PACKET, context->cid, &event[0], pos);
336 }
337 
338 static inline void hid_device_emit_event(hid_device_t * context, uint8_t subevent_type){
339     uint8_t event[5];
340     int pos = 0;
341     event[pos++] = HCI_EVENT_HID_META;
342     pos++;  // skip len
343     event[pos++] = subevent_type;
344     little_endian_store_16(event,pos,context->cid);
345     pos+=2;
346     event[1] = pos - 2;
347     hid_device_callback(HCI_EVENT_PACKET, context->cid, &event[0], pos);
348 }
349 
350 static int hid_report_size_valid(uint16_t cid, int report_id, hid_report_type_t report_type, int report_size){
351     if (!report_size) return 0;
352     if (hid_device_in_boot_protocol_mode(cid)){
353         switch (report_id){
354             case HID_BOOT_MODE_KEYBOARD_ID:
355                 if (report_size < 8) return 0;
356                 break;
357             case HID_BOOT_MODE_MOUSE_ID:
358                 if (report_size < 1) return 0;
359                 break;
360             default:
361                 return 0;
362         }
363     } else {
364         int size =  btstack_hid_get_report_size_for_id(report_id, report_type, hid_device_descriptor_len, hid_device_descriptor);
365         if ((size == 0) || (size != report_size)) return 0;
366     }
367     return 1;
368 }
369 
370 static int hid_get_report_size_for_id(uint16_t cid, int report_id, hid_report_type_t report_type, uint16_t descriptor_len, const uint8_t * descriptor){
371     if (hid_device_in_boot_protocol_mode(cid)){
372         switch (report_id){
373             case HID_BOOT_MODE_KEYBOARD_ID:
374                 return 8;
375             case HID_BOOT_MODE_MOUSE_ID:
376                 return 3;
377             default:
378                 return 0;
379         }
380     } else {
381         return btstack_hid_get_report_size_for_id(report_id, report_type, descriptor_len, descriptor);
382     }
383 }
384 
385 static hid_report_id_status_t hid_report_id_status(uint16_t cid, uint16_t report_id){
386     if (hid_device_in_boot_protocol_mode(cid)){
387         switch (report_id){
388             case HID_BOOT_MODE_KEYBOARD_ID:
389             case HID_BOOT_MODE_MOUSE_ID:
390                 return HID_REPORT_ID_VALID;
391             default:
392                 return HID_REPORT_ID_INVALID;
393         }
394     } else {
395         return btstack_hid_id_valid(report_id, hid_device_descriptor_len, hid_device_descriptor);
396     }
397 }
398 
399 static hid_handshake_param_type_t hid_device_set_report_cmd_is_valid(uint16_t cid, hid_report_type_t report_type, int report_size, uint8_t * report){
400     int pos = 0;
401     int report_id = 0;
402 
403     if (btstack_hid_report_id_declared(hid_device_descriptor_len, hid_device_descriptor)){
404         report_id = report[pos++];
405         hid_report_id_status_t report_id_status = hid_report_id_status(cid, report_id);
406         switch (report_id_status){
407             case HID_REPORT_ID_INVALID:
408                 return HID_HANDSHAKE_PARAM_TYPE_ERR_INVALID_REPORT_ID;
409             default:
410                 break;
411         }
412     }
413 
414     if (!hid_report_size_valid(cid, report_id, report_type, report_size-pos)){
415         // TODO clarify DCT/BI-03c
416         return HID_HANDSHAKE_PARAM_TYPE_ERR_INVALID_PARAMETER;
417     }
418     return HID_HANDSHAKE_PARAM_TYPE_SUCCESSFUL;
419 }
420 
421 static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t * packet, uint16_t packet_size){
422     UNUSED(channel);
423     UNUSED(packet_size);
424     int connected_before;
425     uint16_t psm;
426     uint8_t status;
427     hid_device_t * device = NULL;
428     uint8_t param;
429     bd_addr_t address;
430     uint16_t local_cid;
431     int pos = 0;
432     int report_size;
433     uint8_t report[48];
434     hid_message_type_t message_type;
435 
436     switch (packet_type){
437         case L2CAP_DATA_PACKET:
438             device = hid_device_get_instance_for_l2cap_cid(channel);
439             if (!device) {
440                 log_error("no device with cid 0x%02x", channel);
441                 return;
442             }
443             message_type = (hid_message_type_t)(packet[0] >> 4);
444             switch (message_type){
445                 case HID_MESSAGE_TYPE_GET_REPORT:
446 
447                     pos = 0;
448                     device->report_type = (hid_report_type_t)(packet[pos++] & 0x03);
449                     device->report_id = 0;
450                     device->report_status = HID_HANDSHAKE_PARAM_TYPE_SUCCESSFUL;
451                     device->state = HID_DEVICE_W2_GET_REPORT;
452 
453                     switch (device->protocol_mode){
454                         case HID_PROTOCOL_MODE_BOOT:
455                             if (packet_size < 2){
456                                 device->report_status = HID_HANDSHAKE_PARAM_TYPE_ERR_INVALID_PARAMETER;
457                                 break;
458                             }
459                             device->report_id = packet[pos++];
460                             break;
461                         case HID_PROTOCOL_MODE_REPORT:
462                             if (!btstack_hid_report_id_declared(hid_device_descriptor_len, hid_device_descriptor)) {
463                                 if (packet_size < 2) break;
464                                 if (packet[0] & 0x08){
465                                     if (packet_size > 2) {
466                                         device->report_status = HID_HANDSHAKE_PARAM_TYPE_ERR_INVALID_REPORT_ID;
467                                     }
468                                 } else {
469                                     if (packet_size > 1) {
470                                         device->report_status = HID_HANDSHAKE_PARAM_TYPE_ERR_INVALID_REPORT_ID;
471                                     }
472                                 }
473                                 break;
474                             }
475                             if (packet_size < 2){
476                                 device->report_status = HID_HANDSHAKE_PARAM_TYPE_ERR_INVALID_PARAMETER;
477                                 break;
478                             }
479                             device->report_id = packet[pos++];
480                             break;
481                         default:
482                             btstack_assert(false);
483                             break;
484                     }
485                     if (device->report_status != HID_HANDSHAKE_PARAM_TYPE_SUCCESSFUL){
486                         l2cap_request_can_send_now_event(device->control_cid);
487                         break;
488                     }
489                     switch (hid_report_id_status(device->cid, device->report_id)){
490                         case HID_REPORT_ID_INVALID:
491                             device->report_status = HID_HANDSHAKE_PARAM_TYPE_ERR_INVALID_REPORT_ID;
492                             break;
493                         default:
494                             break;
495                     }
496 
497                     device->expected_report_size = hid_get_report_size_for_id(device->cid, device->report_id, device->report_type, hid_device_descriptor_len, hid_device_descriptor);
498                     report_size =  device->expected_report_size + pos; // add 1 for header size and report id
499 
500                     if ((packet[0] & 0x08) && (packet_size >= (pos + 1))){
501                         device->report_size = btstack_min(btstack_min(little_endian_read_16(packet, pos), report_size), sizeof(report));
502                     } else {
503                         device->report_size = btstack_min(btstack_min(l2cap_max_mtu(), report_size), sizeof(report));
504                     }
505 
506                     l2cap_request_can_send_now_event(device->control_cid);
507                     break;
508 
509                 case HID_MESSAGE_TYPE_SET_REPORT:
510                     device->state = HID_DEVICE_W2_SET_REPORT;
511                     device->report_size = l2cap_max_mtu();
512                     device->report_type = (hid_report_type_t)(packet[0] & 0x03);
513                     if (packet_size < 1){
514                         device->report_status = HID_HANDSHAKE_PARAM_TYPE_ERR_INVALID_PARAMETER;
515                         break;
516                     }
517 
518                     switch (device->protocol_mode){
519                         case HID_PROTOCOL_MODE_BOOT:
520                             if (packet_size < 3){
521                                 device->report_status = HID_HANDSHAKE_PARAM_TYPE_ERR_INVALID_PARAMETER;
522                                 break;
523                             }
524                             device->report_id = packet[1];
525                             device->report_status = hid_device_set_report_cmd_is_valid(device->cid, device->report_type, packet_size - 1, &packet[1]);
526                             if (device->report_status != HID_HANDSHAKE_PARAM_TYPE_SUCCESSFUL) break;
527                             (*hci_device_set_report)(device->cid, device->report_type, packet_size-1, &packet[1]);
528                             break;
529                         case HID_PROTOCOL_MODE_REPORT:
530                             device->report_status = hid_device_set_report_cmd_is_valid(device->cid, device->report_type, packet_size - 1, &packet[1]);
531                             if (device->report_status != HID_HANDSHAKE_PARAM_TYPE_SUCCESSFUL) break;
532 
533                             if (packet_size >= 2){
534                                 (*hci_device_set_report)(device->cid, device->report_type, packet_size-1, &packet[1]);
535                             } else {
536                                 uint8_t payload[] = {0};
537                                 (*hci_device_set_report)(device->cid, device->report_type, 1, payload);
538                             }
539                             break;
540                         default:
541                             btstack_assert(false);
542                             break;
543                     }
544                     device->report_type = (hid_report_type_t)(packet[0] & 0x03);
545                     l2cap_request_can_send_now_event(device->control_cid);
546                     break;
547                 case HID_MESSAGE_TYPE_GET_PROTOCOL:
548                     device->state = HID_DEVICE_W2_GET_PROTOCOL;
549                     if (packet_size != 1) {
550                         device->report_status = HID_HANDSHAKE_PARAM_TYPE_ERR_INVALID_PARAMETER;
551                         break;
552                     }
553                     device->report_status = HID_HANDSHAKE_PARAM_TYPE_SUCCESSFUL;
554                     // hid_device_request_can_send_now_event(channel);
555                     l2cap_request_can_send_now_event(device->control_cid);
556                     break;
557 
558                 case HID_MESSAGE_TYPE_SET_PROTOCOL:
559                     device->state = HID_DEVICE_W2_SET_PROTOCOL;
560                     if (packet_size != 1) {
561                         device->report_status = HID_HANDSHAKE_PARAM_TYPE_ERR_INVALID_PARAMETER;
562                         break;
563                     }
564                     param = packet[0] & 0x01;
565                     if (((hid_protocol_mode_t)param == HID_PROTOCOL_MODE_BOOT) && !hid_device_boot_protocol_mode_supported){
566                         device->report_status = HID_HANDSHAKE_PARAM_TYPE_ERR_INVALID_PARAMETER;
567                         break;
568                     }
569                     device->protocol_mode = (hid_protocol_mode_t) param;
570                     switch (device->protocol_mode){
571                         case HID_PROTOCOL_MODE_BOOT:
572                             break;
573                         case HID_PROTOCOL_MODE_REPORT:
574                             break;
575                         default:
576                             btstack_assert(false);
577                             break;
578                     }
579                     device->report_status = HID_HANDSHAKE_PARAM_TYPE_SUCCESSFUL;
580                     l2cap_request_can_send_now_event(device->control_cid);
581                     break;
582 
583                 case HID_MESSAGE_TYPE_HID_CONTROL:
584                     param = packet[0] & 0x0F;
585 
586                     switch ((hid_control_param_t)param){
587                         case HID_CONTROL_PARAM_SUSPEND:
588                             hid_device_emit_event(device, HID_SUBEVENT_SUSPEND);
589                             break;
590                         case HID_CONTROL_PARAM_EXIT_SUSPEND:
591                             hid_device_emit_event(device, HID_SUBEVENT_EXIT_SUSPEND);
592                             break;
593                         case HID_CONTROL_PARAM_VIRTUAL_CABLE_UNPLUG:
594                             hid_device_emit_event(device, HID_SUBEVENT_VIRTUAL_CABLE_UNPLUG);
595                             break;
596                         default:
597                             device->state = HID_DEVICE_W2_SEND_UNSUPPORTED_REQUEST;
598                             l2cap_request_can_send_now_event(device->control_cid);
599                             break;
600                     }
601                     break;
602 
603                 case HID_MESSAGE_TYPE_DATA:
604                     if (packet_size < 2) {
605                         break;
606                     }
607                     pos = 0;
608                     device->report_type = (hid_report_type_t)(packet[pos++] & 0x03);
609                     device->report_id = 0;
610                     if (btstack_hid_report_id_declared(hid_device_descriptor_len, hid_device_descriptor)){
611                         device->report_id = packet[pos++];
612                     }
613 
614                     if (hid_report_id_status(device->cid, device->report_id) == HID_REPORT_ID_INVALID){
615                         log_info("Ignore invalid report data packet");
616                         break;
617                     }
618                     if (!hid_report_size_valid(device->cid, device->report_id, device->report_type, packet_size - pos)){
619                         log_info("Ignore invalid report data packet, invalid size");
620                         break;
621                     }
622                     (*hci_device_report_data)(device->cid, device->report_type, device->report_id, packet_size - pos, &packet[pos]);
623                     break;
624                 default:
625                     device->state = HID_DEVICE_W2_SEND_UNSUPPORTED_REQUEST;
626                     l2cap_request_can_send_now_event(device->control_cid);
627                     break;
628             }
629             break;
630         case HCI_EVENT_PACKET:
631             switch (packet[0]){
632                 case L2CAP_EVENT_INCOMING_CONNECTION:
633                     switch (l2cap_event_incoming_connection_get_psm(packet)){
634                         case PSM_HID_CONTROL:
635                         case PSM_HID_INTERRUPT:
636                             l2cap_event_incoming_connection_get_address(packet, address);
637                             device = hid_device_provide_instance_for_bd_addr(address);
638                             if (!device) {
639                                 log_error("L2CAP_EVENT_INCOMING_CONNECTION, cannot create instance for %s", bd_addr_to_str(address));
640                                 l2cap_decline_connection(channel);
641                                 break;
642                             }
643                             if ((device->con_handle == HCI_CON_HANDLE_INVALID) || (l2cap_event_incoming_connection_get_handle(packet) == device->con_handle)){
644                                 device->con_handle = l2cap_event_incoming_connection_get_handle(packet);
645                                 device->incoming = 1;
646                                 l2cap_event_incoming_connection_get_address(packet, device->bd_addr);
647                                 psm = l2cap_event_incoming_connection_get_psm(packet);
648                                 switch (psm){
649                                     case PSM_HID_CONTROL:
650                                         device->control_cid = l2cap_event_incoming_connection_get_local_cid(packet);
651                                         break;
652                                     case PSM_HID_INTERRUPT:
653                                         device->interrupt_cid = l2cap_event_incoming_connection_get_local_cid(packet);
654                                     break;
655                                     default:
656                                         break;
657                                 }
658 
659                                 l2cap_accept_connection(channel);
660                             } else {
661                                 l2cap_decline_connection(channel);
662                                 log_info("L2CAP_EVENT_INCOMING_CONNECTION, decline connection for %s", bd_addr_to_str(address));
663                             }
664                             break;
665                         default:
666                             l2cap_decline_connection(channel);
667                             break;
668                     }
669                     break;
670                 case L2CAP_EVENT_CHANNEL_OPENED:
671                     device = hid_device_get_instance_for_l2cap_cid(l2cap_event_channel_opened_get_local_cid(packet));
672                     if (!device) {
673                         log_error("L2CAP_EVENT_CHANNEL_OPENED, no hid device for local cid 0x%02x", l2cap_event_channel_opened_get_local_cid(packet));
674                         return;
675                     }
676                     status = l2cap_event_channel_opened_get_status(packet);
677                     if (status) {
678                         if (device->incoming == 0){
679                             // report error for outgoing connection
680                             hid_device_emit_connected_event(device, status);
681                         }
682                         return;
683                     }
684 
685                     // store con_handle
686                     if (device->con_handle == HCI_CON_HANDLE_INVALID){
687                         device->con_handle  = l2cap_event_channel_opened_get_handle(packet);
688                     }
689 
690                     // store l2cap cid
691                     psm = l2cap_event_channel_opened_get_psm(packet);
692                     switch (psm){
693                         case PSM_HID_CONTROL:
694                             device->control_cid = l2cap_event_channel_opened_get_local_cid(packet);
695                             break;
696                         case PSM_HID_INTERRUPT:
697                             device->interrupt_cid = l2cap_event_channel_opened_get_local_cid(packet);
698                             break;
699                         default:
700                             break;
701                     }
702 
703                     // connect HID Interrupt for outgoing
704                     if ((device->incoming == 0) && (psm == PSM_HID_CONTROL)){
705                         status = l2cap_create_channel(packet_handler, device->bd_addr, PSM_HID_INTERRUPT, 48, &device->interrupt_cid);
706                         break;
707                     }
708 
709                     // emit connected if both channels are open
710                     connected_before = device->connected;
711                     if (!connected_before && device->control_cid && device->interrupt_cid){
712                         device->connected = 1;
713                         hid_device_emit_connected_event(device, 0);
714                     }
715                     break;
716                 case L2CAP_EVENT_CHANNEL_CLOSED:
717                     device = hid_device_get_instance_for_l2cap_cid(l2cap_event_channel_closed_get_local_cid(packet));
718                     if (!device) return;
719 
720                     // connected_before = device->connected;
721                     device->incoming  = 0;
722                     if (l2cap_event_channel_closed_get_local_cid(packet) == device->interrupt_cid){
723                         device->interrupt_cid = 0;
724                     }
725                     if (l2cap_event_channel_closed_get_local_cid(packet) == device->control_cid){
726                         device->control_cid = 0;
727                     }
728                     if (!device->interrupt_cid && !device->control_cid){
729                         device->connected = 0;
730                         device->con_handle = HCI_CON_HANDLE_INVALID;
731                         device->cid = 0;
732                         hid_device_emit_event(device, HID_SUBEVENT_CONNECTION_CLOSED);
733                     }
734                     break;
735 
736                 case L2CAP_EVENT_CAN_SEND_NOW:
737                     local_cid = l2cap_event_can_send_now_get_local_cid(packet);
738                     device = hid_device_get_instance_for_l2cap_cid(local_cid);
739 
740                     if (!device) return;
741                     switch (device->state){
742                         case HID_DEVICE_W2_GET_REPORT:{
743                             if (device->report_status != HID_HANDSHAKE_PARAM_TYPE_SUCCESSFUL) {
744                                 report[0] = (HID_MESSAGE_TYPE_HANDSHAKE << 4) | device->report_status;
745                                 hid_device_send_control_message(device->cid, &report[0], 1);
746                                 break;
747                             }
748 
749                             pos = 0;
750                             report[pos++] = (HID_MESSAGE_TYPE_DATA << 4) | device->report_type;
751                             if (device->report_id){
752                                 report[pos++] = device->report_id;
753                             }
754 
755                             report_size = 0;
756                             status = (*hci_device_get_report)(device->cid, device->report_type, device->report_id, &report_size, &report[pos]);
757 
758                             switch (status){
759                                 case 0:
760                                     device->report_status = HID_HANDSHAKE_PARAM_TYPE_NOT_READY;
761                                     break;
762                                 case 1:
763                                     if (report_size == 0){
764                                         device->report_status = HID_HANDSHAKE_PARAM_TYPE_ERR_UNSUPPORTED_REQUEST;
765                                         break;
766                                     }
767                                     if (device->expected_report_size != report_size){
768                                         log_error("Expected report size of %d bytes, received %d", device->expected_report_size, report_size);
769                                         device->report_status = HID_HANDSHAKE_PARAM_TYPE_ERR_UNSUPPORTED_REQUEST;
770                                         break;
771                                     }
772                                     break;
773                                 default:
774                                     device->report_status = HID_HANDSHAKE_PARAM_TYPE_ERR_UNSUPPORTED_REQUEST;
775                                     break;
776                             }
777                             if (device->report_status != HID_HANDSHAKE_PARAM_TYPE_SUCCESSFUL){
778                                 report[0] = (HID_MESSAGE_TYPE_HANDSHAKE << 4) | device->report_status;
779                                 hid_device_send_control_message(device->cid, &report[0], 1);
780                                 break;
781                             }
782 
783                             // if (report_size > l2cap_max_mtu()){
784                             //     report[0] = (HID_MESSAGE_TYPE_HANDSHAKE << 4) | HID_HANDSHAKE_PARAM_TYPE_ERR_INVALID_PARAMETER;
785                             //     hid_device_send_control_message(device->cid, &report[0], 1);
786                             //     break;
787                             // }
788 
789                             hid_device_send_control_message(device->cid, &report[0], device->report_size);
790                             //     device->state = HID_DEVICE_IDLE;
791                             break;
792                         }
793                         case HID_DEVICE_W2_SET_REPORT:
794                         case HID_DEVICE_W2_SET_PROTOCOL:
795                             report[0] = (HID_MESSAGE_TYPE_HANDSHAKE << 4) | device->report_status;
796                             hid_device_send_control_message(device->cid, &report[0], 1);
797                             break;
798                         case HID_DEVICE_W2_GET_PROTOCOL:
799                             if (device->report_status != HID_HANDSHAKE_PARAM_TYPE_SUCCESSFUL){
800                                 report[0] = (HID_MESSAGE_TYPE_HANDSHAKE << 4) | device->report_status;
801                                 hid_device_send_control_message(device->cid, &report[0], 1);
802                                 break;
803                             }
804 
805                             report[0] = (HID_MESSAGE_TYPE_DATA << 4);
806                             report[1] =  device->protocol_mode;
807                             hid_device_send_control_message(device->cid, &report[0], 2);
808                             break;
809 
810 
811                         case HID_DEVICE_W2_SEND_UNSUPPORTED_REQUEST:
812                             report[0] = (HID_MESSAGE_TYPE_HANDSHAKE << 4) | HID_HANDSHAKE_PARAM_TYPE_ERR_UNSUPPORTED_REQUEST;
813                             hid_device_send_control_message(device->cid, &report[0], 1);
814                             break;
815                         default:
816                             if (device->user_request_can_send_now){
817                                 device->user_request_can_send_now = 0;
818                                 hid_device_emit_event(device, HID_SUBEVENT_CAN_SEND_NOW);
819                             }
820                             break;
821                     }
822                     device->state = HID_DEVICE_IDLE;
823                     break;
824                 default:
825                     break;
826             }
827             break;
828         default:
829             break;
830     }
831 }
832 
833 /**
834  * @brief Set up HID Device
835  */
836 void hid_device_init(bool boot_protocol_mode_supported, uint16_t descriptor_len, const uint8_t * descriptor){
837     hid_device_boot_protocol_mode_supported = boot_protocol_mode_supported;
838     hid_device_descriptor =  descriptor;
839     hid_device_descriptor_len = descriptor_len;
840     hci_device_get_report = dummy_write_report;
841     hci_device_set_report = dummy_set_report;
842     hci_device_report_data = dummy_report_data;
843 
844     l2cap_register_service(packet_handler, PSM_HID_INTERRUPT, 100, gap_get_security_level());
845     l2cap_register_service(packet_handler, PSM_HID_CONTROL,   100, gap_get_security_level());
846 }
847 
848 void hid_device_deinit(void){
849     hid_device_callback = NULL;
850     hci_device_get_report = NULL;
851     hci_device_set_report = NULL;
852     hci_device_report_data = NULL;
853 
854     (void) memset(&hid_device_singleton, 0, sizeof(hid_device_t));
855 
856     hid_device_boot_protocol_mode_supported = false;
857     hid_device_descriptor = NULL;
858     hid_device_descriptor_len = 0;
859     hid_device_cid = 0;
860 }
861 
862 /**
863  * @brief Register callback for the HID Device client.
864  * @param callback
865  */
866 void hid_device_register_packet_handler(btstack_packet_handler_t callback){
867     hid_device_callback = callback;
868 }
869 
870 void hid_device_register_report_request_callback(int (*callback)(uint16_t hid_cid, hid_report_type_t report_type, uint16_t report_id, int * out_report_size, uint8_t * out_report)){
871     if (callback == NULL){
872         callback = dummy_write_report;
873     }
874     hci_device_get_report = callback;
875 }
876 
877 void hid_device_register_set_report_callback(void (*callback)(uint16_t hid_cid, hid_report_type_t report_type, int report_size, uint8_t * report)){
878     if (callback == NULL){
879         callback = dummy_set_report;
880     }
881     hci_device_set_report = callback;
882 }
883 
884 void hid_device_register_report_data_callback(void (*callback)(uint16_t cid, hid_report_type_t report_type, uint16_t report_id, int report_size, uint8_t * report)){
885     if (callback == NULL){
886         callback = dummy_report_data;
887     }
888     hci_device_report_data = callback;
889 }
890 
891 
892 /**
893  * @brief Request can send now event to send HID Report
894  * @param hid_cid
895  */
896 void hid_device_request_can_send_now_event(uint16_t hid_cid){
897     hid_device_t * hid_device = hid_device_get_instance_for_hid_cid(hid_cid);
898     if (!hid_device || !hid_device->interrupt_cid) return;
899     hid_device->user_request_can_send_now = 1;
900     l2cap_request_can_send_now_event(hid_device->interrupt_cid);
901 }
902 
903 /**
904  * @brief Send HID message on interrupt channel
905  * @param hid_cid
906  */
907 void hid_device_send_interrupt_message(uint16_t hid_cid, const uint8_t * message, uint16_t message_len){
908     hid_device_t * hid_device = hid_device_get_instance_for_hid_cid(hid_cid);
909     if (!hid_device || !hid_device->interrupt_cid) return;
910     l2cap_send(hid_device->interrupt_cid, (uint8_t*) message, message_len);
911     if (hid_device->user_request_can_send_now){
912         l2cap_request_can_send_now_event((hid_device->interrupt_cid));
913     }
914 }
915 
916 /**
917  * @brief Send HID message on control channel
918  * @param hid_cid
919  */
920 void hid_device_send_control_message(uint16_t hid_cid, const uint8_t * message, uint16_t message_len){
921     hid_device_t * hid_device = hid_device_get_instance_for_hid_cid(hid_cid);
922     if (!hid_device || !hid_device->control_cid) return;
923     l2cap_send(hid_device->control_cid, (uint8_t*) message, message_len);
924     // request user can send now if pending
925     if (hid_device->user_request_can_send_now){
926         l2cap_request_can_send_now_event((hid_device->control_cid));
927     }
928 }
929 
930 /*
931  * @brief Create HID connection to HID Host
932  * @param addr
933  * @param hid_cid to use for other commands
934  * @result status
935  */
936 uint8_t hid_device_connect(bd_addr_t addr, uint16_t * hid_cid){
937     hid_device_t * hid_device = hid_device_create_instance();
938     if (!hid_device){
939         log_error("hid_device_connect: could not create a hid device instace");
940         return BTSTACK_MEMORY_ALLOC_FAILED;
941     }
942 
943     // setup instance
944     hid_device_setup_instance(hid_device, addr);
945     *hid_cid = hid_device->cid;
946 
947     // create l2cap control using fixed HID L2CAP PSM
948     log_info("Create outgoing HID Control");
949     uint8_t status = l2cap_create_channel(packet_handler, hid_device->bd_addr, PSM_HID_CONTROL, 48, &hid_device->control_cid);
950     return status;
951 }
952 
953 /*
954  * @brief Disconnect from HID Host
955  * @param hid_cid
956  * @result status
957  */
958 void hid_device_disconnect_interrupt_channel(uint16_t hid_cid){
959     hid_device_t * hid_device = hid_device_get_instance_for_hid_cid(hid_cid);
960     if (!hid_device){
961         log_error("hid_device_disconnect_interrupt_channel: could not find hid device instace");
962         return;
963     }
964     log_info("Disconnect from interrupt channel HID Host");
965     if (hid_device->interrupt_cid){
966         l2cap_disconnect(hid_device->interrupt_cid);
967     }
968 }
969 
970 void hid_device_disconnect_control_channel(uint16_t hid_cid){
971     hid_device_t * hid_device = hid_device_get_instance_for_hid_cid(hid_cid);
972     if (!hid_device){
973         log_error("hid_device_disconnect_control_channel: could not find hid device instace");
974         return;
975     }
976     log_info("Disconnect from control channel HID Host");
977     if (hid_device->control_cid){
978         l2cap_disconnect(hid_device->control_cid);
979     }
980 }
981 
982 void hid_device_disconnect(uint16_t hid_cid){
983     hid_device_t * hid_device = hid_device_get_instance_for_hid_cid(hid_cid);
984     if (!hid_device){
985         log_error("hid_device_disconnect: could not find hid device instace");
986         return;
987     }
988     log_info("Disconnect from HID Host");
989     if (hid_device->interrupt_cid){
990         l2cap_disconnect(hid_device->interrupt_cid);
991     }
992     if (hid_device->control_cid){
993         l2cap_disconnect(hid_device->control_cid);
994         }
995 }
996 
997 int hid_device_in_boot_protocol_mode(uint16_t hid_cid){
998     hid_device_t * hid_device = hid_device_get_instance_for_hid_cid(hid_cid);
999     if (!hid_device){
1000         log_error("hid_device_in_boot_protocol_mode: could not find hid device instace");
1001         return 0;
1002     }
1003     return hid_device->protocol_mode == HID_PROTOCOL_MODE_BOOT;
1004 }
1005