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