うおーるぼっとをWiiリモコンでコントロールする新しいプログラムです。 以前のものより、Wiiリモコンが早く繋がる様になりました。 It is a program which controls A with the Wii remote. ※ A Bluetooth dongle and a Wii remote control are needed.

Dependencies:   USBHost mbed FATFileSystem mbed-rtos

Committer:
jksoft
Date:
Mon Jun 10 16:01:50 2013 +0000
Revision:
0:fccb789424fc
1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jksoft 0:fccb789424fc 1 /*
jksoft 0:fccb789424fc 2 * Copyright (C) 2009-2012 by Matthias Ringwald
jksoft 0:fccb789424fc 3 *
jksoft 0:fccb789424fc 4 * Redistribution and use in source and binary forms, with or without
jksoft 0:fccb789424fc 5 * modification, are permitted provided that the following conditions
jksoft 0:fccb789424fc 6 * are met:
jksoft 0:fccb789424fc 7 *
jksoft 0:fccb789424fc 8 * 1. Redistributions of source code must retain the above copyright
jksoft 0:fccb789424fc 9 * notice, this list of conditions and the following disclaimer.
jksoft 0:fccb789424fc 10 * 2. Redistributions in binary form must reproduce the above copyright
jksoft 0:fccb789424fc 11 * notice, this list of conditions and the following disclaimer in the
jksoft 0:fccb789424fc 12 * documentation and/or other materials provided with the distribution.
jksoft 0:fccb789424fc 13 * 3. Neither the name of the copyright holders nor the names of
jksoft 0:fccb789424fc 14 * contributors may be used to endorse or promote products derived
jksoft 0:fccb789424fc 15 * from this software without specific prior written permission.
jksoft 0:fccb789424fc 16 * 4. Any redistribution, use, or modification is done solely for
jksoft 0:fccb789424fc 17 * personal benefit and not for any commercial purpose or for
jksoft 0:fccb789424fc 18 * monetary gain.
jksoft 0:fccb789424fc 19 *
jksoft 0:fccb789424fc 20 * THIS SOFTWARE IS PROVIDED BY MATTHIAS RINGWALD AND CONTRIBUTORS
jksoft 0:fccb789424fc 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
jksoft 0:fccb789424fc 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
jksoft 0:fccb789424fc 23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
jksoft 0:fccb789424fc 24 * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
jksoft 0:fccb789424fc 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
jksoft 0:fccb789424fc 26 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
jksoft 0:fccb789424fc 27 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
jksoft 0:fccb789424fc 28 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
jksoft 0:fccb789424fc 29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
jksoft 0:fccb789424fc 30 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
jksoft 0:fccb789424fc 31 * SUCH DAMAGE.
jksoft 0:fccb789424fc 32 *
jksoft 0:fccb789424fc 33 * Please inquire about commercial licensing options at btstack@ringwald.ch
jksoft 0:fccb789424fc 34 *
jksoft 0:fccb789424fc 35 */
jksoft 0:fccb789424fc 36
jksoft 0:fccb789424fc 37 /*
jksoft 0:fccb789424fc 38 * hci_cmds.c
jksoft 0:fccb789424fc 39 *
jksoft 0:fccb789424fc 40 * Created by Matthias Ringwald on 7/23/09.
jksoft 0:fccb789424fc 41 */
jksoft 0:fccb789424fc 42
jksoft 0:fccb789424fc 43 #include <btstack/hci_cmds.h>
jksoft 0:fccb789424fc 44
jksoft 0:fccb789424fc 45 #include <string.h>
jksoft 0:fccb789424fc 46
jksoft 0:fccb789424fc 47 #include <btstack/sdp_util.h>
jksoft 0:fccb789424fc 48 #include "config.h"
jksoft 0:fccb789424fc 49 #include "hci.h"
jksoft 0:fccb789424fc 50
jksoft 0:fccb789424fc 51 // calculate combined ogf/ocf value
jksoft 0:fccb789424fc 52 #define OPCODE(ogf, ocf) (ocf | ogf << 10)
jksoft 0:fccb789424fc 53
jksoft 0:fccb789424fc 54 /**
jksoft 0:fccb789424fc 55 * construct HCI Command based on template
jksoft 0:fccb789424fc 56 *
jksoft 0:fccb789424fc 57 * Format:
jksoft 0:fccb789424fc 58 * 1,2,3,4: one to four byte value
jksoft 0:fccb789424fc 59 * H: HCI connection handle
jksoft 0:fccb789424fc 60 * B: Bluetooth Baseband Address (BD_ADDR)
jksoft 0:fccb789424fc 61 * E: Extended Inquiry Result
jksoft 0:fccb789424fc 62 * N: Name up to 248 chars, \0 terminated
jksoft 0:fccb789424fc 63 * P: 16 byte Pairing code
jksoft 0:fccb789424fc 64 * S: Service Record (Data Element Sequence)
jksoft 0:fccb789424fc 65 */
jksoft 0:fccb789424fc 66 uint16_t hci_create_cmd_internal(uint8_t *hci_cmd_buffer, const hci_cmd_t *cmd, va_list argptr){
jksoft 0:fccb789424fc 67
jksoft 0:fccb789424fc 68 hci_cmd_buffer[0] = cmd->opcode & 0xff;
jksoft 0:fccb789424fc 69 hci_cmd_buffer[1] = cmd->opcode >> 8;
jksoft 0:fccb789424fc 70 int pos = 3;
jksoft 0:fccb789424fc 71
jksoft 0:fccb789424fc 72 const char *format = cmd->format;
jksoft 0:fccb789424fc 73 uint16_t word;
jksoft 0:fccb789424fc 74 uint32_t longword;
jksoft 0:fccb789424fc 75 uint8_t * ptr;
jksoft 0:fccb789424fc 76 while (*format) {
jksoft 0:fccb789424fc 77 switch(*format) {
jksoft 0:fccb789424fc 78 case '1': // 8 bit value
jksoft 0:fccb789424fc 79 case '2': // 16 bit value
jksoft 0:fccb789424fc 80 case 'H': // hci_handle
jksoft 0:fccb789424fc 81 word = va_arg(argptr, int); // minimal va_arg is int: 2 bytes on 8+16 bit CPUs
jksoft 0:fccb789424fc 82 hci_cmd_buffer[pos++] = word & 0xff;
jksoft 0:fccb789424fc 83 if (*format == '2') {
jksoft 0:fccb789424fc 84 hci_cmd_buffer[pos++] = word >> 8;
jksoft 0:fccb789424fc 85 } else if (*format == 'H') {
jksoft 0:fccb789424fc 86 // TODO implement opaque client connection handles
jksoft 0:fccb789424fc 87 // pass module handle for now
jksoft 0:fccb789424fc 88 hci_cmd_buffer[pos++] = word >> 8;
jksoft 0:fccb789424fc 89 }
jksoft 0:fccb789424fc 90 break;
jksoft 0:fccb789424fc 91 case '3':
jksoft 0:fccb789424fc 92 case '4':
jksoft 0:fccb789424fc 93 longword = va_arg(argptr, uint32_t);
jksoft 0:fccb789424fc 94 // longword = va_arg(argptr, int);
jksoft 0:fccb789424fc 95 hci_cmd_buffer[pos++] = longword;
jksoft 0:fccb789424fc 96 hci_cmd_buffer[pos++] = longword >> 8;
jksoft 0:fccb789424fc 97 hci_cmd_buffer[pos++] = longword >> 16;
jksoft 0:fccb789424fc 98 if (*format == '4'){
jksoft 0:fccb789424fc 99 hci_cmd_buffer[pos++] = longword >> 24;
jksoft 0:fccb789424fc 100 }
jksoft 0:fccb789424fc 101 break;
jksoft 0:fccb789424fc 102 case 'B': // bt-addr
jksoft 0:fccb789424fc 103 ptr = va_arg(argptr, uint8_t *);
jksoft 0:fccb789424fc 104 hci_cmd_buffer[pos++] = ptr[5];
jksoft 0:fccb789424fc 105 hci_cmd_buffer[pos++] = ptr[4];
jksoft 0:fccb789424fc 106 hci_cmd_buffer[pos++] = ptr[3];
jksoft 0:fccb789424fc 107 hci_cmd_buffer[pos++] = ptr[2];
jksoft 0:fccb789424fc 108 hci_cmd_buffer[pos++] = ptr[1];
jksoft 0:fccb789424fc 109 hci_cmd_buffer[pos++] = ptr[0];
jksoft 0:fccb789424fc 110 break;
jksoft 0:fccb789424fc 111 case 'E': // Extended Inquiry Information 240 octets
jksoft 0:fccb789424fc 112 ptr = va_arg(argptr, uint8_t *);
jksoft 0:fccb789424fc 113 memcpy(&hci_cmd_buffer[pos], ptr, 240);
jksoft 0:fccb789424fc 114 pos += 240;
jksoft 0:fccb789424fc 115 break;
jksoft 0:fccb789424fc 116 case 'N': { // UTF-8 string, null terminated
jksoft 0:fccb789424fc 117 ptr = va_arg(argptr, uint8_t *);
jksoft 0:fccb789424fc 118 uint16_t len = strlen((const char*) ptr);
jksoft 0:fccb789424fc 119 if (len > 248) {
jksoft 0:fccb789424fc 120 len = 248;
jksoft 0:fccb789424fc 121 }
jksoft 0:fccb789424fc 122 memcpy(&hci_cmd_buffer[pos], ptr, len);
jksoft 0:fccb789424fc 123 if (len < 248) {
jksoft 0:fccb789424fc 124 // fill remaining space with zeroes
jksoft 0:fccb789424fc 125 memset(&hci_cmd_buffer[pos+len], 0, 248-len);
jksoft 0:fccb789424fc 126 }
jksoft 0:fccb789424fc 127 pos += 248;
jksoft 0:fccb789424fc 128 break;
jksoft 0:fccb789424fc 129 }
jksoft 0:fccb789424fc 130 case 'P': // 16 byte PIN code or link key
jksoft 0:fccb789424fc 131 ptr = va_arg(argptr, uint8_t *);
jksoft 0:fccb789424fc 132 memcpy(&hci_cmd_buffer[pos], ptr, 16);
jksoft 0:fccb789424fc 133 pos += 16;
jksoft 0:fccb789424fc 134 break;
jksoft 0:fccb789424fc 135 #ifdef HAVE_BLE
jksoft 0:fccb789424fc 136 case 'A': // 31 bytes advertising data
jksoft 0:fccb789424fc 137 ptr = va_arg(argptr, uint8_t *);
jksoft 0:fccb789424fc 138 memcpy(&hci_cmd_buffer[pos], ptr, 31);
jksoft 0:fccb789424fc 139 pos += 31;
jksoft 0:fccb789424fc 140 break;
jksoft 0:fccb789424fc 141 #endif
jksoft 0:fccb789424fc 142 #ifdef HAVE_SDP
jksoft 0:fccb789424fc 143 case 'S': { // Service Record (Data Element Sequence)
jksoft 0:fccb789424fc 144 ptr = va_arg(argptr, uint8_t *);
jksoft 0:fccb789424fc 145 uint16_t len = de_get_len(ptr);
jksoft 0:fccb789424fc 146 memcpy(&hci_cmd_buffer[pos], ptr, len);
jksoft 0:fccb789424fc 147 pos += len;
jksoft 0:fccb789424fc 148 break;
jksoft 0:fccb789424fc 149 }
jksoft 0:fccb789424fc 150 #endif
jksoft 0:fccb789424fc 151 default:
jksoft 0:fccb789424fc 152 break;
jksoft 0:fccb789424fc 153 }
jksoft 0:fccb789424fc 154 format++;
jksoft 0:fccb789424fc 155 };
jksoft 0:fccb789424fc 156 hci_cmd_buffer[2] = pos - 3;
jksoft 0:fccb789424fc 157 return pos;
jksoft 0:fccb789424fc 158 }
jksoft 0:fccb789424fc 159
jksoft 0:fccb789424fc 160 /**
jksoft 0:fccb789424fc 161 * construct HCI Command based on template
jksoft 0:fccb789424fc 162 *
jksoft 0:fccb789424fc 163 * mainly calls hci_create_cmd_internal
jksoft 0:fccb789424fc 164 */
jksoft 0:fccb789424fc 165 uint16_t hci_create_cmd(uint8_t *hci_cmd_buffer, hci_cmd_t *cmd, ...){
jksoft 0:fccb789424fc 166 va_list argptr;
jksoft 0:fccb789424fc 167 va_start(argptr, cmd);
jksoft 0:fccb789424fc 168 uint16_t len = hci_create_cmd_internal(hci_cmd_buffer, cmd, argptr);
jksoft 0:fccb789424fc 169 va_end(argptr);
jksoft 0:fccb789424fc 170 return len;
jksoft 0:fccb789424fc 171 }
jksoft 0:fccb789424fc 172
jksoft 0:fccb789424fc 173
jksoft 0:fccb789424fc 174 /**
jksoft 0:fccb789424fc 175 * Link Control Commands
jksoft 0:fccb789424fc 176 */
jksoft 0:fccb789424fc 177 const hci_cmd_t hci_inquiry = {
jksoft 0:fccb789424fc 178 OPCODE(OGF_LINK_CONTROL, 0x01), "311"
jksoft 0:fccb789424fc 179 // LAP, Inquiry length, Num_responses
jksoft 0:fccb789424fc 180 };
jksoft 0:fccb789424fc 181 const hci_cmd_t hci_inquiry_cancel = {
jksoft 0:fccb789424fc 182 OPCODE(OGF_LINK_CONTROL, 0x02), ""
jksoft 0:fccb789424fc 183 // no params
jksoft 0:fccb789424fc 184 };
jksoft 0:fccb789424fc 185 const hci_cmd_t hci_create_connection = {
jksoft 0:fccb789424fc 186 OPCODE(OGF_LINK_CONTROL, 0x05), "B21121"
jksoft 0:fccb789424fc 187 // BD_ADDR, Packet_Type, Page_Scan_Repetition_Mode, Reserved, Clock_Offset, Allow_Role_Switch
jksoft 0:fccb789424fc 188 };
jksoft 0:fccb789424fc 189 const hci_cmd_t hci_disconnect = {
jksoft 0:fccb789424fc 190 OPCODE(OGF_LINK_CONTROL, 0x06), "H1"
jksoft 0:fccb789424fc 191 // Handle, Reason: 0x05, 0x13-0x15, 0x1a, 0x29
jksoft 0:fccb789424fc 192 // see Errors Codes in BT Spec Part D
jksoft 0:fccb789424fc 193 };
jksoft 0:fccb789424fc 194 const hci_cmd_t hci_create_connection_cancel = {
jksoft 0:fccb789424fc 195 OPCODE(OGF_LINK_CONTROL, 0x08), "B"
jksoft 0:fccb789424fc 196 // BD_ADDR
jksoft 0:fccb789424fc 197 };
jksoft 0:fccb789424fc 198 const hci_cmd_t hci_accept_connection_request = {
jksoft 0:fccb789424fc 199 OPCODE(OGF_LINK_CONTROL, 0x09), "B1"
jksoft 0:fccb789424fc 200 // BD_ADDR, Role: become master, stay slave
jksoft 0:fccb789424fc 201 };
jksoft 0:fccb789424fc 202 const hci_cmd_t hci_reject_connection_request = {
jksoft 0:fccb789424fc 203 OPCODE(OGF_LINK_CONTROL, 0x0a), "B1"
jksoft 0:fccb789424fc 204 // BD_ADDR, reason e.g. CONNECTION REJECTED DUE TO LIMITED RESOURCES (0x0d)
jksoft 0:fccb789424fc 205 };
jksoft 0:fccb789424fc 206 const hci_cmd_t hci_link_key_request_reply = {
jksoft 0:fccb789424fc 207 OPCODE(OGF_LINK_CONTROL, 0x0b), "BP"
jksoft 0:fccb789424fc 208 // BD_ADDR, LINK_KEY
jksoft 0:fccb789424fc 209 };
jksoft 0:fccb789424fc 210 const hci_cmd_t hci_link_key_request_negative_reply = {
jksoft 0:fccb789424fc 211 OPCODE(OGF_LINK_CONTROL, 0x0c), "B"
jksoft 0:fccb789424fc 212 // BD_ADDR
jksoft 0:fccb789424fc 213 };
jksoft 0:fccb789424fc 214 const hci_cmd_t hci_pin_code_request_reply = {
jksoft 0:fccb789424fc 215 OPCODE(OGF_LINK_CONTROL, 0x0d), "B1P"
jksoft 0:fccb789424fc 216 // BD_ADDR, pin length, PIN: c-string
jksoft 0:fccb789424fc 217 };
jksoft 0:fccb789424fc 218 const hci_cmd_t hci_pin_code_request_negative_reply = {
jksoft 0:fccb789424fc 219 OPCODE(OGF_LINK_CONTROL, 0x0e), "B"
jksoft 0:fccb789424fc 220 // BD_ADDR
jksoft 0:fccb789424fc 221 };
jksoft 0:fccb789424fc 222 const hci_cmd_t hci_authentication_requested = {
jksoft 0:fccb789424fc 223 OPCODE(OGF_LINK_CONTROL, 0x11), "H"
jksoft 0:fccb789424fc 224 // Handle
jksoft 0:fccb789424fc 225 };
jksoft 0:fccb789424fc 226 const hci_cmd_t hci_set_connection_encryption = {
jksoft 0:fccb789424fc 227 OPCODE(OGF_LINK_CONTROL, 0x13), "H1"
jksoft 0:fccb789424fc 228 // Handle, Encryption_Enable
jksoft 0:fccb789424fc 229 };
jksoft 0:fccb789424fc 230 const hci_cmd_t hci_change_connection_link_key = {
jksoft 0:fccb789424fc 231 OPCODE(OGF_LINK_CONTROL, 0x15), "H"
jksoft 0:fccb789424fc 232 // Handle
jksoft 0:fccb789424fc 233 };
jksoft 0:fccb789424fc 234 const hci_cmd_t hci_remote_name_request = {
jksoft 0:fccb789424fc 235 OPCODE(OGF_LINK_CONTROL, 0x19), "B112"
jksoft 0:fccb789424fc 236 // BD_ADDR, Page_Scan_Repetition_Mode, Reserved, Clock_Offset
jksoft 0:fccb789424fc 237 };
jksoft 0:fccb789424fc 238 const hci_cmd_t hci_remote_name_request_cancel = {
jksoft 0:fccb789424fc 239 OPCODE(OGF_LINK_CONTROL, 0x1A), "B"
jksoft 0:fccb789424fc 240 // BD_ADDR
jksoft 0:fccb789424fc 241 };
jksoft 0:fccb789424fc 242
jksoft 0:fccb789424fc 243 /**
jksoft 0:fccb789424fc 244 * Link Policy Commands
jksoft 0:fccb789424fc 245 */
jksoft 0:fccb789424fc 246 const hci_cmd_t hci_sniff_mode = {
jksoft 0:fccb789424fc 247 OPCODE(OGF_LINK_POLICY, 0x03), "H2222"
jksoft 0:fccb789424fc 248 // handle, Sniff_Max_Interval, Sniff_Min_Interval, Sniff_Attempt, Sniff_Timeout:
jksoft 0:fccb789424fc 249 };
jksoft 0:fccb789424fc 250 const hci_cmd_t hci_qos_setup = {
jksoft 0:fccb789424fc 251 OPCODE(OGF_LINK_POLICY, 0x07), "H114444"
jksoft 0:fccb789424fc 252 // handle, flags, service_type, token rate (bytes/s), peak bandwith (bytes/s),
jksoft 0:fccb789424fc 253 // latency (us), delay_variation (us)
jksoft 0:fccb789424fc 254 };
jksoft 0:fccb789424fc 255 const hci_cmd_t hci_role_discovery = {
jksoft 0:fccb789424fc 256 OPCODE(OGF_LINK_POLICY, 0x09), "H"
jksoft 0:fccb789424fc 257 // handle
jksoft 0:fccb789424fc 258 };
jksoft 0:fccb789424fc 259 const hci_cmd_t hci_switch_role_command= {
jksoft 0:fccb789424fc 260 OPCODE(OGF_LINK_POLICY, 0x0b), "B1"
jksoft 0:fccb789424fc 261 // BD_ADDR, role: {0=master,1=slave}
jksoft 0:fccb789424fc 262 };
jksoft 0:fccb789424fc 263 const hci_cmd_t hci_read_link_policy_settings = {
jksoft 0:fccb789424fc 264 OPCODE(OGF_LINK_POLICY, 0x0c), "H"
jksoft 0:fccb789424fc 265 // handle
jksoft 0:fccb789424fc 266 };
jksoft 0:fccb789424fc 267 const hci_cmd_t hci_write_link_policy_settings = {
jksoft 0:fccb789424fc 268 OPCODE(OGF_LINK_POLICY, 0x0d), "H2"
jksoft 0:fccb789424fc 269 // handle, settings
jksoft 0:fccb789424fc 270 };
jksoft 0:fccb789424fc 271
jksoft 0:fccb789424fc 272 /**
jksoft 0:fccb789424fc 273 * Controller & Baseband Commands
jksoft 0:fccb789424fc 274 */
jksoft 0:fccb789424fc 275 const hci_cmd_t hci_set_event_mask = {
jksoft 0:fccb789424fc 276 OPCODE(OGF_CONTROLLER_BASEBAND, 0x01), "44"
jksoft 0:fccb789424fc 277 // event_mask lower 4 octets, higher 4 bytes
jksoft 0:fccb789424fc 278 };
jksoft 0:fccb789424fc 279 const hci_cmd_t hci_reset = {
jksoft 0:fccb789424fc 280 OPCODE(OGF_CONTROLLER_BASEBAND, 0x03), ""
jksoft 0:fccb789424fc 281 // no params
jksoft 0:fccb789424fc 282 };
jksoft 0:fccb789424fc 283 const hci_cmd_t hci_delete_stored_link_key = {
jksoft 0:fccb789424fc 284 OPCODE(OGF_CONTROLLER_BASEBAND, 0x12), "B1"
jksoft 0:fccb789424fc 285 // BD_ADDR, Delete_All_Flag
jksoft 0:fccb789424fc 286 };
jksoft 0:fccb789424fc 287 const hci_cmd_t hci_write_local_name = {
jksoft 0:fccb789424fc 288 OPCODE(OGF_CONTROLLER_BASEBAND, 0x13), "N"
jksoft 0:fccb789424fc 289 // Local name (UTF-8, Null Terminated, max 248 octets)
jksoft 0:fccb789424fc 290 };
jksoft 0:fccb789424fc 291 const hci_cmd_t hci_write_page_timeout = {
jksoft 0:fccb789424fc 292 OPCODE(OGF_CONTROLLER_BASEBAND, 0x18), "2"
jksoft 0:fccb789424fc 293 // Page_Timeout * 0.625 ms
jksoft 0:fccb789424fc 294 };
jksoft 0:fccb789424fc 295 const hci_cmd_t hci_write_scan_enable = {
jksoft 0:fccb789424fc 296 OPCODE(OGF_CONTROLLER_BASEBAND, 0x1A), "1"
jksoft 0:fccb789424fc 297 // Scan_enable: no, inq, page, inq+page
jksoft 0:fccb789424fc 298 };
jksoft 0:fccb789424fc 299 const hci_cmd_t hci_write_authentication_enable = {
jksoft 0:fccb789424fc 300 OPCODE(OGF_CONTROLLER_BASEBAND, 0x20), "1"
jksoft 0:fccb789424fc 301 // Authentication_Enable
jksoft 0:fccb789424fc 302 };
jksoft 0:fccb789424fc 303 const hci_cmd_t hci_write_class_of_device = {
jksoft 0:fccb789424fc 304 OPCODE(OGF_CONTROLLER_BASEBAND, 0x24), "3"
jksoft 0:fccb789424fc 305 // Class of Device
jksoft 0:fccb789424fc 306 };
jksoft 0:fccb789424fc 307 const hci_cmd_t hci_read_num_broadcast_retransmissions = {
jksoft 0:fccb789424fc 308 OPCODE(OGF_CONTROLLER_BASEBAND, 0x29), ""
jksoft 0:fccb789424fc 309 };
jksoft 0:fccb789424fc 310 const hci_cmd_t hci_write_num_broadcast_retransmissions = {
jksoft 0:fccb789424fc 311 OPCODE(OGF_CONTROLLER_BASEBAND, 0x2a), "1"
jksoft 0:fccb789424fc 312 // Num broadcast retransmissions (e.g. 0 for a single broadcast)
jksoft 0:fccb789424fc 313 };
jksoft 0:fccb789424fc 314 const hci_cmd_t hci_host_buffer_size = {
jksoft 0:fccb789424fc 315 OPCODE(OGF_CONTROLLER_BASEBAND, 0x33), "2122"
jksoft 0:fccb789424fc 316 // Host_ACL_Data_Packet_Length:, Host_Synchronous_Data_Packet_Length:, Host_Total_Num_ACL_Data_Packets:, Host_Total_Num_Synchronous_Data_Packets:
jksoft 0:fccb789424fc 317 };
jksoft 0:fccb789424fc 318 const hci_cmd_t hci_read_link_supervision_timeout = {
jksoft 0:fccb789424fc 319 OPCODE(OGF_CONTROLLER_BASEBAND, 0x36), "H"
jksoft 0:fccb789424fc 320 // handle
jksoft 0:fccb789424fc 321 };
jksoft 0:fccb789424fc 322 const hci_cmd_t hci_write_link_supervision_timeout = {
jksoft 0:fccb789424fc 323 OPCODE(OGF_CONTROLLER_BASEBAND, 0x37), "H2"
jksoft 0:fccb789424fc 324 // handle, Range for N: 0x0001 Ð 0xFFFF Time (Range: 0.625ms Ð 40.9 sec)
jksoft 0:fccb789424fc 325 };
jksoft 0:fccb789424fc 326 const hci_cmd_t hci_write_inquiry_mode = {
jksoft 0:fccb789424fc 327 OPCODE(OGF_CONTROLLER_BASEBAND, 0x45), "1"
jksoft 0:fccb789424fc 328 // Inquiry mode: 0x00 = standard, 0x01 = with RSSI, 0x02 = extended
jksoft 0:fccb789424fc 329 };
jksoft 0:fccb789424fc 330 const hci_cmd_t hci_write_extended_inquiry_response = {
jksoft 0:fccb789424fc 331 OPCODE(OGF_CONTROLLER_BASEBAND, 0x52), "1E"
jksoft 0:fccb789424fc 332 // FEC_Required, Exstended Inquiry Response
jksoft 0:fccb789424fc 333 };
jksoft 0:fccb789424fc 334 const hci_cmd_t hci_write_simple_pairing_mode = {
jksoft 0:fccb789424fc 335 OPCODE(OGF_CONTROLLER_BASEBAND, 0x56), "1"
jksoft 0:fccb789424fc 336 // mode: 0 = off, 1 = on
jksoft 0:fccb789424fc 337 };
jksoft 0:fccb789424fc 338 const hci_cmd_t hci_read_le_host_supported = {
jksoft 0:fccb789424fc 339 OPCODE(OGF_CONTROLLER_BASEBAND, 0x6c), ""
jksoft 0:fccb789424fc 340 // params: none
jksoft 0:fccb789424fc 341 // return: status, le supported host, simultaneous le host
jksoft 0:fccb789424fc 342 };
jksoft 0:fccb789424fc 343 const hci_cmd_t hci_write_le_host_supported = {
jksoft 0:fccb789424fc 344 OPCODE(OGF_CONTROLLER_BASEBAND, 0x6d), "11"
jksoft 0:fccb789424fc 345 // param: le supported host, simultaneous le host
jksoft 0:fccb789424fc 346 // return: status
jksoft 0:fccb789424fc 347 };
jksoft 0:fccb789424fc 348
jksoft 0:fccb789424fc 349 /**
jksoft 0:fccb789424fc 350 * Informational Parameters
jksoft 0:fccb789424fc 351 */
jksoft 0:fccb789424fc 352 const hci_cmd_t hci_read_local_supported_features = {
jksoft 0:fccb789424fc 353 OPCODE(OGF_INFORMATIONAL_PARAMETERS, 0x03), ""
jksoft 0:fccb789424fc 354 // no params
jksoft 0:fccb789424fc 355 };
jksoft 0:fccb789424fc 356 const hci_cmd_t hci_read_buffer_size = {
jksoft 0:fccb789424fc 357 OPCODE(OGF_INFORMATIONAL_PARAMETERS, 0x05), ""
jksoft 0:fccb789424fc 358 // no params
jksoft 0:fccb789424fc 359 };
jksoft 0:fccb789424fc 360 const hci_cmd_t hci_read_bd_addr = {
jksoft 0:fccb789424fc 361 OPCODE(OGF_INFORMATIONAL_PARAMETERS, 0x09), ""
jksoft 0:fccb789424fc 362 // no params
jksoft 0:fccb789424fc 363 };
jksoft 0:fccb789424fc 364
jksoft 0:fccb789424fc 365 //sibu
jksoft 0:fccb789424fc 366 const hci_cmd_t hci_read_local_supprted_commands = {
jksoft 0:fccb789424fc 367 OPCODE(OGF_INFORMATIONAL_PARAMETERS, 0x02), ""
jksoft 0:fccb789424fc 368 // no params
jksoft 0:fccb789424fc 369 };
jksoft 0:fccb789424fc 370 /**
jksoft 0:fccb789424fc 371 * Status Parameters
jksoft 0:fccb789424fc 372 */
jksoft 0:fccb789424fc 373 const hci_cmd_t hci_read_rssi = {
jksoft 0:fccb789424fc 374 OPCODE(OGF_STATUS_PARAMETERS, 0x05), "H"
jksoft 0:fccb789424fc 375 // handle
jksoft 0:fccb789424fc 376 // return: handle,RSSI
jksoft 0:fccb789424fc 377 };
jksoft 0:fccb789424fc 378
jksoft 0:fccb789424fc 379 #ifdef HAVE_BLE
jksoft 0:fccb789424fc 380 /**
jksoft 0:fccb789424fc 381 * Low Energy Commands
jksoft 0:fccb789424fc 382 */
jksoft 0:fccb789424fc 383 const hci_cmd_t hci_le_set_event_mask = {
jksoft 0:fccb789424fc 384 OPCODE(OGF_LE_CONTROLLER, 0x01), "44"
jksoft 0:fccb789424fc 385 // params: event_mask lower 4 octets, higher 4 bytes
jksoft 0:fccb789424fc 386 // return: status
jksoft 0:fccb789424fc 387 };
jksoft 0:fccb789424fc 388 const hci_cmd_t hci_le_read_buffer_size = {
jksoft 0:fccb789424fc 389 OPCODE(OGF_LE_CONTROLLER, 0x02), ""
jksoft 0:fccb789424fc 390 // params: none
jksoft 0:fccb789424fc 391 // return: status, le acl data packet len (16), total num le acl data packets(8)
jksoft 0:fccb789424fc 392 };
jksoft 0:fccb789424fc 393 const hci_cmd_t hci_le_read_supported_features = {
jksoft 0:fccb789424fc 394 OPCODE(OGF_LE_CONTROLLER, 0x03), ""
jksoft 0:fccb789424fc 395 // params: none
jksoft 0:fccb789424fc 396 // return: LE_Features See [Vol 6] Part B, Section 4.6
jksoft 0:fccb789424fc 397 };
jksoft 0:fccb789424fc 398 const hci_cmd_t hci_le_set_random_address = {
jksoft 0:fccb789424fc 399 OPCODE(OGF_LE_CONTROLLER, 0x05), "B"
jksoft 0:fccb789424fc 400 // params: random device address
jksoft 0:fccb789424fc 401 // return: status
jksoft 0:fccb789424fc 402 };
jksoft 0:fccb789424fc 403 const hci_cmd_t hci_le_set_advertising_parameters = {
jksoft 0:fccb789424fc 404 OPCODE(OGF_LE_CONTROLLER, 0x06), "22111B11"
jksoft 0:fccb789424fc 405 // param: min advertising interval, [0x0020,0x4000], default: 0x0800, unit: 0.625 msec
jksoft 0:fccb789424fc 406 // param: max advertising interval, [0x0020,0x4000], default: 0x0800, unit: 0.625 msec
jksoft 0:fccb789424fc 407 // param: advertising type (enum from 0): ADV_IND, ADC_DIRECT_IND, ADV_SCAN_IND, ADV_NONCONN_IND
jksoft 0:fccb789424fc 408 // param: own address type (enum from 0): public device address, random device address
jksoft 0:fccb789424fc 409 // param: direct address type (enum from 0): public device address, random device address
jksoft 0:fccb789424fc 410 // param: direct address - public or random address of device to be connecteed
jksoft 0:fccb789424fc 411 // param: advertising channel map (flags): chan_37(1), chan_38(2), chan_39(4)
jksoft 0:fccb789424fc 412 // param: advertising filter policy (enum from 0): scan any conn any, scan whitelist, con any, scan any conn whitelist, scan whitelist, con whitelist
jksoft 0:fccb789424fc 413 // return: status
jksoft 0:fccb789424fc 414 };
jksoft 0:fccb789424fc 415 const hci_cmd_t hci_le_read_advertising_channel_tx_power = {
jksoft 0:fccb789424fc 416 OPCODE(OGF_LE_CONTROLLER, 0x07), ""
jksoft 0:fccb789424fc 417 // params: none
jksoft 0:fccb789424fc 418 // return: status, level [-20,10] signed int (8), units dBm
jksoft 0:fccb789424fc 419 };
jksoft 0:fccb789424fc 420 const hci_cmd_t hci_le_set_advertising_data= {
jksoft 0:fccb789424fc 421 OPCODE(OGF_LE_CONTROLLER, 0x08), "1A"
jksoft 0:fccb789424fc 422 // param: advertising data len
jksoft 0:fccb789424fc 423 // param: advertising data (31 bytes)
jksoft 0:fccb789424fc 424 // return: status
jksoft 0:fccb789424fc 425 };
jksoft 0:fccb789424fc 426 const hci_cmd_t hci_le_set_scan_response_data= {
jksoft 0:fccb789424fc 427 OPCODE(OGF_LE_CONTROLLER, 0x09), "1A"
jksoft 0:fccb789424fc 428 // param: scan response data len
jksoft 0:fccb789424fc 429 // param: scan response data (31 bytes)
jksoft 0:fccb789424fc 430 // return: status
jksoft 0:fccb789424fc 431 };
jksoft 0:fccb789424fc 432 const hci_cmd_t hci_le_set_advertise_enable = {
jksoft 0:fccb789424fc 433 OPCODE(OGF_LE_CONTROLLER, 0x0a), "1"
jksoft 0:fccb789424fc 434 // params: avertise enable: off (0), on (1)
jksoft 0:fccb789424fc 435 // return: status
jksoft 0:fccb789424fc 436 };
jksoft 0:fccb789424fc 437 const hci_cmd_t hci_le_set_scan_parameters = {
jksoft 0:fccb789424fc 438 OPCODE(OGF_LE_CONTROLLER, 0x0b), "12211"
jksoft 0:fccb789424fc 439 // param: le scan type: passive (0), active (1)
jksoft 0:fccb789424fc 440 // param: le scan interval [0x0004,0x4000], unit: 0.625 msec
jksoft 0:fccb789424fc 441 // param: le scan window [0x0004,0x4000], unit: 0.625 msec
jksoft 0:fccb789424fc 442 // param: own address type: public (0), random (1)
jksoft 0:fccb789424fc 443 // param: scanning filter policy: any (0), only whitelist (1)
jksoft 0:fccb789424fc 444 // return: status
jksoft 0:fccb789424fc 445 };
jksoft 0:fccb789424fc 446 const hci_cmd_t hci_le_set_scan_enable = {
jksoft 0:fccb789424fc 447 OPCODE(OGF_LE_CONTROLLER, 0x0c), "11"
jksoft 0:fccb789424fc 448 // param: le scan enable: disabled (0), enabled (1)
jksoft 0:fccb789424fc 449 // param: filter duplices: disabled (0), enabled (1)
jksoft 0:fccb789424fc 450 // return: status
jksoft 0:fccb789424fc 451 };
jksoft 0:fccb789424fc 452 const hci_cmd_t hci_le_create_connection= {
jksoft 0:fccb789424fc 453 OPCODE(OGF_LE_CONTROLLER, 0x0d), "2211B1222222"
jksoft 0:fccb789424fc 454 // param: le scan interval, [0x0004, 0x4000], unit: 0.625 msec
jksoft 0:fccb789424fc 455 // param: le scan window, [0x0004, 0x4000], unit: 0.625 msec
jksoft 0:fccb789424fc 456 // param: initiator filter policy: peer address type + peer address (0), whitelist (1)
jksoft 0:fccb789424fc 457 // param: peer address type: public (0), random (1)
jksoft 0:fccb789424fc 458 // param: peer address
jksoft 0:fccb789424fc 459 // param: own address type: public (0), random (1)
jksoft 0:fccb789424fc 460 // param: conn interval min, [0x0006, 0x0c80], unit: 1.25 msec
jksoft 0:fccb789424fc 461 // param: conn interval max, [0x0006, 0x0c80], unit: 1.25 msec
jksoft 0:fccb789424fc 462 // param: conn latency, number of connection events [0x0000, 0x01f4]
jksoft 0:fccb789424fc 463 // param: supervision timeout, [0x000a, 0x0c80], unit: 10 msec
jksoft 0:fccb789424fc 464 // param: minimum CE length, [0x0000, 0xffff], unit: 0.625 msec
jksoft 0:fccb789424fc 465 // return: none -> le create connection complete event
jksoft 0:fccb789424fc 466 };
jksoft 0:fccb789424fc 467 const hci_cmd_t hci_le_create_connection_cancel = {
jksoft 0:fccb789424fc 468 OPCODE(OGF_LE_CONTROLLER, 0x0e), ""
jksoft 0:fccb789424fc 469 // params: none
jksoft 0:fccb789424fc 470 // return: status
jksoft 0:fccb789424fc 471 };
jksoft 0:fccb789424fc 472 const hci_cmd_t hci_le_read_white_list_size = {
jksoft 0:fccb789424fc 473 OPCODE(OGF_LE_CONTROLLER, 0x0f), ""
jksoft 0:fccb789424fc 474 // params: none
jksoft 0:fccb789424fc 475 // return: status, number of entries in controller whitelist
jksoft 0:fccb789424fc 476 };
jksoft 0:fccb789424fc 477 const hci_cmd_t hci_le_clear_white_list = {
jksoft 0:fccb789424fc 478 OPCODE(OGF_LE_CONTROLLER, 0x10), ""
jksoft 0:fccb789424fc 479 // params: none
jksoft 0:fccb789424fc 480 // return: status
jksoft 0:fccb789424fc 481 };
jksoft 0:fccb789424fc 482 const hci_cmd_t hci_le_add_device_to_whitelist = {
jksoft 0:fccb789424fc 483 OPCODE(OGF_LE_CONTROLLER, 0x11), "1B"
jksoft 0:fccb789424fc 484 // param: address type: public (0), random (1)
jksoft 0:fccb789424fc 485 // param: address
jksoft 0:fccb789424fc 486 // return: status
jksoft 0:fccb789424fc 487 };
jksoft 0:fccb789424fc 488 const hci_cmd_t hci_le_remove_device_from_whitelist = {
jksoft 0:fccb789424fc 489 OPCODE(OGF_LE_CONTROLLER, 0x12), "1B"
jksoft 0:fccb789424fc 490 // param: address type: public (0), random (1)
jksoft 0:fccb789424fc 491 // param: address
jksoft 0:fccb789424fc 492 // return: status
jksoft 0:fccb789424fc 493 };
jksoft 0:fccb789424fc 494 const hci_cmd_t hci_le_connection_update = {
jksoft 0:fccb789424fc 495 OPCODE(OGF_LE_CONTROLLER, 0x13), "H222222"
jksoft 0:fccb789424fc 496 // param: conn handle
jksoft 0:fccb789424fc 497 // param: conn interval min, [0x0006,0x0c80], unit: 1.25 msec
jksoft 0:fccb789424fc 498 // param: conn interval max, [0x0006,0x0c80], unit: 1.25 msec
jksoft 0:fccb789424fc 499 // param: conn latency, [0x0000,0x03e8], number of connection events
jksoft 0:fccb789424fc 500 // param: supervision timeout, [0x000a,0x0c80], unit: 10 msec
jksoft 0:fccb789424fc 501 // param: minimum CE length, [0x0000,0xffff], unit: 0.625 msec
jksoft 0:fccb789424fc 502 // param: maximum CE length, [0x0000,0xffff], unit: 0.625 msec
jksoft 0:fccb789424fc 503 // return: none -> le connection update complete event
jksoft 0:fccb789424fc 504 };
jksoft 0:fccb789424fc 505 const hci_cmd_t hci_le_set_host_channel_classification = {
jksoft 0:fccb789424fc 506 OPCODE(OGF_LE_CONTROLLER, 0x14), "41"
jksoft 0:fccb789424fc 507 // param: channel map 37 bit, split into first 32 and higher 5 bits
jksoft 0:fccb789424fc 508 // return: status
jksoft 0:fccb789424fc 509 };
jksoft 0:fccb789424fc 510 const hci_cmd_t hci_le_read_channel_map = {
jksoft 0:fccb789424fc 511 OPCODE(OGF_LE_CONTROLLER, 0x15), "H"
jksoft 0:fccb789424fc 512 // params: connection handle
jksoft 0:fccb789424fc 513 // return: status, connection handle, channel map (5 bytes, 37 used)
jksoft 0:fccb789424fc 514 };
jksoft 0:fccb789424fc 515 const hci_cmd_t hci_le_read_remote_used_features = {
jksoft 0:fccb789424fc 516 OPCODE(OGF_LE_CONTROLLER, 0x16), "H"
jksoft 0:fccb789424fc 517 // params: connection handle
jksoft 0:fccb789424fc 518 // return: none -> le read remote used features complete event
jksoft 0:fccb789424fc 519 };
jksoft 0:fccb789424fc 520 const hci_cmd_t hci_le_encrypt = {
jksoft 0:fccb789424fc 521 OPCODE(OGF_LE_CONTROLLER, 0x17), "PP"
jksoft 0:fccb789424fc 522 // param: key (128) for AES-128
jksoft 0:fccb789424fc 523 // param: plain text (128)
jksoft 0:fccb789424fc 524 // return: status, encrypted data (128)
jksoft 0:fccb789424fc 525 };
jksoft 0:fccb789424fc 526 const hci_cmd_t hci_le_rand = {
jksoft 0:fccb789424fc 527 OPCODE(OGF_LE_CONTROLLER, 0x18), ""
jksoft 0:fccb789424fc 528 // params: none
jksoft 0:fccb789424fc 529 // return: status, random number (64)
jksoft 0:fccb789424fc 530 };
jksoft 0:fccb789424fc 531 const hci_cmd_t hci_le_start_encryption = {
jksoft 0:fccb789424fc 532 OPCODE(OGF_LE_CONTROLLER, 0x19), "H442P"
jksoft 0:fccb789424fc 533 // param: connection handle
jksoft 0:fccb789424fc 534 // param: 64 bit random number lower 32 bit
jksoft 0:fccb789424fc 535 // param: 64 bit random number higher 32 bit
jksoft 0:fccb789424fc 536 // param: encryption diversifier (16)
jksoft 0:fccb789424fc 537 // param: long term key (128)
jksoft 0:fccb789424fc 538 // return: none -> encryption changed or encryption key refresh complete event
jksoft 0:fccb789424fc 539 };
jksoft 0:fccb789424fc 540 const hci_cmd_t hci_le_long_term_key_request_reply = {
jksoft 0:fccb789424fc 541 OPCODE(OGF_LE_CONTROLLER, 0x1a), "HP"
jksoft 0:fccb789424fc 542 // param: connection handle
jksoft 0:fccb789424fc 543 // param: long term key (128)
jksoft 0:fccb789424fc 544 // return: status, connection handle
jksoft 0:fccb789424fc 545 };
jksoft 0:fccb789424fc 546 const hci_cmd_t hci_le_long_term_key_negative_reply = {
jksoft 0:fccb789424fc 547 OPCODE(OGF_LE_CONTROLLER, 0x1b), "H"
jksoft 0:fccb789424fc 548 // param: connection handle
jksoft 0:fccb789424fc 549 // return: status, connection handle
jksoft 0:fccb789424fc 550 };
jksoft 0:fccb789424fc 551 const hci_cmd_t hci_le_read_supported_states = {
jksoft 0:fccb789424fc 552 OPCODE(OGF_LE_CONTROLLER, 0x1c), "H"
jksoft 0:fccb789424fc 553 // param: none
jksoft 0:fccb789424fc 554 // return: status, LE states (64)
jksoft 0:fccb789424fc 555 };
jksoft 0:fccb789424fc 556 const hci_cmd_t hci_le_receiver_test = {
jksoft 0:fccb789424fc 557 OPCODE(OGF_LE_CONTROLLER, 0x1d), "1"
jksoft 0:fccb789424fc 558 // param: rx frequency, [0x00 0x27], frequency (MHz): 2420 + N*2
jksoft 0:fccb789424fc 559 // return: status
jksoft 0:fccb789424fc 560 };
jksoft 0:fccb789424fc 561 const hci_cmd_t hci_le_transmitter_test = {
jksoft 0:fccb789424fc 562 OPCODE(OGF_LE_CONTROLLER, 0x1e), "111"
jksoft 0:fccb789424fc 563 // param: tx frequency, [0x00 0x27], frequency (MHz): 2420 + N*2
jksoft 0:fccb789424fc 564 // param: lengh of test payload [0x00,0x25]
jksoft 0:fccb789424fc 565 // param: packet payload [0,7] different patterns
jksoft 0:fccb789424fc 566 // return: status
jksoft 0:fccb789424fc 567 };
jksoft 0:fccb789424fc 568 const hci_cmd_t hci_le_test_end = {
jksoft 0:fccb789424fc 569 OPCODE(OGF_LE_CONTROLLER, 0x1f), "1"
jksoft 0:fccb789424fc 570 // params: none
jksoft 0:fccb789424fc 571 // return: status, number of packets (8)
jksoft 0:fccb789424fc 572 };
jksoft 0:fccb789424fc 573 #endif
jksoft 0:fccb789424fc 574
jksoft 0:fccb789424fc 575 // BTstack commands
jksoft 0:fccb789424fc 576 const hci_cmd_t btstack_get_state = {
jksoft 0:fccb789424fc 577 OPCODE(OGF_BTSTACK, BTSTACK_GET_STATE), ""
jksoft 0:fccb789424fc 578 // no params ->
jksoft 0:fccb789424fc 579 };
jksoft 0:fccb789424fc 580
jksoft 0:fccb789424fc 581 const hci_cmd_t btstack_set_power_mode = {
jksoft 0:fccb789424fc 582 OPCODE(OGF_BTSTACK, BTSTACK_SET_POWER_MODE), "1"
jksoft 0:fccb789424fc 583 // mode: 0 = off, 1 = on
jksoft 0:fccb789424fc 584 };
jksoft 0:fccb789424fc 585
jksoft 0:fccb789424fc 586 const hci_cmd_t btstack_set_acl_capture_mode = {
jksoft 0:fccb789424fc 587 OPCODE(OGF_BTSTACK, BTSTACK_SET_ACL_CAPTURE_MODE), "1"
jksoft 0:fccb789424fc 588 // mode: 0 = off, 1 = on
jksoft 0:fccb789424fc 589 };
jksoft 0:fccb789424fc 590
jksoft 0:fccb789424fc 591 const hci_cmd_t btstack_get_version = {
jksoft 0:fccb789424fc 592 OPCODE(OGF_BTSTACK, BTSTACK_GET_VERSION), ""
jksoft 0:fccb789424fc 593 };
jksoft 0:fccb789424fc 594
jksoft 0:fccb789424fc 595 const hci_cmd_t btstack_get_system_bluetooth_enabled = {
jksoft 0:fccb789424fc 596 OPCODE(OGF_BTSTACK, BTSTACK_GET_SYSTEM_BLUETOOTH_ENABLED), ""
jksoft 0:fccb789424fc 597 };
jksoft 0:fccb789424fc 598
jksoft 0:fccb789424fc 599 const hci_cmd_t btstack_set_system_bluetooth_enabled = {
jksoft 0:fccb789424fc 600 OPCODE(OGF_BTSTACK, BTSTACK_SET_SYSTEM_BLUETOOTH_ENABLED), "1"
jksoft 0:fccb789424fc 601 };
jksoft 0:fccb789424fc 602
jksoft 0:fccb789424fc 603 const hci_cmd_t btstack_set_discoverable = {
jksoft 0:fccb789424fc 604 OPCODE(OGF_BTSTACK, BTSTACK_SET_DISCOVERABLE), "1"
jksoft 0:fccb789424fc 605 };
jksoft 0:fccb789424fc 606
jksoft 0:fccb789424fc 607 const hci_cmd_t btstack_set_bluetooth_enabled = {
jksoft 0:fccb789424fc 608 // only used by btstack config
jksoft 0:fccb789424fc 609 OPCODE(OGF_BTSTACK, BTSTACK_SET_BLUETOOTH_ENABLED), "1"
jksoft 0:fccb789424fc 610 };
jksoft 0:fccb789424fc 611
jksoft 0:fccb789424fc 612 const hci_cmd_t l2cap_create_channel = {
jksoft 0:fccb789424fc 613 OPCODE(OGF_BTSTACK, L2CAP_CREATE_CHANNEL), "B2"
jksoft 0:fccb789424fc 614 // @param bd_addr(48), psm (16)
jksoft 0:fccb789424fc 615 };
jksoft 0:fccb789424fc 616 const hci_cmd_t l2cap_create_channel_mtu = {
jksoft 0:fccb789424fc 617 OPCODE(OGF_BTSTACK, L2CAP_CREATE_CHANNEL_MTU), "B22"
jksoft 0:fccb789424fc 618 // @param bd_addr(48), psm (16), mtu (16)
jksoft 0:fccb789424fc 619 };
jksoft 0:fccb789424fc 620 const hci_cmd_t l2cap_disconnect = {
jksoft 0:fccb789424fc 621 OPCODE(OGF_BTSTACK, L2CAP_DISCONNECT), "21"
jksoft 0:fccb789424fc 622 // @param channel(16), reason(8)
jksoft 0:fccb789424fc 623 };
jksoft 0:fccb789424fc 624 const hci_cmd_t l2cap_register_service = {
jksoft 0:fccb789424fc 625 OPCODE(OGF_BTSTACK, L2CAP_REGISTER_SERVICE), "22"
jksoft 0:fccb789424fc 626 // @param psm (16), mtu (16)
jksoft 0:fccb789424fc 627 };
jksoft 0:fccb789424fc 628 const hci_cmd_t l2cap_unregister_service = {
jksoft 0:fccb789424fc 629 OPCODE(OGF_BTSTACK, L2CAP_UNREGISTER_SERVICE), "2"
jksoft 0:fccb789424fc 630 // @param psm (16)
jksoft 0:fccb789424fc 631 };
jksoft 0:fccb789424fc 632 const hci_cmd_t l2cap_accept_connection = {
jksoft 0:fccb789424fc 633 OPCODE(OGF_BTSTACK, L2CAP_ACCEPT_CONNECTION), "2"
jksoft 0:fccb789424fc 634 // @param source cid (16)
jksoft 0:fccb789424fc 635 };
jksoft 0:fccb789424fc 636 const hci_cmd_t l2cap_decline_connection = {
jksoft 0:fccb789424fc 637 OPCODE(OGF_BTSTACK, L2CAP_DECLINE_CONNECTION), "21"
jksoft 0:fccb789424fc 638 // @param source cid (16), reason(8)
jksoft 0:fccb789424fc 639 };
jksoft 0:fccb789424fc 640 const hci_cmd_t sdp_register_service_record = {
jksoft 0:fccb789424fc 641 OPCODE(OGF_BTSTACK, SDP_REGISTER_SERVICE_RECORD), "S"
jksoft 0:fccb789424fc 642 // @param service record handle (DES)
jksoft 0:fccb789424fc 643 };
jksoft 0:fccb789424fc 644 const hci_cmd_t sdp_unregister_service_record = {
jksoft 0:fccb789424fc 645 OPCODE(OGF_BTSTACK, SDP_UNREGISTER_SERVICE_RECORD), "4"
jksoft 0:fccb789424fc 646 // @param service record handle (32)
jksoft 0:fccb789424fc 647 };
jksoft 0:fccb789424fc 648
jksoft 0:fccb789424fc 649 // create rfcomm channel: @param bd_addr(48), channel (8)
jksoft 0:fccb789424fc 650 const hci_cmd_t rfcomm_create_channel = {
jksoft 0:fccb789424fc 651 OPCODE(OGF_BTSTACK, RFCOMM_CREATE_CHANNEL), "B1"
jksoft 0:fccb789424fc 652 };
jksoft 0:fccb789424fc 653 // create rfcomm channel: @param bd_addr(48), channel (8), mtu (16), credits (8)
jksoft 0:fccb789424fc 654 const hci_cmd_t rfcomm_create_channel_with_initial_credits = {
jksoft 0:fccb789424fc 655 OPCODE(OGF_BTSTACK, RFCOMM_CREATE_CHANNEL_WITH_CREDITS), "B121"
jksoft 0:fccb789424fc 656 };
jksoft 0:fccb789424fc 657 // grant credits: @param rfcomm_cid(16), credits (8)
jksoft 0:fccb789424fc 658 const hci_cmd_t rfcomm_grants_credits= {
jksoft 0:fccb789424fc 659 OPCODE(OGF_BTSTACK, RFCOMM_GRANT_CREDITS), "21"
jksoft 0:fccb789424fc 660 };
jksoft 0:fccb789424fc 661 // disconnect rfcomm disconnect, @param rfcomm_cid(16), reason(8)
jksoft 0:fccb789424fc 662 const hci_cmd_t rfcomm_disconnect = {
jksoft 0:fccb789424fc 663 OPCODE(OGF_BTSTACK, RFCOMM_DISCONNECT), "21"
jksoft 0:fccb789424fc 664 };
jksoft 0:fccb789424fc 665
jksoft 0:fccb789424fc 666 // register rfcomm service: @param channel(8), mtu (16)
jksoft 0:fccb789424fc 667 const hci_cmd_t rfcomm_register_service = {
jksoft 0:fccb789424fc 668 OPCODE(OGF_BTSTACK, RFCOMM_REGISTER_SERVICE), "12"
jksoft 0:fccb789424fc 669 };
jksoft 0:fccb789424fc 670 // register rfcomm service: @param channel(8), mtu (16), initial credits (8)
jksoft 0:fccb789424fc 671 const hci_cmd_t rfcomm_register_service_with_initial_credits = {
jksoft 0:fccb789424fc 672 OPCODE(OGF_BTSTACK, RFCOMM_REGISTER_SERVICE_WITH_CREDITS), "121"
jksoft 0:fccb789424fc 673 };
jksoft 0:fccb789424fc 674
jksoft 0:fccb789424fc 675 // unregister rfcomm service, @param service_channel(16)
jksoft 0:fccb789424fc 676 const hci_cmd_t rfcomm_unregister_service = {
jksoft 0:fccb789424fc 677 OPCODE(OGF_BTSTACK, RFCOMM_UNREGISTER_SERVICE), "2"
jksoft 0:fccb789424fc 678 };
jksoft 0:fccb789424fc 679 // accept connection @param source cid (16)
jksoft 0:fccb789424fc 680 const hci_cmd_t rfcomm_accept_connection = {
jksoft 0:fccb789424fc 681 OPCODE(OGF_BTSTACK, RFCOMM_ACCEPT_CONNECTION), "2"
jksoft 0:fccb789424fc 682 };
jksoft 0:fccb789424fc 683 // decline connection @param source cid (16)
jksoft 0:fccb789424fc 684 const hci_cmd_t rfcomm_decline_connection = {
jksoft 0:fccb789424fc 685 OPCODE(OGF_BTSTACK, RFCOMM_DECLINE_CONNECTION), "21"
jksoft 0:fccb789424fc 686 };
jksoft 0:fccb789424fc 687 // request persisten rfcomm channel number for named service
jksoft 0:fccb789424fc 688 const hci_cmd_t rfcomm_persistent_channel_for_service = {
jksoft 0:fccb789424fc 689 OPCODE(OGF_BTSTACK, RFCOMM_PERSISTENT_CHANNEL), "N"
jksoft 0:fccb789424fc 690 };
jksoft 0:fccb789424fc 691
jksoft 0:fccb789424fc 692 // register rfcomm service: @param channel(8), mtu (16), initial credits (8)
jksoft 0:fccb789424fc 693 extern const hci_cmd_t rfcomm_register_service_with_initial_credits;