1 /* 2 * Copyright (C) 2014 BlueKitchen GmbH 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of the copyright holders nor the names of 14 * contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 4. Any redistribution, use, or modification is done solely for 17 * personal benefit and not for any commercial purpose or for 18 * monetary gain. 19 * 20 * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS 24 * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 27 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 28 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 30 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * Please inquire about commercial licensing options at 34 * [email protected] 35 * 36 */ 37 38 #define BTSTACK_FILE__ "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