xref: /btstack/src/hci_cmd.c (revision b28dc8004dd8d4fb9020a6dcd2bc81f05d36a008)
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__ "hci_cmd.c"
39 
40 /*
41  *  hci_cmd.c
42  *
43  *  Created by Matthias Ringwald on 7/23/09.
44  */
45 
46 #include "btstack_config.h"
47 
48 #include "hci.h"
49 #include "hci_cmd.h"
50 #include "btstack_debug.h"
51 
52 #include <string.h>
53 
54 
55 #ifdef ENABLE_SDP
56 #include "classic/sdp_util.h"
57 #endif
58 
59 // calculate combined ogf/ocf value
60 #define OPCODE(ogf, ocf) ((ocf) | ((ogf) << 10))
61 
62 #define INVALID_VAR_LEN 0xffffu
63 // hci_le_set_cig_parameters_test has 10 arrayed parameters
64 #define MAX_NR_ARRAY_FIELDS 10
65 #define INVALID_ARRAY_LEN 0xff
66 
67 /**
68  * construct HCI Command based on template
69  *
70  * Format:
71  *   1,2,3,4: one to four byte value
72  *   H: HCI connection handle
73  *   B: Bluetooth Baseband Address (BD_ADDR)
74  *   D: 8 byte data block
75  *   E: Extended Inquiry Result
76  *   N: Name up to 248 chars, \0 terminated
77  *   P: 16 byte data block. Pairing code, Simple Pairing Hash and Randomizer
78  *   A: 31 bytes advertising data
79  *   S: Service Record (Data Element Sequence)
80  *   Q: 32 byte data block, e.g. for X and Y coordinates of P-256 public key
81  *   J: 8-bit length of variable size element
82  *   V: variable size element, len was given with param 'J'
83  *   a: number of elements in following arrayed parameters(s), specified as '[...]'
84  *   b: bit field indicating number of arrayed parameters(s), specified as '[...]'
85  *   [: start of arrayed param sequence
86  *   ]: end of arrayed param sequence
87  */
88 uint16_t hci_cmd_create_from_template(uint8_t *hci_cmd_buffer, const hci_cmd_t *cmd, va_list argptr){
89 
90     hci_cmd_buffer[0] = cmd->opcode & 0xffu;
91     hci_cmd_buffer[1] = cmd->opcode >> 8;
92     uint16_t pos = 3;
93 
94     const char *format = cmd->format;
95     uint16_t word;
96     uint32_t longword;
97     uint8_t * ptr;
98 
99 #ifdef ENABLE_BLE
100     // variable size data
101     uint16_t var_len = INVALID_VAR_LEN;
102     // array processing
103     const char * array_format = NULL;
104     void *  array_data[MAX_NR_ARRAY_FIELDS];
105     uint8_t array_num_elements = INVALID_ARRAY_LEN;
106     uint8_t array_num_fields;
107     uint8_t array_element_index;
108     bool array_done;
109 #endif
110 
111     bool done_format = false;
112     while (!done_format) {
113         switch(*format) {
114             case 0:
115                 done_format = true;
116                 break;
117             case '1': //  8 bit value
118                 word = va_arg(argptr, int); // LCOV_EXCL_BR_LINE
119                 hci_cmd_buffer[pos++] = word & 0xffu;
120                 break;
121             case '2': // 16 bit value
122                 word = va_arg(argptr, int); // LCOV_EXCL_BR_LINE
123                 hci_cmd_buffer[pos++] = word & 0xffu;
124                 hci_cmd_buffer[pos++] = word >> 8;
125                 break;
126             case 'H': // hci_handle
127                 word = va_arg(argptr, int); // LCOV_EXCL_BR_LINE
128                 hci_cmd_buffer[pos++] = word & 0xffu;
129                 hci_cmd_buffer[pos++] = word >> 8;
130                 break;
131             case '3':
132                 longword = va_arg(argptr, uint32_t); // LCOV_EXCL_BR_LINE
133                 hci_cmd_buffer[pos++] = longword;
134                 hci_cmd_buffer[pos++] = longword >> 8;
135                 hci_cmd_buffer[pos++] = longword >> 16;
136                 break;
137             case '4':
138                 longword = va_arg(argptr, uint32_t); // LCOV_EXCL_BR_LINE
139                 hci_cmd_buffer[pos++] = longword;
140                 hci_cmd_buffer[pos++] = longword >> 8;
141                 hci_cmd_buffer[pos++] = longword >> 16;
142                 hci_cmd_buffer[pos++] = longword >> 24;
143                 break;
144             case 'B': // bt-addr
145                 ptr = va_arg(argptr, uint8_t *); // LCOV_EXCL_BR_LINE
146                 hci_cmd_buffer[pos++] = ptr[5];
147                 hci_cmd_buffer[pos++] = ptr[4];
148                 hci_cmd_buffer[pos++] = ptr[3];
149                 hci_cmd_buffer[pos++] = ptr[2];
150                 hci_cmd_buffer[pos++] = ptr[1];
151                 hci_cmd_buffer[pos++] = ptr[0];
152                 break;
153             case 'D': // 8 byte data block
154                 ptr = va_arg(argptr, uint8_t *); // LCOV_EXCL_BR_LINE
155                 (void)memcpy(&hci_cmd_buffer[pos], ptr, 8);
156                 pos += 8;
157                 break;
158             case 'E': // Extended Inquiry Information 240 octets
159                 ptr = va_arg(argptr, uint8_t *); // LCOV_EXCL_BR_LINE
160                 (void)memcpy(&hci_cmd_buffer[pos], ptr, 240);
161                 pos += 240;
162                 break;
163             case 'N': { // UTF-8 string, null terminated
164                 ptr = va_arg(argptr, uint8_t *); // LCOV_EXCL_BR_LINE
165                 uint16_t len = strlen((const char*) ptr);
166                 if (len > 248u) {
167                     len = 248;
168                 }
169                 (void)memcpy(&hci_cmd_buffer[pos], ptr, len);
170                 if (len < 248u) {
171                     // fill remaining space with zeroes
172                     memset(&hci_cmd_buffer[pos+len], 0u, 248u-len);
173                 }
174                 pos += 248;
175                 break;
176             }
177             case 'P': // 16 byte PIN code or link key in little endian
178                 ptr = va_arg(argptr, uint8_t *); // LCOV_EXCL_BR_LINE
179                 (void)memcpy(&hci_cmd_buffer[pos], ptr, 16);
180                 pos += 16;
181                 break;
182             case 'K':   // 16 byte OOB Data or Link Key in big endian
183                 ptr = va_arg(argptr, uint8_t *); // LCOV_EXCL_BR_LINE
184                 reverse_bytes(ptr, &hci_cmd_buffer[pos], 16);
185                 pos += 16;
186                 break;
187 #ifdef ENABLE_BLE
188             case 'A': // 31 bytes advertising data
189                 ptr = va_arg(argptr, uint8_t *); // LCOV_EXCL_BR_LINE
190                 (void)memcpy(&hci_cmd_buffer[pos], ptr, 31);
191                 pos += 31;
192                 break;
193             case 'J': //  8 bit variable length indicator for 'V'
194                 word = va_arg(argptr, int); // LCOV_EXCL_BR_LINE
195                 var_len = word & 0xffu;
196                 hci_cmd_buffer[pos++] = var_len;
197                 break;
198             case 'V':
199                 btstack_assert(var_len != INVALID_VAR_LEN);
200                 ptr = va_arg(argptr, uint8_t *); // LCOV_EXCL_BR_LINE
201                 (void)memcpy(&hci_cmd_buffer[pos], ptr, var_len);
202                 pos += var_len;
203                 var_len = INVALID_VAR_LEN;
204                 break;
205             case 'a':
206                 btstack_assert(array_num_elements == INVALID_ARRAY_LEN);
207                 word = va_arg(argptr, int); // LCOV_EXCL_BR_LINE
208                 hci_cmd_buffer[pos++] = word & 0xff;
209                 array_num_elements = word & 0xffu;
210                 break;
211             case 'b':
212                 btstack_assert(array_num_elements == INVALID_ARRAY_LEN);
213                 word = va_arg(argptr, int); // LCOV_EXCL_BR_LINE
214                 hci_cmd_buffer[pos++] = word & 0xff;
215                 array_num_elements = count_set_bits_uint32(word & 0xffu);
216                 break;
217             case '[':
218                 btstack_assert(array_num_elements != INVALID_ARRAY_LEN);
219                 // process array
220                 format++;
221                 array_format = format;
222                 array_num_fields = 0;
223                 array_done = false;
224                 while (!array_done){
225                     switch (*format){
226                         case 0:
227                             array_done = true;
228                             done_format = true;
229                             break;
230                         case ']':
231                             array_done = true;
232                             break;
233                         case '1':
234                         case '2':
235                             // all arrayed parameters are passed in as arrays
236                             ptr = va_arg(argptr, uint8_t *); // LCOV_EXCL_BR_LINE
237                             array_data[array_num_fields++] = ptr;
238                             format++;
239                             break;
240                         default:
241                             btstack_unreachable();
242                             break;
243                     }
244                 }
245                 for (array_element_index = 0; array_element_index < array_num_elements ; array_element_index++){
246                     uint8_t array_field_index;
247                     for (array_field_index = 0; array_field_index < array_num_fields ; array_field_index++){
248                         switch (array_format[array_field_index]){
249                             case '1':
250                                 hci_cmd_buffer[pos++] = ((const uint8_t *) array_data[array_field_index])[array_element_index];
251                                 break;
252                             case '2':
253                                 little_endian_store_16(hci_cmd_buffer, pos, ((const uint16_t *) array_data[array_field_index])[array_element_index]);
254                                 pos += 2;
255                                 break;
256                             default:
257                                 btstack_unreachable();
258                                 break;
259                         }
260                     }
261                 }
262                 break;
263 #endif
264 #ifdef ENABLE_LE_SECURE_CONNECTIONS
265             case 'Q':
266                 ptr = va_arg(argptr, uint8_t *); // LCOV_EXCL_BR_LINE
267                 reverse_bytes(ptr, &hci_cmd_buffer[pos], 32);
268                 pos += 32;
269                 break;
270 #endif
271 #ifdef ENABLE_SDP
272             // used by daemon
273             case 'S': { // Service Record (Data Element Sequence)
274                 ptr = va_arg(argptr, uint8_t *); // LCOV_EXCL_BR_LINE
275                 uint16_t len = de_get_len(ptr);
276                 (void)memcpy(&hci_cmd_buffer[pos], ptr, len);
277                 pos += len;
278                 break;
279             }
280 #endif
281             default:
282                 btstack_unreachable();
283                 break;
284         }
285         format++;
286     };
287     hci_cmd_buffer[2] = pos - 3;
288     return pos;
289 }
290 
291 /**
292  *  Link Control Commands
293  */
294 
295 /**
296  * @param lap
297  * @param inquiry_length
298  * @param num_responses
299  */
300 const hci_cmd_t hci_inquiry = {
301     HCI_OPCODE_HCI_INQUIRY, "311"
302 };
303 
304 /**
305  */
306 const hci_cmd_t hci_inquiry_cancel = {
307     HCI_OPCODE_HCI_INQUIRY_CANCEL, ""
308 };
309 
310 /**
311  * @param bd_addr
312  * @param packet_type
313  * @param page_scan_repetition_mode
314  * @param reserved
315  * @param clock_offset
316  * @param allow_role_switch
317  */
318 const hci_cmd_t hci_create_connection = {
319     HCI_OPCODE_HCI_CREATE_CONNECTION, "B21121"
320 };
321 
322 /**
323  * @param handle
324  * @param reason (0x05, 0x13-0x15, 0x1a, 0x29, see Errors Codes in BT Spec Part D)
325  */
326 const hci_cmd_t hci_disconnect = {
327     HCI_OPCODE_HCI_DISCONNECT, "H1"
328 };
329 
330 /**
331  * @param bd_addr
332  */
333 const hci_cmd_t hci_create_connection_cancel = {
334     HCI_OPCODE_HCI_CREATE_CONNECTION_CANCEL, "B"
335 };
336 
337 /**
338  * @param bd_addr
339  * @param role (become master, stay slave)
340  */
341 const hci_cmd_t hci_accept_connection_request = {
342     HCI_OPCODE_HCI_ACCEPT_CONNECTION_REQUEST, "B1"
343 };
344 
345 /**
346  * @param bd_addr
347  * @param reason (e.g. CONNECTION REJECTED DUE TO LIMITED RESOURCES (0x0d))
348  */
349 const hci_cmd_t hci_reject_connection_request = {
350     HCI_OPCODE_HCI_REJECT_CONNECTION_REQUEST, "B1"
351 };
352 
353 /**
354  * @param bd_addr
355  * @param link_key
356  */
357 const hci_cmd_t hci_link_key_request_reply = {
358     HCI_OPCODE_HCI_LINK_KEY_REQUEST_REPLY, "BP"
359 };
360 
361 /**
362  * @param bd_addr
363  */
364 const hci_cmd_t hci_link_key_request_negative_reply = {
365     HCI_OPCODE_HCI_LINK_KEY_REQUEST_NEGATIVE_REPLY, "B"
366 };
367 
368 /**
369  * @param bd_addr
370  * @param pin_length
371  * @param pin (c-string)
372  */
373 const hci_cmd_t hci_pin_code_request_reply = {
374     HCI_OPCODE_HCI_PIN_CODE_REQUEST_REPLY, "B1P"
375 };
376 
377 /**
378  * @param bd_addr
379  */
380 const hci_cmd_t hci_pin_code_request_negative_reply = {
381     HCI_OPCODE_HCI_PIN_CODE_REQUEST_NEGATIVE_REPLY, "B"
382 };
383 
384 /**
385  * @param handle
386  * @param packet_type
387  */
388 const hci_cmd_t hci_change_connection_packet_type = {
389     HCI_OPCODE_HCI_CHANGE_CONNECTION_PACKET_TYPE, "H2"
390 };
391 
392 /**
393  * @param handle
394  */
395 const hci_cmd_t hci_authentication_requested = {
396     HCI_OPCODE_HCI_AUTHENTICATION_REQUESTED, "H"
397 };
398 
399 /**
400  * @param handle
401  * @param encryption_enable
402  */
403 const hci_cmd_t hci_set_connection_encryption = {
404     HCI_OPCODE_HCI_SET_CONNECTION_ENCRYPTION, "H1"
405 };
406 
407 /**
408  * @param handle
409  */
410 const hci_cmd_t hci_change_connection_link_key = {
411     HCI_OPCODE_HCI_CHANGE_CONNECTION_LINK_KEY, "H"
412 };
413 
414 /**
415  * @param bd_addr
416  * @param page_scan_repetition_mode
417  * @param reserved
418  * @param clock_offset
419  */
420 const hci_cmd_t hci_remote_name_request = {
421     HCI_OPCODE_HCI_REMOTE_NAME_REQUEST, "B112"
422 };
423 
424 
425 /**
426  * @param bd_addr
427  */
428 const hci_cmd_t hci_remote_name_request_cancel = {
429     HCI_OPCODE_HCI_REMOTE_NAME_REQUEST_CANCEL, "B"
430 };
431 
432  /**
433  * @param handle
434  */
435 const hci_cmd_t hci_read_remote_supported_features_command = {
436     HCI_OPCODE_HCI_READ_REMOTE_SUPPORTED_FEATURES_COMMAND, "H"
437 };
438 
439 /**
440 * @param handle
441 */
442 const hci_cmd_t hci_read_remote_extended_features_command = {
443     HCI_OPCODE_HCI_READ_REMOTE_EXTENDED_FEATURES_COMMAND, "H1"
444 };
445 
446 /**
447  * @param handle
448  */
449 const hci_cmd_t hci_read_remote_version_information = {
450     HCI_OPCODE_HCI_READ_REMOTE_VERSION_INFORMATION, "H"
451 };
452 
453 /**
454  * @param handle
455  * @param transmit_bandwidth 8000(64kbps)
456  * @param receive_bandwidth  8000(64kbps)
457  * @param max_latency        >= 7ms for eSCO, 0xFFFF do not care
458  * @param voice_settings     e.g. CVSD, Input Coding: Linear, Input Data Format: 2’s complement, data 16bit: 00011000000 == 0x60
459  * @param retransmission_effort  e.g. 0xFF do not care
460  * @param packet_type        at least EV3 for eSCO
461  */
462 const hci_cmd_t hci_setup_synchronous_connection = {
463     HCI_OPCODE_HCI_SETUP_SYNCHRONOUS_CONNECTION, "H442212"
464 };
465 
466 /**
467  * @param bd_addr
468  * @param transmit_bandwidth
469  * @param receive_bandwidth
470  * @param max_latency
471  * @param voice_settings
472  * @param retransmission_effort
473  * @param packet_type
474  */
475 const hci_cmd_t hci_accept_synchronous_connection = {
476     HCI_OPCODE_HCI_ACCEPT_SYNCHRONOUS_CONNECTION, "B442212"
477 };
478 
479 /**
480  * @param bd_addr
481  * @param IO_capability
482  * @param OOB_data_present
483  * @param authentication_requirements
484  */
485 const hci_cmd_t hci_io_capability_request_reply = {
486     HCI_OPCODE_HCI_IO_CAPABILITY_REQUEST_REPLY, "B111"
487 };
488 
489 /**
490  * @param bd_addr
491  */
492 const hci_cmd_t hci_user_confirmation_request_reply = {
493     HCI_OPCODE_HCI_USER_CONFIRMATION_REQUEST_REPLY, "B"
494 };
495 
496 /**
497  * @param bd_addr
498  */
499 const hci_cmd_t hci_user_confirmation_request_negative_reply = {
500     HCI_OPCODE_HCI_USER_CONFIRMATION_REQUEST_NEGATIVE_REPLY, "B"
501 };
502 
503 /**
504  * @param bd_addr
505  * @param numeric_value
506  */
507 const hci_cmd_t hci_user_passkey_request_reply = {
508     HCI_OPCODE_HCI_USER_PASSKEY_REQUEST_REPLY, "B4"
509 };
510 
511 /**
512  * @param bd_addr
513  */
514 const hci_cmd_t hci_user_passkey_request_negative_reply = {
515     HCI_OPCODE_HCI_USER_PASSKEY_REQUEST_NEGATIVE_REPLY, "B"
516 };
517 
518 /**
519  * @param bd_addr
520  * @param c Simple Pairing Hash C
521  * @param r Simple Pairing Randomizer R
522  */
523 const hci_cmd_t hci_remote_oob_data_request_reply = {
524     HCI_OPCODE_HCI_REMOTE_OOB_DATA_REQUEST_REPLY, "BKK"
525 };
526 
527 /**
528  * @param bd_addr
529  */
530 const hci_cmd_t hci_remote_oob_data_request_negative_reply = {
531     HCI_OPCODE_HCI_REMOTE_OOB_DATA_REQUEST_NEGATIVE_REPLY, "B"
532 };
533 
534 /**
535  * @param bd_addr
536  * @param reason (Part D, Error codes)
537  */
538 const hci_cmd_t hci_io_capability_request_negative_reply = {
539     HCI_OPCODE_HCI_IO_CAPABILITY_REQUEST_NEGATIVE_REPLY, "B1"
540 };
541 
542 /**
543  * @param handle
544  * @param transmit_bandwidth
545  * @param receive_bandwidth
546  * @param transmit_coding_format_type
547  * @param transmit_coding_format_company
548  * @param transmit_coding_format_codec
549  * @param receive_coding_format_type
550  * @param receive_coding_format_company
551  * @param receive_coding_format_codec
552  * @param transmit_coding_frame_size
553  * @param receive_coding_frame_size
554  * @param input_bandwidth
555  * @param output_bandwidth
556  * @param input_coding_format_type
557  * @param input_coding_format_company
558  * @param input_coding_format_codec
559  * @param output_coding_format_type
560  * @param output_coding_format_company
561  * @param output_coding_format_codec
562  * @param input_coded_data_size
563  * @param outupt_coded_data_size
564  * @param input_pcm_data_format
565  * @param output_pcm_data_format
566  * @param input_pcm_sample_payload_msb_position
567  * @param output_pcm_sample_payload_msb_position
568  * @param input_data_path
569  * @param output_data_path
570  * @param input_transport_unit_size
571  * @param output_transport_unit_size
572  * @param max_latency
573  * @param packet_type
574  * @param retransmission_effort
575  */
576 const hci_cmd_t hci_enhanced_setup_synchronous_connection = {
577     HCI_OPCODE_HCI_ENHANCED_SETUP_SYNCHRONOUS_CONNECTION, "H4412212222441221222211111111221"
578 };
579 
580 /**
581  * @param bd_addr
582  * @param transmit_bandwidth
583  * @param receive_bandwidth
584  * @param transmit_coding_format_type
585  * @param transmit_coding_format_company
586  * @param transmit_coding_format_codec
587  * @param receive_coding_format_type
588  * @param receive_coding_format_company
589  * @param receive_coding_format_codec
590  * @param transmit_coding_frame_size
591  * @param receive_coding_frame_size
592  * @param input_bandwidth
593  * @param output_bandwidth
594  * @param input_coding_format_type
595  * @param input_coding_format_company
596  * @param input_coding_format_codec
597  * @param output_coding_format_type
598  * @param output_coding_format_company
599  * @param output_coding_format_codec
600  * @param input_coded_data_size
601  * @param outupt_coded_data_size
602  * @param input_pcm_data_format
603  * @param output_pcm_data_format
604  * @param input_pcm_sample_payload_msb_position
605  * @param output_pcm_sample_payload_msb_position
606  * @param input_data_path
607  * @param output_data_path
608  * @param input_transport_unit_size
609  * @param output_transport_unit_size
610  * @param max_latency
611  * @param packet_type
612  * @param retransmission_effort
613  */
614 const hci_cmd_t hci_enhanced_accept_synchronous_connection = {
615     HCI_OPCODE_HCI_ENHANCED_ACCEPT_SYNCHRONOUS_CONNECTION, "B4412212222441221222211111111221"
616 };
617 
618 /**
619  * @param bd_addr
620  * @param c_192 Simple Pairing Hash C derived from P-192 public key
621  * @param r_192 Simple Pairing Randomizer derived from P-192 public key
622  * @param c_256 Simple Pairing Hash C derived from P-256 public key
623  * @param r_256 Simple Pairing Randomizer derived from P-256 public key
624  */
625 const hci_cmd_t hci_remote_oob_extended_data_request_reply = {
626     HCI_OPCODE_HCI_REMOTE_OOB_EXTENDED_DATA_REQUEST_REPLY, "BKKKK"
627 };
628 
629 /**
630  *  Link Policy Commands
631  */
632 
633 /**
634  * @param handle
635  * @param hold_mode_max_interval * 0.625 ms,  range: 0x0002..0xFFFE; only even values are valid.
636  * @param hold_mode_min_interval * 0.625 ms,  range: 0x0002..0xFFFE; only even values are valid.
637  */
638 const hci_cmd_t hci_hold_mode = {
639         HCI_OPCODE_HCI_HOLD_MODE, "H22"
640 };
641 
642 /**
643  * @param handle
644  * @param sniff_max_interval
645  * @param sniff_min_interval
646  * @param sniff_attempt
647  * @param sniff_timeout
648  */
649 const hci_cmd_t hci_sniff_mode = {
650     HCI_OPCODE_HCI_SNIFF_MODE, "H2222"
651 };
652 
653 /**
654  * @param handle
655  */
656 const hci_cmd_t hci_exit_sniff_mode = {
657     HCI_OPCODE_HCI_EXIT_SNIFF_MODE, "H"
658 };
659 
660 /**
661  * @note  Removed in Bluetooth Core v5.0
662  * @param handle
663  * @param beacon_max_interval * 0.625 ms,  range: 0x000E..0xFFFE; only even values are valid.
664  * @param beacon_max_interval * 0.625 ms,  range: 0x000E..0xFFFE; only even values are valid.
665  */
666 const hci_cmd_t hci_park_state = {
667         HCI_OPCODE_HCI_PARK_STATE, "H22"
668 };
669 
670 /**
671  * @note  Removed in Bluetooth Core v5.0
672  * @param handle
673  */
674 const hci_cmd_t hci_exit_park_state = {
675         HCI_OPCODE_HCI_EXIT_PARK_STATE, "H"
676 };
677 
678 /**
679  * @param handle
680  * @param flags
681  * @param service_type
682  * @param token_rate (bytes/s)
683  * @param peak_bandwith (bytes/s)
684  * @param latency (us)
685  * @param delay_variation (us)
686  */
687 const hci_cmd_t hci_qos_setup = {
688     HCI_OPCODE_HCI_QOS_SETUP, "H114444"
689 };
690 
691 /**
692  * @param handle
693  */
694 const hci_cmd_t hci_role_discovery = {
695     HCI_OPCODE_HCI_ROLE_DISCOVERY, "H"
696 };
697 
698 /**
699  * @param bd_addr
700  * @param role (0=master,1=slave)
701  */
702 const hci_cmd_t hci_switch_role_command= {
703     HCI_OPCODE_HCI_SWITCH_ROLE_COMMAND, "B1"
704 };
705 
706 /**
707  * @param handle
708  */
709 const hci_cmd_t hci_read_link_policy_settings = {
710     HCI_OPCODE_HCI_READ_LINK_POLICY_SETTINGS, "H"
711 };
712 
713 /**
714  * @param handle
715  * @param settings
716  */
717 const hci_cmd_t hci_write_link_policy_settings = {
718     HCI_OPCODE_HCI_WRITE_LINK_POLICY_SETTINGS, "H2"
719 };
720 
721 /**
722  * @param handle
723  * @param max_latency
724  * @param min_remote_timeout
725  * @param min_local_timeout
726  */
727 const hci_cmd_t hci_sniff_subrating = {
728     HCI_OPCODE_HCI_SNIFF_SUBRATING, "H222"
729 };
730 
731 /**
732  * @param policy
733  */
734 const hci_cmd_t hci_write_default_link_policy_setting = {
735     HCI_OPCODE_HCI_WRITE_DEFAULT_LINK_POLICY_SETTING, "2"
736 };
737 
738 /**
739  * @param handle
740  * @param unused
741  * @param flow_direction
742  * @param service_type
743  * @param token_rate
744  * @param token_bucket_size
745  * @param peak_bandwidth
746  * @param access_latency
747  */
748 const hci_cmd_t hci_flow_specification = {
749     HCI_OPCODE_HCI_FLOW_SPECIFICATION, "H1114444"
750 };
751 
752 
753 /**
754  *  Controller & Baseband Commands
755  */
756 
757 
758 /**
759  * @param event_mask_lover_octets
760  * @param event_mask_higher_octets
761  */
762 const hci_cmd_t hci_set_event_mask = {
763     HCI_OPCODE_HCI_SET_EVENT_MASK, "44"
764 };
765 
766 /**
767  */
768 const hci_cmd_t hci_reset = {
769     HCI_OPCODE_HCI_RESET, ""
770 };
771 
772 /**
773  * @param handle
774  */
775 const hci_cmd_t hci_flush = {
776     HCI_OPCODE_HCI_FLUSH, "H"
777 };
778 
779 /**
780  * @param handle
781  */
782 const hci_cmd_t hci_read_pin_type = {
783     HCI_OPCODE_HCI_READ_PIN_TYPE, ""
784 };
785 
786 /**
787  * @param handle
788  */
789 const hci_cmd_t hci_write_pin_type = {
790     HCI_OPCODE_HCI_WRITE_PIN_TYPE, "1"
791 };
792 
793 /**
794  * @param bd_addr
795  * @param delete_all_flags
796  */
797 const hci_cmd_t hci_delete_stored_link_key = {
798     HCI_OPCODE_HCI_DELETE_STORED_LINK_KEY, "B1"
799 };
800 
801 #ifdef ENABLE_CLASSIC
802 /**
803  * @param local_name (UTF-8, Null Terminated, max 248 octets)
804  */
805 const hci_cmd_t hci_write_local_name = {
806     HCI_OPCODE_HCI_WRITE_LOCAL_NAME, "N"
807 };
808 #endif
809 
810 /**
811  */
812 const hci_cmd_t hci_read_local_name = {
813     HCI_OPCODE_HCI_READ_LOCAL_NAME, ""
814 };
815 
816 /**
817  */
818 const hci_cmd_t hci_read_page_timeout = {
819     HCI_OPCODE_HCI_READ_PAGE_TIMEOUT, ""
820 };
821 
822 /**
823  * @param page_timeout (* 0.625 ms)
824  */
825 const hci_cmd_t hci_write_page_timeout = {
826     HCI_OPCODE_HCI_WRITE_PAGE_TIMEOUT, "2"
827 };
828 
829 /**
830  * @param scan_enable (no, inq, page, inq+page)
831  */
832 const hci_cmd_t hci_write_scan_enable = {
833     HCI_OPCODE_HCI_WRITE_SCAN_ENABLE, "1"
834 };
835 
836 /**
837  */
838 const hci_cmd_t hci_read_page_scan_activity = {
839     HCI_OPCODE_HCI_READ_PAGE_SCAN_ACTIVITY, ""
840 };
841 
842 /**
843  * @param page_scan_interval (* 0.625 ms)
844  * @param page_scan_window (* 0.625 ms, must be <= page_scan_interval)
845  */
846 const hci_cmd_t hci_write_page_scan_activity = {
847     HCI_OPCODE_HCI_WRITE_PAGE_SCAN_ACTIVITY, "22"
848 };
849 
850 /**
851  */
852 const hci_cmd_t hci_read_inquiry_scan_activity = {
853     HCI_OPCODE_HCI_READ_INQUIRY_SCAN_ACTIVITY, ""
854 };
855 
856 /**
857  * @param inquiry_scan_interval (* 0.625 ms)
858  * @param inquiry_scan_window (* 0.625 ms, must be <= inquiry_scan_interval)
859  */
860 const hci_cmd_t hci_write_inquiry_scan_activity = {
861     HCI_OPCODE_HCI_WRITE_INQUIRY_SCAN_ACTIVITY, "22"
862 };
863 
864 /**
865  * @param authentication_enable
866  */
867 const hci_cmd_t hci_write_authentication_enable = {
868     HCI_OPCODE_HCI_WRITE_AUTHENTICATION_ENABLE, "1"
869 };
870 
871 /**
872  * @param class_of_device
873  */
874 const hci_cmd_t hci_write_class_of_device = {
875     HCI_OPCODE_HCI_WRITE_CLASS_OF_DEVICE, "3"
876 };
877 
878 /**
879  */
880 const hci_cmd_t hci_read_num_broadcast_retransmissions = {
881     HCI_OPCODE_HCI_READ_NUM_BROADCAST_RETRANSMISSIONS, ""
882 };
883 
884 /**
885  * @param num_broadcast_retransmissions (e.g. 0 for a single broadcast)
886  */
887 const hci_cmd_t hci_write_num_broadcast_retransmissions = {
888     HCI_OPCODE_HCI_WRITE_NUM_BROADCAST_RETRANSMISSIONS, "1"
889 };
890 
891 /**
892  * @param connection_handle
893  * @param type 0 = current transmit level, 1 = max transmit level
894  */
895 const hci_cmd_t hci_read_transmit_power_level = {
896     HCI_OPCODE_HCI_READ_TRANSMIT_POWER_LEVEL, "11"
897 };
898 
899 /**
900  * @param synchronous_flow_control_enable - if yes, num completed packet everts are sent for SCO packets
901  */
902 const hci_cmd_t hci_write_synchronous_flow_control_enable = {
903     HCI_OPCODE_HCI_WRITE_SYNCHRONOUS_FLOW_CONTROL_ENABLE, "1"
904 };
905 
906 #ifdef ENABLE_HCI_CONTROLLER_TO_HOST_FLOW_CONTROL
907 
908 /**
909  * @param flow_control_enable - 0: off, 1: ACL only, 2: SCO only, 3: ACL + SCO
910  */
911 const hci_cmd_t hci_set_controller_to_host_flow_control = {
912     HCI_OPCODE_HCI_SET_CONTROLLER_TO_HOST_FLOW_CONTROL, "1"
913 };
914 
915 /**
916  * @param host_acl_data_packet_length
917  * @param host_synchronous_data_packet_length
918  * @param host_total_num_acl_data_packets
919  * @param host_total_num_synchronous_data_packets
920  */
921 const hci_cmd_t hci_host_buffer_size = {
922     HCI_OPCODE_HCI_HOST_BUFFER_SIZE, "2122"
923 };
924 
925 
926 #if 0
927 //
928 // command sent manually sent by hci_host_num_completed_packets
929 //
930 /**
931  * @note only single handle supported by BTstack command generator
932  * @param number_of_handles must be 1
933  * @param connection_handle
934  * @param host_num_of_completed_packets for the given connection handle
935  */
936 const hci_cmd_t hci_host_number_of_completed_packets = {
937     HCI_OPCODE_HCI_HOST_NUMBER_OF_COMPLETED_PACKETS, "1H2"
938 };
939 #endif
940 
941 #endif
942 
943 /**
944  * @param handle
945  */
946 const hci_cmd_t hci_read_link_supervision_timeout = {
947     HCI_OPCODE_HCI_READ_LINK_SUPERVISION_TIMEOUT, "H"
948 };
949 
950 /**
951  * @param handle
952  * @param timeout (0x0001 - 0xFFFF Time -> Range: 0.625ms - 40.9 sec)
953  */
954 const hci_cmd_t hci_write_link_supervision_timeout = {
955     HCI_OPCODE_HCI_WRITE_LINK_SUPERVISION_TIMEOUT, "H2"
956 };
957 
958 /**
959  * @param num_current_iac must be 2
960  * @param iac_lap1
961  * @param iac_lap2
962  */
963 const hci_cmd_t hci_write_current_iac_lap_two_iacs = {
964     HCI_OPCODE_HCI_WRITE_CURRENT_IAC_LAP_TWO_IACS, "133"
965 };
966 
967 /**
968  * @param inquiry_scan_type (0x00 = standard, 0x01 = interlaced)
969  */
970 const hci_cmd_t hci_write_inquiry_scan_type = {
971     HCI_OPCODE_HCI_WRITE_INQUIRY_SCAN_TYPE,  "1"
972 };
973 
974 /**
975  * @param inquiry_mode (0x00 = standard, 0x01 = with RSSI, 0x02 = extended)
976  */
977 const hci_cmd_t hci_write_inquiry_mode = {
978     HCI_OPCODE_HCI_WRITE_INQUIRY_MODE, "1"
979 };
980 
981 /**
982  * @param page_scan_type (0x00 = standard, 0x01 = interlaced)
983  */
984 const hci_cmd_t hci_write_page_scan_type = {
985     HCI_OPCODE_HCI_WRITE_PAGE_SCAN_TYPE, "1"
986 };
987 
988 /**
989  * @param fec_required
990  * @param exstended_inquiry_response
991  */
992 const hci_cmd_t hci_write_extended_inquiry_response = {
993     HCI_OPCODE_HCI_WRITE_EXTENDED_INQUIRY_RESPONSE, "1E"
994 };
995 
996 /**
997  * @param mode (0 = off, 1 = on)
998  */
999 const hci_cmd_t hci_write_simple_pairing_mode = {
1000     HCI_OPCODE_HCI_WRITE_SIMPLE_PAIRING_MODE, "1"
1001 };
1002 
1003 /**
1004  */
1005 const hci_cmd_t hci_read_local_oob_data = {
1006     HCI_OPCODE_HCI_READ_LOCAL_OOB_DATA, ""
1007     // return status, C, R
1008 };
1009 
1010 /**
1011  * @param mode (0 = off, 1 = on)
1012  */
1013 const hci_cmd_t hci_write_default_erroneous_data_reporting = {
1014     HCI_OPCODE_HCI_WRITE_DEFAULT_ERRONEOUS_DATA_REPORTING, "1"
1015 };
1016 
1017 /**
1018  */
1019 const hci_cmd_t hci_read_le_host_supported = {
1020     HCI_OPCODE_HCI_READ_LE_HOST_SUPPORTED, ""
1021     // return: status, le supported host, simultaneous le host
1022 };
1023 
1024 /**
1025  * @param le_supported_host
1026  * @param simultaneous_le_host
1027  */
1028 const hci_cmd_t hci_write_le_host_supported = {
1029     HCI_OPCODE_HCI_WRITE_LE_HOST_SUPPORTED, "11"
1030     // return: status
1031 };
1032 
1033 /**
1034  * @param secure_connections_host_support
1035  */
1036 const hci_cmd_t hci_write_secure_connections_host_support = {
1037     HCI_OPCODE_HCI_WRITE_SECURE_CONNECTIONS_HOST_SUPPORT, "1"
1038     // return: status
1039 };
1040 
1041 /**
1042  */
1043 const hci_cmd_t hci_read_local_extended_oob_data = {
1044     HCI_OPCODE_HCI_READ_LOCAL_EXTENDED_OOB_DATA, ""
1045     // return status, C_192, R_192, R_256, C_256
1046 };
1047 
1048 
1049 /**
1050  * Testing Commands
1051  */
1052 
1053 
1054 /**
1055  */
1056 const hci_cmd_t hci_read_loopback_mode = {
1057     HCI_OPCODE_HCI_READ_LOOPBACK_MODE, ""
1058     // return: status, loopback mode (0 = off, 1 = local loopback, 2 = remote loopback)
1059 };
1060 
1061 /**
1062  * @param loopback_mode
1063  */
1064 const hci_cmd_t hci_write_loopback_mode = {
1065     HCI_OPCODE_HCI_WRITE_LOOPBACK_MODE, "1"
1066     // return: status
1067 };
1068 
1069 /**
1070  */
1071 const hci_cmd_t hci_enable_device_under_test_mode = {
1072     HCI_OPCODE_HCI_ENABLE_DEVICE_UNDER_TEST_MODE, ""
1073     // return: status
1074 };
1075 
1076 /**
1077  * @param simple_pairing_debug_mode
1078  */
1079 const hci_cmd_t hci_write_simple_pairing_debug_mode = {
1080     HCI_OPCODE_HCI_WRITE_SIMPLE_PAIRING_DEBUG_MODE, "1"
1081     // return: status
1082 };
1083 
1084 /**
1085  * @param handle
1086  * @param dm1_acl_u_mode
1087  * @param esco_loopback_mode
1088  */
1089 const hci_cmd_t hci_write_secure_connections_test_mode = {
1090     HCI_OPCODE_HCI_WRITE_SECURE_CONNECTIONS_TEST_MODE, "H11"
1091     // return: status
1092 };
1093 
1094 
1095 /**
1096  * Informational Parameters
1097  */
1098 
1099 const hci_cmd_t hci_read_local_version_information = {
1100     HCI_OPCODE_HCI_READ_LOCAL_VERSION_INFORMATION, ""
1101 };
1102 const hci_cmd_t hci_read_local_supported_commands = {
1103     HCI_OPCODE_HCI_READ_LOCAL_SUPPORTED_COMMANDS, ""
1104 };
1105 const hci_cmd_t hci_read_local_supported_features = {
1106     HCI_OPCODE_HCI_READ_LOCAL_SUPPORTED_FEATURES, ""
1107 };
1108 const hci_cmd_t hci_read_buffer_size = {
1109     HCI_OPCODE_HCI_READ_BUFFER_SIZE, ""
1110 };
1111 const hci_cmd_t hci_read_bd_addr = {
1112     HCI_OPCODE_HCI_READ_BD_ADDR, ""
1113 };
1114 
1115 /**
1116  * Status Paramters
1117  */
1118 
1119 /**
1120  * @param handle
1121  */
1122 const hci_cmd_t hci_read_rssi = {
1123     HCI_OPCODE_HCI_READ_RSSI, "H"
1124 };
1125 
1126 /**
1127  * @param handle
1128  */
1129 const hci_cmd_t hci_read_encryption_key_size = {
1130     HCI_OPCODE_HCI_READ_ENCRYPTION_KEY_SIZE, "H"
1131 };
1132 
1133 
1134 #ifdef ENABLE_BLE
1135 /**
1136  * Low Energy Commands
1137  */
1138 
1139 /**
1140  * @param event_mask_lower_octets
1141  * @param event_mask_higher_octets
1142  */
1143 const hci_cmd_t hci_le_set_event_mask = {
1144     HCI_OPCODE_HCI_LE_SET_EVENT_MASK, "44"
1145     // return: status
1146 };
1147 
1148 const hci_cmd_t hci_le_read_buffer_size = {
1149     HCI_OPCODE_HCI_LE_READ_BUFFER_SIZE, ""
1150     // return: status, le acl data packet len (16), total num le acl data packets(8)
1151 };
1152 const hci_cmd_t hci_le_read_local_supported_features = {
1153     HCI_OPCODE_HCI_LE_READ_LOCAL_SUPPORTED_FEATURES, ""
1154     // return: LE_Features See [Vol 6] Part B, Section 4.6
1155 };
1156 
1157 /**
1158  * @param random_bd_addr
1159  */
1160 const hci_cmd_t hci_le_set_random_address = {
1161     HCI_OPCODE_HCI_LE_SET_RANDOM_ADDRESS, "B"
1162     // return: status
1163 };
1164 
1165 /**
1166  * @param advertising_interval_min ([0x0020,0x4000], default: 0x0800, unit: 0.625 msec)
1167  * @param advertising_interval_max ([0x0020,0x4000], default: 0x0800, unit: 0.625 msec)
1168  * @param advertising_type (enum from 0: ADV_IND, ADC_DIRECT_IND, ADV_SCAN_IND, ADV_NONCONN_IND)
1169  * @param own_address_type (enum from 0: public device address, random device address)
1170  * @param direct_address_type ()
1171  * @param direct_address (public or random address of device to be connecteed)
1172  * @param advertising_channel_map (flags: chan_37(1), chan_38(2), chan_39(4))
1173  * @param advertising_filter_policy (enum from 0: scan any conn any, scan whitelist, con any, scan any conn whitelist, scan whitelist, con whitelist)
1174  */
1175 const hci_cmd_t hci_le_set_advertising_parameters = {
1176     HCI_OPCODE_HCI_LE_SET_ADVERTISING_PARAMETERS, "22111B11"
1177     // return: status
1178 };
1179 
1180 const hci_cmd_t hci_le_read_advertising_channel_tx_power = {
1181     HCI_OPCODE_HCI_LE_READ_ADVERTISING_CHANNEL_TX_POWER, ""
1182     // return: status, level [-20,10] signed int (8), units dBm
1183 };
1184 
1185 /**
1186  * @param advertising_data_length
1187  * @param advertising_data (31 bytes)
1188  */
1189 const hci_cmd_t hci_le_set_advertising_data= {
1190     HCI_OPCODE_HCI_LE_SET_ADVERTISING_DATA, "1A"
1191     // return: status
1192 };
1193 
1194 /**
1195  * @param scan_response_data_length
1196  * @param scan_response_data (31 bytes)
1197  */
1198 const hci_cmd_t hci_le_set_scan_response_data= {
1199     HCI_OPCODE_HCI_LE_SET_SCAN_RESPONSE_DATA, "1A"
1200     // return: status
1201 };
1202 
1203 /**
1204  * @param advertise_enable (off: 0, on: 1)
1205  */
1206 const hci_cmd_t hci_le_set_advertise_enable = {
1207     HCI_OPCODE_HCI_LE_SET_ADVERTISE_ENABLE, "1"
1208     // return: status
1209 };
1210 
1211 /**
1212  * @param le_scan_type (passive (0), active (1))
1213  * @param le_scan_interval ([0x0004,0x4000], unit: 0.625 msec)
1214  * @param le_scan_window   ([0x0004,0x4000], unit: 0.625 msec)
1215  * @param own_address_type (public (0), random (1))
1216  * @param scanning_filter_policy (any (0), only whitelist (1))
1217  */
1218 const hci_cmd_t hci_le_set_scan_parameters = {
1219     HCI_OPCODE_HCI_LE_SET_SCAN_PARAMETERS, "12211"
1220     // return: status
1221 };
1222 
1223 /**
1224  * @param le_scan_enable  (disabled (0), enabled (1))
1225  * @param filter_duplices (disabled (0), enabled (1))
1226  */
1227 const hci_cmd_t hci_le_set_scan_enable = {
1228     HCI_OPCODE_HCI_LE_SET_SCAN_ENABLE, "11"
1229     // return: status
1230 };
1231 
1232 /**
1233  * @param le_scan_interval ([0x0004, 0x4000], unit: 0.625 msec)
1234  * @param le_scan_window ([0x0004, 0x4000], unit: 0.625 msec)
1235  * @param initiator_filter_policy (peer address type + peer address (0), whitelist (1))
1236  * @param peer_address_type (public (0), random (1))
1237  * @param peer_address
1238  * @param own_address_type (public (0), random (1))
1239  * @param conn_interval_min ([0x0006, 0x0c80], unit: 1.25 msec)
1240  * @param conn_interval_max ([0x0006, 0x0c80], unit: 1.25 msec)
1241  * @param conn_latency (number of connection events [0x0000, 0x01f4])
1242  * @param supervision_timeout ([0x000a, 0x0c80], unit: 10 msec)
1243  * @param minimum_CE_length ([0x0000, 0xffff], unit: 0.625 msec)
1244  * @param maximum_CE_length ([0x0000, 0xffff], unit: 0.625 msec)
1245  */
1246 const hci_cmd_t hci_le_create_connection= {
1247     HCI_OPCODE_HCI_LE_CREATE_CONNECTION, "2211B1222222"
1248     // return: none -> le create connection complete event
1249 };
1250 
1251 const hci_cmd_t hci_le_create_connection_cancel = {
1252     HCI_OPCODE_HCI_LE_CREATE_CONNECTION_CANCEL, ""
1253     // return: status
1254 };
1255 
1256 const hci_cmd_t hci_le_read_white_list_size = {
1257     HCI_OPCODE_HCI_LE_READ_WHITE_LIST_SIZE, ""
1258     // return: status, number of entries in controller whitelist
1259 };
1260 
1261 const hci_cmd_t hci_le_clear_white_list = {
1262     HCI_OPCODE_HCI_LE_CLEAR_WHITE_LIST, ""
1263     // return: status
1264 };
1265 
1266 /**
1267  * @param address_type (public (0), random (1))
1268  * @param bd_addr
1269  */
1270 const hci_cmd_t hci_le_add_device_to_white_list = {
1271     HCI_OPCODE_HCI_LE_ADD_DEVICE_TO_WHITE_LIST, "1B"
1272     // return: status
1273 };
1274 
1275 /**
1276  * @param address_type (public (0), random (1))
1277  * @param bd_addr
1278  */
1279 const hci_cmd_t hci_le_remove_device_from_white_list = {
1280     HCI_OPCODE_HCI_LE_REMOVE_DEVICE_FROM_WHITE_LIST, "1B"
1281     // return: status
1282 };
1283 
1284 /**
1285  * @param conn_handle
1286  * @param conn_interval_min ([0x0006,0x0c80], unit: 1.25 msec)
1287  * @param conn_interval_max ([0x0006,0x0c80], unit: 1.25 msec)
1288  * @param conn_latency ([0x0000,0x03e8], number of connection events)
1289  * @param supervision_timeout ([0x000a,0x0c80], unit: 10 msec)
1290  * @param minimum_CE_length ([0x0000,0xffff], unit: 0.625 msec)
1291  * @param maximum_CE_length ([0x0000,0xffff], unit: 0.625 msec)
1292  */
1293 const hci_cmd_t hci_le_connection_update = {
1294     HCI_OPCODE_HCI_LE_CONNECTION_UPDATE, "H222222"
1295     // return: none -> le connection update complete event
1296 };
1297 
1298 /**
1299  * @param channel_map_lower_32bits
1300  * @param channel_map_higher_5bits
1301  */
1302 const hci_cmd_t hci_le_set_host_channel_classification = {
1303     HCI_OPCODE_HCI_LE_SET_HOST_CHANNEL_CLASSIFICATION, "41"
1304     // return: status
1305 };
1306 
1307 /**
1308  * @param conn_handle
1309  */
1310 const hci_cmd_t hci_le_read_channel_map = {
1311     HCI_OPCODE_HCI_LE_READ_CHANNEL_MAP, "H"
1312     // return: status, connection handle, channel map (5 bytes, 37 used)
1313 };
1314 
1315 /**
1316  * @param conn_handle
1317  */
1318 const hci_cmd_t hci_le_read_remote_used_features = {
1319     HCI_OPCODE_HCI_LE_READ_REMOTE_USED_FEATURES, "H"
1320     // return: none -> le read remote used features complete event
1321 };
1322 
1323 /**
1324  * @param key ((128) for AES-128)
1325  * @param plain_text (128)
1326  */
1327 const hci_cmd_t hci_le_encrypt = {
1328     HCI_OPCODE_HCI_LE_ENCRYPT, "PP"
1329     // return: status, encrypted data (128)
1330 };
1331 
1332 const hci_cmd_t hci_le_rand = {
1333     HCI_OPCODE_HCI_LE_RAND, ""
1334     // return: status, random number (64)
1335 };
1336 
1337 /**
1338  * @param conn_handle
1339  * @param random_number_lower_32bits
1340  * @param random_number_higher_32bits
1341  * @param encryption_diversifier (16)
1342  * @param long_term_key (128)
1343  */
1344 const hci_cmd_t hci_le_start_encryption = {
1345     HCI_OPCODE_HCI_LE_START_ENCRYPTION, "H442P"
1346     // return: none -> encryption changed or encryption key refresh complete event
1347 };
1348 
1349 /**
1350  * @param connection_handle
1351  * @param long_term_key (128)
1352  */
1353 const hci_cmd_t hci_le_long_term_key_request_reply = {
1354     HCI_OPCODE_HCI_LE_LONG_TERM_KEY_REQUEST_REPLY, "HP"
1355     // return: status, connection handle
1356 };
1357 
1358 /**
1359  * @param conn_handle
1360  */
1361 const hci_cmd_t hci_le_long_term_key_negative_reply = {
1362     HCI_OPCODE_HCI_LE_LONG_TERM_KEY_NEGATIVE_REPLY, "H"
1363     // return: status, connection handle
1364 };
1365 
1366 /**
1367  * @param conn_handle
1368  */
1369 const hci_cmd_t hci_le_read_supported_states = {
1370     HCI_OPCODE_HCI_LE_READ_SUPPORTED_STATES, "H"
1371     // return: status, LE states (64)
1372 };
1373 
1374 /**
1375  * @param rx_frequency ([0x00 0x27], frequency (MHz): 2420 + N*2)
1376  */
1377 const hci_cmd_t hci_le_receiver_test = {
1378     HCI_OPCODE_HCI_LE_RECEIVER_TEST, "1"
1379     // return: status
1380 };
1381 
1382 /**
1383  * @param tx_frequency ([0x00 0x27], frequency (MHz): 2420 + N*2)
1384  * @param test_payload_lengh ([0x00,0x25])
1385  * @param packet_payload ([0,7] different patterns)
1386  */
1387 const hci_cmd_t hci_le_transmitter_test = {
1388     HCI_OPCODE_HCI_LE_TRANSMITTER_TEST, "111"
1389     // return: status
1390 };
1391 
1392 /**
1393  * @param end_test_cmd
1394  */
1395 const hci_cmd_t hci_le_test_end = {
1396     HCI_OPCODE_HCI_LE_TEST_END, "1"
1397     // return: status, number of packets (8)
1398 };
1399 
1400 /**
1401  * @param conn_handle
1402  * @param conn_interval_min ([0x0006,0x0c80], unit: 1.25 msec)
1403  * @param conn_interval_max ([0x0006,0x0c80], unit: 1.25 msec)
1404  * @param conn_latency ([0x0000,0x03e8], number of connection events)
1405  * @param supervision_timeout ([0x000a,0x0c80], unit: 10 msec)
1406  * @param minimum_CE_length ([0x0000,0xffff], unit: 0.625 msec)
1407  * @param maximum_CE_length ([0x0000,0xffff], unit: 0.625 msec)
1408  */
1409 const hci_cmd_t hci_le_remote_connection_parameter_request_reply = {
1410     HCI_OPCODE_HCI_LE_REMOTE_CONNECTION_PARAMETER_REQUEST_REPLY, "H222222"
1411     // return: status, connection handle
1412 };
1413 
1414 /**
1415  * @param con_handle
1416  * @param reason
1417  */
1418 const hci_cmd_t hci_le_remote_connection_parameter_request_negative_reply = {
1419     HCI_OPCODE_HCI_LE_REMOTE_CONNECTION_PARAMETER_REQUEST_NEGATIVE_REPLY, "H1"
1420     // return: status, connection handle
1421 };
1422 
1423 /**
1424  * @param con_handle
1425  * @param tx_octets
1426  * @param tx_time
1427  */
1428 const hci_cmd_t hci_le_set_data_length = {
1429     HCI_OPCODE_HCI_LE_SET_DATA_LENGTH, "H22"
1430     // return: status, connection handle
1431 };
1432 
1433 /**
1434  */
1435 const hci_cmd_t hci_le_read_suggested_default_data_length = {
1436     HCI_OPCODE_HCI_LE_READ_SUGGESTED_DEFAULT_DATA_LENGTH, ""
1437     // return: status, suggested max tx octets, suggested max tx time
1438 };
1439 
1440 /**
1441  * @param suggested_max_tx_octets
1442  * @param suggested_max_tx_time
1443  */
1444 const hci_cmd_t hci_le_write_suggested_default_data_length = {
1445     HCI_OPCODE_HCI_LE_WRITE_SUGGESTED_DEFAULT_DATA_LENGTH, "22"
1446     // return: status
1447 };
1448 
1449 /**
1450  */
1451 const hci_cmd_t hci_le_read_local_p256_public_key = {
1452     HCI_OPCODE_HCI_LE_READ_LOCAL_P256_PUBLIC_KEY, ""
1453 //  LE Read Local P-256 Public Key Complete is generated on completion
1454 };
1455 
1456 /**
1457  * @param public key
1458  * @param private key
1459  */
1460 const hci_cmd_t hci_le_generate_dhkey = {
1461     HCI_OPCODE_HCI_LE_GENERATE_DHKEY, "QQ"
1462 // LE Generate DHKey Complete is generated on completion
1463 };
1464 
1465 /**
1466  * @param Peer_Identity_Address_Type
1467  * @param Peer_Identity_Address
1468  * @param Peer_IRK
1469  * @param Local_IRK
1470  */
1471 const hci_cmd_t hci_le_add_device_to_resolving_list = {
1472     HCI_OPCODE_HCI_LE_ADD_DEVICE_TO_RESOLVING_LIST, "1BPP"
1473 };
1474 
1475 /**
1476  * @param Peer_Identity_Address_Type
1477  * @param Peer_Identity_Address
1478  */
1479 const hci_cmd_t hci_le_remove_device_from_resolving_list = {
1480     HCI_OPCODE_HCI_LE_REMOVE_DEVICE_FROM_RESOLVING_LIST, "1B"
1481 };
1482 
1483 /**
1484  */
1485 const hci_cmd_t hci_le_clear_resolving_list = {
1486     HCI_OPCODE_HCI_LE_CLEAR_RESOLVING_LIST, ""
1487 };
1488 
1489 /**
1490  */
1491 const hci_cmd_t hci_le_read_resolving_list_size = {
1492     HCI_OPCODE_HCI_LE_READ_RESOLVING_LIST_SIZE, ""
1493 };
1494 
1495 /**
1496  * @param Peer_Identity_Address_Type
1497  * @param Peer_Identity_Address
1498  */
1499 const hci_cmd_t hci_le_read_peer_resolvable_address = {
1500     HCI_OPCODE_HCI_LE_READ_PEER_RESOLVABLE_ADDRESS, ""
1501 };
1502 
1503 /**
1504  * @param Peer_Identity_Address_Type
1505  * @param Peer_Identity_Address
1506  */
1507 const hci_cmd_t hci_le_read_local_resolvable_address = {
1508     HCI_OPCODE_HCI_LE_READ_LOCAL_RESOLVABLE_ADDRESS, ""
1509 };
1510 
1511 /**
1512  * @param Address_Resolution_Enable
1513  */
1514 const hci_cmd_t hci_le_set_address_resolution_enabled= {
1515     HCI_OPCODE_HCI_LE_SET_ADDRESS_RESOLUTION_ENABLED, "1"
1516 };
1517 
1518 /**
1519  * @param RPA_Timeout in seconds, range 0x0001 to 0x0E10, default: 900 s
1520  */
1521 const hci_cmd_t hci_le_set_resolvable_private_address_timeout= {
1522     HCI_OPCODE_HCI_LE_SET_RESOLVABLE_PRIVATE_ADDRESS_TIMEOUT, "2"
1523 };
1524 
1525 /**
1526  */
1527 const hci_cmd_t hci_le_read_maximum_data_length = {
1528     HCI_OPCODE_HCI_LE_READ_MAXIMUM_DATA_LENGTH, ""
1529     // return: status, supported max tx octets, supported max tx time, supported max rx octets, supported max rx time
1530 };
1531 
1532 /**
1533  * @param con_handle
1534  */
1535 const hci_cmd_t hci_le_read_phy = {
1536     HCI_OPCODE_HCI_LE_READ_PHY, "H"
1537     // return: status, connection handler, tx phy, rx phy
1538 };
1539 
1540 /**
1541  * @param all_phys
1542  * @param tx_phys
1543  * @param rx_phys
1544  */
1545 const hci_cmd_t hci_le_set_default_phy = {
1546     HCI_OPCODE_HCI_LE_SET_DEFAULT_PHY, "111"
1547     // return: status
1548 };
1549 
1550 /**
1551  * @param con_handle
1552  * @param all_phys
1553  * @param tx_phys
1554  * @param rx_phys
1555  * @param phy_options
1556  */
1557 const hci_cmd_t hci_le_set_phy = {
1558     HCI_OPCODE_HCI_LE_SET_PHY, "H1111"
1559 // LE PHY Update Complete is generated on completion
1560 };
1561 
1562 /**
1563  * @param rx_channel
1564  * @param phy
1565  * @param modulation_index
1566  */
1567 const hci_cmd_t hci_le_receiver_test_v2 = {
1568     HCI_OPCODE_HCI_LE_RECEIVER_TEST_V2, "111"
1569 };
1570 
1571 /**
1572  * @param tx_channel
1573  * @param test_data_length
1574  * @param packet_payload
1575  * @param phy
1576  */
1577 const hci_cmd_t hci_le_transmitter_test_v2 = {
1578     HCI_OPCODE_HCI_LE_TRANSMITTER_TEST_V2, "1111"
1579 };
1580 
1581 /**
1582  * @param advertising_handle
1583  * @param random_address
1584  */
1585 const hci_cmd_t hci_le_set_advertising_set_random_address = {
1586     HCI_OPCODE_HCI_LE_SET_ADVERTISING_SET_RANDOM_ADDRESS, "1B"
1587 };
1588 
1589 /**
1590  * @param advertising_handle
1591  * @param advertising_event_properties
1592  * @param primary_advertising_interval_min in 0.625 ms, range: 0x000020..0xffffff
1593  * @param primary_advertising_interval_max in 0.625 ms, range: 0x000020..0xffffff
1594  * @param primary_advertising_channel_map
1595  * @param own_address_type
1596  * @param peer_address_type
1597  * @param peer_address
1598  * @param advertising_filter_policy
1599  * @param advertising_tx_power in dBm, range: -127..20
1600  * @param primary_advertising_phy
1601  * @param secondary_advertising_max_skip
1602  * @param secondary_advertising_phy
1603  * @param advertising_sid
1604  * @param scan_request_notification_enable
1605  */
1606 const hci_cmd_t hci_le_set_extended_advertising_parameters = {
1607     HCI_OPCODE_HCI_LE_SET_EXTENDED_ADVERTISING_PARAMETERS, "1233111B1111111"
1608 };
1609 
1610 /**
1611  * @param advertising_handle
1612  * @param operation
1613  * @param fragment_preference
1614  * @param advertising_data_length
1615  * @param advertising_data
1616  */
1617 
1618 const hci_cmd_t hci_le_set_extended_advertising_data = {
1619     HCI_OPCODE_HCI_LE_SET_EXTENDED_ADVERTISING_DATA, "111JV"
1620 };
1621 
1622 /**
1623  * @param advertising_handle
1624  * @param operation
1625  * @param fragment_preference
1626  * @param scan_response_data_length
1627  * @param scan_response_data
1628  */
1629 
1630 const hci_cmd_t hci_le_set_extended_scan_response_data = {
1631     HCI_OPCODE_HCI_LE_SET_EXTENDED_SCAN_RESPONSE_DATA, "111JV"
1632 };
1633 
1634 /**
1635  * @param enable
1636  * @param num_sets
1637  * @param advertising_handle[i]
1638  * @param duration[i]
1639  * @param max_extended_advertising_events[i]
1640  */
1641 
1642 const hci_cmd_t hci_le_set_extended_advertising_enable = {
1643         HCI_OPCODE_HCI_LE_SET_EXTENDED_ADVERTISING_ENABLE, "11[121]"
1644 };
1645 
1646 /**
1647  */
1648 const hci_cmd_t hci_le_read_maximum_advertising_data_length = {
1649     HCI_OPCODE_HCI_LE_READ_MAXIMUM_ADVERTISING_DATA_LENGTH, ""
1650 };
1651 
1652 /**
1653  */
1654 const hci_cmd_t hci_le_read_number_of_supported_advertising_sets = {
1655     HCI_OPCODE_HCI_LE_READ_NUMBER_OF_SUPPORTED_ADVERTISING_SETS, ""
1656 };
1657 
1658 /**
1659  * @param advertising_handle
1660  */
1661 const hci_cmd_t hci_le_remove_advertising_set = {
1662     HCI_OPCODE_HCI_LE_REMOVE_ADVERTISING_SET, "1"
1663 };
1664 
1665 /**
1666  */
1667 const hci_cmd_t hci_le_clear_advertising_sets = {
1668     HCI_OPCODE_HCI_LE_CLEAR_ADVERTISING_SETS, ""
1669 };
1670 
1671 /**
1672  * @param advertising_handle
1673  * @param periodic_advertising_interval_min * 1.25 ms, range 0x0006..0xffff
1674  * @param periodic_advertising_interval_max * 1.25 ms, range 0x0006..0xffff
1675  * @param periodic_advertising_properties
1676  */
1677 const hci_cmd_t hci_le_set_periodic_advertising_parameters = {
1678     HCI_OPCODE_HCI_LE_SET_PERIODIC_ADVERTISING_PARAMETERS, "1222"
1679 };
1680 
1681 /**
1682  * @param advertising_handle
1683  * @param operation
1684  * @param advertising_data_length
1685  * @param advertising_data
1686  */
1687 
1688 const hci_cmd_t hci_le_set_periodic_advertising_data = {
1689     HCI_OPCODE_HCI_LE_SET_PERIODIC_ADVERTISING_DATA, "11JV"
1690 };
1691 
1692 /**
1693  * @param enable
1694  * @param advertising_handle
1695  */
1696 const hci_cmd_t hci_le_set_periodic_advertising_enable = {
1697     HCI_OPCODE_HCI_LE_SET_PERIODIC_ADVERTISING_ENABLE, "11"
1698 };
1699 
1700 /**
1701  * @param own_address_type
1702  * @param scanning_filter_policy
1703  * @param scanning_phys 0 = LE 1M PHY | 2 = LE Coded PHY
1704  * @param scan_type
1705  * @param scan_interval * 0.625, range = 0x0004..0xffff
1706  * @param scan_window * 0.625, range = 0x0004..0xffff
1707  */
1708 
1709 // Variants for 1 (1M or Coded) PHY
1710 const hci_cmd_t hci_le_set_extended_scan_parameters_1 = {
1711     HCI_OPCODE_HCI_LE_SET_EXTENDED_SCAN_PARAMETERS, "111122"
1712 };
1713 
1714 // Variants for 2 (1M and Coded) PHY
1715 const hci_cmd_t hci_le_set_extended_scan_parameters_2 = {
1716         HCI_OPCODE_HCI_LE_SET_EXTENDED_SCAN_PARAMETERS, "111122122"
1717 };
1718 
1719 /**
1720  * @param enable
1721  * @param filter_duplicates
1722  * @param duration 0 = Scan continuously until explicitly disable, 10 ms
1723  * @param period 0 = Scan continuously, 1.28 s
1724  */
1725 const hci_cmd_t hci_le_set_extended_scan_enable = {
1726     HCI_OPCODE_HCI_LE_SET_EXTENDED_SCAN_ENABLE, "1122"
1727 };
1728 
1729 /**
1730  * @param initiator_filter_policy
1731  * @param own_address_type
1732  * @param peer_address_type
1733  * @param peer_address
1734  * @param initiating_phys with bit 0 = LE 1M PHY, bit 1 = LE 2M PHY, bit 2 = Coded PHY
1735  * @param scan_interval[i] * 0.625 ms
1736  * @param scan_window[i] * 0.625 ms
1737  * @param connection_interval_min[i] * 1.25 ms
1738  * @param connection_interval_max[i] * 1.25 ms
1739  * @param connection_latency[i]
1740  * @param supervision_timeout[i] * 10 ms
1741  * @param min_ce_length[i] * 0.625 ms
1742  * @param max_ce_length[i] * 0.625 ms
1743  */
1744 
1745 const hci_cmd_t hci_le_extended_create_connection = {
1746     HCI_OPCODE_HCI_LE_EXTENDED_CREATE_CONNECTION, "111Bb[22222222]"
1747 };
1748 
1749 /**
1750  * @param options
1751  * @param advertising_sid
1752  * @param advertiser_address_type
1753  * @param advertiser_address
1754  * @param skip
1755  * @param sync_timeout * 10 ms
1756  * @param sync_cte_type
1757  */
1758 const hci_cmd_t hci_le_periodic_advertising_create_sync = {
1759     HCI_OPCODE_HCI_LE_PERIODIC_ADVERTISING_CREATE_SYNC, "111B221"
1760 };
1761 
1762 /**
1763  */
1764 const hci_cmd_t hci_le_periodic_advertising_create_sync_cancel = {
1765     HCI_OPCODE_HCI_LE_PERIODIC_ADVERTISING_CREATE_SYNC_CANCEL, ""
1766 };
1767 
1768 /**
1769  * @param sync_handle
1770  */
1771 const hci_cmd_t hci_le_periodic_advertising_terminate_sync = {
1772     HCI_OPCODE_HCI_LE_PERIODIC_ADVERTISING_TERMINATE_SYNC, ""
1773 };
1774 
1775 /**
1776  * @param advertiser_address_type
1777  * @param advertiser_address
1778  * @param advertising_sid
1779  */
1780 const hci_cmd_t hci_le_add_device_to_periodic_advertiser_list = {
1781     HCI_OPCODE_HCI_LE_ADD_DEVICE_TO_PERIODIC_ADVERTISER_LIST, "1B1"
1782 };
1783 
1784 /**
1785  * @param advertiser_address_type
1786  * @param advertiser_address
1787  * @param advertising_sid
1788  */
1789 const hci_cmd_t hci_le_remove_device_from_periodic_advertiser_list = {
1790     HCI_OPCODE_HCI_LE_REMOVE_DEVICE_FROM_PERIODIC_ADVERTISER_LIST, "1B1"
1791 };
1792 
1793 /**
1794  */
1795 const hci_cmd_t hci_le_clear_periodic_advertiser_list = {
1796     HCI_OPCODE_HCI_LE_CLEAR_PERIODIC_ADVERTISER_LIST, ""
1797 };
1798 
1799 /**
1800  */
1801 const hci_cmd_t hci_le_read_periodic_advertiser_list_size = {
1802     HCI_OPCODE_HCI_LE_READ_PERIODIC_ADVERTISER_LIST_SIZE, ""
1803 };
1804 
1805 /**
1806  */
1807 const hci_cmd_t hci_le_read_transmit_power = {
1808     HCI_OPCODE_HCI_LE_READ_TRANSMIT_POWER, ""
1809 };
1810 
1811 /**
1812  */
1813 const hci_cmd_t hci_le_read_rf_path_compensation = {
1814     HCI_OPCODE_HCI_LE_READ_RF_PATH_COMPENSATION, ""
1815 };
1816 
1817 /**
1818  * @param rf_tx_path_compensation_value * 0.1 dB, signed
1819  * @param rf_rx_path_compensation_value * 0.1 dB, signed
1820  */
1821 const hci_cmd_t hci_le_write_rf_path_compensation = {
1822     HCI_OPCODE_HCI_LE_WRITE_RF_PATH_COMPENSATION, "22"
1823 };
1824 
1825 /**
1826  * @param peer_identity_address_type
1827  * @param peer_identity_address
1828  * @param privacy_mode
1829  */
1830 const hci_cmd_t hci_le_set_privacy_mode = {
1831     HCI_OPCODE_HCI_LE_SET_PRIVACY_MODE, "1B1"
1832 };
1833 
1834 /**
1835  * @param rx_channel
1836  * @param phy
1837  * @param modulation_index
1838  * @param expected_cte_length
1839  * @param expected_cte_type
1840  * @param slot_durations
1841  * @param switching_pattern_length
1842  * @param antenna_ids[i]
1843  */
1844 
1845 const hci_cmd_t hci_le_receiver_test_v3 = {
1846     HCI_OPCODE_HCI_LE_RECEIVER_TEST_V3, "111111a[1]"
1847 };
1848 
1849 /**
1850  * @param tx_channel
1851  * @param test_data_length
1852  * @param packet_payload
1853  * @param phy
1854  * @param cte_length
1855  * @param cte_type
1856  * @param switching_pattern_length
1857  * @param antenna_ids[i]
1858  */
1859 
1860 const hci_cmd_t hci_le_transmitter_test_v3 = {
1861     HCI_OPCODE_HCI_LE_TRANSMITTER_TEST_V3, "111111a[1]"
1862 };
1863 
1864 /**
1865  * @param advertising_handle
1866  * @param cte_length
1867  * @param cte_type
1868  * @param cte_count
1869  * @param switching_pattern_length
1870  * @param antenna_ids[i]
1871  */
1872 
1873 const hci_cmd_t hci_le_set_connectionless_cte_transmit_parameters = {
1874     HCI_OPCODE_HCI_LE_SET_CONNECTIONLESS_CTE_TRANSMIT_PARAMETERS, "1111a[1]"
1875 };
1876 
1877 /**
1878  * @param advertising_handle
1879  * @param cte_enable
1880  */
1881 const hci_cmd_t hci_le_set_connectionless_cte_transmit_enable = {
1882     HCI_OPCODE_HCI_LE_SET_CONNECTIONLESS_CTE_TRANSMIT_ENABLE, "11"
1883 };
1884 
1885 /**
1886  * @param sync_handle
1887  * @param sampling_enable
1888  * @param slot_durations
1889  * @param max_sampled_ctes
1890  * @param switching_pattern_length
1891  * @param antenna_ids[i]
1892  */
1893 
1894 const hci_cmd_t hci_le_set_connectionless_iq_sampling_enable = {
1895     HCI_OPCODE_HCI_LE_SET_CONNECTIONLESS_IQ_SAMPLING_ENABLE, "2111a[i]"
1896 };
1897 
1898 /**
1899  * @param connection_handle
1900  * @param sampling_enable
1901  * @param slot_durations
1902  * @param switching_pattern_length
1903  * @param antenna_ids[i]
1904  */
1905 
1906 const hci_cmd_t hci_le_set_connection_cte_receive_parameters = {
1907     HCI_OPCODE_HCI_LE_SET_CONNECTION_CTE_RECEIVE_PARAMETERS, "211a[1]"
1908 };
1909 
1910 /**
1911  * @param connection_handle
1912  * @param cte_types
1913  * @param switching_pattern_length
1914  * @param antenna_ids[i]
1915  */
1916 
1917 const hci_cmd_t hci_le_set_connection_cte_transmit_parameters = {
1918     HCI_OPCODE_HCI_LE_SET_CONNECTION_CTE_TRANSMIT_PARAMETERS, "21a[1]"
1919 };
1920 
1921 /**
1922  * @param connection_handle
1923  * @param enable
1924  * @param cte_request_interval
1925  * @param requested_cte_length
1926  * @param requested_cte_type
1927  */
1928 const hci_cmd_t hci_le_connection_cte_request_enable = {
1929     HCI_OPCODE_HCI_LE_CONNECTION_CTE_REQUEST_ENABLE, "H1211"
1930 };
1931 
1932 /**
1933  * @param connection_handle
1934  * @param enable
1935  */
1936 const hci_cmd_t hci_le_connection_cte_response_enable = {
1937     HCI_OPCODE_HCI_LE_CONNECTION_CTE_RESPONSE_ENABLE, "H1"
1938 };
1939 
1940 /**
1941  */
1942 const hci_cmd_t hci_le_read_antenna_information = {
1943     HCI_OPCODE_HCI_LE_READ_ANTENNA_INFORMATION, ""
1944 };
1945 
1946 /**
1947  * @param sync_handle
1948  * @param enable
1949  */
1950 const hci_cmd_t hci_le_set_periodic_advertising_receive_enable = {
1951     HCI_OPCODE_HCI_LE_SET_PERIODIC_ADVERTISING_RECEIVE_ENABLE, "H1"
1952 };
1953 
1954 /**
1955  * @param connection_handle
1956  * @param service_data
1957  * @param sync_handle
1958  */
1959 const hci_cmd_t hci_le_periodic_advertising_sync_transfer = {
1960     HCI_OPCODE_HCI_LE_PERIODIC_ADVERTISING_SYNC_TRANSFER, "H22"
1961 };
1962 
1963 /**
1964  * @param connection_handle
1965  * @param service_data
1966  * @param advertising_handle
1967  */
1968 const hci_cmd_t hci_le_periodic_advertising_set_info_transfer = {
1969     HCI_OPCODE_HCI_LE_PERIODIC_ADVERTISING_SET_INFO_TRANSFER, "H21"
1970 };
1971 
1972 /**
1973  * @param connection_handle
1974  * @param mode
1975  * @param skip
1976  * @param sync_timeout
1977  * @param cte_type
1978  */
1979 const hci_cmd_t hci_le_set_periodic_advertising_sync_transfer_parameters = {
1980     HCI_OPCODE_HCI_LE_SET_PERIODIC_ADVERTISING_SYNC_TRANSFER_PARAMETERS, "H1221"
1981 };
1982 
1983 /**
1984  * @param mode
1985  * @param skip
1986  * @param sync_timeout
1987  * @param cte_type
1988  */
1989 const hci_cmd_t hci_le_set_default_periodic_advertising_sync_transfer_parameters = {
1990     HCI_OPCODE_HCI_LE_SET_DEFAULT_PERIODIC_ADVERTISING_SYNC_TRANSFER_PARAMETERS, "1221"
1991 };
1992 
1993 /**
1994  * @param 256Remote_P-256_public_key_x
1995  * @param 256Remote_P-256_public_key_y
1996  * @param key_type
1997  */
1998 const hci_cmd_t hci_le_generate_dhkey_v2 = {
1999     HCI_OPCODE_HCI_LE_GENERATE_DHKEY_V2, "QQ1"
2000 };
2001 
2002 /**
2003  * @param action
2004  */
2005 const hci_cmd_t hci_le_modify_sleep_clock_accuracy = {
2006     HCI_OPCODE_HCI_LE_MODIFY_SLEEP_CLOCK_ACCURACY, "1"
2007 };
2008 
2009 /**
2010  */
2011 const hci_cmd_t hci_opcode_hci_le_read_buffer_size_v2 = {
2012     HCI_OPCODE_HCI_OPCODE_HCI_LE_READ_BUFFER_SIZE_V2, ""
2013 };
2014 
2015 /**
2016  * @param connection_handle
2017  */
2018 const hci_cmd_t hci_le_read_iso_tx_sync = {
2019     HCI_OPCODE_HCI_LE_READ_ISO_TX_SYNC, "H"
2020 };
2021 
2022 /**
2023  * @param cig_id
2024  * @param sdu_interval_m_to_s
2025  * @param sdu_interval_s_to_m
2026  * @param slaves_clock_accuracy
2027  * @param packing
2028  * @param framing
2029  * @param max_transport_latency_m_to_s
2030  * @param max_transport_latency_s_to_m
2031  * @param cis_count
2032  * @param cis_id[i]
2033  * @param max_sdu_m_to_s[i]
2034  * @param max_sdu_s_to_m[i]
2035  * @param phy_m_to_s[i]
2036  * @param phy_s_to_m[i]
2037  * @param rtn_m_to_s[i]
2038  * @param rtn_s_to_m[i]
2039  */
2040 
2041 const hci_cmd_t hci_le_set_cig_parameters = {
2042     HCI_OPCODE_HCI_LE_SET_CIG_PARAMETERS, "13311122a[1221111]"
2043 };
2044 
2045 /**
2046  * @param cig_id
2047  * @param sdu_interval_m_to_s
2048  * @param sdu_interval_s_to_m
2049  * @param ft_m_to_s
2050  * @param ft_s_to_m
2051  * @param iso_interval
2052  * @param slaves_clock_accuracy
2053  * @param packing
2054  * @param framing
2055  * @param max_transport_latency_m_to_s
2056  * @param max_transport_latency_s_to_m
2057  * @param cis_count
2058  * @param cis_id[i]
2059  * @param nse[i]
2060  * @param max_sdu_m_to_s[i]
2061  * @param max_sdu_s_to_m[i]
2062  * @param max_pdu_m_to_s[i]
2063  * @param max_pdu_s_to_m[i]
2064  * @param phy_m_to_s[i]
2065  * @param phy_s_to_m[i]
2066  * @param bn_m_to_s[i]
2067  * @param bn_s_to_m[i]
2068  */
2069 
2070 const hci_cmd_t hci_le_set_cig_parameters_test = {
2071     HCI_OPCODE_HCI_LE_SET_CIG_PARAMETERS_TEST, "133112111a[1122221111]"
2072 };
2073 
2074 /**
2075  * @param cis_count
2076  * @param cis_connection_handle[i]
2077  * @param acl_connection_handle[i]
2078  */
2079 
2080 const hci_cmd_t hci_le_create_cis = {
2081     HCI_OPCODE_HCI_LE_CREATE_CIS, "a[22]"
2082 };
2083 
2084 /**
2085  * @param cig_id
2086  */
2087 const hci_cmd_t hci_le_remove_cig = {
2088     HCI_OPCODE_HCI_LE_REMOVE_CIG, "1"
2089 };
2090 
2091 /**
2092  * @param connection_handle
2093  */
2094 const hci_cmd_t hci_le_accept_cis_request = {
2095     HCI_OPCODE_HCI_LE_ACCEPT_CIS_REQUEST, "H"
2096 };
2097 
2098 /**
2099  * @param connection_handle
2100  */
2101 const hci_cmd_t hci_le_reject_cis_request = {
2102     HCI_OPCODE_HCI_LE_REJECT_CIS_REQUEST, "H"
2103 };
2104 
2105 /**
2106  * @param big_handle
2107  * @param advertising_handle
2108  * @param num_bis
2109  * @param sdu_interval
2110  * @param max_sdu
2111  * @param max_transport_latency
2112  * @param rtn
2113  * @param phy
2114  * @param packing
2115  * @param framing
2116  * @param encryption
2117  * @param broadcast_code
2118  */
2119 const hci_cmd_t hci_le_create_big = {
2120     HCI_OPCODE_HCI_LE_CREATE_BIG, "11132211111P"
2121 };
2122 
2123 /**
2124  * @param big_handle
2125  * @param advertising_handle
2126  * @param num_bis
2127  * @param sdu_interval
2128  * @param iso_interval
2129  * @param nse
2130  * @param max_sdu
2131  * @param max_PDU
2132  * @param phy
2133  * @param packing
2134  * @param framing
2135  * @param bn
2136  * @param irc
2137  * @param pto
2138  * @param encryption
2139  * @param broadcast_code
2140  */
2141 const hci_cmd_t hci_le_create_big_test = {
2142     HCI_OPCODE_HCI_LE_CREATE_BIG_TEST, "111321221111111P"
2143 };
2144 
2145 /**
2146  * @param big_handle
2147  * @param reason
2148  */
2149 const hci_cmd_t hci_le_terminate_big = {
2150     HCI_OPCODE_HCI_LE_TERMINATE_BIG, "11"
2151 };
2152 
2153 /**
2154  * @param big_handle
2155  * @param sync_handle
2156  * @param encryption
2157  * @param broadcast_code
2158  * @param mse
2159  * @param big_sync_timeout
2160  * @param num_bis
2161  * @param bis[i]
2162  */
2163 
2164 const hci_cmd_t hci_le_big_create_sync = {
2165     HCI_OPCODE_HCI_LE_BIG_CREATE_SYNC, "1H1P12a[1]"
2166 };
2167 
2168 /**
2169  * @param big_handle
2170  */
2171 const hci_cmd_t hci_le_big_terminate_sync = {
2172     HCI_OPCODE_HCI_LE_BIG_TERMINATE_SYNC, ""
2173 };
2174 
2175 /**
2176  * @param connection_handle
2177  */
2178 const hci_cmd_t hci_le_request_peer_sca = {
2179         HCI_OPCODE_HCI_LE_REQUEST_PEER_SCA, "H"
2180 };
2181 
2182 /**
2183  * @param connection_handle
2184  * @param data_path_direction
2185  * @param data_path_id
2186  * @param codec_id_coding_format
2187  * @param codec_id_company_identifier (Shall be ignored if codec_id_coding_format is not 0xFF)
2188  * @param codec_id_vendor_codec_id (Shall be ignored if codec_id_coding_format is not 0xFF)
2189  * @param controller_delay
2190  * @param codec_configuration_length
2191  * @param codec_configuration
2192  */
2193 
2194 const hci_cmd_t hci_le_setup_iso_data_path = {
2195     HCI_OPCODE_HCI_LE_SETUP_ISO_DATA_PATH, "H111223JV"
2196 };
2197 
2198 /**
2199  * @param connection_handle
2200  */
2201 const hci_cmd_t hci_le_remove_iso_data_path = {
2202     HCI_OPCODE_HCI_LE_REMOVE_ISO_DATA_PATH, "H1"
2203 };
2204 
2205 /**
2206  * @param connection_handle
2207  * @param paylaod_type
2208  */
2209 const hci_cmd_t hci_le_iso_transmit_test = {
2210     HCI_OPCODE_HCI_LE_ISO_TRANSMIT_TEST, "H1"
2211 };
2212 
2213 /**
2214  * @param connection_handle
2215  * @param paylaod_type
2216  */
2217 const hci_cmd_t hci_le_iso_receive_test = {
2218     HCI_OPCODE_HCI_LE_ISO_RECEIVE_TEST, "H1"
2219 };
2220 
2221 /**
2222  * @param connection_handle
2223  */
2224 const hci_cmd_t hci_le_iso_read_test_counters = {
2225     HCI_OPCODE_HCI_LE_ISO_READ_TEST_COUNTERS, "H"
2226 };
2227 
2228 /**
2229  * @param connection_handle
2230  */
2231 const hci_cmd_t hci_le_iso_test_end = {
2232     HCI_OPCODE_HCI_LE_ISO_TEST_END, "H"
2233 };
2234 
2235 /**
2236  * @param bit_number
2237  * @param bit_value
2238  */
2239 const hci_cmd_t hci_le_set_host_feature = {
2240     HCI_OPCODE_HCI_LE_SET_HOST_FEATURE, "11"
2241 };
2242 
2243 /**
2244  * @param connection_handle
2245  */
2246 const hci_cmd_t hci_le_read_iso_link_quality = {
2247     HCI_OPCODE_HCI_LE_READ_ISO_LINK_QUALITY, "H"
2248 };
2249 
2250 /**
2251  * @param connection_handle
2252  * @param phy
2253  */
2254 const hci_cmd_t hci_le_enhanced_read_transmit_power_level = {
2255     HCI_OPCODE_HCI_LE_ENHANCED_READ_TRANSMIT_POWER_LEVEL, "H1"
2256 };
2257 
2258 /**
2259  * @param connection_handle
2260  * @param phy
2261  */
2262 const hci_cmd_t hci_le_read_remote_transmit_power_level = {
2263     HCI_OPCODE_HCI_LE_READ_REMOTE_TRANSMIT_POWER_LEVEL, "H1"
2264 };
2265 
2266 /**
2267  * @param connection_handle
2268  * @param high_threshold
2269  * @param high_hysteresis
2270  * @param low_threshold
2271  * @param low_hysteresis
2272  * @param min_time_spent
2273  */
2274 const hci_cmd_t hci_le_set_path_loss_reporting_parameters = {
2275     HCI_OPCODE_HCI_LE_SET_PATH_LOSS_REPORTING_PARAMETERS, "211112"
2276 };
2277 
2278 /**
2279  * @param connection_handle
2280  * @param enable
2281  */
2282 const hci_cmd_t hci_le_set_path_loss_reporting_enable = {
2283     HCI_OPCODE_HCI_LE_SET_PATH_LOSS_REPORTING_ENABLE, "H1"
2284 };
2285 
2286 /**
2287  * @param connection_handle
2288  * @param local_enable
2289  * @param remote_enable
2290  */
2291 const hci_cmd_t hci_le_set_transmit_power_reporting_enable = {
2292     HCI_OPCODE_HCI_LE_SET_TRANSMIT_POWER_REPORTING_ENABLE, "H11"
2293 };
2294 
2295 /**
2296  * @param tx_channel
2297  * @param test_data_length
2298  * @param packet_payload
2299  * @param phy
2300  * @param cte_length
2301  * @param cte_type
2302  * @param switching_pattern_length
2303  * @param antenna_ids[i]
2304  * @param transmit_power_level
2305  */
2306 
2307 const hci_cmd_t hci_le_transmitter_test_v4 = {
2308     HCI_OPCODE_HCI_LE_TRANSMITTER_TEST_V4, "111111a[1]1"
2309 };
2310 
2311 #endif
2312 
2313 // Broadcom / Cypress specific HCI commands
2314 
2315 /**
2316  * @brief Enable Wide-Band Speech / mSBC decoding for PCM
2317  * @param enable_wbs is 0 for disable, 1 for enable
2318  * @param uuid_wbs is 2 for EV2/EV3
2319  */
2320 const hci_cmd_t hci_bcm_enable_wbs = {
2321     HCI_OPCODE_HCI_BCM_ENABLE_WBS, "12"
2322         // return: status
2323 };
2324 
2325 /**
2326  * @brief Configure SCO Routing (BCM)
2327  * @param sco_routing is 0 for PCM, 1 for Transport, 2 for Codec and 3 for I2S
2328  * @param pcm_interface_rate is 0 for 128KBps, 1 for 256 KBps, 2 for 512KBps, 3 for 1024KBps, and 4 for 2048Kbps
2329  * @param frame_type is 0 for short and 1 for long
2330  * @param sync_mode is 0 for slave and 1 for master
2331  * @param clock_mode is 0 for slabe and 1 for master
2332  */
2333 const hci_cmd_t hci_bcm_write_sco_pcm_int = {
2334     HCI_OPCODE_HCI_BCM_WRITE_SCO_PCM_INT, "11111"
2335     // return: status
2336 };
2337 
2338 /**
2339  * @brief Configure the I2S/PCM interface (BCM)
2340  * @param i2s_enable is 0 for off, 1 for on
2341  * @param is_master is 0 for slave, is 1 for master
2342  * @param sample_rate is 0 for 8 kHz, 1 for 16 kHz, 2 for 4 kHz
2343  * @param clock_rate is 0 for 128 kz, 1 for 256 kHz, 2 for 512 khz, 3 for 1024 kHz, 4 for 2048 khz
2344  * @param clock_mode is 0 for slabe and 1 for master
2345  */
2346 const hci_cmd_t hci_bcm_write_i2spcm_interface_param = {
2347     HCI_OPCODE_HCI_BCM_WRITE_I2SPCM_INTERFACE_PARAM, "1111"
2348         // return: status
2349 };
2350 
2351 
2352 /**
2353  * @brief Activates selected Sleep Mode
2354  * @param sleep_mode: 0=no sleep, 1=UART, 2=UART with Messaging, 3=USB, 4=H4IBSS, USB with Host Wake, 6=SDIO, 7=UART CS-N, 8=SPI, 9=H5, 10=H4DS, 12=UART with BREAK
2355  * @param idle_threshold_host (modes 1,2,5,7) time until considered idle, unit roughly 300 ms
2356  * @param idle_threshold_controller (modes 1-7,9) time until considered idle, unit roughly 300 ms
2357  * @param bt_wake_active_mode (modes 1,2,7) 0 = BT_WAKE line is active high, 1 = BT_WAKE is active low
2358  * @param host_wake_active_mode (modes 1,2,5,7) 0 = HOST_WAKE line is active high, 1 = HOST_WAKE is active low
2359  * @param allow_host_sleep_during_sco (modes 1,2,3,5,7)
2360  * @param combine_sleep_mode_and_lpm  (modes 1,2,3,5,7)
2361  * @param enable_tristate_control_of_uart_tx_line (modes 1,2,7)
2362  * @param active_connection_handling_on_suspend (modes 3,5)
2363  * @param resume_timeout (modes 3,5)
2364  * @param enable_break_to_host (mode 12)
2365  * @param pulsed_host_wake (modes 1,12)
2366  */
2367 const hci_cmd_t hci_bcm_set_sleep_mode = {
2368     HCI_OPCODE_HCI_BCM_SET_SLEEP_MODE, "111111111111"
2369 };
2370 
2371 /**
2372  * @brief Set TX Power Table
2373  * @param is_le 0=classic, 1=LE
2374  * @param chip_max_tx_pwr_db chip level max TX power in dBM
2375  */
2376 const hci_cmd_t hci_bcm_write_tx_power_table = {
2377     HCI_OPCODE_HCI_BCM_WRITE_TX_POWER_TABLE, "11"
2378 };
2379 
2380 const hci_cmd_t hci_bcm_set_tx_pwr = {
2381     HCI_OPCODE_HCI_BCM_SET_TX_PWR, "11H"
2382 };
2383 
2384 /**
2385  * @brief This command starts receiving packets using packet transmission parameters such as
2386  *        frequency channel, packet type, and packet length. It is used for Packet RX.
2387  * @see   https://processors.wiki.ti.com/index.php/CC256x_Testing_Guide#Continuous_RX
2388  * @param frequency
2389  * @param ADPLL loop mode
2390  */
2391 const hci_cmd_t hci_ti_drpb_tester_con_rx = {
2392         0xFD17, "11"
2393 };
2394 
2395 /**
2396  *
2397  *
2398  * @brief This command tests the RF transceiver in continuous transmission mode.
2399  *        The transmitter is activated by configuring the transmission parameters such as pattern,
2400  *        modulation, and frequency.
2401  * @see   processors.wiki.ti.com/index.php/CC256x_VS_HCI_Commands#HCI_VS_DRPb_Tester_Con_TX.280xFD84.29
2402  * @param modulation
2403  * @param test_pattern
2404  * @param frequency
2405  * @param power_level
2406  * @param reserved1
2407  * @param reserved2
2408  */
2409 const hci_cmd_t hci_ti_drpb_tester_con_tx = {
2410     0xFD84, "111144"
2411 };
2412 
2413 /**
2414  * @brief This command starts sending/receiving packets using packet transmission parameters such as
2415  *        frequency channel, packet type, and packet length. It is used for Packet TX/RX.
2416  * @see   processors.wiki.ti.com/index.php/CC256x_VS_HCI_Commands#HCI_VS_DRPb_Tester_Packet_TX_RX_.280xFD85.29
2417  * @param frequency_mode
2418  * @param tx_single_frequency
2419  * @param rx_single_frequency
2420  * @param acl_packet_type
2421  * @paarm acl_packet_data_pattern
2422  * @param reserved
2423  * @param power_level
2424  * @param disable_whitening
2425  * @param prbs9_initialization_value
2426  */
2427 const hci_cmd_t hci_ti_drpb_tester_packet_tx_rx = {
2428     0xFD85, "1111112112"
2429 };
2430 
2431 
2432 /**
2433  * @param best effort access percentage
2434  * @param guaranteed access percentage
2435  * @param poll period
2436  * @param slave burst after tx
2437  * @param slave master search count
2438  * @param master burst after tx enable
2439  * @param master burst after rx limit
2440  */
2441 const hci_cmd_t hci_ti_configure_ddip = {
2442     HCI_OPCODE_HCI_TI_VS_CONFIGURE_DDIP, "1111111"
2443 };
2444 
2445 /**
2446  * @brief This command is used to associate the requested ACL handle with Wide Band Speech configuration.
2447  * @param enable 0=disable, 1=enable
2448  * @param a3dp_role (NL5500, WL128x only) 0=source,1=sink
2449  * @param code_upload (NL5500, WL128x only) 0=do not load a3dp code, 1=load a3dp code
2450  * @param reserved for future use
2451  */
2452 const hci_cmd_t hci_ti_avrp_enable = {
2453         0xFD92, "1112"
2454 };
2455 
2456 /**
2457  * @brief This command is used to associate the requested ACL handle with Wide Band Speech configuration.
2458  * @param acl_con_handle
2459  */
2460 const hci_cmd_t hci_ti_wbs_associate = {
2461         0xFD78, "H"
2462 };
2463 
2464 /**
2465  * @brief This command is used to disassociate Wide Band Speech configuration from any ACL handle.
2466  */
2467 const hci_cmd_t hci_ti_wbs_disassociate = {
2468         0xFD79, ""
2469 };
2470 
2471 /**
2472  * @brief This command configures the codec interface parameters and the PCM clock rate, which is relevant when
2473           the Bluetooth core generates the clock. This command must be used by the host to use the PCM
2474           interface.
2475  * @param clock_rate in kHz
2476  * @param clock_direction 0=master/output, 1=slave/input
2477  * @param frame_sync_frequency in Hz
2478  * @param frame_sync_duty_cycle 0=50% (I2S Format), 0x0001-0xffff number of cycles of PCM clock
2479  * @param frame_sync_edge 0=driven/sampled at rising edge, 1=driven/sampled at falling edge of PCM clock
2480  * @param frame_sync_polariy 0=active high, 1=active low
2481  * @param reserved1
2482  * @param channel_1_data_out_size sample size in bits
2483  * @param channel_1_data_out_offset number of PCM clock cycles between rising of frame sync and data start
2484  * @param channel_1_data_out_edge 0=data driven at rising edge, 1=data driven at falling edge of PCM clock
2485  * @param channel_1_data_in_size sample size in bits
2486  * @param channel_1_data_in_offset number of PCM clock cycles between rising of frame sync and data start
2487  * @param channel_1_data_in_edge 0=data sampled at rising edge, 1=data sampled at falling edge of PCM clock
2488  * @param fsync_multiplier this field is only relevant to CC256XB from service pack 0.2 !!! -> use 0x00
2489  * @param channel_2_data_out_size sample size in bits
2490  * @param channel_2_data_out_offset number of PCM clock cycles between rising of frame sync and data start
2491  * @param channel_2_data_out_edge 0=data driven at rising edge, 1=data driven at falling edge of PCM clock
2492  * @param channel_2_data_in_size sample size in bits
2493  * @param channel_2_data_in_offset number of PCM clock cycles between rising of frame sync and data start
2494  * @param channel_2_data_in_edge 0=data sampled at rising edge, 1=data sampled at falling edge of PCM clock
2495  * @param reserved2
2496  *
2497  */
2498 const hci_cmd_t hci_ti_write_codec_config = {
2499         0xFD06, "214211122122112212211"
2500 };
2501 
2502 /**
2503  * @brief This command is used only for internal testing.
2504  * @see   https://processors.wiki.ti.com/index.php/CC256x_Testing_Guide#Continuous_TX
2505  * @param frequency
2506  * @param ADPLL loop mode
2507  */
2508 const hci_cmd_t hci_ti_drpb_enable_rf_calibration = {
2509         0xFD80, "141"
2510 };
2511 
2512 /**
2513  * @brief This command command is only required for the continuous TX test of modulated
2514  * (GFSK, π/4-DQPSK or 8DPSK) signal. This command should be skipped when performing continuous TX test for CW.
2515  * @see   https://processors.wiki.ti.com/index.php/CC256x_Testing_Guide#Continuous_RX
2516  * @param frequency
2517  * @param ADPLL loop mode
2518  */
2519 const hci_cmd_t hci_ti_write_hardware_register = {
2520         0xFF01, "42"
2521 };
2522