うおーるぼっとを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
btstack/hci_cmds.c@0:fccb789424fc, 2013-06-10 (annotated)
- Committer:
- jksoft
- Date:
- Mon Jun 10 16:01:50 2013 +0000
- Revision:
- 0:fccb789424fc
1.0
Who changed what in which revision?
User | Revision | Line number | New 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; |