1*56042629SMatthias Ringwald /* 2*56042629SMatthias Ringwald * Copyright (C) 2014 BlueKitchen GmbH 3*56042629SMatthias Ringwald * 4*56042629SMatthias Ringwald * Redistribution and use in source and binary forms, with or without 5*56042629SMatthias Ringwald * modification, are permitted provided that the following conditions 6*56042629SMatthias Ringwald * are met: 7*56042629SMatthias Ringwald * 8*56042629SMatthias Ringwald * 1. Redistributions of source code must retain the above copyright 9*56042629SMatthias Ringwald * notice, this list of conditions and the following disclaimer. 10*56042629SMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright 11*56042629SMatthias Ringwald * notice, this list of conditions and the following disclaimer in the 12*56042629SMatthias Ringwald * documentation and/or other materials provided with the distribution. 13*56042629SMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of 14*56042629SMatthias Ringwald * contributors may be used to endorse or promote products derived 15*56042629SMatthias Ringwald * from this software without specific prior written permission. 16*56042629SMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for 17*56042629SMatthias Ringwald * personal benefit and not for any commercial purpose or for 18*56042629SMatthias Ringwald * monetary gain. 19*56042629SMatthias Ringwald * 20*56042629SMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 21*56042629SMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22*56042629SMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23*56042629SMatthias Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS 24*56042629SMatthias Ringwald * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25*56042629SMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26*56042629SMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 27*56042629SMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 28*56042629SMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29*56042629SMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 30*56042629SMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31*56042629SMatthias Ringwald * SUCH DAMAGE. 32*56042629SMatthias Ringwald * 33*56042629SMatthias Ringwald * Please inquire about commercial licensing options at 34*56042629SMatthias Ringwald * [email protected] 35*56042629SMatthias Ringwald * 36*56042629SMatthias Ringwald */ 37*56042629SMatthias Ringwald 38*56042629SMatthias Ringwald /* 39*56042629SMatthias Ringwald * hci_cmd.c 40*56042629SMatthias Ringwald * 41*56042629SMatthias Ringwald * Created by Matthias Ringwald on 7/23/09. 42*56042629SMatthias Ringwald */ 43*56042629SMatthias Ringwald 44*56042629SMatthias Ringwald #include "btstack-config.h" 45*56042629SMatthias Ringwald 46*56042629SMatthias Ringwald #include "classic/sdp_util.h" 47*56042629SMatthias Ringwald #include "hci.h" 48*56042629SMatthias Ringwald #include "hci_cmd.h" 49*56042629SMatthias Ringwald 50*56042629SMatthias Ringwald #include <string.h> 51*56042629SMatthias Ringwald 52*56042629SMatthias Ringwald // calculate combined ogf/ocf value 53*56042629SMatthias Ringwald #define OPCODE(ogf, ocf) (ocf | ogf << 10) 54*56042629SMatthias Ringwald 55*56042629SMatthias Ringwald /** 56*56042629SMatthias Ringwald * construct HCI Command based on template 57*56042629SMatthias Ringwald * 58*56042629SMatthias Ringwald * Format: 59*56042629SMatthias Ringwald * 1,2,3,4: one to four byte value 60*56042629SMatthias Ringwald * H: HCI connection handle 61*56042629SMatthias Ringwald * B: Bluetooth Baseband Address (BD_ADDR) 62*56042629SMatthias Ringwald * D: 8 byte data block 63*56042629SMatthias Ringwald * E: Extended Inquiry Result 64*56042629SMatthias Ringwald * N: Name up to 248 chars, \0 terminated 65*56042629SMatthias Ringwald * P: 16 byte Pairing code 66*56042629SMatthias Ringwald * A: 31 bytes advertising data 67*56042629SMatthias Ringwald * S: Service Record (Data Element Sequence) 68*56042629SMatthias Ringwald */ 69*56042629SMatthias Ringwald uint16_t hci_cmd_create_from_template(uint8_t *hci_cmd_buffer, const hci_cmd_t *cmd, va_list argptr){ 70*56042629SMatthias Ringwald 71*56042629SMatthias Ringwald hci_cmd_buffer[0] = cmd->opcode & 0xff; 72*56042629SMatthias Ringwald hci_cmd_buffer[1] = cmd->opcode >> 8; 73*56042629SMatthias Ringwald int pos = 3; 74*56042629SMatthias Ringwald 75*56042629SMatthias Ringwald const char *format = cmd->format; 76*56042629SMatthias Ringwald uint16_t word; 77*56042629SMatthias Ringwald uint32_t longword; 78*56042629SMatthias Ringwald uint8_t * ptr; 79*56042629SMatthias Ringwald while (*format) { 80*56042629SMatthias Ringwald switch(*format) { 81*56042629SMatthias Ringwald case '1': // 8 bit value 82*56042629SMatthias Ringwald case '2': // 16 bit value 83*56042629SMatthias Ringwald case 'H': // hci_handle 84*56042629SMatthias Ringwald word = va_arg(argptr, int); // minimal va_arg is int: 2 bytes on 8+16 bit CPUs 85*56042629SMatthias Ringwald hci_cmd_buffer[pos++] = word & 0xff; 86*56042629SMatthias Ringwald if (*format == '2') { 87*56042629SMatthias Ringwald hci_cmd_buffer[pos++] = word >> 8; 88*56042629SMatthias Ringwald } else if (*format == 'H') { 89*56042629SMatthias Ringwald // TODO implement opaque client connection handles 90*56042629SMatthias Ringwald // pass module handle for now 91*56042629SMatthias Ringwald hci_cmd_buffer[pos++] = word >> 8; 92*56042629SMatthias Ringwald } 93*56042629SMatthias Ringwald break; 94*56042629SMatthias Ringwald case '3': 95*56042629SMatthias Ringwald case '4': 96*56042629SMatthias Ringwald longword = va_arg(argptr, uint32_t); 97*56042629SMatthias Ringwald // longword = va_arg(argptr, int); 98*56042629SMatthias Ringwald hci_cmd_buffer[pos++] = longword; 99*56042629SMatthias Ringwald hci_cmd_buffer[pos++] = longword >> 8; 100*56042629SMatthias Ringwald hci_cmd_buffer[pos++] = longword >> 16; 101*56042629SMatthias Ringwald if (*format == '4'){ 102*56042629SMatthias Ringwald hci_cmd_buffer[pos++] = longword >> 24; 103*56042629SMatthias Ringwald } 104*56042629SMatthias Ringwald break; 105*56042629SMatthias Ringwald case 'B': // bt-addr 106*56042629SMatthias Ringwald ptr = va_arg(argptr, uint8_t *); 107*56042629SMatthias Ringwald hci_cmd_buffer[pos++] = ptr[5]; 108*56042629SMatthias Ringwald hci_cmd_buffer[pos++] = ptr[4]; 109*56042629SMatthias Ringwald hci_cmd_buffer[pos++] = ptr[3]; 110*56042629SMatthias Ringwald hci_cmd_buffer[pos++] = ptr[2]; 111*56042629SMatthias Ringwald hci_cmd_buffer[pos++] = ptr[1]; 112*56042629SMatthias Ringwald hci_cmd_buffer[pos++] = ptr[0]; 113*56042629SMatthias Ringwald break; 114*56042629SMatthias Ringwald case 'D': // 8 byte data block 115*56042629SMatthias Ringwald ptr = va_arg(argptr, uint8_t *); 116*56042629SMatthias Ringwald memcpy(&hci_cmd_buffer[pos], ptr, 8); 117*56042629SMatthias Ringwald pos += 8; 118*56042629SMatthias Ringwald break; 119*56042629SMatthias Ringwald case 'E': // Extended Inquiry Information 240 octets 120*56042629SMatthias Ringwald ptr = va_arg(argptr, uint8_t *); 121*56042629SMatthias Ringwald memcpy(&hci_cmd_buffer[pos], ptr, 240); 122*56042629SMatthias Ringwald pos += 240; 123*56042629SMatthias Ringwald break; 124*56042629SMatthias Ringwald case 'N': { // UTF-8 string, null terminated 125*56042629SMatthias Ringwald ptr = va_arg(argptr, uint8_t *); 126*56042629SMatthias Ringwald uint16_t len = strlen((const char*) ptr); 127*56042629SMatthias Ringwald if (len > 248) { 128*56042629SMatthias Ringwald len = 248; 129*56042629SMatthias Ringwald } 130*56042629SMatthias Ringwald memcpy(&hci_cmd_buffer[pos], ptr, len); 131*56042629SMatthias Ringwald if (len < 248) { 132*56042629SMatthias Ringwald // fill remaining space with zeroes 133*56042629SMatthias Ringwald memset(&hci_cmd_buffer[pos+len], 0, 248-len); 134*56042629SMatthias Ringwald } 135*56042629SMatthias Ringwald pos += 248; 136*56042629SMatthias Ringwald break; 137*56042629SMatthias Ringwald } 138*56042629SMatthias Ringwald case 'P': // 16 byte PIN code or link key 139*56042629SMatthias Ringwald ptr = va_arg(argptr, uint8_t *); 140*56042629SMatthias Ringwald memcpy(&hci_cmd_buffer[pos], ptr, 16); 141*56042629SMatthias Ringwald pos += 16; 142*56042629SMatthias Ringwald break; 143*56042629SMatthias Ringwald #ifdef HAVE_BLE 144*56042629SMatthias Ringwald case 'A': // 31 bytes advertising data 145*56042629SMatthias Ringwald ptr = va_arg(argptr, uint8_t *); 146*56042629SMatthias Ringwald memcpy(&hci_cmd_buffer[pos], ptr, 31); 147*56042629SMatthias Ringwald pos += 31; 148*56042629SMatthias Ringwald break; 149*56042629SMatthias Ringwald #endif 150*56042629SMatthias Ringwald #ifdef HAVE_SDP 151*56042629SMatthias Ringwald case 'S': { // Service Record (Data Element Sequence) 152*56042629SMatthias Ringwald ptr = va_arg(argptr, uint8_t *); 153*56042629SMatthias Ringwald uint16_t len = de_get_len(ptr); 154*56042629SMatthias Ringwald memcpy(&hci_cmd_buffer[pos], ptr, len); 155*56042629SMatthias Ringwald pos += len; 156*56042629SMatthias Ringwald break; 157*56042629SMatthias Ringwald } 158*56042629SMatthias Ringwald #endif 159*56042629SMatthias Ringwald default: 160*56042629SMatthias Ringwald break; 161*56042629SMatthias Ringwald } 162*56042629SMatthias Ringwald format++; 163*56042629SMatthias Ringwald }; 164*56042629SMatthias Ringwald hci_cmd_buffer[2] = pos - 3; 165*56042629SMatthias Ringwald return pos; 166*56042629SMatthias Ringwald } 167*56042629SMatthias Ringwald 168*56042629SMatthias Ringwald /** 169*56042629SMatthias Ringwald * construct HCI Command based on template 170*56042629SMatthias Ringwald * 171*56042629SMatthias Ringwald * mainly calls hci_cmd_create_from_template 172*56042629SMatthias Ringwald */ 173*56042629SMatthias Ringwald uint16_t hci_create_cmd(uint8_t *hci_cmd_buffer, hci_cmd_t *cmd, ...){ 174*56042629SMatthias Ringwald va_list argptr; 175*56042629SMatthias Ringwald va_start(argptr, cmd); 176*56042629SMatthias Ringwald uint16_t len = hci_cmd_create_from_template(hci_cmd_buffer, cmd, argptr); 177*56042629SMatthias Ringwald va_end(argptr); 178*56042629SMatthias Ringwald return len; 179*56042629SMatthias Ringwald } 180*56042629SMatthias Ringwald 181*56042629SMatthias Ringwald 182*56042629SMatthias Ringwald /** 183*56042629SMatthias Ringwald * Link Control Commands 184*56042629SMatthias Ringwald */ 185*56042629SMatthias Ringwald 186*56042629SMatthias Ringwald /** 187*56042629SMatthias Ringwald * @param lap 188*56042629SMatthias Ringwald * @param inquiry_length 189*56042629SMatthias Ringwald * @param num_responses 190*56042629SMatthias Ringwald */ 191*56042629SMatthias Ringwald const hci_cmd_t hci_inquiry = { 192*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x01), "311" 193*56042629SMatthias Ringwald }; 194*56042629SMatthias Ringwald 195*56042629SMatthias Ringwald /** 196*56042629SMatthias Ringwald */ 197*56042629SMatthias Ringwald const hci_cmd_t hci_inquiry_cancel = { 198*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x02), "" 199*56042629SMatthias Ringwald }; 200*56042629SMatthias Ringwald 201*56042629SMatthias Ringwald /** 202*56042629SMatthias Ringwald * @param bd_addr 203*56042629SMatthias Ringwald * @param packet_type 204*56042629SMatthias Ringwald * @param page_scan_repetition_mode 205*56042629SMatthias Ringwald * @param reserved 206*56042629SMatthias Ringwald * @param clock_offset 207*56042629SMatthias Ringwald * @param allow_role_switch 208*56042629SMatthias Ringwald */ 209*56042629SMatthias Ringwald const hci_cmd_t hci_create_connection = { 210*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x05), "B21121" 211*56042629SMatthias Ringwald }; 212*56042629SMatthias Ringwald 213*56042629SMatthias Ringwald /** 214*56042629SMatthias Ringwald * @param handle 215*56042629SMatthias Ringwald * @param reason (0x05, 0x13-0x15, 0x1a, 0x29, see Errors Codes in BT Spec Part D) 216*56042629SMatthias Ringwald */ 217*56042629SMatthias Ringwald const hci_cmd_t hci_disconnect = { 218*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x06), "H1" 219*56042629SMatthias Ringwald }; 220*56042629SMatthias Ringwald 221*56042629SMatthias Ringwald /** 222*56042629SMatthias Ringwald * @param bd_addr 223*56042629SMatthias Ringwald */ 224*56042629SMatthias Ringwald const hci_cmd_t hci_create_connection_cancel = { 225*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x08), "B" 226*56042629SMatthias Ringwald }; 227*56042629SMatthias Ringwald 228*56042629SMatthias Ringwald /** 229*56042629SMatthias Ringwald * @param bd_addr 230*56042629SMatthias Ringwald * @param role (become master, stay slave) 231*56042629SMatthias Ringwald */ 232*56042629SMatthias Ringwald const hci_cmd_t hci_accept_connection_request = { 233*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x09), "B1" 234*56042629SMatthias Ringwald }; 235*56042629SMatthias Ringwald 236*56042629SMatthias Ringwald /** 237*56042629SMatthias Ringwald * @param bd_addr 238*56042629SMatthias Ringwald * @param reason (e.g. CONNECTION REJECTED DUE TO LIMITED RESOURCES (0x0d)) 239*56042629SMatthias Ringwald */ 240*56042629SMatthias Ringwald const hci_cmd_t hci_reject_connection_request = { 241*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x0a), "B1" 242*56042629SMatthias Ringwald }; 243*56042629SMatthias Ringwald 244*56042629SMatthias Ringwald /** 245*56042629SMatthias Ringwald * @param bd_addr 246*56042629SMatthias Ringwald * @param link_key 247*56042629SMatthias Ringwald */ 248*56042629SMatthias Ringwald const hci_cmd_t hci_link_key_request_reply = { 249*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x0b), "BP" 250*56042629SMatthias Ringwald }; 251*56042629SMatthias Ringwald 252*56042629SMatthias Ringwald /** 253*56042629SMatthias Ringwald * @param bd_addr 254*56042629SMatthias Ringwald */ 255*56042629SMatthias Ringwald const hci_cmd_t hci_link_key_request_negative_reply = { 256*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x0c), "B" 257*56042629SMatthias Ringwald }; 258*56042629SMatthias Ringwald 259*56042629SMatthias Ringwald /** 260*56042629SMatthias Ringwald * @param bd_addr 261*56042629SMatthias Ringwald * @param pin_length 262*56042629SMatthias Ringwald * @param pin (c-string) 263*56042629SMatthias Ringwald */ 264*56042629SMatthias Ringwald const hci_cmd_t hci_pin_code_request_reply = { 265*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x0d), "B1P" 266*56042629SMatthias Ringwald }; 267*56042629SMatthias Ringwald 268*56042629SMatthias Ringwald /** 269*56042629SMatthias Ringwald * @param bd_addr 270*56042629SMatthias Ringwald */ 271*56042629SMatthias Ringwald const hci_cmd_t hci_pin_code_request_negative_reply = { 272*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x0e), "B" 273*56042629SMatthias Ringwald }; 274*56042629SMatthias Ringwald 275*56042629SMatthias Ringwald /** 276*56042629SMatthias Ringwald * @param handle 277*56042629SMatthias Ringwald * @param packet_type 278*56042629SMatthias Ringwald */ 279*56042629SMatthias Ringwald const hci_cmd_t hci_change_connection_packet_type = { 280*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x0f), "H2" 281*56042629SMatthias Ringwald }; 282*56042629SMatthias Ringwald 283*56042629SMatthias Ringwald /** 284*56042629SMatthias Ringwald * @param handle 285*56042629SMatthias Ringwald */ 286*56042629SMatthias Ringwald const hci_cmd_t hci_authentication_requested = { 287*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x11), "H" 288*56042629SMatthias Ringwald }; 289*56042629SMatthias Ringwald 290*56042629SMatthias Ringwald /** 291*56042629SMatthias Ringwald * @param handle 292*56042629SMatthias Ringwald * @param encryption_enable 293*56042629SMatthias Ringwald */ 294*56042629SMatthias Ringwald const hci_cmd_t hci_set_connection_encryption = { 295*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x13), "H1" 296*56042629SMatthias Ringwald }; 297*56042629SMatthias Ringwald 298*56042629SMatthias Ringwald /** 299*56042629SMatthias Ringwald * @param handle 300*56042629SMatthias Ringwald */ 301*56042629SMatthias Ringwald const hci_cmd_t hci_change_connection_link_key = { 302*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x15), "H" 303*56042629SMatthias Ringwald }; 304*56042629SMatthias Ringwald 305*56042629SMatthias Ringwald /** 306*56042629SMatthias Ringwald * @param bd_addr 307*56042629SMatthias Ringwald * @param page_scan_repetition_mode 308*56042629SMatthias Ringwald * @param reserved 309*56042629SMatthias Ringwald * @param clock_offset 310*56042629SMatthias Ringwald */ 311*56042629SMatthias Ringwald const hci_cmd_t hci_remote_name_request = { 312*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x19), "B112" 313*56042629SMatthias Ringwald }; 314*56042629SMatthias Ringwald 315*56042629SMatthias Ringwald 316*56042629SMatthias Ringwald /** 317*56042629SMatthias Ringwald * @param bd_addr 318*56042629SMatthias Ringwald */ 319*56042629SMatthias Ringwald const hci_cmd_t hci_remote_name_request_cancel = { 320*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x1A), "B" 321*56042629SMatthias Ringwald }; 322*56042629SMatthias Ringwald 323*56042629SMatthias Ringwald /** 324*56042629SMatthias Ringwald * @param handle 325*56042629SMatthias Ringwald */ 326*56042629SMatthias Ringwald const hci_cmd_t hci_read_remote_supported_features_command = { 327*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x1B), "H" 328*56042629SMatthias Ringwald }; 329*56042629SMatthias Ringwald 330*56042629SMatthias Ringwald /** 331*56042629SMatthias Ringwald * @param handle 332*56042629SMatthias Ringwald * @param transmit_bandwidth 8000(64kbps) 333*56042629SMatthias Ringwald * @param receive_bandwidth 8000(64kbps) 334*56042629SMatthias Ringwald * @param max_latency >= 7ms for eSCO, 0xFFFF do not care 335*56042629SMatthias Ringwald * @param voice_settings e.g. CVSD, Input Coding: Linear, Input Data Format: 2’s complement, data 16bit: 00011000000 == 0x60 336*56042629SMatthias Ringwald * @param retransmission_effort e.g. 0xFF do not care 337*56042629SMatthias Ringwald * @param packet_type at least EV3 for eSCO 338*56042629SMatthias Ringwald */ 339*56042629SMatthias Ringwald const hci_cmd_t hci_setup_synchronous_connection = { 340*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x0028), "H442212" 341*56042629SMatthias Ringwald }; 342*56042629SMatthias Ringwald 343*56042629SMatthias Ringwald /** 344*56042629SMatthias Ringwald * @param bd_addr 345*56042629SMatthias Ringwald * @param transmit_bandwidth 346*56042629SMatthias Ringwald * @param receive_bandwidth 347*56042629SMatthias Ringwald * @param max_latency 348*56042629SMatthias Ringwald * @param voice_settings 349*56042629SMatthias Ringwald * @param retransmission_effort 350*56042629SMatthias Ringwald * @param packet_type 351*56042629SMatthias Ringwald */ 352*56042629SMatthias Ringwald const hci_cmd_t hci_accept_synchronous_connection = { 353*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x0029), "B442212" 354*56042629SMatthias Ringwald }; 355*56042629SMatthias Ringwald 356*56042629SMatthias Ringwald /** 357*56042629SMatthias Ringwald * @param bd_addr 358*56042629SMatthias Ringwald * @param IO_capability 359*56042629SMatthias Ringwald * @param OOB_data_present 360*56042629SMatthias Ringwald * @param authentication_requirements 361*56042629SMatthias Ringwald */ 362*56042629SMatthias Ringwald const hci_cmd_t hci_io_capability_request_reply = { 363*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x2b), "B111" 364*56042629SMatthias Ringwald }; 365*56042629SMatthias Ringwald 366*56042629SMatthias Ringwald /** 367*56042629SMatthias Ringwald * @param bd_addr 368*56042629SMatthias Ringwald */ 369*56042629SMatthias Ringwald const hci_cmd_t hci_user_confirmation_request_reply = { 370*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x2c), "B" 371*56042629SMatthias Ringwald }; 372*56042629SMatthias Ringwald 373*56042629SMatthias Ringwald /** 374*56042629SMatthias Ringwald * @param bd_addr 375*56042629SMatthias Ringwald */ 376*56042629SMatthias Ringwald const hci_cmd_t hci_user_confirmation_request_negative_reply = { 377*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x2d), "B" 378*56042629SMatthias Ringwald }; 379*56042629SMatthias Ringwald 380*56042629SMatthias Ringwald /** 381*56042629SMatthias Ringwald * @param bd_addr 382*56042629SMatthias Ringwald * @param numeric_value 383*56042629SMatthias Ringwald */ 384*56042629SMatthias Ringwald const hci_cmd_t hci_user_passkey_request_reply = { 385*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x2e), "B4" 386*56042629SMatthias Ringwald }; 387*56042629SMatthias Ringwald 388*56042629SMatthias Ringwald /** 389*56042629SMatthias Ringwald * @param bd_addr 390*56042629SMatthias Ringwald */ 391*56042629SMatthias Ringwald const hci_cmd_t hci_user_passkey_request_negative_reply = { 392*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x2f), "B" 393*56042629SMatthias Ringwald }; 394*56042629SMatthias Ringwald 395*56042629SMatthias Ringwald /** 396*56042629SMatthias Ringwald * @param bd_addr 397*56042629SMatthias Ringwald */ 398*56042629SMatthias Ringwald const hci_cmd_t hci_remote_oob_data_request_negative_reply = { 399*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x33), "B" 400*56042629SMatthias Ringwald }; 401*56042629SMatthias Ringwald 402*56042629SMatthias Ringwald /** 403*56042629SMatthias Ringwald * @param bd_addr 404*56042629SMatthias Ringwald * @param reason (Part D, Error codes) 405*56042629SMatthias Ringwald */ 406*56042629SMatthias Ringwald const hci_cmd_t hci_io_capability_request_negative_reply = { 407*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x34), "B1" 408*56042629SMatthias Ringwald }; 409*56042629SMatthias Ringwald 410*56042629SMatthias Ringwald /** 411*56042629SMatthias Ringwald * @param handle 412*56042629SMatthias Ringwald * @param transmit_bandwidth 413*56042629SMatthias Ringwald * @param receive_bandwidth 414*56042629SMatthias Ringwald * @param transmit_coding_format_type 415*56042629SMatthias Ringwald * @param transmit_coding_format_company 416*56042629SMatthias Ringwald * @param transmit_coding_format_codec 417*56042629SMatthias Ringwald * @param receive_coding_format_type 418*56042629SMatthias Ringwald * @param receive_coding_format_company 419*56042629SMatthias Ringwald * @param receive_coding_format_codec 420*56042629SMatthias Ringwald * @param transmit_coding_frame_size 421*56042629SMatthias Ringwald * @param receive_coding_frame_size 422*56042629SMatthias Ringwald * @param input_bandwidth 423*56042629SMatthias Ringwald * @param output_bandwidth 424*56042629SMatthias Ringwald * @param input_coding_format_type 425*56042629SMatthias Ringwald * @param input_coding_format_company 426*56042629SMatthias Ringwald * @param input_coding_format_codec 427*56042629SMatthias Ringwald * @param output_coding_format_type 428*56042629SMatthias Ringwald * @param output_coding_format_company 429*56042629SMatthias Ringwald * @param output_coding_format_codec 430*56042629SMatthias Ringwald * @param input_coded_data_size 431*56042629SMatthias Ringwald * @param outupt_coded_data_size 432*56042629SMatthias Ringwald * @param input_pcm_data_format 433*56042629SMatthias Ringwald * @param output_pcm_data_format 434*56042629SMatthias Ringwald * @param input_pcm_sample_payload_msb_position 435*56042629SMatthias Ringwald * @param output_pcm_sample_payload_msb_position 436*56042629SMatthias Ringwald * @param input_data_path 437*56042629SMatthias Ringwald * @param output_data_path 438*56042629SMatthias Ringwald * @param input_transport_unit_size 439*56042629SMatthias Ringwald * @param output_transport_unit_size 440*56042629SMatthias Ringwald * @param max_latency 441*56042629SMatthias Ringwald * @param packet_type 442*56042629SMatthias Ringwald * @param retransmission_effort 443*56042629SMatthias Ringwald */ 444*56042629SMatthias Ringwald const hci_cmd_t hci_enhanced_setup_synchronous_connection = { 445*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x3d), "H4412212222441221222211111111221" 446*56042629SMatthias Ringwald }; 447*56042629SMatthias Ringwald 448*56042629SMatthias Ringwald /** 449*56042629SMatthias Ringwald * @param bd_addr 450*56042629SMatthias Ringwald * @param transmit_bandwidth 451*56042629SMatthias Ringwald * @param receive_bandwidth 452*56042629SMatthias Ringwald * @param transmit_coding_format_type 453*56042629SMatthias Ringwald * @param transmit_coding_format_company 454*56042629SMatthias Ringwald * @param transmit_coding_format_codec 455*56042629SMatthias Ringwald * @param receive_coding_format_type 456*56042629SMatthias Ringwald * @param receive_coding_format_company 457*56042629SMatthias Ringwald * @param receive_coding_format_codec 458*56042629SMatthias Ringwald * @param transmit_coding_frame_size 459*56042629SMatthias Ringwald * @param receive_coding_frame_size 460*56042629SMatthias Ringwald * @param input_bandwidth 461*56042629SMatthias Ringwald * @param output_bandwidth 462*56042629SMatthias Ringwald * @param input_coding_format_type 463*56042629SMatthias Ringwald * @param input_coding_format_company 464*56042629SMatthias Ringwald * @param input_coding_format_codec 465*56042629SMatthias Ringwald * @param output_coding_format_type 466*56042629SMatthias Ringwald * @param output_coding_format_company 467*56042629SMatthias Ringwald * @param output_coding_format_codec 468*56042629SMatthias Ringwald * @param input_coded_data_size 469*56042629SMatthias Ringwald * @param outupt_coded_data_size 470*56042629SMatthias Ringwald * @param input_pcm_data_format 471*56042629SMatthias Ringwald * @param output_pcm_data_format 472*56042629SMatthias Ringwald * @param input_pcm_sample_payload_msb_position 473*56042629SMatthias Ringwald * @param output_pcm_sample_payload_msb_position 474*56042629SMatthias Ringwald * @param input_data_path 475*56042629SMatthias Ringwald * @param output_data_path 476*56042629SMatthias Ringwald * @param input_transport_unit_size 477*56042629SMatthias Ringwald * @param output_transport_unit_size 478*56042629SMatthias Ringwald * @param max_latency 479*56042629SMatthias Ringwald * @param packet_type 480*56042629SMatthias Ringwald * @param retransmission_effort 481*56042629SMatthias Ringwald */ 482*56042629SMatthias Ringwald const hci_cmd_t hci_enhanced_accept_synchronous_connection = { 483*56042629SMatthias Ringwald OPCODE(OGF_LINK_CONTROL, 0x3e), "B4412212222441221222211111111221" 484*56042629SMatthias Ringwald }; 485*56042629SMatthias Ringwald 486*56042629SMatthias Ringwald /** 487*56042629SMatthias Ringwald * Link Policy Commands 488*56042629SMatthias Ringwald */ 489*56042629SMatthias Ringwald 490*56042629SMatthias Ringwald /** 491*56042629SMatthias Ringwald * @param handle 492*56042629SMatthias Ringwald * @param sniff_max_interval 493*56042629SMatthias Ringwald * @param sniff_min_interval 494*56042629SMatthias Ringwald * @param sniff_attempt 495*56042629SMatthias Ringwald * @param sniff_timeout 496*56042629SMatthias Ringwald */ 497*56042629SMatthias Ringwald const hci_cmd_t hci_sniff_mode = { 498*56042629SMatthias Ringwald OPCODE(OGF_LINK_POLICY, 0x03), "H2222" 499*56042629SMatthias Ringwald }; 500*56042629SMatthias Ringwald 501*56042629SMatthias Ringwald /** 502*56042629SMatthias Ringwald * @param handle 503*56042629SMatthias Ringwald * @param flags 504*56042629SMatthias Ringwald * @param service_type 505*56042629SMatthias Ringwald * @param token_rate (bytes/s) 506*56042629SMatthias Ringwald * @param peak_bandwith (bytes/s) 507*56042629SMatthias Ringwald * @param latency (us) 508*56042629SMatthias Ringwald * @param delay_variation (us) 509*56042629SMatthias Ringwald */ 510*56042629SMatthias Ringwald const hci_cmd_t hci_qos_setup = { 511*56042629SMatthias Ringwald OPCODE(OGF_LINK_POLICY, 0x07), "H114444" 512*56042629SMatthias Ringwald }; 513*56042629SMatthias Ringwald 514*56042629SMatthias Ringwald /** 515*56042629SMatthias Ringwald * @param handle 516*56042629SMatthias Ringwald */ 517*56042629SMatthias Ringwald const hci_cmd_t hci_role_discovery = { 518*56042629SMatthias Ringwald OPCODE(OGF_LINK_POLICY, 0x09), "H" 519*56042629SMatthias Ringwald }; 520*56042629SMatthias Ringwald 521*56042629SMatthias Ringwald /** 522*56042629SMatthias Ringwald * @param bd_addr 523*56042629SMatthias Ringwald * @param role (0=master,1=slave) 524*56042629SMatthias Ringwald */ 525*56042629SMatthias Ringwald const hci_cmd_t hci_switch_role_command= { 526*56042629SMatthias Ringwald OPCODE(OGF_LINK_POLICY, 0x0b), "B1" 527*56042629SMatthias Ringwald }; 528*56042629SMatthias Ringwald 529*56042629SMatthias Ringwald /** 530*56042629SMatthias Ringwald * @param handle 531*56042629SMatthias Ringwald */ 532*56042629SMatthias Ringwald const hci_cmd_t hci_read_link_policy_settings = { 533*56042629SMatthias Ringwald OPCODE(OGF_LINK_POLICY, 0x0c), "H" 534*56042629SMatthias Ringwald }; 535*56042629SMatthias Ringwald 536*56042629SMatthias Ringwald /** 537*56042629SMatthias Ringwald * @param handle 538*56042629SMatthias Ringwald * @param settings 539*56042629SMatthias Ringwald */ 540*56042629SMatthias Ringwald const hci_cmd_t hci_write_link_policy_settings = { 541*56042629SMatthias Ringwald OPCODE(OGF_LINK_POLICY, 0x0d), "H2" 542*56042629SMatthias Ringwald }; 543*56042629SMatthias Ringwald 544*56042629SMatthias Ringwald 545*56042629SMatthias Ringwald /** 546*56042629SMatthias Ringwald * Controller & Baseband Commands 547*56042629SMatthias Ringwald */ 548*56042629SMatthias Ringwald 549*56042629SMatthias Ringwald /** 550*56042629SMatthias Ringwald * @param event_mask_lover_octets 551*56042629SMatthias Ringwald * @param event_mask_higher_octets 552*56042629SMatthias Ringwald */ 553*56042629SMatthias Ringwald const hci_cmd_t hci_set_event_mask = { 554*56042629SMatthias Ringwald OPCODE(OGF_CONTROLLER_BASEBAND, 0x01), "44" 555*56042629SMatthias Ringwald }; 556*56042629SMatthias Ringwald 557*56042629SMatthias Ringwald /** 558*56042629SMatthias Ringwald */ 559*56042629SMatthias Ringwald const hci_cmd_t hci_reset = { 560*56042629SMatthias Ringwald OPCODE(OGF_CONTROLLER_BASEBAND, 0x03), "" 561*56042629SMatthias Ringwald }; 562*56042629SMatthias Ringwald 563*56042629SMatthias Ringwald /** 564*56042629SMatthias Ringwald * @param bd_addr 565*56042629SMatthias Ringwald * @param delete_all_flags 566*56042629SMatthias Ringwald */ 567*56042629SMatthias Ringwald const hci_cmd_t hci_delete_stored_link_key = { 568*56042629SMatthias Ringwald OPCODE(OGF_CONTROLLER_BASEBAND, 0x12), "B1" 569*56042629SMatthias Ringwald }; 570*56042629SMatthias Ringwald 571*56042629SMatthias Ringwald /** 572*56042629SMatthias Ringwald * @param local_name (UTF-8, Null Terminated, max 248 octets) 573*56042629SMatthias Ringwald */ 574*56042629SMatthias Ringwald const hci_cmd_t hci_write_local_name = { 575*56042629SMatthias Ringwald OPCODE(OGF_CONTROLLER_BASEBAND, 0x13), "N" 576*56042629SMatthias Ringwald }; 577*56042629SMatthias Ringwald 578*56042629SMatthias Ringwald /** 579*56042629SMatthias Ringwald * @param page_timeout (* 0.625 ms) 580*56042629SMatthias Ringwald */ 581*56042629SMatthias Ringwald const hci_cmd_t hci_write_page_timeout = { 582*56042629SMatthias Ringwald OPCODE(OGF_CONTROLLER_BASEBAND, 0x18), "2" 583*56042629SMatthias Ringwald }; 584*56042629SMatthias Ringwald 585*56042629SMatthias Ringwald /** 586*56042629SMatthias Ringwald * @param scan_enable (no, inq, page, inq+page) 587*56042629SMatthias Ringwald */ 588*56042629SMatthias Ringwald const hci_cmd_t hci_write_scan_enable = { 589*56042629SMatthias Ringwald OPCODE(OGF_CONTROLLER_BASEBAND, 0x1A), "1" 590*56042629SMatthias Ringwald }; 591*56042629SMatthias Ringwald 592*56042629SMatthias Ringwald /** 593*56042629SMatthias Ringwald * @param authentication_enable 594*56042629SMatthias Ringwald */ 595*56042629SMatthias Ringwald const hci_cmd_t hci_write_authentication_enable = { 596*56042629SMatthias Ringwald OPCODE(OGF_CONTROLLER_BASEBAND, 0x20), "1" 597*56042629SMatthias Ringwald }; 598*56042629SMatthias Ringwald 599*56042629SMatthias Ringwald /** 600*56042629SMatthias Ringwald * @param class_of_device 601*56042629SMatthias Ringwald */ 602*56042629SMatthias Ringwald const hci_cmd_t hci_write_class_of_device = { 603*56042629SMatthias Ringwald OPCODE(OGF_CONTROLLER_BASEBAND, 0x24), "3" 604*56042629SMatthias Ringwald }; 605*56042629SMatthias Ringwald 606*56042629SMatthias Ringwald /** 607*56042629SMatthias Ringwald */ 608*56042629SMatthias Ringwald const hci_cmd_t hci_read_num_broadcast_retransmissions = { 609*56042629SMatthias Ringwald OPCODE(OGF_CONTROLLER_BASEBAND, 0x29), "" 610*56042629SMatthias Ringwald }; 611*56042629SMatthias Ringwald 612*56042629SMatthias Ringwald /** 613*56042629SMatthias Ringwald * @param num_broadcast_retransmissions (e.g. 0 for a single broadcast) 614*56042629SMatthias Ringwald */ 615*56042629SMatthias Ringwald const hci_cmd_t hci_write_num_broadcast_retransmissions = { 616*56042629SMatthias Ringwald OPCODE(OGF_CONTROLLER_BASEBAND, 0x2a), "1" 617*56042629SMatthias Ringwald }; 618*56042629SMatthias Ringwald 619*56042629SMatthias Ringwald /** 620*56042629SMatthias Ringwald * @param synchronous_flow_control_enable - if yes, num completed packet everts are sent for SCO packets 621*56042629SMatthias Ringwald */ 622*56042629SMatthias Ringwald const hci_cmd_t hci_write_synchronous_flow_control_enable = { 623*56042629SMatthias Ringwald OPCODE(OGF_CONTROLLER_BASEBAND, 0x2f), "1" 624*56042629SMatthias Ringwald }; 625*56042629SMatthias Ringwald 626*56042629SMatthias Ringwald /** 627*56042629SMatthias Ringwald * @param host_acl_data_packet_length 628*56042629SMatthias Ringwald * @param host_synchronous_data_packet_length 629*56042629SMatthias Ringwald * @param host_total_num_acl_data_packets 630*56042629SMatthias Ringwald * @param host_total_num_synchronous_data_packets 631*56042629SMatthias Ringwald */ 632*56042629SMatthias Ringwald const hci_cmd_t hci_host_buffer_size = { 633*56042629SMatthias Ringwald OPCODE(OGF_CONTROLLER_BASEBAND, 0x33), "2122" 634*56042629SMatthias Ringwald }; 635*56042629SMatthias Ringwald 636*56042629SMatthias Ringwald /** 637*56042629SMatthias Ringwald * @param handle 638*56042629SMatthias Ringwald */ 639*56042629SMatthias Ringwald const hci_cmd_t hci_read_link_supervision_timeout = { 640*56042629SMatthias Ringwald OPCODE(OGF_CONTROLLER_BASEBAND, 0x36), "H" 641*56042629SMatthias Ringwald }; 642*56042629SMatthias Ringwald 643*56042629SMatthias Ringwald /** 644*56042629SMatthias Ringwald * @param handle 645*56042629SMatthias Ringwald * @param timeout (0x0001 - 0xFFFF Time -> Range: 0.625ms - 40.9 sec) 646*56042629SMatthias Ringwald */ 647*56042629SMatthias Ringwald const hci_cmd_t hci_write_link_supervision_timeout = { 648*56042629SMatthias Ringwald OPCODE(OGF_CONTROLLER_BASEBAND, 0x37), "H2" 649*56042629SMatthias Ringwald }; 650*56042629SMatthias Ringwald 651*56042629SMatthias Ringwald /** 652*56042629SMatthias Ringwald * @param inquiry_mode (0x00 = standard, 0x01 = with RSSI, 0x02 = extended) 653*56042629SMatthias Ringwald */ 654*56042629SMatthias Ringwald const hci_cmd_t hci_write_inquiry_mode = { 655*56042629SMatthias Ringwald OPCODE(OGF_CONTROLLER_BASEBAND, 0x45), "1" 656*56042629SMatthias Ringwald }; 657*56042629SMatthias Ringwald 658*56042629SMatthias Ringwald /** 659*56042629SMatthias Ringwald * @param fec_required 660*56042629SMatthias Ringwald * @param exstended_inquiry_response 661*56042629SMatthias Ringwald */ 662*56042629SMatthias Ringwald const hci_cmd_t hci_write_extended_inquiry_response = { 663*56042629SMatthias Ringwald OPCODE(OGF_CONTROLLER_BASEBAND, 0x52), "1E" 664*56042629SMatthias Ringwald }; 665*56042629SMatthias Ringwald 666*56042629SMatthias Ringwald /** 667*56042629SMatthias Ringwald * @param mode (0 = off, 1 = on) 668*56042629SMatthias Ringwald */ 669*56042629SMatthias Ringwald const hci_cmd_t hci_write_simple_pairing_mode = { 670*56042629SMatthias Ringwald OPCODE(OGF_CONTROLLER_BASEBAND, 0x56), "1" 671*56042629SMatthias Ringwald }; 672*56042629SMatthias Ringwald 673*56042629SMatthias Ringwald /** 674*56042629SMatthias Ringwald */ 675*56042629SMatthias Ringwald const hci_cmd_t hci_read_le_host_supported = { 676*56042629SMatthias Ringwald OPCODE(OGF_CONTROLLER_BASEBAND, 0x6c), "" 677*56042629SMatthias Ringwald // return: status, le supported host, simultaneous le host 678*56042629SMatthias Ringwald }; 679*56042629SMatthias Ringwald 680*56042629SMatthias Ringwald /** 681*56042629SMatthias Ringwald * @param le_supported_host 682*56042629SMatthias Ringwald * @param simultaneous_le_host 683*56042629SMatthias Ringwald */ 684*56042629SMatthias Ringwald const hci_cmd_t hci_write_le_host_supported = { 685*56042629SMatthias Ringwald OPCODE(OGF_CONTROLLER_BASEBAND, 0x6d), "11" 686*56042629SMatthias Ringwald // return: status 687*56042629SMatthias Ringwald }; 688*56042629SMatthias Ringwald 689*56042629SMatthias Ringwald /** 690*56042629SMatthias Ringwald * Testing Commands 691*56042629SMatthias Ringwald */ 692*56042629SMatthias Ringwald 693*56042629SMatthias Ringwald 694*56042629SMatthias Ringwald /** 695*56042629SMatthias Ringwald */ 696*56042629SMatthias Ringwald const hci_cmd_t hci_read_loopback_mode = { 697*56042629SMatthias Ringwald OPCODE(OGF_TESTING, 0x01), "" 698*56042629SMatthias Ringwald // return: status, loopback mode (0 = off, 1 = local loopback, 2 = remote loopback) 699*56042629SMatthias Ringwald }; 700*56042629SMatthias Ringwald 701*56042629SMatthias Ringwald /** 702*56042629SMatthias Ringwald * @param loopback_mode 703*56042629SMatthias Ringwald */ 704*56042629SMatthias Ringwald const hci_cmd_t hci_write_loopback_mode = { 705*56042629SMatthias Ringwald OPCODE(OGF_TESTING, 0x02), "1" 706*56042629SMatthias Ringwald // return: status 707*56042629SMatthias Ringwald }; 708*56042629SMatthias Ringwald 709*56042629SMatthias Ringwald 710*56042629SMatthias Ringwald /** 711*56042629SMatthias Ringwald * Informational Parameters 712*56042629SMatthias Ringwald */ 713*56042629SMatthias Ringwald 714*56042629SMatthias Ringwald const hci_cmd_t hci_read_local_version_information = { 715*56042629SMatthias Ringwald OPCODE(OGF_INFORMATIONAL_PARAMETERS, 0x01), "" 716*56042629SMatthias Ringwald }; 717*56042629SMatthias Ringwald const hci_cmd_t hci_read_local_supported_commands = { 718*56042629SMatthias Ringwald OPCODE(OGF_INFORMATIONAL_PARAMETERS, 0x02), "" 719*56042629SMatthias Ringwald }; 720*56042629SMatthias Ringwald const hci_cmd_t hci_read_local_supported_features = { 721*56042629SMatthias Ringwald OPCODE(OGF_INFORMATIONAL_PARAMETERS, 0x03), "" 722*56042629SMatthias Ringwald }; 723*56042629SMatthias Ringwald const hci_cmd_t hci_read_buffer_size = { 724*56042629SMatthias Ringwald OPCODE(OGF_INFORMATIONAL_PARAMETERS, 0x05), "" 725*56042629SMatthias Ringwald }; 726*56042629SMatthias Ringwald const hci_cmd_t hci_read_bd_addr = { 727*56042629SMatthias Ringwald OPCODE(OGF_INFORMATIONAL_PARAMETERS, 0x09), "" 728*56042629SMatthias Ringwald }; 729*56042629SMatthias Ringwald 730*56042629SMatthias Ringwald /** 731*56042629SMatthias Ringwald * Status Paramters 732*56042629SMatthias Ringwald */ 733*56042629SMatthias Ringwald 734*56042629SMatthias Ringwald /** 735*56042629SMatthias Ringwald * @param handle 736*56042629SMatthias Ringwald */ 737*56042629SMatthias Ringwald const hci_cmd_t hci_read_rssi = { 738*56042629SMatthias Ringwald OPCODE(OGF_STATUS_PARAMETERS, 0x05), "H" 739*56042629SMatthias Ringwald // no params 740*56042629SMatthias Ringwald }; 741*56042629SMatthias Ringwald 742*56042629SMatthias Ringwald 743*56042629SMatthias Ringwald 744*56042629SMatthias Ringwald #ifdef HAVE_BLE 745*56042629SMatthias Ringwald /** 746*56042629SMatthias Ringwald * Low Energy Commands 747*56042629SMatthias Ringwald */ 748*56042629SMatthias Ringwald 749*56042629SMatthias Ringwald /** 750*56042629SMatthias Ringwald * @param event_mask_lower_octets 751*56042629SMatthias Ringwald * @param event_mask_higher_octets 752*56042629SMatthias Ringwald */ 753*56042629SMatthias Ringwald const hci_cmd_t hci_le_set_event_mask = { 754*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x01), "44" 755*56042629SMatthias Ringwald // return: status 756*56042629SMatthias Ringwald }; 757*56042629SMatthias Ringwald 758*56042629SMatthias Ringwald const hci_cmd_t hci_le_read_buffer_size = { 759*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x02), "" 760*56042629SMatthias Ringwald // return: status, le acl data packet len (16), total num le acl data packets(8) 761*56042629SMatthias Ringwald }; 762*56042629SMatthias Ringwald const hci_cmd_t hci_le_read_supported_features = { 763*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x03), "" 764*56042629SMatthias Ringwald // return: LE_Features See [Vol 6] Part B, Section 4.6 765*56042629SMatthias Ringwald }; 766*56042629SMatthias Ringwald 767*56042629SMatthias Ringwald /** 768*56042629SMatthias Ringwald * @param random_bd_addr 769*56042629SMatthias Ringwald */ 770*56042629SMatthias Ringwald const hci_cmd_t hci_le_set_random_address = { 771*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x05), "B" 772*56042629SMatthias Ringwald // return: status 773*56042629SMatthias Ringwald }; 774*56042629SMatthias Ringwald 775*56042629SMatthias Ringwald /** 776*56042629SMatthias Ringwald * @param advertising_interval_min ([0x0020,0x4000], default: 0x0800, unit: 0.625 msec) 777*56042629SMatthias Ringwald * @param advertising_interval_max ([0x0020,0x4000], default: 0x0800, unit: 0.625 msec) 778*56042629SMatthias Ringwald * @param advertising_type (enum from 0: ADV_IND, ADC_DIRECT_IND, ADV_SCAN_IND, ADV_NONCONN_IND) 779*56042629SMatthias Ringwald * @param own_address_type (enum from 0: public device address, random device address) 780*56042629SMatthias Ringwald * @param direct_address_type () 781*56042629SMatthias Ringwald * @param direct_address (public or random address of device to be connecteed) 782*56042629SMatthias Ringwald * @param advertising_channel_map (flags: chan_37(1), chan_38(2), chan_39(4)) 783*56042629SMatthias Ringwald * @param advertising_filter_policy (enum from 0: scan any conn any, scan whitelist, con any, scan any conn whitelist, scan whitelist, con whitelist) 784*56042629SMatthias Ringwald */ 785*56042629SMatthias Ringwald const hci_cmd_t hci_le_set_advertising_parameters = { 786*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x06), "22111B11" 787*56042629SMatthias Ringwald // return: status 788*56042629SMatthias Ringwald }; 789*56042629SMatthias Ringwald 790*56042629SMatthias Ringwald const hci_cmd_t hci_le_read_advertising_channel_tx_power = { 791*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x07), "" 792*56042629SMatthias Ringwald // return: status, level [-20,10] signed int (8), units dBm 793*56042629SMatthias Ringwald }; 794*56042629SMatthias Ringwald 795*56042629SMatthias Ringwald /** 796*56042629SMatthias Ringwald * @param advertising_data_length 797*56042629SMatthias Ringwald * @param advertising_data (31 bytes) 798*56042629SMatthias Ringwald */ 799*56042629SMatthias Ringwald const hci_cmd_t hci_le_set_advertising_data= { 800*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x08), "1A" 801*56042629SMatthias Ringwald // return: status 802*56042629SMatthias Ringwald }; 803*56042629SMatthias Ringwald 804*56042629SMatthias Ringwald /** 805*56042629SMatthias Ringwald * @param scan_response_data_length 806*56042629SMatthias Ringwald * @param scan_response_data (31 bytes) 807*56042629SMatthias Ringwald */ 808*56042629SMatthias Ringwald const hci_cmd_t hci_le_set_scan_response_data= { 809*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x09), "1A" 810*56042629SMatthias Ringwald // return: status 811*56042629SMatthias Ringwald }; 812*56042629SMatthias Ringwald 813*56042629SMatthias Ringwald /** 814*56042629SMatthias Ringwald * @param advertise_enable (off: 0, on: 1) 815*56042629SMatthias Ringwald */ 816*56042629SMatthias Ringwald const hci_cmd_t hci_le_set_advertise_enable = { 817*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x0a), "1" 818*56042629SMatthias Ringwald // return: status 819*56042629SMatthias Ringwald }; 820*56042629SMatthias Ringwald 821*56042629SMatthias Ringwald /** 822*56042629SMatthias Ringwald * @param le_scan_type (passive (0), active (1)) 823*56042629SMatthias Ringwald * @param le_scan_interval ([0x0004,0x4000], unit: 0.625 msec) 824*56042629SMatthias Ringwald * @param le_scan_window ([0x0004,0x4000], unit: 0.625 msec) 825*56042629SMatthias Ringwald * @param own_address_type (public (0), random (1)) 826*56042629SMatthias Ringwald * @param scanning_filter_policy (any (0), only whitelist (1)) 827*56042629SMatthias Ringwald */ 828*56042629SMatthias Ringwald const hci_cmd_t hci_le_set_scan_parameters = { 829*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x0b), "12211" 830*56042629SMatthias Ringwald // return: status 831*56042629SMatthias Ringwald }; 832*56042629SMatthias Ringwald 833*56042629SMatthias Ringwald /** 834*56042629SMatthias Ringwald * @param le_scan_enable (disabled (0), enabled (1)) 835*56042629SMatthias Ringwald * @param filter_duplices (disabled (0), enabled (1)) 836*56042629SMatthias Ringwald */ 837*56042629SMatthias Ringwald const hci_cmd_t hci_le_set_scan_enable = { 838*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x0c), "11" 839*56042629SMatthias Ringwald // return: status 840*56042629SMatthias Ringwald }; 841*56042629SMatthias Ringwald 842*56042629SMatthias Ringwald /** 843*56042629SMatthias Ringwald * @param le_scan_interval ([0x0004, 0x4000], unit: 0.625 msec) 844*56042629SMatthias Ringwald * @param le_scan_window ([0x0004, 0x4000], unit: 0.625 msec) 845*56042629SMatthias Ringwald * @param initiator_filter_policy (peer address type + peer address (0), whitelist (1)) 846*56042629SMatthias Ringwald * @param peer_address_type (public (0), random (1)) 847*56042629SMatthias Ringwald * @param peer_address 848*56042629SMatthias Ringwald * @param own_address_type (public (0), random (1)) 849*56042629SMatthias Ringwald * @param conn_interval_min ([0x0006, 0x0c80], unit: 1.25 msec) 850*56042629SMatthias Ringwald * @param conn_interval_max ([0x0006, 0x0c80], unit: 1.25 msec) 851*56042629SMatthias Ringwald * @param conn_latency (number of connection events [0x0000, 0x01f4]) 852*56042629SMatthias Ringwald * @param supervision_timeout ([0x000a, 0x0c80], unit: 10 msec) 853*56042629SMatthias Ringwald * @param minimum_CE_length ([0x0000, 0xffff], unit: 0.625 msec) 854*56042629SMatthias Ringwald * @param maximum_CE_length ([0x0000, 0xffff], unit: 0.625 msec) 855*56042629SMatthias Ringwald */ 856*56042629SMatthias Ringwald const hci_cmd_t hci_le_create_connection= { 857*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x0d), "2211B1222222" 858*56042629SMatthias Ringwald // return: none -> le create connection complete event 859*56042629SMatthias Ringwald }; 860*56042629SMatthias Ringwald 861*56042629SMatthias Ringwald const hci_cmd_t hci_le_create_connection_cancel = { 862*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x0e), "" 863*56042629SMatthias Ringwald // return: status 864*56042629SMatthias Ringwald }; 865*56042629SMatthias Ringwald 866*56042629SMatthias Ringwald const hci_cmd_t hci_le_read_white_list_size = { 867*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x0f), "" 868*56042629SMatthias Ringwald // return: status, number of entries in controller whitelist 869*56042629SMatthias Ringwald }; 870*56042629SMatthias Ringwald 871*56042629SMatthias Ringwald const hci_cmd_t hci_le_clear_white_list = { 872*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x10), "" 873*56042629SMatthias Ringwald // return: status 874*56042629SMatthias Ringwald }; 875*56042629SMatthias Ringwald 876*56042629SMatthias Ringwald /** 877*56042629SMatthias Ringwald * @param address_type (public (0), random (1)) 878*56042629SMatthias Ringwald * @param bd_addr 879*56042629SMatthias Ringwald */ 880*56042629SMatthias Ringwald const hci_cmd_t hci_le_add_device_to_white_list = { 881*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x11), "1B" 882*56042629SMatthias Ringwald // return: status 883*56042629SMatthias Ringwald }; 884*56042629SMatthias Ringwald 885*56042629SMatthias Ringwald /** 886*56042629SMatthias Ringwald * @param address_type (public (0), random (1)) 887*56042629SMatthias Ringwald * @param bd_addr 888*56042629SMatthias Ringwald */ 889*56042629SMatthias Ringwald const hci_cmd_t hci_le_remove_device_from_white_list = { 890*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x12), "1B" 891*56042629SMatthias Ringwald // return: status 892*56042629SMatthias Ringwald }; 893*56042629SMatthias Ringwald 894*56042629SMatthias Ringwald /** 895*56042629SMatthias Ringwald * @param conn_handle 896*56042629SMatthias Ringwald * @param conn_interval_min ([0x0006,0x0c80], unit: 1.25 msec) 897*56042629SMatthias Ringwald * @param conn_interval_max ([0x0006,0x0c80], unit: 1.25 msec) 898*56042629SMatthias Ringwald * @param conn_latency ([0x0000,0x03e8], number of connection events) 899*56042629SMatthias Ringwald * @param supervision_timeout ([0x000a,0x0c80], unit: 10 msec) 900*56042629SMatthias Ringwald * @param minimum_CE_length ([0x0000,0xffff], unit: 0.625 msec) 901*56042629SMatthias Ringwald * @param maximum_CE_length ([0x0000,0xffff], unit: 0.625 msec) 902*56042629SMatthias Ringwald */ 903*56042629SMatthias Ringwald const hci_cmd_t hci_le_connection_update = { 904*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x13), "H222222" 905*56042629SMatthias Ringwald // return: none -> le connection update complete event 906*56042629SMatthias Ringwald }; 907*56042629SMatthias Ringwald 908*56042629SMatthias Ringwald /** 909*56042629SMatthias Ringwald * @param channel_map_lower_32bits 910*56042629SMatthias Ringwald * @param channel_map_higher_5bits 911*56042629SMatthias Ringwald */ 912*56042629SMatthias Ringwald const hci_cmd_t hci_le_set_host_channel_classification = { 913*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x14), "41" 914*56042629SMatthias Ringwald // return: status 915*56042629SMatthias Ringwald }; 916*56042629SMatthias Ringwald 917*56042629SMatthias Ringwald /** 918*56042629SMatthias Ringwald * @param conn_handle 919*56042629SMatthias Ringwald */ 920*56042629SMatthias Ringwald const hci_cmd_t hci_le_read_channel_map = { 921*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x15), "H" 922*56042629SMatthias Ringwald // return: status, connection handle, channel map (5 bytes, 37 used) 923*56042629SMatthias Ringwald }; 924*56042629SMatthias Ringwald 925*56042629SMatthias Ringwald /** 926*56042629SMatthias Ringwald * @param conn_handle 927*56042629SMatthias Ringwald */ 928*56042629SMatthias Ringwald const hci_cmd_t hci_le_read_remote_used_features = { 929*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x16), "H" 930*56042629SMatthias Ringwald // return: none -> le read remote used features complete event 931*56042629SMatthias Ringwald }; 932*56042629SMatthias Ringwald 933*56042629SMatthias Ringwald /** 934*56042629SMatthias Ringwald * @param key ((128) for AES-128) 935*56042629SMatthias Ringwald * @param plain_text (128) 936*56042629SMatthias Ringwald */ 937*56042629SMatthias Ringwald const hci_cmd_t hci_le_encrypt = { 938*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x17), "PP" 939*56042629SMatthias Ringwald // return: status, encrypted data (128) 940*56042629SMatthias Ringwald }; 941*56042629SMatthias Ringwald 942*56042629SMatthias Ringwald const hci_cmd_t hci_le_rand = { 943*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x18), "" 944*56042629SMatthias Ringwald // return: status, random number (64) 945*56042629SMatthias Ringwald }; 946*56042629SMatthias Ringwald 947*56042629SMatthias Ringwald /** 948*56042629SMatthias Ringwald * @param conn_handle 949*56042629SMatthias Ringwald * @param random_number_lower_32bits 950*56042629SMatthias Ringwald * @param random_number_higher_32bits 951*56042629SMatthias Ringwald * @param encryption_diversifier (16) 952*56042629SMatthias Ringwald * @param long_term_key (128) 953*56042629SMatthias Ringwald */ 954*56042629SMatthias Ringwald const hci_cmd_t hci_le_start_encryption = { 955*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x19), "H442P" 956*56042629SMatthias Ringwald // return: none -> encryption changed or encryption key refresh complete event 957*56042629SMatthias Ringwald }; 958*56042629SMatthias Ringwald 959*56042629SMatthias Ringwald /** 960*56042629SMatthias Ringwald * @param connection_handle 961*56042629SMatthias Ringwald * @param long_term_key (128) 962*56042629SMatthias Ringwald */ 963*56042629SMatthias Ringwald const hci_cmd_t hci_le_long_term_key_request_reply = { 964*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x1a), "HP" 965*56042629SMatthias Ringwald // return: status, connection handle 966*56042629SMatthias Ringwald }; 967*56042629SMatthias Ringwald 968*56042629SMatthias Ringwald /** 969*56042629SMatthias Ringwald * @param conn_handle 970*56042629SMatthias Ringwald */ 971*56042629SMatthias Ringwald const hci_cmd_t hci_le_long_term_key_negative_reply = { 972*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x1b), "H" 973*56042629SMatthias Ringwald // return: status, connection handle 974*56042629SMatthias Ringwald }; 975*56042629SMatthias Ringwald 976*56042629SMatthias Ringwald /** 977*56042629SMatthias Ringwald * @param conn_handle 978*56042629SMatthias Ringwald */ 979*56042629SMatthias Ringwald const hci_cmd_t hci_le_read_supported_states = { 980*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x1c), "H" 981*56042629SMatthias Ringwald // return: status, LE states (64) 982*56042629SMatthias Ringwald }; 983*56042629SMatthias Ringwald 984*56042629SMatthias Ringwald /** 985*56042629SMatthias Ringwald * @param rx_frequency ([0x00 0x27], frequency (MHz): 2420 + N*2) 986*56042629SMatthias Ringwald */ 987*56042629SMatthias Ringwald const hci_cmd_t hci_le_receiver_test = { 988*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x1d), "1" 989*56042629SMatthias Ringwald // return: status 990*56042629SMatthias Ringwald }; 991*56042629SMatthias Ringwald 992*56042629SMatthias Ringwald /** 993*56042629SMatthias Ringwald * @param tx_frequency ([0x00 0x27], frequency (MHz): 2420 + N*2) 994*56042629SMatthias Ringwald * @param test_payload_lengh ([0x00,0x25]) 995*56042629SMatthias Ringwald * @param packet_payload ([0,7] different patterns) 996*56042629SMatthias Ringwald */ 997*56042629SMatthias Ringwald const hci_cmd_t hci_le_transmitter_test = { 998*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x1e), "111" 999*56042629SMatthias Ringwald // return: status 1000*56042629SMatthias Ringwald }; 1001*56042629SMatthias Ringwald 1002*56042629SMatthias Ringwald /** 1003*56042629SMatthias Ringwald * @param end_test_cmd 1004*56042629SMatthias Ringwald */ 1005*56042629SMatthias Ringwald const hci_cmd_t hci_le_test_end = { 1006*56042629SMatthias Ringwald OPCODE(OGF_LE_CONTROLLER, 0x1f), "1" 1007*56042629SMatthias Ringwald // return: status, number of packets (8) 1008*56042629SMatthias Ringwald }; 1009*56042629SMatthias Ringwald #endif 1010