xref: /btstack/src/hci_cmd.c (revision 2fca4dad957cd7b88f4657ed51e89c12615dda72)
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 sniff_max_interval
636  * @param sniff_min_interval
637  * @param sniff_attempt
638  * @param sniff_timeout
639  */
640 const hci_cmd_t hci_sniff_mode = {
641     HCI_OPCODE_HCI_SNIFF_MODE, "H2222"
642 };
643 
644 /**
645  * @param handle
646  */
647 const hci_cmd_t hci_exit_sniff_mode = {
648     HCI_OPCODE_HCI_EXIT_SNIFF_MODE, "H"
649 };
650 
651 /**
652  * @param handle
653  * @param flags
654  * @param service_type
655  * @param token_rate (bytes/s)
656  * @param peak_bandwith (bytes/s)
657  * @param latency (us)
658  * @param delay_variation (us)
659  */
660 const hci_cmd_t hci_qos_setup = {
661     HCI_OPCODE_HCI_QOS_SETUP, "H114444"
662 };
663 
664 /**
665  * @param handle
666  */
667 const hci_cmd_t hci_role_discovery = {
668     HCI_OPCODE_HCI_ROLE_DISCOVERY, "H"
669 };
670 
671 /**
672  * @param bd_addr
673  * @param role (0=master,1=slave)
674  */
675 const hci_cmd_t hci_switch_role_command= {
676     HCI_OPCODE_HCI_SWITCH_ROLE_COMMAND, "B1"
677 };
678 
679 /**
680  * @param handle
681  */
682 const hci_cmd_t hci_read_link_policy_settings = {
683     HCI_OPCODE_HCI_READ_LINK_POLICY_SETTINGS, "H"
684 };
685 
686 /**
687  * @param handle
688  * @param settings
689  */
690 const hci_cmd_t hci_write_link_policy_settings = {
691     HCI_OPCODE_HCI_WRITE_LINK_POLICY_SETTINGS, "H2"
692 };
693 
694 /**
695  * @param handle
696  * @param max_latency
697  * @param min_remote_timeout
698  * @param min_local_timeout
699  */
700 const hci_cmd_t hci_sniff_subrating = {
701     HCI_OPCODE_HCI_SNIFF_SUBRATING, "H222"
702 };
703 
704 /**
705  * @param policy
706  */
707 const hci_cmd_t hci_write_default_link_policy_setting = {
708     HCI_OPCODE_HCI_WRITE_DEFAULT_LINK_POLICY_SETTING, "2"
709 };
710 
711 /**
712  * @param handle
713  * @param unused
714  * @param flow_direction
715  * @param service_type
716  * @param token_rate
717  * @param token_bucket_size
718  * @param peak_bandwidth
719  * @param access_latency
720  */
721 const hci_cmd_t hci_flow_specification = {
722     HCI_OPCODE_HCI_FLOW_SPECIFICATION, "H1114444"
723 };
724 
725 
726 /**
727  *  Controller & Baseband Commands
728  */
729 
730 
731 /**
732  * @param event_mask_lover_octets
733  * @param event_mask_higher_octets
734  */
735 const hci_cmd_t hci_set_event_mask = {
736     HCI_OPCODE_HCI_SET_EVENT_MASK, "44"
737 };
738 
739 /**
740  */
741 const hci_cmd_t hci_reset = {
742     HCI_OPCODE_HCI_RESET, ""
743 };
744 
745 /**
746  * @param handle
747  */
748 const hci_cmd_t hci_flush = {
749     HCI_OPCODE_HCI_FLUSH, "H"
750 };
751 
752 /**
753  * @param handle
754  */
755 const hci_cmd_t hci_read_pin_type = {
756     HCI_OPCODE_HCI_READ_PIN_TYPE, ""
757 };
758 
759 /**
760  * @param handle
761  */
762 const hci_cmd_t hci_write_pin_type = {
763     HCI_OPCODE_HCI_WRITE_PIN_TYPE, "1"
764 };
765 
766 /**
767  * @param bd_addr
768  * @param delete_all_flags
769  */
770 const hci_cmd_t hci_delete_stored_link_key = {
771     HCI_OPCODE_HCI_DELETE_STORED_LINK_KEY, "B1"
772 };
773 
774 #ifdef ENABLE_CLASSIC
775 /**
776  * @param local_name (UTF-8, Null Terminated, max 248 octets)
777  */
778 const hci_cmd_t hci_write_local_name = {
779     HCI_OPCODE_HCI_WRITE_LOCAL_NAME, "N"
780 };
781 #endif
782 
783 /**
784  */
785 const hci_cmd_t hci_read_local_name = {
786     HCI_OPCODE_HCI_READ_LOCAL_NAME, ""
787 };
788 
789 /**
790  */
791 const hci_cmd_t hci_read_page_timeout = {
792     HCI_OPCODE_HCI_READ_PAGE_TIMEOUT, ""
793 };
794 
795 /**
796  * @param page_timeout (* 0.625 ms)
797  */
798 const hci_cmd_t hci_write_page_timeout = {
799     HCI_OPCODE_HCI_WRITE_PAGE_TIMEOUT, "2"
800 };
801 
802 /**
803  * @param scan_enable (no, inq, page, inq+page)
804  */
805 const hci_cmd_t hci_write_scan_enable = {
806     HCI_OPCODE_HCI_WRITE_SCAN_ENABLE, "1"
807 };
808 
809 /**
810  */
811 const hci_cmd_t hci_read_page_scan_activity = {
812     HCI_OPCODE_HCI_READ_PAGE_SCAN_ACTIVITY, ""
813 };
814 
815 /**
816  * @param page_scan_interval (* 0.625 ms)
817  * @param page_scan_window (* 0.625 ms, must be <= page_scan_interval)
818  */
819 const hci_cmd_t hci_write_page_scan_activity = {
820     HCI_OPCODE_HCI_WRITE_PAGE_SCAN_ACTIVITY, "22"
821 };
822 
823 /**
824  */
825 const hci_cmd_t hci_read_inquiry_scan_activity = {
826     HCI_OPCODE_HCI_READ_INQUIRY_SCAN_ACTIVITY, ""
827 };
828 
829 /**
830  * @param inquiry_scan_interval (* 0.625 ms)
831  * @param inquiry_scan_window (* 0.625 ms, must be <= inquiry_scan_interval)
832  */
833 const hci_cmd_t hci_write_inquiry_scan_activity = {
834     HCI_OPCODE_HCI_WRITE_INQUIRY_SCAN_ACTIVITY, "22"
835 };
836 
837 /**
838  * @param authentication_enable
839  */
840 const hci_cmd_t hci_write_authentication_enable = {
841     HCI_OPCODE_HCI_WRITE_AUTHENTICATION_ENABLE, "1"
842 };
843 
844 /**
845  * @param class_of_device
846  */
847 const hci_cmd_t hci_write_class_of_device = {
848     HCI_OPCODE_HCI_WRITE_CLASS_OF_DEVICE, "3"
849 };
850 
851 /**
852  */
853 const hci_cmd_t hci_read_num_broadcast_retransmissions = {
854     HCI_OPCODE_HCI_READ_NUM_BROADCAST_RETRANSMISSIONS, ""
855 };
856 
857 /**
858  * @param num_broadcast_retransmissions (e.g. 0 for a single broadcast)
859  */
860 const hci_cmd_t hci_write_num_broadcast_retransmissions = {
861     HCI_OPCODE_HCI_WRITE_NUM_BROADCAST_RETRANSMISSIONS, "1"
862 };
863 
864 /**
865  * @param connection_handle
866  * @param type 0 = current transmit level, 1 = max transmit level
867  */
868 const hci_cmd_t hci_read_transmit_power_level = {
869     HCI_OPCODE_HCI_READ_TRANSMIT_POWER_LEVEL, "11"
870 };
871 
872 /**
873  * @param synchronous_flow_control_enable - if yes, num completed packet everts are sent for SCO packets
874  */
875 const hci_cmd_t hci_write_synchronous_flow_control_enable = {
876     HCI_OPCODE_HCI_WRITE_SYNCHRONOUS_FLOW_CONTROL_ENABLE, "1"
877 };
878 
879 #ifdef ENABLE_HCI_CONTROLLER_TO_HOST_FLOW_CONTROL
880 
881 /**
882  * @param flow_control_enable - 0: off, 1: ACL only, 2: SCO only, 3: ACL + SCO
883  */
884 const hci_cmd_t hci_set_controller_to_host_flow_control = {
885     HCI_OPCODE_HCI_SET_CONTROLLER_TO_HOST_FLOW_CONTROL, "1"
886 };
887 
888 /**
889  * @param host_acl_data_packet_length
890  * @param host_synchronous_data_packet_length
891  * @param host_total_num_acl_data_packets
892  * @param host_total_num_synchronous_data_packets
893  */
894 const hci_cmd_t hci_host_buffer_size = {
895     HCI_OPCODE_HCI_HOST_BUFFER_SIZE, "2122"
896 };
897 
898 
899 #if 0
900 //
901 // command sent manually sent by hci_host_num_completed_packets
902 //
903 /**
904  * @note only single handle supported by BTstack command generator
905  * @param number_of_handles must be 1
906  * @param connection_handle
907  * @param host_num_of_completed_packets for the given connection handle
908  */
909 const hci_cmd_t hci_host_number_of_completed_packets = {
910     HCI_OPCODE_HCI_HOST_NUMBER_OF_COMPLETED_PACKETS, "1H2"
911 };
912 #endif
913 
914 #endif
915 
916 /**
917  * @param handle
918  */
919 const hci_cmd_t hci_read_link_supervision_timeout = {
920     HCI_OPCODE_HCI_READ_LINK_SUPERVISION_TIMEOUT, "H"
921 };
922 
923 /**
924  * @param handle
925  * @param timeout (0x0001 - 0xFFFF Time -> Range: 0.625ms - 40.9 sec)
926  */
927 const hci_cmd_t hci_write_link_supervision_timeout = {
928     HCI_OPCODE_HCI_WRITE_LINK_SUPERVISION_TIMEOUT, "H2"
929 };
930 
931 /**
932  * @param num_current_iac must be 2
933  * @param iac_lap1
934  * @param iac_lap2
935  */
936 const hci_cmd_t hci_write_current_iac_lap_two_iacs = {
937     HCI_OPCODE_HCI_WRITE_CURRENT_IAC_LAP_TWO_IACS, "133"
938 };
939 
940 /**
941  * @param inquiry_scan_type (0x00 = standard, 0x01 = interlaced)
942  */
943 const hci_cmd_t hci_write_inquiry_scan_type = {
944     HCI_OPCODE_HCI_WRITE_INQUIRY_SCAN_TYPE,  "1"
945 };
946 
947 /**
948  * @param inquiry_mode (0x00 = standard, 0x01 = with RSSI, 0x02 = extended)
949  */
950 const hci_cmd_t hci_write_inquiry_mode = {
951     HCI_OPCODE_HCI_WRITE_INQUIRY_MODE, "1"
952 };
953 
954 /**
955  * @param page_scan_type (0x00 = standard, 0x01 = interlaced)
956  */
957 const hci_cmd_t hci_write_page_scan_type = {
958     HCI_OPCODE_HCI_WRITE_PAGE_SCAN_TYPE, "1"
959 };
960 
961 /**
962  * @param fec_required
963  * @param exstended_inquiry_response
964  */
965 const hci_cmd_t hci_write_extended_inquiry_response = {
966     HCI_OPCODE_HCI_WRITE_EXTENDED_INQUIRY_RESPONSE, "1E"
967 };
968 
969 /**
970  * @param mode (0 = off, 1 = on)
971  */
972 const hci_cmd_t hci_write_simple_pairing_mode = {
973     HCI_OPCODE_HCI_WRITE_SIMPLE_PAIRING_MODE, "1"
974 };
975 
976 /**
977  */
978 const hci_cmd_t hci_read_local_oob_data = {
979     HCI_OPCODE_HCI_READ_LOCAL_OOB_DATA, ""
980     // return status, C, R
981 };
982 
983 /**
984  * @param mode (0 = off, 1 = on)
985  */
986 const hci_cmd_t hci_write_default_erroneous_data_reporting = {
987     HCI_OPCODE_HCI_WRITE_DEFAULT_ERRONEOUS_DATA_REPORTING, "1"
988 };
989 
990 /**
991  */
992 const hci_cmd_t hci_read_le_host_supported = {
993     HCI_OPCODE_HCI_READ_LE_HOST_SUPPORTED, ""
994     // return: status, le supported host, simultaneous le host
995 };
996 
997 /**
998  * @param le_supported_host
999  * @param simultaneous_le_host
1000  */
1001 const hci_cmd_t hci_write_le_host_supported = {
1002     HCI_OPCODE_HCI_WRITE_LE_HOST_SUPPORTED, "11"
1003     // return: status
1004 };
1005 
1006 /**
1007  * @param secure_connections_host_support
1008  */
1009 const hci_cmd_t hci_write_secure_connections_host_support = {
1010     HCI_OPCODE_HCI_WRITE_SECURE_CONNECTIONS_HOST_SUPPORT, "1"
1011     // return: status
1012 };
1013 
1014 /**
1015  */
1016 const hci_cmd_t hci_read_local_extended_oob_data = {
1017     HCI_OPCODE_HCI_READ_LOCAL_EXTENDED_OOB_DATA, ""
1018     // return status, C_192, R_192, R_256, C_256
1019 };
1020 
1021 
1022 /**
1023  * Testing Commands
1024  */
1025 
1026 
1027 /**
1028  */
1029 const hci_cmd_t hci_read_loopback_mode = {
1030     HCI_OPCODE_HCI_READ_LOOPBACK_MODE, ""
1031     // return: status, loopback mode (0 = off, 1 = local loopback, 2 = remote loopback)
1032 };
1033 
1034 /**
1035  * @param loopback_mode
1036  */
1037 const hci_cmd_t hci_write_loopback_mode = {
1038     HCI_OPCODE_HCI_WRITE_LOOPBACK_MODE, "1"
1039     // return: status
1040 };
1041 
1042 /**
1043  */
1044 const hci_cmd_t hci_enable_device_under_test_mode = {
1045     HCI_OPCODE_HCI_ENABLE_DEVICE_UNDER_TEST_MODE, ""
1046     // return: status
1047 };
1048 
1049 /**
1050  * @param simple_pairing_debug_mode
1051  */
1052 const hci_cmd_t hci_write_simple_pairing_debug_mode = {
1053     HCI_OPCODE_HCI_WRITE_SIMPLE_PAIRING_DEBUG_MODE, "1"
1054     // return: status
1055 };
1056 
1057 /**
1058  * @param handle
1059  * @param dm1_acl_u_mode
1060  * @param esco_loopback_mode
1061  */
1062 const hci_cmd_t hci_write_secure_connections_test_mode = {
1063     HCI_OPCODE_HCI_WRITE_SECURE_CONNECTIONS_TEST_MODE, "H11"
1064     // return: status
1065 };
1066 
1067 
1068 /**
1069  * Informational Parameters
1070  */
1071 
1072 const hci_cmd_t hci_read_local_version_information = {
1073     HCI_OPCODE_HCI_READ_LOCAL_VERSION_INFORMATION, ""
1074 };
1075 const hci_cmd_t hci_read_local_supported_commands = {
1076     HCI_OPCODE_HCI_READ_LOCAL_SUPPORTED_COMMANDS, ""
1077 };
1078 const hci_cmd_t hci_read_local_supported_features = {
1079     HCI_OPCODE_HCI_READ_LOCAL_SUPPORTED_FEATURES, ""
1080 };
1081 const hci_cmd_t hci_read_buffer_size = {
1082     HCI_OPCODE_HCI_READ_BUFFER_SIZE, ""
1083 };
1084 const hci_cmd_t hci_read_bd_addr = {
1085     HCI_OPCODE_HCI_READ_BD_ADDR, ""
1086 };
1087 
1088 /**
1089  * Status Paramters
1090  */
1091 
1092 /**
1093  * @param handle
1094  */
1095 const hci_cmd_t hci_read_rssi = {
1096     HCI_OPCODE_HCI_READ_RSSI, "H"
1097 };
1098 
1099 /**
1100  * @param handle
1101  */
1102 const hci_cmd_t hci_read_encryption_key_size = {
1103     HCI_OPCODE_HCI_READ_ENCRYPTION_KEY_SIZE, "H"
1104 };
1105 
1106 
1107 #ifdef ENABLE_BLE
1108 /**
1109  * Low Energy Commands
1110  */
1111 
1112 /**
1113  * @param event_mask_lower_octets
1114  * @param event_mask_higher_octets
1115  */
1116 const hci_cmd_t hci_le_set_event_mask = {
1117     HCI_OPCODE_HCI_LE_SET_EVENT_MASK, "44"
1118     // return: status
1119 };
1120 
1121 const hci_cmd_t hci_le_read_buffer_size = {
1122     HCI_OPCODE_HCI_LE_READ_BUFFER_SIZE, ""
1123     // return: status, le acl data packet len (16), total num le acl data packets(8)
1124 };
1125 const hci_cmd_t hci_le_read_local_supported_features = {
1126     HCI_OPCODE_HCI_LE_READ_LOCAL_SUPPORTED_FEATURES, ""
1127     // return: LE_Features See [Vol 6] Part B, Section 4.6
1128 };
1129 
1130 /**
1131  * @param random_bd_addr
1132  */
1133 const hci_cmd_t hci_le_set_random_address = {
1134     HCI_OPCODE_HCI_LE_SET_RANDOM_ADDRESS, "B"
1135     // return: status
1136 };
1137 
1138 /**
1139  * @param advertising_interval_min ([0x0020,0x4000], default: 0x0800, unit: 0.625 msec)
1140  * @param advertising_interval_max ([0x0020,0x4000], default: 0x0800, unit: 0.625 msec)
1141  * @param advertising_type (enum from 0: ADV_IND, ADC_DIRECT_IND, ADV_SCAN_IND, ADV_NONCONN_IND)
1142  * @param own_address_type (enum from 0: public device address, random device address)
1143  * @param direct_address_type ()
1144  * @param direct_address (public or random address of device to be connecteed)
1145  * @param advertising_channel_map (flags: chan_37(1), chan_38(2), chan_39(4))
1146  * @param advertising_filter_policy (enum from 0: scan any conn any, scan whitelist, con any, scan any conn whitelist, scan whitelist, con whitelist)
1147  */
1148 const hci_cmd_t hci_le_set_advertising_parameters = {
1149     HCI_OPCODE_HCI_LE_SET_ADVERTISING_PARAMETERS, "22111B11"
1150     // return: status
1151 };
1152 
1153 const hci_cmd_t hci_le_read_advertising_channel_tx_power = {
1154     HCI_OPCODE_HCI_LE_READ_ADVERTISING_CHANNEL_TX_POWER, ""
1155     // return: status, level [-20,10] signed int (8), units dBm
1156 };
1157 
1158 /**
1159  * @param advertising_data_length
1160  * @param advertising_data (31 bytes)
1161  */
1162 const hci_cmd_t hci_le_set_advertising_data= {
1163     HCI_OPCODE_HCI_LE_SET_ADVERTISING_DATA, "1A"
1164     // return: status
1165 };
1166 
1167 /**
1168  * @param scan_response_data_length
1169  * @param scan_response_data (31 bytes)
1170  */
1171 const hci_cmd_t hci_le_set_scan_response_data= {
1172     HCI_OPCODE_HCI_LE_SET_SCAN_RESPONSE_DATA, "1A"
1173     // return: status
1174 };
1175 
1176 /**
1177  * @param advertise_enable (off: 0, on: 1)
1178  */
1179 const hci_cmd_t hci_le_set_advertise_enable = {
1180     HCI_OPCODE_HCI_LE_SET_ADVERTISE_ENABLE, "1"
1181     // return: status
1182 };
1183 
1184 /**
1185  * @param le_scan_type (passive (0), active (1))
1186  * @param le_scan_interval ([0x0004,0x4000], unit: 0.625 msec)
1187  * @param le_scan_window   ([0x0004,0x4000], unit: 0.625 msec)
1188  * @param own_address_type (public (0), random (1))
1189  * @param scanning_filter_policy (any (0), only whitelist (1))
1190  */
1191 const hci_cmd_t hci_le_set_scan_parameters = {
1192     HCI_OPCODE_HCI_LE_SET_SCAN_PARAMETERS, "12211"
1193     // return: status
1194 };
1195 
1196 /**
1197  * @param le_scan_enable  (disabled (0), enabled (1))
1198  * @param filter_duplices (disabled (0), enabled (1))
1199  */
1200 const hci_cmd_t hci_le_set_scan_enable = {
1201     HCI_OPCODE_HCI_LE_SET_SCAN_ENABLE, "11"
1202     // return: status
1203 };
1204 
1205 /**
1206  * @param le_scan_interval ([0x0004, 0x4000], unit: 0.625 msec)
1207  * @param le_scan_window ([0x0004, 0x4000], unit: 0.625 msec)
1208  * @param initiator_filter_policy (peer address type + peer address (0), whitelist (1))
1209  * @param peer_address_type (public (0), random (1))
1210  * @param peer_address
1211  * @param own_address_type (public (0), random (1))
1212  * @param conn_interval_min ([0x0006, 0x0c80], unit: 1.25 msec)
1213  * @param conn_interval_max ([0x0006, 0x0c80], unit: 1.25 msec)
1214  * @param conn_latency (number of connection events [0x0000, 0x01f4])
1215  * @param supervision_timeout ([0x000a, 0x0c80], unit: 10 msec)
1216  * @param minimum_CE_length ([0x0000, 0xffff], unit: 0.625 msec)
1217  * @param maximum_CE_length ([0x0000, 0xffff], unit: 0.625 msec)
1218  */
1219 const hci_cmd_t hci_le_create_connection= {
1220     HCI_OPCODE_HCI_LE_CREATE_CONNECTION, "2211B1222222"
1221     // return: none -> le create connection complete event
1222 };
1223 
1224 const hci_cmd_t hci_le_create_connection_cancel = {
1225     HCI_OPCODE_HCI_LE_CREATE_CONNECTION_CANCEL, ""
1226     // return: status
1227 };
1228 
1229 const hci_cmd_t hci_le_read_white_list_size = {
1230     HCI_OPCODE_HCI_LE_READ_WHITE_LIST_SIZE, ""
1231     // return: status, number of entries in controller whitelist
1232 };
1233 
1234 const hci_cmd_t hci_le_clear_white_list = {
1235     HCI_OPCODE_HCI_LE_CLEAR_WHITE_LIST, ""
1236     // return: status
1237 };
1238 
1239 /**
1240  * @param address_type (public (0), random (1))
1241  * @param bd_addr
1242  */
1243 const hci_cmd_t hci_le_add_device_to_white_list = {
1244     HCI_OPCODE_HCI_LE_ADD_DEVICE_TO_WHITE_LIST, "1B"
1245     // return: status
1246 };
1247 
1248 /**
1249  * @param address_type (public (0), random (1))
1250  * @param bd_addr
1251  */
1252 const hci_cmd_t hci_le_remove_device_from_white_list = {
1253     HCI_OPCODE_HCI_LE_REMOVE_DEVICE_FROM_WHITE_LIST, "1B"
1254     // return: status
1255 };
1256 
1257 /**
1258  * @param conn_handle
1259  * @param conn_interval_min ([0x0006,0x0c80], unit: 1.25 msec)
1260  * @param conn_interval_max ([0x0006,0x0c80], unit: 1.25 msec)
1261  * @param conn_latency ([0x0000,0x03e8], number of connection events)
1262  * @param supervision_timeout ([0x000a,0x0c80], unit: 10 msec)
1263  * @param minimum_CE_length ([0x0000,0xffff], unit: 0.625 msec)
1264  * @param maximum_CE_length ([0x0000,0xffff], unit: 0.625 msec)
1265  */
1266 const hci_cmd_t hci_le_connection_update = {
1267     HCI_OPCODE_HCI_LE_CONNECTION_UPDATE, "H222222"
1268     // return: none -> le connection update complete event
1269 };
1270 
1271 /**
1272  * @param channel_map_lower_32bits
1273  * @param channel_map_higher_5bits
1274  */
1275 const hci_cmd_t hci_le_set_host_channel_classification = {
1276     HCI_OPCODE_HCI_LE_SET_HOST_CHANNEL_CLASSIFICATION, "41"
1277     // return: status
1278 };
1279 
1280 /**
1281  * @param conn_handle
1282  */
1283 const hci_cmd_t hci_le_read_channel_map = {
1284     HCI_OPCODE_HCI_LE_READ_CHANNEL_MAP, "H"
1285     // return: status, connection handle, channel map (5 bytes, 37 used)
1286 };
1287 
1288 /**
1289  * @param conn_handle
1290  */
1291 const hci_cmd_t hci_le_read_remote_used_features = {
1292     HCI_OPCODE_HCI_LE_READ_REMOTE_USED_FEATURES, "H"
1293     // return: none -> le read remote used features complete event
1294 };
1295 
1296 /**
1297  * @param key ((128) for AES-128)
1298  * @param plain_text (128)
1299  */
1300 const hci_cmd_t hci_le_encrypt = {
1301     HCI_OPCODE_HCI_LE_ENCRYPT, "PP"
1302     // return: status, encrypted data (128)
1303 };
1304 
1305 const hci_cmd_t hci_le_rand = {
1306     HCI_OPCODE_HCI_LE_RAND, ""
1307     // return: status, random number (64)
1308 };
1309 
1310 /**
1311  * @param conn_handle
1312  * @param random_number_lower_32bits
1313  * @param random_number_higher_32bits
1314  * @param encryption_diversifier (16)
1315  * @param long_term_key (128)
1316  */
1317 const hci_cmd_t hci_le_start_encryption = {
1318     HCI_OPCODE_HCI_LE_START_ENCRYPTION, "H442P"
1319     // return: none -> encryption changed or encryption key refresh complete event
1320 };
1321 
1322 /**
1323  * @param connection_handle
1324  * @param long_term_key (128)
1325  */
1326 const hci_cmd_t hci_le_long_term_key_request_reply = {
1327     HCI_OPCODE_HCI_LE_LONG_TERM_KEY_REQUEST_REPLY, "HP"
1328     // return: status, connection handle
1329 };
1330 
1331 /**
1332  * @param conn_handle
1333  */
1334 const hci_cmd_t hci_le_long_term_key_negative_reply = {
1335     HCI_OPCODE_HCI_LE_LONG_TERM_KEY_NEGATIVE_REPLY, "H"
1336     // return: status, connection handle
1337 };
1338 
1339 /**
1340  * @param conn_handle
1341  */
1342 const hci_cmd_t hci_le_read_supported_states = {
1343     HCI_OPCODE_HCI_LE_READ_SUPPORTED_STATES, "H"
1344     // return: status, LE states (64)
1345 };
1346 
1347 /**
1348  * @param rx_frequency ([0x00 0x27], frequency (MHz): 2420 + N*2)
1349  */
1350 const hci_cmd_t hci_le_receiver_test = {
1351     HCI_OPCODE_HCI_LE_RECEIVER_TEST, "1"
1352     // return: status
1353 };
1354 
1355 /**
1356  * @param tx_frequency ([0x00 0x27], frequency (MHz): 2420 + N*2)
1357  * @param test_payload_lengh ([0x00,0x25])
1358  * @param packet_payload ([0,7] different patterns)
1359  */
1360 const hci_cmd_t hci_le_transmitter_test = {
1361     HCI_OPCODE_HCI_LE_TRANSMITTER_TEST, "111"
1362     // return: status
1363 };
1364 
1365 /**
1366  * @param end_test_cmd
1367  */
1368 const hci_cmd_t hci_le_test_end = {
1369     HCI_OPCODE_HCI_LE_TEST_END, "1"
1370     // return: status, number of packets (8)
1371 };
1372 
1373 /**
1374  * @param conn_handle
1375  * @param conn_interval_min ([0x0006,0x0c80], unit: 1.25 msec)
1376  * @param conn_interval_max ([0x0006,0x0c80], unit: 1.25 msec)
1377  * @param conn_latency ([0x0000,0x03e8], number of connection events)
1378  * @param supervision_timeout ([0x000a,0x0c80], unit: 10 msec)
1379  * @param minimum_CE_length ([0x0000,0xffff], unit: 0.625 msec)
1380  * @param maximum_CE_length ([0x0000,0xffff], unit: 0.625 msec)
1381  */
1382 const hci_cmd_t hci_le_remote_connection_parameter_request_reply = {
1383     HCI_OPCODE_HCI_LE_REMOTE_CONNECTION_PARAMETER_REQUEST_REPLY, "H222222"
1384     // return: status, connection handle
1385 };
1386 
1387 /**
1388  * @param con_handle
1389  * @param reason
1390  */
1391 const hci_cmd_t hci_le_remote_connection_parameter_request_negative_reply = {
1392     HCI_OPCODE_HCI_LE_REMOTE_CONNECTION_PARAMETER_REQUEST_NEGATIVE_REPLY, "H1"
1393     // return: status, connection handle
1394 };
1395 
1396 /**
1397  * @param con_handle
1398  * @param tx_octets
1399  * @param tx_time
1400  */
1401 const hci_cmd_t hci_le_set_data_length = {
1402     HCI_OPCODE_HCI_LE_SET_DATA_LENGTH, "H22"
1403     // return: status, connection handle
1404 };
1405 
1406 /**
1407  */
1408 const hci_cmd_t hci_le_read_suggested_default_data_length = {
1409     HCI_OPCODE_HCI_LE_READ_SUGGESTED_DEFAULT_DATA_LENGTH, ""
1410     // return: status, suggested max tx octets, suggested max tx time
1411 };
1412 
1413 /**
1414  * @param suggested_max_tx_octets
1415  * @param suggested_max_tx_time
1416  */
1417 const hci_cmd_t hci_le_write_suggested_default_data_length = {
1418     HCI_OPCODE_HCI_LE_WRITE_SUGGESTED_DEFAULT_DATA_LENGTH, "22"
1419     // return: status
1420 };
1421 
1422 /**
1423  */
1424 const hci_cmd_t hci_le_read_local_p256_public_key = {
1425     HCI_OPCODE_HCI_LE_READ_LOCAL_P256_PUBLIC_KEY, ""
1426 //  LE Read Local P-256 Public Key Complete is generated on completion
1427 };
1428 
1429 /**
1430  * @param public key
1431  * @param private key
1432  */
1433 const hci_cmd_t hci_le_generate_dhkey = {
1434     HCI_OPCODE_HCI_LE_GENERATE_DHKEY, "QQ"
1435 // LE Generate DHKey Complete is generated on completion
1436 };
1437 
1438 /**
1439  * @param Peer_Identity_Address_Type
1440  * @param Peer_Identity_Address
1441  * @param Peer_IRK
1442  * @param Local_IRK
1443  */
1444 const hci_cmd_t hci_le_add_device_to_resolving_list = {
1445     HCI_OPCODE_HCI_LE_ADD_DEVICE_TO_RESOLVING_LIST, "1BPP"
1446 };
1447 
1448 /**
1449  * @param Peer_Identity_Address_Type
1450  * @param Peer_Identity_Address
1451  */
1452 const hci_cmd_t hci_le_remove_device_from_resolving_list = {
1453     HCI_OPCODE_HCI_LE_REMOVE_DEVICE_FROM_RESOLVING_LIST, "1B"
1454 };
1455 
1456 /**
1457  */
1458 const hci_cmd_t hci_le_clear_resolving_list = {
1459     HCI_OPCODE_HCI_LE_CLEAR_RESOLVING_LIST, ""
1460 };
1461 
1462 /**
1463  */
1464 const hci_cmd_t hci_le_read_resolving_list_size = {
1465     HCI_OPCODE_HCI_LE_READ_RESOLVING_LIST_SIZE, ""
1466 };
1467 
1468 /**
1469  * @param Peer_Identity_Address_Type
1470  * @param Peer_Identity_Address
1471  */
1472 const hci_cmd_t hci_le_read_peer_resolvable_address = {
1473     HCI_OPCODE_HCI_LE_READ_PEER_RESOLVABLE_ADDRESS, ""
1474 };
1475 
1476 /**
1477  * @param Peer_Identity_Address_Type
1478  * @param Peer_Identity_Address
1479  */
1480 const hci_cmd_t hci_le_read_local_resolvable_address = {
1481     HCI_OPCODE_HCI_LE_READ_LOCAL_RESOLVABLE_ADDRESS, ""
1482 };
1483 
1484 /**
1485  * @param Address_Resolution_Enable
1486  */
1487 const hci_cmd_t hci_le_set_address_resolution_enabled= {
1488     HCI_OPCODE_HCI_LE_SET_ADDRESS_RESOLUTION_ENABLED, "1"
1489 };
1490 
1491 /**
1492  * @param RPA_Timeout in seconds, range 0x0001 to 0x0E10, default: 900 s
1493  */
1494 const hci_cmd_t hci_le_set_resolvable_private_address_timeout= {
1495     HCI_OPCODE_HCI_LE_SET_RESOLVABLE_PRIVATE_ADDRESS_TIMEOUT, "2"
1496 };
1497 
1498 /**
1499  */
1500 const hci_cmd_t hci_le_read_maximum_data_length = {
1501     HCI_OPCODE_HCI_LE_READ_MAXIMUM_DATA_LENGTH, ""
1502     // return: status, supported max tx octets, supported max tx time, supported max rx octets, supported max rx time
1503 };
1504 
1505 /**
1506  * @param con_handle
1507  */
1508 const hci_cmd_t hci_le_read_phy = {
1509     HCI_OPCODE_HCI_LE_READ_PHY, "H"
1510     // return: status, connection handler, tx phy, rx phy
1511 };
1512 
1513 /**
1514  * @param all_phys
1515  * @param tx_phys
1516  * @param rx_phys
1517  */
1518 const hci_cmd_t hci_le_set_default_phy = {
1519     HCI_OPCODE_HCI_LE_SET_DEFAULT_PHY, "111"
1520     // return: status
1521 };
1522 
1523 /**
1524  * @param con_handle
1525  * @param all_phys
1526  * @param tx_phys
1527  * @param rx_phys
1528  * @param phy_options
1529  */
1530 const hci_cmd_t hci_le_set_phy = {
1531     HCI_OPCODE_HCI_LE_SET_PHY, "H1111"
1532 // LE PHY Update Complete is generated on completion
1533 };
1534 
1535 /**
1536  * @param rx_channel
1537  * @param phy
1538  * @param modulation_index
1539  */
1540 const hci_cmd_t hci_le_receiver_test_v2 = {
1541     HCI_OPCODE_HCI_LE_RECEIVER_TEST_V2, "111"
1542 };
1543 
1544 /**
1545  * @param tx_channel
1546  * @param test_data_length
1547  * @param packet_payload
1548  * @param phy
1549  */
1550 const hci_cmd_t hci_le_transmitter_test_v2 = {
1551     HCI_OPCODE_HCI_LE_TRANSMITTER_TEST_V2, "1111"
1552 };
1553 
1554 /**
1555  * @param advertising_handle
1556  * @param random_address
1557  */
1558 const hci_cmd_t hci_le_set_advertising_set_random_address = {
1559     HCI_OPCODE_HCI_LE_SET_ADVERTISING_SET_RANDOM_ADDRESS, "1B"
1560 };
1561 
1562 /**
1563  * @param advertising_handle
1564  * @param advertising_event_properties
1565  * @param primary_advertising_interval_min in 0.625 ms, range: 0x000020..0xffffff
1566  * @param primary_advertising_interval_max in 0.625 ms, range: 0x000020..0xffffff
1567  * @param primary_advertising_channel_map
1568  * @param own_address_type
1569  * @param peer_address_type
1570  * @param peer_address
1571  * @param advertising_filter_policy
1572  * @param advertising_tx_power in dBm, range: -127..20
1573  * @param primary_advertising_phy
1574  * @param secondary_advertising_max_skip
1575  * @param secondary_advertising_phy
1576  * @param advertising_sid
1577  * @param scan_request_notification_enable
1578  */
1579 const hci_cmd_t hci_le_set_extended_advertising_parameters = {
1580     HCI_OPCODE_HCI_LE_SET_EXTENDED_ADVERTISING_PARAMETERS, "1233111B1111111"
1581 };
1582 
1583 /**
1584  * @param advertising_handle
1585  * @param operation
1586  * @param fragment_preference
1587  * @param advertising_data_length
1588  * @param advertising_data
1589  */
1590 
1591 const hci_cmd_t hci_le_set_extended_advertising_data = {
1592     HCI_OPCODE_HCI_LE_SET_EXTENDED_ADVERTISING_DATA, "111JV"
1593 };
1594 
1595 /**
1596  * @param advertising_handle
1597  * @param operation
1598  * @param fragment_preference
1599  * @param scan_response_data_length
1600  * @param scan_response_data
1601  */
1602 
1603 const hci_cmd_t hci_le_set_extended_scan_response_data = {
1604     HCI_OPCODE_HCI_LE_SET_EXTENDED_SCAN_RESPONSE_DATA, "111JV"
1605 };
1606 
1607 /**
1608  * @param enable
1609  * @param num_sets
1610  * @param advertising_handle[i]
1611  * @param duration[i]
1612  * @param max_extended_advertising_events[i]
1613  */
1614 
1615 const hci_cmd_t hci_le_set_extended_advertising_enable = {
1616         HCI_OPCODE_HCI_LE_SET_EXTENDED_ADVERTISING_ENABLE, "11[121]"
1617 };
1618 
1619 /**
1620  */
1621 const hci_cmd_t hci_le_read_maximum_advertising_data_length = {
1622     HCI_OPCODE_HCI_LE_READ_MAXIMUM_ADVERTISING_DATA_LENGTH, ""
1623 };
1624 
1625 /**
1626  */
1627 const hci_cmd_t hci_le_read_number_of_supported_advertising_sets = {
1628     HCI_OPCODE_HCI_LE_READ_NUMBER_OF_SUPPORTED_ADVERTISING_SETS, ""
1629 };
1630 
1631 /**
1632  * @param advertising_handle
1633  */
1634 const hci_cmd_t hci_le_remove_advertising_set = {
1635     HCI_OPCODE_HCI_LE_REMOVE_ADVERTISING_SET, "1"
1636 };
1637 
1638 /**
1639  */
1640 const hci_cmd_t hci_le_clear_advertising_sets = {
1641     HCI_OPCODE_HCI_LE_CLEAR_ADVERTISING_SETS, ""
1642 };
1643 
1644 /**
1645  * @param advertising_handle
1646  * @param periodic_advertising_interval_min * 1.25 ms, range 0x0006..0xffff
1647  * @param periodic_advertising_interval_max * 1.25 ms, range 0x0006..0xffff
1648  * @param periodic_advertising_properties
1649  */
1650 const hci_cmd_t hci_le_set_periodic_advertising_parameters = {
1651     HCI_OPCODE_HCI_LE_SET_PERIODIC_ADVERTISING_PARAMETERS, "1222"
1652 };
1653 
1654 /**
1655  * @param advertising_handle
1656  * @param operation
1657  * @param advertising_data_length
1658  * @param advertising_data
1659  */
1660 
1661 const hci_cmd_t hci_le_set_periodic_advertising_data = {
1662     HCI_OPCODE_HCI_LE_SET_PERIODIC_ADVERTISING_DATA, "11JV"
1663 };
1664 
1665 /**
1666  * @param enable
1667  * @param advertising_handle
1668  */
1669 const hci_cmd_t hci_le_set_periodic_advertising_enable = {
1670     HCI_OPCODE_HCI_LE_SET_PERIODIC_ADVERTISING_ENABLE, "11"
1671 };
1672 
1673 /**
1674  * @param own_address_type
1675  * @param scanning_filter_policy
1676  * @param scanning_phys 0 = LE 1M PHY | 2 = LE Coded PHY
1677  * @param scan_type
1678  * @param scan_interval * 0.625, range = 0x0004..0xffff
1679  * @param scan_window * 0.625, range = 0x0004..0xffff
1680  */
1681 
1682 // Variants for 1 (1M or Coded) PHY
1683 const hci_cmd_t hci_le_set_extended_scan_parameters_1 = {
1684     HCI_OPCODE_HCI_LE_SET_EXTENDED_SCAN_PARAMETERS, "111122"
1685 };
1686 
1687 // Variants for 2 (1M and Coded) PHY
1688 const hci_cmd_t hci_le_set_extended_scan_parameters_2 = {
1689         HCI_OPCODE_HCI_LE_SET_EXTENDED_SCAN_PARAMETERS, "111122122"
1690 };
1691 
1692 /**
1693  * @param enable
1694  * @param filter_duplicates
1695  * @param duration 0 = Scan continuously until explicitly disable, 10 ms
1696  * @param period 0 = Scan continuously, 1.28 s
1697  */
1698 const hci_cmd_t hci_le_set_extended_scan_enable = {
1699     HCI_OPCODE_HCI_LE_SET_EXTENDED_SCAN_ENABLE, "1122"
1700 };
1701 
1702 /**
1703  * @param initiator_filter_policy
1704  * @param own_address_type
1705  * @param peer_address_type
1706  * @param peer_address
1707  * @param initiating_phys with bit 0 = LE 1M PHY, bit 1 = LE 2M PHY, bit 2 = Coded PHY
1708  * @param scan_interval[i] * 0.625 ms
1709  * @param scan_window[i] * 0.625 ms
1710  * @param connection_interval_min[i] * 1.25 ms
1711  * @param connection_interval_max[i] * 1.25 ms
1712  * @param connection_latency[i]
1713  * @param supervision_timeout[i] * 10 ms
1714  * @param min_ce_length[i] * 0.625 ms
1715  * @param max_ce_length[i] * 0.625 ms
1716  */
1717 
1718 const hci_cmd_t hci_le_extended_create_connection = {
1719     HCI_OPCODE_HCI_LE_EXTENDED_CREATE_CONNECTION, "111Bb[22222222]"
1720 };
1721 
1722 /**
1723  * @param options
1724  * @param advertising_sid
1725  * @param advertiser_address_type
1726  * @param advertiser_address
1727  * @param skip
1728  * @param sync_timeout * 10 ms
1729  * @param sync_cte_type
1730  */
1731 const hci_cmd_t hci_le_periodic_advertising_create_sync = {
1732     HCI_OPCODE_HCI_LE_PERIODIC_ADVERTISING_CREATE_SYNC, "111B221"
1733 };
1734 
1735 /**
1736  */
1737 const hci_cmd_t hci_le_periodic_advertising_create_sync_cancel = {
1738     HCI_OPCODE_HCI_LE_PERIODIC_ADVERTISING_CREATE_SYNC_CANCEL, ""
1739 };
1740 
1741 /**
1742  * @param sync_handle
1743  */
1744 const hci_cmd_t hci_le_periodic_advertising_terminate_sync = {
1745     HCI_OPCODE_HCI_LE_PERIODIC_ADVERTISING_TERMINATE_SYNC, ""
1746 };
1747 
1748 /**
1749  * @param advertiser_address_type
1750  * @param advertiser_address
1751  * @param advertising_sid
1752  */
1753 const hci_cmd_t hci_le_add_device_to_periodic_advertiser_list = {
1754     HCI_OPCODE_HCI_LE_ADD_DEVICE_TO_PERIODIC_ADVERTISER_LIST, "1B1"
1755 };
1756 
1757 /**
1758  * @param advertiser_address_type
1759  * @param advertiser_address
1760  * @param advertising_sid
1761  */
1762 const hci_cmd_t hci_le_remove_device_from_periodic_advertiser_list = {
1763     HCI_OPCODE_HCI_LE_REMOVE_DEVICE_FROM_PERIODIC_ADVERTISER_LIST, "1B1"
1764 };
1765 
1766 /**
1767  */
1768 const hci_cmd_t hci_le_clear_periodic_advertiser_list = {
1769     HCI_OPCODE_HCI_LE_CLEAR_PERIODIC_ADVERTISER_LIST, ""
1770 };
1771 
1772 /**
1773  */
1774 const hci_cmd_t hci_le_read_periodic_advertiser_list_size = {
1775     HCI_OPCODE_HCI_LE_READ_PERIODIC_ADVERTISER_LIST_SIZE, ""
1776 };
1777 
1778 /**
1779  */
1780 const hci_cmd_t hci_le_read_transmit_power = {
1781     HCI_OPCODE_HCI_LE_READ_TRANSMIT_POWER, ""
1782 };
1783 
1784 /**
1785  */
1786 const hci_cmd_t hci_le_read_rf_path_compensation = {
1787     HCI_OPCODE_HCI_LE_READ_RF_PATH_COMPENSATION, ""
1788 };
1789 
1790 /**
1791  * @param rf_tx_path_compensation_value * 0.1 dB, signed
1792  * @param rf_rx_path_compensation_value * 0.1 dB, signed
1793  */
1794 const hci_cmd_t hci_le_write_rf_path_compensation = {
1795     HCI_OPCODE_HCI_LE_WRITE_RF_PATH_COMPENSATION, "22"
1796 };
1797 
1798 /**
1799  * @param peer_identity_address_type
1800  * @param peer_identity_address
1801  * @param privacy_mode
1802  */
1803 const hci_cmd_t hci_le_set_privacy_mode = {
1804     HCI_OPCODE_HCI_LE_SET_PRIVACY_MODE, "1B1"
1805 };
1806 
1807 /**
1808  * @param rx_channel
1809  * @param phy
1810  * @param modulation_index
1811  * @param expected_cte_length
1812  * @param expected_cte_type
1813  * @param slot_durations
1814  * @param switching_pattern_length
1815  * @param antenna_ids[i]
1816  */
1817 
1818 const hci_cmd_t hci_le_receiver_test_v3 = {
1819     HCI_OPCODE_HCI_LE_RECEIVER_TEST_V3, "111111a[1]"
1820 };
1821 
1822 /**
1823  * @param tx_channel
1824  * @param test_data_length
1825  * @param packet_payload
1826  * @param phy
1827  * @param cte_length
1828  * @param cte_type
1829  * @param switching_pattern_length
1830  * @param antenna_ids[i]
1831  */
1832 
1833 const hci_cmd_t hci_le_transmitter_test_v3 = {
1834     HCI_OPCODE_HCI_LE_TRANSMITTER_TEST_V3, "111111a[1]"
1835 };
1836 
1837 /**
1838  * @param advertising_handle
1839  * @param cte_length
1840  * @param cte_type
1841  * @param cte_count
1842  * @param switching_pattern_length
1843  * @param antenna_ids[i]
1844  */
1845 
1846 const hci_cmd_t hci_le_set_connectionless_cte_transmit_parameters = {
1847     HCI_OPCODE_HCI_LE_SET_CONNECTIONLESS_CTE_TRANSMIT_PARAMETERS, "1111a[1]"
1848 };
1849 
1850 /**
1851  * @param advertising_handle
1852  * @param cte_enable
1853  */
1854 const hci_cmd_t hci_le_set_connectionless_cte_transmit_enable = {
1855     HCI_OPCODE_HCI_LE_SET_CONNECTIONLESS_CTE_TRANSMIT_ENABLE, "11"
1856 };
1857 
1858 /**
1859  * @param sync_handle
1860  * @param sampling_enable
1861  * @param slot_durations
1862  * @param max_sampled_ctes
1863  * @param switching_pattern_length
1864  * @param antenna_ids[i]
1865  */
1866 
1867 const hci_cmd_t hci_le_set_connectionless_iq_sampling_enable = {
1868     HCI_OPCODE_HCI_LE_SET_CONNECTIONLESS_IQ_SAMPLING_ENABLE, "2111a[i]"
1869 };
1870 
1871 /**
1872  * @param connection_handle
1873  * @param sampling_enable
1874  * @param slot_durations
1875  * @param switching_pattern_length
1876  * @param antenna_ids[i]
1877  */
1878 
1879 const hci_cmd_t hci_le_set_connection_cte_receive_parameters = {
1880     HCI_OPCODE_HCI_LE_SET_CONNECTION_CTE_RECEIVE_PARAMETERS, "211a[1]"
1881 };
1882 
1883 /**
1884  * @param connection_handle
1885  * @param cte_types
1886  * @param switching_pattern_length
1887  * @param antenna_ids[i]
1888  */
1889 
1890 const hci_cmd_t hci_le_set_connection_cte_transmit_parameters = {
1891     HCI_OPCODE_HCI_LE_SET_CONNECTION_CTE_TRANSMIT_PARAMETERS, "21a[1]"
1892 };
1893 
1894 /**
1895  * @param connection_handle
1896  * @param enable
1897  * @param cte_request_interval
1898  * @param requested_cte_length
1899  * @param requested_cte_type
1900  */
1901 const hci_cmd_t hci_le_connection_cte_request_enable = {
1902     HCI_OPCODE_HCI_LE_CONNECTION_CTE_REQUEST_ENABLE, "H1211"
1903 };
1904 
1905 /**
1906  * @param connection_handle
1907  * @param enable
1908  */
1909 const hci_cmd_t hci_le_connection_cte_response_enable = {
1910     HCI_OPCODE_HCI_LE_CONNECTION_CTE_RESPONSE_ENABLE, "H1"
1911 };
1912 
1913 /**
1914  */
1915 const hci_cmd_t hci_le_read_antenna_information = {
1916     HCI_OPCODE_HCI_LE_READ_ANTENNA_INFORMATION, ""
1917 };
1918 
1919 /**
1920  * @param sync_handle
1921  * @param enable
1922  */
1923 const hci_cmd_t hci_le_set_periodic_advertising_receive_enable = {
1924     HCI_OPCODE_HCI_LE_SET_PERIODIC_ADVERTISING_RECEIVE_ENABLE, "H1"
1925 };
1926 
1927 /**
1928  * @param connection_handle
1929  * @param service_data
1930  * @param sync_handle
1931  */
1932 const hci_cmd_t hci_le_periodic_advertising_sync_transfer = {
1933     HCI_OPCODE_HCI_LE_PERIODIC_ADVERTISING_SYNC_TRANSFER, "H22"
1934 };
1935 
1936 /**
1937  * @param connection_handle
1938  * @param service_data
1939  * @param advertising_handle
1940  */
1941 const hci_cmd_t hci_le_periodic_advertising_set_info_transfer = {
1942     HCI_OPCODE_HCI_LE_PERIODIC_ADVERTISING_SET_INFO_TRANSFER, "H21"
1943 };
1944 
1945 /**
1946  * @param connection_handle
1947  * @param mode
1948  * @param skip
1949  * @param sync_timeout
1950  * @param cte_type
1951  */
1952 const hci_cmd_t hci_le_set_periodic_advertising_sync_transfer_parameters = {
1953     HCI_OPCODE_HCI_LE_SET_PERIODIC_ADVERTISING_SYNC_TRANSFER_PARAMETERS, "H1221"
1954 };
1955 
1956 /**
1957  * @param mode
1958  * @param skip
1959  * @param sync_timeout
1960  * @param cte_type
1961  */
1962 const hci_cmd_t hci_le_set_default_periodic_advertising_sync_transfer_parameters = {
1963     HCI_OPCODE_HCI_LE_SET_DEFAULT_PERIODIC_ADVERTISING_SYNC_TRANSFER_PARAMETERS, "1221"
1964 };
1965 
1966 /**
1967  * @param 256Remote_P-256_public_key_x
1968  * @param 256Remote_P-256_public_key_y
1969  * @param key_type
1970  */
1971 const hci_cmd_t hci_le_generate_dhkey_v2 = {
1972     HCI_OPCODE_HCI_LE_GENERATE_DHKEY_V2, "QQ1"
1973 };
1974 
1975 /**
1976  * @param action
1977  */
1978 const hci_cmd_t hci_le_modify_sleep_clock_accuracy = {
1979     HCI_OPCODE_HCI_LE_MODIFY_SLEEP_CLOCK_ACCURACY, "1"
1980 };
1981 
1982 /**
1983  */
1984 const hci_cmd_t hci_opcode_hci_le_read_buffer_size_v2 = {
1985     HCI_OPCODE_HCI_OPCODE_HCI_LE_READ_BUFFER_SIZE_V2, ""
1986 };
1987 
1988 /**
1989  * @param connection_handle
1990  */
1991 const hci_cmd_t hci_le_read_iso_tx_sync = {
1992     HCI_OPCODE_HCI_LE_READ_ISO_TX_SYNC, "H"
1993 };
1994 
1995 /**
1996  * @param cig_id
1997  * @param sdu_interval_m_to_s
1998  * @param sdu_interval_s_to_m
1999  * @param slaves_clock_accuracy
2000  * @param packing
2001  * @param framing
2002  * @param max_transport_latency_m_to_s
2003  * @param max_transport_latency_s_to_m
2004  * @param cis_count
2005  * @param cis_id[i]
2006  * @param max_sdu_m_to_s[i]
2007  * @param max_sdu_s_to_m[i]
2008  * @param phy_m_to_s[i]
2009  * @param phy_s_to_m[i]
2010  * @param rtn_m_to_s[i]
2011  * @param rtn_s_to_m[i]
2012  */
2013 
2014 const hci_cmd_t hci_le_set_cig_parameters = {
2015     HCI_OPCODE_HCI_LE_SET_CIG_PARAMETERS, "13311122a[1221111]"
2016 };
2017 
2018 /**
2019  * @param cig_id
2020  * @param sdu_interval_m_to_s
2021  * @param sdu_interval_s_to_m
2022  * @param ft_m_to_s
2023  * @param ft_s_to_m
2024  * @param iso_interval
2025  * @param slaves_clock_accuracy
2026  * @param packing
2027  * @param framing
2028  * @param max_transport_latency_m_to_s
2029  * @param max_transport_latency_s_to_m
2030  * @param cis_count
2031  * @param cis_id[i]
2032  * @param nse[i]
2033  * @param max_sdu_m_to_s[i]
2034  * @param max_sdu_s_to_m[i]
2035  * @param max_pdu_m_to_s[i]
2036  * @param max_pdu_s_to_m[i]
2037  * @param phy_m_to_s[i]
2038  * @param phy_s_to_m[i]
2039  * @param bn_m_to_s[i]
2040  * @param bn_s_to_m[i]
2041  */
2042 
2043 const hci_cmd_t hci_le_set_cig_parameters_test = {
2044     HCI_OPCODE_HCI_LE_SET_CIG_PARAMETERS_TEST, "133112111a[1122221111]"
2045 };
2046 
2047 /**
2048  * @param cis_count
2049  * @param cis_connection_handle[i]
2050  * @param acl_connection_handle[i]
2051  */
2052 
2053 const hci_cmd_t hci_le_create_cis = {
2054     HCI_OPCODE_HCI_LE_CREATE_CIS, "a[22]"
2055 };
2056 
2057 /**
2058  * @param cig_id
2059  */
2060 const hci_cmd_t hci_le_remove_cig = {
2061     HCI_OPCODE_HCI_LE_REMOVE_CIG, "1"
2062 };
2063 
2064 /**
2065  * @param connection_handle
2066  */
2067 const hci_cmd_t hci_le_accept_cis_request = {
2068     HCI_OPCODE_HCI_LE_ACCEPT_CIS_REQUEST, "H"
2069 };
2070 
2071 /**
2072  * @param connection_handle
2073  */
2074 const hci_cmd_t hci_le_reject_cis_request = {
2075     HCI_OPCODE_HCI_LE_REJECT_CIS_REQUEST, "H"
2076 };
2077 
2078 /**
2079  * @param big_handle
2080  * @param advertising_handle
2081  * @param num_bis
2082  * @param sdu_interval
2083  * @param max_sdu
2084  * @param max_transport_latency
2085  * @param rtn
2086  * @param phy
2087  * @param packing
2088  * @param framing
2089  * @param encryption
2090  * @param broadcast_code
2091  */
2092 const hci_cmd_t hci_le_create_big = {
2093     HCI_OPCODE_HCI_LE_CREATE_BIG, "11132211111P"
2094 };
2095 
2096 /**
2097  * @param big_handle
2098  * @param advertising_handle
2099  * @param num_bis
2100  * @param sdu_interval
2101  * @param iso_interval
2102  * @param nse
2103  * @param max_sdu
2104  * @param max_PDU
2105  * @param phy
2106  * @param packing
2107  * @param framing
2108  * @param bn
2109  * @param irc
2110  * @param pto
2111  * @param encryption
2112  * @param broadcast_code
2113  */
2114 const hci_cmd_t hci_le_create_big_test = {
2115     HCI_OPCODE_HCI_LE_CREATE_BIG_TEST, "111321221111111P"
2116 };
2117 
2118 /**
2119  * @param big_handle
2120  * @param reason
2121  */
2122 const hci_cmd_t hci_le_terminate_big = {
2123     HCI_OPCODE_HCI_LE_TERMINATE_BIG, "11"
2124 };
2125 
2126 /**
2127  * @param big_handle
2128  * @param sync_handle
2129  * @param encryption
2130  * @param broadcast_code
2131  * @param mse
2132  * @param big_sync_timeout
2133  * @param num_bis
2134  * @param bis[i]
2135  */
2136 
2137 const hci_cmd_t hci_le_big_create_sync = {
2138     HCI_OPCODE_HCI_LE_BIG_CREATE_SYNC, "1H1P12a[1]"
2139 };
2140 
2141 /**
2142  * @param big_handle
2143  */
2144 const hci_cmd_t hci_le_big_terminate_sync = {
2145     HCI_OPCODE_HCI_LE_BIG_TERMINATE_SYNC, ""
2146 };
2147 
2148 /**
2149  * @param connection_handle
2150  */
2151 const hci_cmd_t hci_le_request_peer_sca = {
2152         HCI_OPCODE_HCI_LE_REQUEST_PEER_SCA, "H"
2153 };
2154 
2155 /**
2156  * @param connection_handle
2157  * @param data_path_direction
2158  * @param data_path_id
2159  * @param codec_id_coding_format
2160  * @param codec_id_company_identifier (Shall be ignored if codec_id_coding_format is not 0xFF)
2161  * @param codec_id_vendor_codec_id (Shall be ignored if codec_id_coding_format is not 0xFF)
2162  * @param controller_delay
2163  * @param codec_configuration_length
2164  * @param codec_configuration
2165  */
2166 
2167 const hci_cmd_t hci_le_setup_iso_data_path = {
2168     HCI_OPCODE_HCI_LE_SETUP_ISO_DATA_PATH, "H111223JV"
2169 };
2170 
2171 /**
2172  * @param connection_handle
2173  */
2174 const hci_cmd_t hci_le_remove_iso_data_path = {
2175     HCI_OPCODE_HCI_LE_REMOVE_ISO_DATA_PATH, "H1"
2176 };
2177 
2178 /**
2179  * @param connection_handle
2180  * @param paylaod_type
2181  */
2182 const hci_cmd_t hci_le_iso_transmit_test = {
2183     HCI_OPCODE_HCI_LE_ISO_TRANSMIT_TEST, "H1"
2184 };
2185 
2186 /**
2187  * @param connection_handle
2188  * @param paylaod_type
2189  */
2190 const hci_cmd_t hci_le_iso_receive_test = {
2191     HCI_OPCODE_HCI_LE_ISO_RECEIVE_TEST, "H1"
2192 };
2193 
2194 /**
2195  * @param connection_handle
2196  */
2197 const hci_cmd_t hci_le_iso_read_test_counters = {
2198     HCI_OPCODE_HCI_LE_ISO_READ_TEST_COUNTERS, "H"
2199 };
2200 
2201 /**
2202  * @param connection_handle
2203  */
2204 const hci_cmd_t hci_le_iso_test_end = {
2205     HCI_OPCODE_HCI_LE_ISO_TEST_END, "H"
2206 };
2207 
2208 /**
2209  * @param bit_number
2210  * @param bit_value
2211  */
2212 const hci_cmd_t hci_le_set_host_feature = {
2213     HCI_OPCODE_HCI_LE_SET_HOST_FEATURE, "11"
2214 };
2215 
2216 /**
2217  * @param connection_handle
2218  */
2219 const hci_cmd_t hci_le_read_iso_link_quality = {
2220     HCI_OPCODE_HCI_LE_READ_ISO_LINK_QUALITY, "H"
2221 };
2222 
2223 /**
2224  * @param connection_handle
2225  * @param phy
2226  */
2227 const hci_cmd_t hci_le_enhanced_read_transmit_power_level = {
2228     HCI_OPCODE_HCI_LE_ENHANCED_READ_TRANSMIT_POWER_LEVEL, "H1"
2229 };
2230 
2231 /**
2232  * @param connection_handle
2233  * @param phy
2234  */
2235 const hci_cmd_t hci_le_read_remote_transmit_power_level = {
2236     HCI_OPCODE_HCI_LE_READ_REMOTE_TRANSMIT_POWER_LEVEL, "H1"
2237 };
2238 
2239 /**
2240  * @param connection_handle
2241  * @param high_threshold
2242  * @param high_hysteresis
2243  * @param low_threshold
2244  * @param low_hysteresis
2245  * @param min_time_spent
2246  */
2247 const hci_cmd_t hci_le_set_path_loss_reporting_parameters = {
2248     HCI_OPCODE_HCI_LE_SET_PATH_LOSS_REPORTING_PARAMETERS, "211112"
2249 };
2250 
2251 /**
2252  * @param connection_handle
2253  * @param enable
2254  */
2255 const hci_cmd_t hci_le_set_path_loss_reporting_enable = {
2256     HCI_OPCODE_HCI_LE_SET_PATH_LOSS_REPORTING_ENABLE, "H1"
2257 };
2258 
2259 /**
2260  * @param connection_handle
2261  * @param local_enable
2262  * @param remote_enable
2263  */
2264 const hci_cmd_t hci_le_set_transmit_power_reporting_enable = {
2265     HCI_OPCODE_HCI_LE_SET_TRANSMIT_POWER_REPORTING_ENABLE, "H11"
2266 };
2267 
2268 /**
2269  * @param tx_channel
2270  * @param test_data_length
2271  * @param packet_payload
2272  * @param phy
2273  * @param cte_length
2274  * @param cte_type
2275  * @param switching_pattern_length
2276  * @param antenna_ids[i]
2277  * @param transmit_power_level
2278  */
2279 
2280 const hci_cmd_t hci_le_transmitter_test_v4 = {
2281     HCI_OPCODE_HCI_LE_TRANSMITTER_TEST_V4, "111111a[1]1"
2282 };
2283 
2284 #endif
2285 
2286 // Broadcom / Cypress specific HCI commands
2287 
2288 /**
2289  * @brief Enable Wide-Band Speech / mSBC decoding for PCM
2290  * @param enable_wbs is 0 for disable, 1 for enable
2291  * @param uuid_wbs is 2 for EV2/EV3
2292  */
2293 const hci_cmd_t hci_bcm_enable_wbs = {
2294     HCI_OPCODE_HCI_BCM_ENABLE_WBS, "12"
2295         // return: status
2296 };
2297 
2298 /**
2299  * @brief Configure SCO Routing (BCM)
2300  * @param sco_routing is 0 for PCM, 1 for Transport, 2 for Codec and 3 for I2S
2301  * @param pcm_interface_rate is 0 for 128KBps, 1 for 256 KBps, 2 for 512KBps, 3 for 1024KBps, and 4 for 2048Kbps
2302  * @param frame_type is 0 for short and 1 for long
2303  * @param sync_mode is 0 for slave and 1 for master
2304  * @param clock_mode is 0 for slabe and 1 for master
2305  */
2306 const hci_cmd_t hci_bcm_write_sco_pcm_int = {
2307     HCI_OPCODE_HCI_BCM_WRITE_SCO_PCM_INT, "11111"
2308     // return: status
2309 };
2310 
2311 /**
2312  * @brief Configure the I2S/PCM interface (BCM)
2313  * @param i2s_enable is 0 for off, 1 for on
2314  * @param is_master is 0 for slave, is 1 for master
2315  * @param sample_rate is 0 for 8 kHz, 1 for 16 kHz, 2 for 4 kHz
2316  * @param clock_rate is 0 for 128 kz, 1 for 256 kHz, 2 for 512 khz, 3 for 1024 kHz, 4 for 2048 khz
2317  * @param clock_mode is 0 for slabe and 1 for master
2318  */
2319 const hci_cmd_t hci_bcm_write_i2spcm_interface_param = {
2320     HCI_OPCODE_HCI_BCM_WRITE_I2SPCM_INTERFACE_PARAM, "1111"
2321         // return: status
2322 };
2323 
2324 
2325 /**
2326  * @brief Activates selected Sleep Mode
2327  * @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
2328  * @param idle_threshold_host (modes 1,2,5,7) time until considered idle, unit roughly 300 ms
2329  * @param idle_threshold_controller (modes 1-7,9) time until considered idle, unit roughly 300 ms
2330  * @param bt_wake_active_mode (modes 1,2,7) 0 = BT_WAKE line is active high, 1 = BT_WAKE is active low
2331  * @param host_wake_active_mode (modes 1,2,5,7) 0 = HOST_WAKE line is active high, 1 = HOST_WAKE is active low
2332  * @param allow_host_sleep_during_sco (modes 1,2,3,5,7)
2333  * @param combine_sleep_mode_and_lpm  (modes 1,2,3,5,7)
2334  * @param enable_tristate_control_of_uart_tx_line (modes 1,2,7)
2335  * @param active_connection_handling_on_suspend (modes 3,5)
2336  * @param resume_timeout (modes 3,5)
2337  * @param enable_break_to_host (mode 12)
2338  * @param pulsed_host_wake (modes 1,12)
2339  */
2340 const hci_cmd_t hci_bcm_set_sleep_mode = {
2341     HCI_OPCODE_HCI_BCM_SET_SLEEP_MODE, "111111111111"
2342 };
2343 
2344 /**
2345  * @brief Set TX Power Table
2346  * @param is_le 0=classic, 1=LE
2347  * @param chip_max_tx_pwr_db chip level max TX power in dBM
2348  */
2349 const hci_cmd_t hci_bcm_write_tx_power_table = {
2350     HCI_OPCODE_HCI_BCM_WRITE_TX_POWER_TABLE, "11"
2351 };
2352 
2353 const hci_cmd_t hci_bcm_set_tx_pwr = {
2354     HCI_OPCODE_HCI_BCM_SET_TX_PWR, "11H"
2355 };
2356 
2357 /**
2358  * @brief This command starts receiving packets using packet transmission parameters such as
2359  *        frequency channel, packet type, and packet length. It is used for Packet RX.
2360  * @see   https://processors.wiki.ti.com/index.php/CC256x_Testing_Guide#Continuous_RX
2361  * @param frequency
2362  * @param ADPLL loop mode
2363  */
2364 const hci_cmd_t hci_ti_drpb_tester_con_rx = {
2365         0xFD17, "11"
2366 };
2367 
2368 /**
2369  *
2370  *
2371  * @brief This command tests the RF transceiver in continuous transmission mode.
2372  *        The transmitter is activated by configuring the transmission parameters such as pattern,
2373  *        modulation, and frequency.
2374  * @see   processors.wiki.ti.com/index.php/CC256x_VS_HCI_Commands#HCI_VS_DRPb_Tester_Con_TX.280xFD84.29
2375  * @param modulation
2376  * @param test_pattern
2377  * @param frequency
2378  * @param power_level
2379  * @param reserved1
2380  * @param reserved2
2381  */
2382 const hci_cmd_t hci_ti_drpb_tester_con_tx = {
2383     0xFD84, "111144"
2384 };
2385 
2386 /**
2387  * @brief This command starts sending/receiving packets using packet transmission parameters such as
2388  *        frequency channel, packet type, and packet length. It is used for Packet TX/RX.
2389  * @see   processors.wiki.ti.com/index.php/CC256x_VS_HCI_Commands#HCI_VS_DRPb_Tester_Packet_TX_RX_.280xFD85.29
2390  * @param frequency_mode
2391  * @param tx_single_frequency
2392  * @param rx_single_frequency
2393  * @param acl_packet_type
2394  * @paarm acl_packet_data_pattern
2395  * @param reserved
2396  * @param power_level
2397  * @param disable_whitening
2398  * @param prbs9_initialization_value
2399  */
2400 const hci_cmd_t hci_ti_drpb_tester_packet_tx_rx = {
2401     0xFD85, "1111112112"
2402 };
2403 
2404 
2405 /**
2406  * @param best effort access percentage
2407  * @param guaranteed access percentage
2408  * @param poll period
2409  * @param slave burst after tx
2410  * @param slave master search count
2411  * @param master burst after tx enable
2412  * @param master burst after rx limit
2413  */
2414 const hci_cmd_t hci_ti_configure_ddip = {
2415     HCI_OPCODE_HCI_TI_VS_CONFIGURE_DDIP, "1111111"
2416 };
2417 
2418 /**
2419  * @brief This command is used to associate the requested ACL handle with Wide Band Speech configuration.
2420  * @param enable 0=disable, 1=enable
2421  * @param a3dp_role (NL5500, WL128x only) 0=source,1=sink
2422  * @param code_upload (NL5500, WL128x only) 0=do not load a3dp code, 1=load a3dp code
2423  * @param reserved for future use
2424  */
2425 const hci_cmd_t hci_ti_avrp_enable = {
2426         0xFD92, "1112"
2427 };
2428 
2429 /**
2430  * @brief This command is used to associate the requested ACL handle with Wide Band Speech configuration.
2431  * @param acl_con_handle
2432  */
2433 const hci_cmd_t hci_ti_wbs_associate = {
2434         0xFD78, "H"
2435 };
2436 
2437 /**
2438  * @brief This command is used to disassociate Wide Band Speech configuration from any ACL handle.
2439  */
2440 const hci_cmd_t hci_ti_wbs_disassociate = {
2441         0xFD79, ""
2442 };
2443 
2444 /**
2445  * @brief This command configures the codec interface parameters and the PCM clock rate, which is relevant when
2446           the Bluetooth core generates the clock. This command must be used by the host to use the PCM
2447           interface.
2448  * @param clock_rate in kHz
2449  * @param clock_direction 0=master/output, 1=slave/input
2450  * @param frame_sync_frequency in Hz
2451  * @param frame_sync_duty_cycle 0=50% (I2S Format), 0x0001-0xffff number of cycles of PCM clock
2452  * @param frame_sync_edge 0=driven/sampled at rising edge, 1=driven/sampled at falling edge of PCM clock
2453  * @param frame_sync_polariy 0=active high, 1=active low
2454  * @param reserved1
2455  * @param channel_1_data_out_size sample size in bits
2456  * @param channel_1_data_out_offset number of PCM clock cycles between rising of frame sync and data start
2457  * @param channel_1_data_out_edge 0=data driven at rising edge, 1=data driven at falling edge of PCM clock
2458  * @param channel_1_data_in_size sample size in bits
2459  * @param channel_1_data_in_offset number of PCM clock cycles between rising of frame sync and data start
2460  * @param channel_1_data_in_edge 0=data sampled at rising edge, 1=data sampled at falling edge of PCM clock
2461  * @param fsync_multiplier this field is only relevant to CC256XB from service pack 0.2 !!! -> use 0x00
2462  * @param channel_2_data_out_size sample size in bits
2463  * @param channel_2_data_out_offset number of PCM clock cycles between rising of frame sync and data start
2464  * @param channel_2_data_out_edge 0=data driven at rising edge, 1=data driven at falling edge of PCM clock
2465  * @param channel_2_data_in_size sample size in bits
2466  * @param channel_2_data_in_offset number of PCM clock cycles between rising of frame sync and data start
2467  * @param channel_2_data_in_edge 0=data sampled at rising edge, 1=data sampled at falling edge of PCM clock
2468  * @param reserved2
2469  *
2470  */
2471 const hci_cmd_t hci_ti_write_codec_config = {
2472         0xFD06, "214211122122112212211"
2473 };
2474 
2475 /**
2476  * @brief This command is used only for internal testing.
2477  * @see   https://processors.wiki.ti.com/index.php/CC256x_Testing_Guide#Continuous_TX
2478  * @param frequency
2479  * @param ADPLL loop mode
2480  */
2481 const hci_cmd_t hci_ti_drpb_enable_rf_calibration = {
2482         0xFD80, "141"
2483 };
2484 
2485 /**
2486  * @brief This command command is only required for the continuous TX test of modulated
2487  * (GFSK, π/4-DQPSK or 8DPSK) signal. This command should be skipped when performing continuous TX test for CW.
2488  * @see   https://processors.wiki.ti.com/index.php/CC256x_Testing_Guide#Continuous_RX
2489  * @param frequency
2490  * @param ADPLL loop mode
2491  */
2492 const hci_cmd_t hci_ti_write_hardware_register = {
2493         0xFF01, "42"
2494 };
2495