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