source: asp3_tinet_ecnl_arm/trunk/btstack/src/hci_cmds.c@ 352

Last change on this file since 352 was 352, checked in by coas-nagasima, 6 years ago

arm向けASP3版ECNLを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 30.0 KB
Line 
1/*
2 * Copyright (C) 2009-2012 by Matthias Ringwald
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the copyright holders nor the names of
14 * contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 * 4. Any redistribution, use, or modification is done solely for
17 * personal benefit and not for any commercial purpose or for
18 * monetary gain.
19 *
20 * THIS SOFTWARE IS PROVIDED BY MATTHIAS RINGWALD AND CONTRIBUTORS
21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
24 * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
27 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
30 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * Please inquire about commercial licensing options at btstack@ringwald.ch
34 *
35 */
36
37/*
38 * hci_cmds.c
39 *
40 * Created by Matthias Ringwald on 7/23/09.
41 */
42
43#include <btstack/hci_cmds.h>
44
45#include <string.h>
46
47#include <btstack/sdp_util.h>
48#include "btstack-config.h"
49#include "hci.h"
50
51// calculate combined ogf/ocf value
52#define OPCODE(ogf, ocf) (ocf | ogf << 10)
53
54/**
55 * construct HCI Command based on template
56 *
57 * Format:
58 * 1,2,3,4: one to four byte value
59 * H: HCI connection handle
60 * B: Bluetooth Baseband Address (BD_ADDR)
61 * E: Extended Inquiry Result
62 * N: Name up to 248 chars, \0 terminated
63 * P: 16 byte Pairing code
64 * S: Service Record (Data Element Sequence)
65 */
66uint16_t hci_create_cmd_internal(uint8_t *hci_cmd_buffer, const hci_cmd_t *cmd, va_list argptr){
67 int pos;
68 const char *format;
69 uint16_t word;
70 uint32_t longword;
71 uint8_t * ptr;
72 uint16_t len;
73
74 hci_cmd_buffer[0] = cmd->opcode & 0xff;
75 hci_cmd_buffer[1] = cmd->opcode >> 8;
76 pos = 3;
77
78 format = cmd->format;
79 while (*format) {
80 switch(*format) {
81 case '1': // 8 bit value
82 case '2': // 16 bit value
83 case 'H': // hci_handle
84 word = va_arg(argptr, int); // minimal va_arg is int: 2 bytes on 8+16 bit CPUs
85 hci_cmd_buffer[pos++] = word & 0xff;
86 if (*format == '2') {
87 hci_cmd_buffer[pos++] = word >> 8;
88 } else if (*format == 'H') {
89 // TODO implement opaque client connection handles
90 // pass module handle for now
91 hci_cmd_buffer[pos++] = word >> 8;
92 }
93 break;
94 case '3':
95 case '4':
96 longword = va_arg(argptr, uint32_t);
97 // longword = va_arg(argptr, int);
98 hci_cmd_buffer[pos++] = longword;
99 hci_cmd_buffer[pos++] = longword >> 8;
100 hci_cmd_buffer[pos++] = longword >> 16;
101 if (*format == '4'){
102 hci_cmd_buffer[pos++] = longword >> 24;
103 }
104 break;
105 case 'B': // bt-addr
106 ptr = va_arg(argptr, uint8_t *);
107 hci_cmd_buffer[pos++] = ptr[5];
108 hci_cmd_buffer[pos++] = ptr[4];
109 hci_cmd_buffer[pos++] = ptr[3];
110 hci_cmd_buffer[pos++] = ptr[2];
111 hci_cmd_buffer[pos++] = ptr[1];
112 hci_cmd_buffer[pos++] = ptr[0];
113 break;
114 case 'D': // 8 byte data block
115 ptr = va_arg(argptr, uint8_t *);
116 memcpy(&hci_cmd_buffer[pos], ptr, 8);
117 pos += 8;
118 break;
119 case 'E': // Extended Inquiry Information 240 octets
120 ptr = va_arg(argptr, uint8_t *);
121 memcpy(&hci_cmd_buffer[pos], ptr, 240);
122 pos += 240;
123 break;
124 case 'N': { // UTF-8 string, null terminated
125 ptr = va_arg(argptr, uint8_t *);
126 len = strlen((const char*) ptr) + 1;
127 if (len > 248) {
128 len = 248;
129 }
130 memcpy(&hci_cmd_buffer[pos], ptr, len);
131 if (len < 248) {
132 // fill remaining space with zeroes
133 memset(&hci_cmd_buffer[pos+len], 0, 248-len);
134 }
135 pos += len;
136 break;
137 }
138 case 'P': // 16 byte PIN code or link key
139 ptr = va_arg(argptr, uint8_t *);
140 memcpy(&hci_cmd_buffer[pos], ptr, 16);
141 pos += 16;
142 break;
143#ifdef HAVE_BLE
144 case 'A': // 31 bytes advertising data
145 ptr = va_arg(argptr, uint8_t *);
146 memcpy(&hci_cmd_buffer[pos], ptr, 31);
147 pos += 31;
148 break;
149#endif
150#ifdef HAVE_SDP
151 case 'S': { // Service Record (Data Element Sequence)
152 ptr = va_arg(argptr, uint8_t *);
153 uint16_t len = de_get_len(ptr);
154 memcpy(&hci_cmd_buffer[pos], ptr, len);
155 pos += len;
156 break;
157 }
158#endif
159 default:
160 break;
161 }
162 format++;
163 };
164 hci_cmd_buffer[2] = pos - 3;
165 return pos;
166}
167
168/**
169 * construct HCI Command based on template
170 *
171 * mainly calls hci_create_cmd_internal
172 */
173uint16_t hci_create_cmd(uint8_t *hci_cmd_buffer, hci_cmd_t *cmd, ...){
174 va_list argptr;
175 uint16_t len;
176 va_start(argptr, cmd);
177 len = hci_create_cmd_internal(hci_cmd_buffer, cmd, argptr);
178 va_end(argptr);
179 return len;
180}
181
182
183/**
184 * Link Control Commands
185 */
186
187/**
188 * @param lap
189 * @param inquiry_length
190 * @param num_responses
191 */
192const hci_cmd_t hci_inquiry = {
193OPCODE(OGF_LINK_CONTROL, 0x01), "311"
194};
195
196/**
197 */
198const hci_cmd_t hci_inquiry_cancel = {
199OPCODE(OGF_LINK_CONTROL, 0x02), ""
200};
201
202/**
203 * @param bd_addr
204 * @param packet_type
205 * @param page_scan_repetition_mode
206 * @param reserved
207 * @param clock_offset
208 * @param allow_role_switch
209 */
210const hci_cmd_t hci_create_connection = {
211OPCODE(OGF_LINK_CONTROL, 0x05), "B21121"
212};
213
214/**
215 * @param handle
216 * @param reason (0x05, 0x13-0x15, 0x1a, 0x29, see Errors Codes in BT Spec Part D)
217 */
218const hci_cmd_t hci_disconnect = {
219OPCODE(OGF_LINK_CONTROL, 0x06), "H1"
220};
221
222/**
223 * @param bd_addr
224 */
225const hci_cmd_t hci_create_connection_cancel = {
226OPCODE(OGF_LINK_CONTROL, 0x08), "B"
227};
228
229/**
230 * @param bd_addr
231 * @param role (become master, stay slave)
232 */
233const hci_cmd_t hci_accept_connection_request = {
234OPCODE(OGF_LINK_CONTROL, 0x09), "B1"
235};
236
237/**
238 * @param bd_addr
239 * @param reason (e.g. CONNECTION REJECTED DUE TO LIMITED RESOURCES (0x0d))
240 */
241const hci_cmd_t hci_reject_connection_request = {
242OPCODE(OGF_LINK_CONTROL, 0x0a), "B1"
243};
244
245/**
246 * @param bd_addr
247 * @param link_key
248 */
249const hci_cmd_t hci_link_key_request_reply = {
250OPCODE(OGF_LINK_CONTROL, 0x0b), "BP"
251};
252
253/**
254 * @param bd_addr
255 */
256const hci_cmd_t hci_link_key_request_negative_reply = {
257OPCODE(OGF_LINK_CONTROL, 0x0c), "B"
258};
259
260/**
261 * @param bd_addr
262 * @param pin_length
263 * @param pin (c-string)
264 */
265const hci_cmd_t hci_pin_code_request_reply = {
266OPCODE(OGF_LINK_CONTROL, 0x0d), "B1P"
267};
268
269/**
270 * @param bd_addr
271 */
272const hci_cmd_t hci_pin_code_request_negative_reply = {
273OPCODE(OGF_LINK_CONTROL, 0x0e), "B"
274};
275
276/**
277 * @param handle
278 * @param packet_type
279 */
280const hci_cmd_t hci_change_connection_packet_type = {
281OPCODE(OGF_LINK_CONTROL, 0x0f), "H2"
282};
283
284/**
285 * @param handle
286 */
287const hci_cmd_t hci_authentication_requested = {
288OPCODE(OGF_LINK_CONTROL, 0x11), "H"
289};
290
291/**
292 * @param handle
293 * @param encryption_enable
294 */
295const hci_cmd_t hci_set_connection_encryption = {
296OPCODE(OGF_LINK_CONTROL, 0x13), "H1"
297};
298
299/**
300 * @param handle
301 */
302const hci_cmd_t hci_change_connection_link_key = {
303OPCODE(OGF_LINK_CONTROL, 0x15), "H"
304};
305
306/**
307 * @param bd_addr
308 * @param page_scan_repetition_mode
309 * @param reserved
310 * @param clock_offset
311 */
312const hci_cmd_t hci_remote_name_request = {
313OPCODE(OGF_LINK_CONTROL, 0x19), "B112"
314};
315
316
317/**
318 * @param bd_addr
319 */
320const hci_cmd_t hci_remote_name_request_cancel = {
321OPCODE(OGF_LINK_CONTROL, 0x1A), "B"
322};
323
324/**
325 * @param handle
326 */
327const hci_cmd_t hci_read_remote_supported_features_command = {
328OPCODE(OGF_LINK_CONTROL, 0x1B), "H"
329};
330
331/**
332 * @param bd_addr
333 * @param IO_capability
334 * @param OOB_data_present
335 * @param authentication_requirements
336 */
337const hci_cmd_t hci_io_capability_request_reply = {
338OPCODE(OGF_LINK_CONTROL, 0x2b), "B111"
339};
340
341/**
342 * @param bd_addr
343 */
344const hci_cmd_t hci_user_confirmation_request_reply = {
345OPCODE(OGF_LINK_CONTROL, 0x2c), "B"
346};
347
348/**
349 * @param bd_addr
350 */
351const hci_cmd_t hci_user_confirmation_request_negative_reply = {
352OPCODE(OGF_LINK_CONTROL, 0x2d), "B"
353};
354
355/**
356 * @param bd_addr
357 * @param numeric_value
358 */
359const hci_cmd_t hci_user_passkey_request_reply = {
360OPCODE(OGF_LINK_CONTROL, 0x2e), "B4"
361};
362
363/**
364 * @param bd_addr
365 */
366const hci_cmd_t hci_user_passkey_request_negative_reply = {
367OPCODE(OGF_LINK_CONTROL, 0x2f), "B"
368};
369
370/**
371 * @param bd_addr
372 */
373const hci_cmd_t hci_remote_oob_data_request_negative_reply = {
374OPCODE(OGF_LINK_CONTROL, 0x33), "B"
375};
376
377/**
378 * @param bd_addr
379 * @param reason (Part D, Error codes)
380 */
381const hci_cmd_t hci_io_capability_request_negative_reply = {
382OPCODE(OGF_LINK_CONTROL, 0x34), "B1"
383};
384
385
386/**
387 * Link Policy Commands
388 */
389
390/**
391 * @param handle
392 * @param sniff_max_interval
393 * @param sniff_min_interval
394 * @param sniff_attempt
395 * @param sniff_timeout
396 */
397const hci_cmd_t hci_sniff_mode = {
398OPCODE(OGF_LINK_POLICY, 0x03), "H2222"
399};
400
401/**
402 * @param handle
403 * @param flags
404 * @param service_type
405 * @param token_rate (bytes/s)
406 * @param peak_bandwith (bytes/s)
407 * @param latency (us)
408 * @param delay_variation (us)
409 */
410const hci_cmd_t hci_qos_setup = {
411OPCODE(OGF_LINK_POLICY, 0x07), "H114444"
412};
413
414/**
415 * @param handle
416 */
417const hci_cmd_t hci_role_discovery = {
418OPCODE(OGF_LINK_POLICY, 0x09), "H"
419};
420
421/**
422 * @param bd_addr
423 * @param role (0=master,1=slave)
424 */
425const hci_cmd_t hci_switch_role_command= {
426OPCODE(OGF_LINK_POLICY, 0x0b), "B1"
427};
428
429/**
430 * @param handle
431 */
432const hci_cmd_t hci_read_link_policy_settings = {
433OPCODE(OGF_LINK_POLICY, 0x0c), "H"
434};
435
436/**
437 * @param handle
438 * @param settings
439 */
440const hci_cmd_t hci_write_link_policy_settings = {
441OPCODE(OGF_LINK_POLICY, 0x0d), "H2"
442};
443
444
445/**
446 * Controller & Baseband Commands
447 */
448
449/**
450 * @param event_mask_lover_octets
451 * @param event_mask_higher_octets
452 */
453const hci_cmd_t hci_set_event_mask = {
454OPCODE(OGF_CONTROLLER_BASEBAND, 0x01), "44"
455};
456
457/**
458 */
459const hci_cmd_t hci_reset = {
460OPCODE(OGF_CONTROLLER_BASEBAND, 0x03), ""
461};
462
463/**
464 * @param bd_addr
465 * @param delete_all_flags
466 */
467const hci_cmd_t hci_delete_stored_link_key = {
468OPCODE(OGF_CONTROLLER_BASEBAND, 0x12), "B1"
469};
470
471/**
472 * @param local_name (UTF-8, Null Terminated, max 248 octets)
473 */
474const hci_cmd_t hci_write_local_name = {
475OPCODE(OGF_CONTROLLER_BASEBAND, 0x13), "N"
476};
477
478/**
479 * @param page_timeout (* 0.625 ms)
480 */
481const hci_cmd_t hci_write_page_timeout = {
482OPCODE(OGF_CONTROLLER_BASEBAND, 0x18), "2"
483};
484
485/**
486 * @param scan_enable (no, inq, page, inq+page)
487 */
488const hci_cmd_t hci_write_scan_enable = {
489OPCODE(OGF_CONTROLLER_BASEBAND, 0x1A), "1"
490};
491
492/**
493 * @param authentication_enable
494 */
495const hci_cmd_t hci_write_authentication_enable = {
496OPCODE(OGF_CONTROLLER_BASEBAND, 0x20), "1"
497};
498
499/**
500 * @param class_of_device
501 */
502const hci_cmd_t hci_write_class_of_device = {
503OPCODE(OGF_CONTROLLER_BASEBAND, 0x24), "3"
504};
505
506/**
507 */
508const hci_cmd_t hci_read_num_broadcast_retransmissions = {
509OPCODE(OGF_CONTROLLER_BASEBAND, 0x29), ""
510};
511
512/**
513 * @param num_broadcast_retransmissions (e.g. 0 for a single broadcast)
514 */
515const hci_cmd_t hci_write_num_broadcast_retransmissions = {
516OPCODE(OGF_CONTROLLER_BASEBAND, 0x2a), "1"
517};
518
519/**
520 * @param host_acl_data_packet_length
521 * @param host_synchronous_data_packet_length
522 * @param host_total_num_acl_data_packets
523 * @param host_total_num_synchronous_data_packets
524 */
525const hci_cmd_t hci_host_buffer_size = {
526OPCODE(OGF_CONTROLLER_BASEBAND, 0x33), "2122"
527};
528
529/**
530 * @param handle
531 */
532const hci_cmd_t hci_read_link_supervision_timeout = {
533OPCODE(OGF_CONTROLLER_BASEBAND, 0x36), "H"
534};
535
536/**
537 * @param handle
538 * @param timeout (0x0001 - 0xFFFF Time -> Range: 0.625ms - 40.9 sec)
539 */
540const hci_cmd_t hci_write_link_supervision_timeout = {
541OPCODE(OGF_CONTROLLER_BASEBAND, 0x37), "H2"
542};
543
544/**
545 * @param inquiry_mode (0x00 = standard, 0x01 = with RSSI, 0x02 = extended)
546 */
547const hci_cmd_t hci_write_inquiry_mode = {
548OPCODE(OGF_CONTROLLER_BASEBAND, 0x45), "1"
549};
550
551/**
552 * @param fec_required
553 * @param exstended_inquiry_response
554 */
555const hci_cmd_t hci_write_extended_inquiry_response = {
556OPCODE(OGF_CONTROLLER_BASEBAND, 0x52), "1E"
557};
558
559/**
560 * @param mode (0 = off, 1 = on)
561 */
562const hci_cmd_t hci_write_simple_pairing_mode = {
563OPCODE(OGF_CONTROLLER_BASEBAND, 0x56), "1"
564};
565
566/**
567 */
568const hci_cmd_t hci_read_le_host_supported = {
569OPCODE(OGF_CONTROLLER_BASEBAND, 0x6c), ""
570// return: status, le supported host, simultaneous le host
571};
572
573/**
574 * @param le_supported_host
575 * @param simultaneous_le_host
576 */
577const hci_cmd_t hci_write_le_host_supported = {
578OPCODE(OGF_CONTROLLER_BASEBAND, 0x6d), "11"
579// return: status
580};
581
582
583/**
584 * Informational Parameters
585 */
586
587const hci_cmd_t hci_read_local_supported_features = {
588OPCODE(OGF_INFORMATIONAL_PARAMETERS, 0x03), ""
589};
590const hci_cmd_t hci_read_buffer_size = {
591OPCODE(OGF_INFORMATIONAL_PARAMETERS, 0x05), ""
592};
593const hci_cmd_t hci_read_bd_addr = {
594OPCODE(OGF_INFORMATIONAL_PARAMETERS, 0x09), ""
595};
596
597/**
598 * Status Paramters
599 */
600
601/**
602 * @param handle
603 */
604const hci_cmd_t hci_read_rssi = {
605OPCODE(OGF_STATUS_PARAMETERS, 0x05), "H"
606// no params
607};
608
609
610
611#ifdef HAVE_BLE
612/**
613 * Low Energy Commands
614 */
615
616/**
617 * @param event_mask_lower_octets
618 * @param event_mask_higher_octets
619 */
620const hci_cmd_t hci_le_set_event_mask = {
621OPCODE(OGF_LE_CONTROLLER, 0x01), "44"
622// return: status
623};
624
625const hci_cmd_t hci_le_read_buffer_size = {
626OPCODE(OGF_LE_CONTROLLER, 0x02), ""
627// return: status, le acl data packet len (16), total num le acl data packets(8)
628};
629const hci_cmd_t hci_le_read_supported_features = {
630OPCODE(OGF_LE_CONTROLLER, 0x03), ""
631// return: LE_Features See [Vol 6] Part B, Section 4.6
632};
633
634/**
635 * @param random_bd_addr
636 */
637const hci_cmd_t hci_le_set_random_address = {
638OPCODE(OGF_LE_CONTROLLER, 0x05), "B"
639// return: status
640};
641
642/**
643 * @param advertising_interval_min ([0x0020,0x4000], default: 0x0800, unit: 0.625 msec)
644 * @param advertising_interval_max ([0x0020,0x4000], default: 0x0800, unit: 0.625 msec)
645 * @param advertising_type (enum from 0: ADV_IND, ADC_DIRECT_IND, ADV_SCAN_IND, ADV_NONCONN_IND)
646 * @param own_address_type (enum from 0: public device address, random device address)
647 * @param direct_address_type ()
648 * @param direct_address (public or random address of device to be connecteed)
649 * @param advertising_channel_map (flags: chan_37(1), chan_38(2), chan_39(4))
650 * @param advertising_filter_policy (enum from 0: scan any conn any, scan whitelist, con any, scan any conn whitelist, scan whitelist, con whitelist)
651 */
652const hci_cmd_t hci_le_set_advertising_parameters = {
653OPCODE(OGF_LE_CONTROLLER, 0x06), "22111B11"
654// return: status
655};
656
657const hci_cmd_t hci_le_read_advertising_channel_tx_power = {
658OPCODE(OGF_LE_CONTROLLER, 0x07), ""
659// return: status, level [-20,10] signed int (8), units dBm
660};
661
662/**
663 * @param advertising_data_length
664 * @param advertising_data (31 bytes)
665 */
666const hci_cmd_t hci_le_set_advertising_data= {
667OPCODE(OGF_LE_CONTROLLER, 0x08), "1A"
668// return: status
669};
670
671/**
672 * @param scan_response_data_length
673 * @param scan_response_data (31 bytes)
674 */
675const hci_cmd_t hci_le_set_scan_response_data= {
676OPCODE(OGF_LE_CONTROLLER, 0x09), "1A"
677// return: status
678};
679
680/**
681 * @param advertise_enable (off: 0, on: 1)
682 */
683const hci_cmd_t hci_le_set_advertise_enable = {
684OPCODE(OGF_LE_CONTROLLER, 0x0a), "1"
685// return: status
686};
687
688/**
689 * @param le_scan_type (passive (0), active (1))
690 * @param le_scan_interval ([0x0004,0x4000], unit: 0.625 msec)
691 * @param le_scan_window ([0x0004,0x4000], unit: 0.625 msec)
692 * @param own_address_type (public (0), random (1))
693 * @param scanning_filter_policy (any (0), only whitelist (1))
694 */
695const hci_cmd_t hci_le_set_scan_parameters = {
696OPCODE(OGF_LE_CONTROLLER, 0x0b), "12211"
697// return: status
698};
699
700/**
701 * @param le_scan_enable (disabled (0), enabled (1))
702 * @param filter_duplices (disabled (0), enabled (1))
703 */
704const hci_cmd_t hci_le_set_scan_enable = {
705OPCODE(OGF_LE_CONTROLLER, 0x0c), "11"
706// return: status
707};
708
709/**
710 * @param le_scan_interval ([0x0004, 0x4000], unit: 0.625 msec)
711 * @param le_scan_window ([0x0004, 0x4000], unit: 0.625 msec)
712 * @param initiator_filter_policy (peer address type + peer address (0), whitelist (1))
713 * @param peer_address_type (public (0), random (1))
714 * @param peer_address
715 * @param own_address_type (public (0), random (1))
716 * @param conn_interval_min ([0x0006, 0x0c80], unit: 1.25 msec)
717 * @param conn_interval_max ([0x0006, 0x0c80], unit: 1.25 msec)
718 * @param conn_latency (number of connection events [0x0000, 0x01f4])
719 * @param supervision_timeout ([0x000a, 0x0c80], unit: 10 msec)
720 * @param minimum_CE_length ([0x0000, 0xffff], unit: 0.625 msec)
721 * @param maximum_CE_length ([0x0000, 0xffff], unit: 0.625 msec)
722 */
723const hci_cmd_t hci_le_create_connection= {
724OPCODE(OGF_LE_CONTROLLER, 0x0d), "2211B1222222"
725// return: none -> le create connection complete event
726};
727
728const hci_cmd_t hci_le_create_connection_cancel = {
729OPCODE(OGF_LE_CONTROLLER, 0x0e), ""
730// return: status
731};
732
733const hci_cmd_t hci_le_read_white_list_size = {
734OPCODE(OGF_LE_CONTROLLER, 0x0f), ""
735// return: status, number of entries in controller whitelist
736};
737
738const hci_cmd_t hci_le_clear_white_list = {
739OPCODE(OGF_LE_CONTROLLER, 0x10), ""
740// return: status
741};
742
743/**
744 * @param address_type (public (0), random (1))
745 * @param bd_addr
746 */
747const hci_cmd_t hci_le_add_device_to_whitelist = {
748OPCODE(OGF_LE_CONTROLLER, 0x11), "1B"
749// return: status
750};
751
752/**
753 * @param address_type (public (0), random (1))
754 * @param bd_addr
755 */
756const hci_cmd_t hci_le_remove_device_from_whitelist = {
757OPCODE(OGF_LE_CONTROLLER, 0x12), "1B"
758// return: status
759};
760
761/**
762 * @param conn_handle
763 * @param conn_interval_min ([0x0006,0x0c80], unit: 1.25 msec)
764 * @param conn_interval_max ([0x0006,0x0c80], unit: 1.25 msec)
765 * @param conn_latency ([0x0000,0x03e8], number of connection events)
766 * @param supervision_timeout ([0x000a,0x0c80], unit: 10 msec)
767 * @param minimum_CE_length ([0x0000,0xffff], unit: 0.625 msec)
768 * @param maximum_CE_length ([0x0000,0xffff], unit: 0.625 msec)
769 */
770const hci_cmd_t hci_le_connection_update = {
771OPCODE(OGF_LE_CONTROLLER, 0x13), "H222222"
772// return: none -> le connection update complete event
773};
774
775/**
776 * @param channel_map_lower_32bits
777 * @param channel_map_higher_5bits
778 */
779const hci_cmd_t hci_le_set_host_channel_classification = {
780OPCODE(OGF_LE_CONTROLLER, 0x14), "41"
781// return: status
782};
783
784/**
785 * @param conn_handle
786 */
787const hci_cmd_t hci_le_read_channel_map = {
788OPCODE(OGF_LE_CONTROLLER, 0x15), "H"
789// return: status, connection handle, channel map (5 bytes, 37 used)
790};
791
792/**
793 * @param conn_handle
794 */
795const hci_cmd_t hci_le_read_remote_used_features = {
796OPCODE(OGF_LE_CONTROLLER, 0x16), "H"
797// return: none -> le read remote used features complete event
798};
799
800/**
801 * @param key ((128) for AES-128)
802 * @param plain_text (128)
803 */
804const hci_cmd_t hci_le_encrypt = {
805OPCODE(OGF_LE_CONTROLLER, 0x17), "PP"
806// return: status, encrypted data (128)
807};
808
809const hci_cmd_t hci_le_rand = {
810OPCODE(OGF_LE_CONTROLLER, 0x18), ""
811// return: status, random number (64)
812};
813
814/**
815 * @param conn_handle
816 * @param random_number_lower_32bits
817 * @param random_number_higher_32bits
818 * @param encryption_diversifier (16)
819 * @param long_term_key (128)
820 */
821const hci_cmd_t hci_le_start_encryption = {
822OPCODE(OGF_LE_CONTROLLER, 0x19), "H442P"
823// return: none -> encryption changed or encryption key refresh complete event
824};
825
826/**
827 * @param connection_handle
828 * @param long_term_key (128)
829 */
830const hci_cmd_t hci_le_long_term_key_request_reply = {
831OPCODE(OGF_LE_CONTROLLER, 0x1a), "HP"
832// return: status, connection handle
833};
834
835/**
836 * @param conn_handle
837 */
838const hci_cmd_t hci_le_long_term_key_negative_reply = {
839OPCODE(OGF_LE_CONTROLLER, 0x1b), "H"
840// return: status, connection handle
841};
842
843/**
844 * @param conn_handle
845 */
846const hci_cmd_t hci_le_read_supported_states = {
847OPCODE(OGF_LE_CONTROLLER, 0x1c), "H"
848// return: status, LE states (64)
849};
850
851/**
852 * @param rx_frequency ([0x00 0x27], frequency (MHz): 2420 + N*2)
853 */
854const hci_cmd_t hci_le_receiver_test = {
855OPCODE(OGF_LE_CONTROLLER, 0x1d), "1"
856// return: status
857};
858
859/**
860 * @param tx_frequency ([0x00 0x27], frequency (MHz): 2420 + N*2)
861 * @param test_payload_lengh ([0x00,0x25])
862 * @param packet_payload ([0,7] different patterns)
863 */
864const hci_cmd_t hci_le_transmitter_test = {
865OPCODE(OGF_LE_CONTROLLER, 0x1e), "111"
866// return: status
867};
868
869/**
870 * @param end_test_cmd
871 */
872const hci_cmd_t hci_le_test_end = {
873OPCODE(OGF_LE_CONTROLLER, 0x1f), "1"
874// return: status, number of packets (8)
875};
876#endif
877
878
879// BTstack commands
880const hci_cmd_t btstack_get_state = {
881OPCODE(OGF_BTSTACK, BTSTACK_GET_STATE), ""
882};
883
884/**
885 * @param power_mode (0 = off, 1 = on)
886 */
887const hci_cmd_t btstack_set_power_mode = {
888OPCODE(OGF_BTSTACK, BTSTACK_SET_POWER_MODE), "1"
889};
890
891
892/**
893 * @param acl_capture_mode (0 = off, 1 = on)
894 */
895const hci_cmd_t btstack_set_acl_capture_mode = {
896OPCODE(OGF_BTSTACK, BTSTACK_SET_ACL_CAPTURE_MODE), "1"
897};
898
899const hci_cmd_t btstack_get_version = {
900OPCODE(OGF_BTSTACK, BTSTACK_GET_VERSION), ""
901};
902
903const hci_cmd_t btstack_get_system_bluetooth_enabled = {
904OPCODE(OGF_BTSTACK, BTSTACK_GET_SYSTEM_BLUETOOTH_ENABLED), ""
905};
906
907/**
908 * @param bluetooth_enabled_flag (0 = off, 1 = on, only used by btstack config)
909 */
910const hci_cmd_t btstack_set_system_bluetooth_enabled = {
911OPCODE(OGF_BTSTACK, BTSTACK_SET_SYSTEM_BLUETOOTH_ENABLED), "1"
912};
913
914/**
915 * @param discoverable_flag (0 = off, 1 = on)
916 */
917const hci_cmd_t btstack_set_discoverable = {
918OPCODE(OGF_BTSTACK, BTSTACK_SET_DISCOVERABLE), "1"
919};
920
921/**
922 * @param bluetooth_enabled_flag (0 = off, 1 = on, only used by btstack config)
923 */
924const hci_cmd_t btstack_set_bluetooth_enabled = {
925OPCODE(OGF_BTSTACK, BTSTACK_SET_BLUETOOTH_ENABLED), "1"
926};
927
928/**
929 * @param bd_addr (48)
930 * @param psm (16)
931 */
932const hci_cmd_t l2cap_create_channel = {
933OPCODE(OGF_BTSTACK, L2CAP_CREATE_CHANNEL), "B2"
934};
935
936/**
937 * @param bd_addr (48)
938 * @param psm (16)
939 * @param mtu (16)
940 */
941const hci_cmd_t l2cap_create_channel_mtu = {
942OPCODE(OGF_BTSTACK, L2CAP_CREATE_CHANNEL_MTU), "B22"
943// @param bd_addr(48), psm (16), mtu (16)
944};
945
946/**
947 * @param channel (16)
948 * @param reason (16)
949 */
950const hci_cmd_t l2cap_disconnect = {
951OPCODE(OGF_BTSTACK, L2CAP_DISCONNECT), "21"
952};
953
954/**
955 * @param psm (16)
956 * @param mtu (16)
957 */
958const hci_cmd_t l2cap_register_service = {
959OPCODE(OGF_BTSTACK, L2CAP_REGISTER_SERVICE), "22"
960};
961
962/**
963 * @param psm (16)
964 */
965const hci_cmd_t l2cap_unregister_service = {
966OPCODE(OGF_BTSTACK, L2CAP_UNREGISTER_SERVICE), "2"
967};
968
969/**
970 * @param source_cid (16)
971 */
972const hci_cmd_t l2cap_accept_connection = {
973OPCODE(OGF_BTSTACK, L2CAP_ACCEPT_CONNECTION), "2"
974};
975
976/**
977 * @param source_cid (16)
978 * @param reason
979 */
980const hci_cmd_t l2cap_decline_connection = {
981OPCODE(OGF_BTSTACK, L2CAP_DECLINE_CONNECTION), "21"
982};
983
984
985/**
986 * @param service_record
987 */
988const hci_cmd_t sdp_register_service_record = {
989OPCODE(OGF_BTSTACK, SDP_REGISTER_SERVICE_RECORD), "S"
990};
991
992/**
993 * @param service_record_handle
994 */
995const hci_cmd_t sdp_unregister_service_record = {
996OPCODE(OGF_BTSTACK, SDP_UNREGISTER_SERVICE_RECORD), "4"
997};
998
999/**
1000 * @param bd_addr
1001 * @param service_search_pattern
1002 */
1003const hci_cmd_t sdp_client_query_rfcomm_services = {
1004OPCODE(OGF_BTSTACK, SDP_CLIENT_QUERY_RFCOMM_SERVICES), "BS"
1005};
1006
1007/**
1008 * @param bd_addr
1009 * @param service_search_pattern
1010 * @param attribute_ID_list
1011 */
1012const hci_cmd_t sdp_client_query_services = {
1013OPCODE(OGF_BTSTACK, SDP_CLIENT_QUERY_SERVICES), "BSS"
1014};
1015
1016/**
1017 * @param bd_addr
1018 * @param server_channel
1019 */
1020const hci_cmd_t rfcomm_create_channel = {
1021OPCODE(OGF_BTSTACK, RFCOMM_CREATE_CHANNEL), "B1"
1022};
1023
1024/**
1025 * @param bd_addr
1026 * @param server_channel
1027 * @param mtu
1028 * @param credits
1029 */
1030const hci_cmd_t rfcomm_create_channel_with_initial_credits = {
1031OPCODE(OGF_BTSTACK, RFCOMM_CREATE_CHANNEL_WITH_CREDITS), "B121"
1032};
1033
1034/**
1035 * @param rfcomm_cid
1036 * @param credits
1037 */
1038const hci_cmd_t rfcomm_grants_credits= {
1039OPCODE(OGF_BTSTACK, RFCOMM_GRANT_CREDITS), "21"
1040};
1041
1042/**
1043 * @param rfcomm_cid
1044 * @param reason
1045 */
1046const hci_cmd_t rfcomm_disconnect = {
1047OPCODE(OGF_BTSTACK, RFCOMM_DISCONNECT), "21"
1048};
1049
1050/**
1051 * @param server_channel
1052 * @param mtu
1053 */
1054const hci_cmd_t rfcomm_register_service = {
1055OPCODE(OGF_BTSTACK, RFCOMM_REGISTER_SERVICE), "12"
1056};
1057
1058/**
1059 * @param server_channel
1060 * @param mtu
1061 * @param initial_credits
1062 */
1063const hci_cmd_t rfcomm_register_service_with_initial_credits = {
1064OPCODE(OGF_BTSTACK, RFCOMM_REGISTER_SERVICE_WITH_CREDITS), "121"
1065};
1066
1067/**
1068 * @param service_channel
1069 */
1070const hci_cmd_t rfcomm_unregister_service = {
1071OPCODE(OGF_BTSTACK, RFCOMM_UNREGISTER_SERVICE), "2"
1072};
1073
1074/**
1075 * @param source_cid
1076 */
1077const hci_cmd_t rfcomm_accept_connection = {
1078OPCODE(OGF_BTSTACK, RFCOMM_ACCEPT_CONNECTION), "2"
1079};
1080
1081
1082/**
1083 * @param source_cid
1084 * @param reason
1085 */
1086const hci_cmd_t rfcomm_decline_connection = {
1087OPCODE(OGF_BTSTACK, RFCOMM_DECLINE_CONNECTION), "21"
1088};
1089
1090// request persistent rfcomm channel number for named service
1091/**
1092 * @param named_service
1093 */
1094const hci_cmd_t rfcomm_persistent_channel_for_service = {
1095OPCODE(OGF_BTSTACK, RFCOMM_PERSISTENT_CHANNEL), "N"
1096};
1097
1098/**
1099 * @param handle
1100 */
1101const hci_cmd_t gap_disconnect_cmd = {
1102OPCODE(OGF_BTSTACK, GAP_DISCONNECT), "H"
1103};
1104
1105/**
1106 */
1107const hci_cmd_t gap_le_scan_start = {
1108OPCODE(OGF_BTSTACK, GAP_LE_SCAN_START), ""
1109};
1110
1111/**
1112 */
1113const hci_cmd_t gap_le_scan_stop = {
1114OPCODE(OGF_BTSTACK, GAP_LE_SCAN_STOP), ""
1115};
1116
1117/**
1118 * @param scan_type
1119 * @param scan_interval
1120 * @param scan_window
1121 */
1122const hci_cmd_t gap_le_set_scan_parameters = {
1123OPCODE(OGF_BTSTACK, GAP_LE_SET_SCAN_PARAMETERS), "122"
1124};
1125
1126/**
1127 * @param peer_address_type
1128 * @param peer_address
1129 */
1130const hci_cmd_t gap_le_connect_cmd = {
1131OPCODE(OGF_BTSTACK, GAP_LE_CONNECT), "1B"
1132};
1133
1134/**
1135 * @param peer_address_type
1136 * @param peer_address
1137 */
1138const hci_cmd_t gap_le_connect_cancel_cmd = {
1139OPCODE(OGF_BTSTACK, GAP_LE_CONNECT_CANCEL), ""
1140};
1141
1142/**
1143 * @param handle
1144 */
1145const hci_cmd_t gatt_discover_primary_services_cmd = {
1146OPCODE(OGF_BTSTACK, GATT_DISCOVER_ALL_PRIMARY_SERVICES), "H"
1147};
1148
1149/**
1150 * @param handle
1151 * @param uuid16
1152 */
1153const hci_cmd_t gatt_discover_primary_services_by_uuid16_cmd = {
1154 OPCODE(OGF_BTSTACK, GATT_DISCOVER_PRIMARY_SERVICES_BY_UUID16), "H2"
1155};
1156
1157/**
1158 * @param handle
1159 * @param uuid128
1160 */
1161const hci_cmd_t gatt_discover_primary_services_by_uuid128_cmd = {
1162 OPCODE(OGF_BTSTACK, GATT_DISCOVER_PRIMARY_SERVICES_BY_UUID128), "HU"
1163};
1164
1165/**
1166 * @param handle
1167 * @param service
1168 */
1169const hci_cmd_t gatt_find_included_services_for_service_cmd = {
1170 OPCODE(OGF_BTSTACK, GATT_FIND_INCLUDED_SERVICES_FOR_SERVICE), "HX"
1171};
1172
1173/**
1174 * @param handle
1175 * @param service
1176 */
1177const hci_cmd_t gatt_discover_characteristics_for_service_cmd = {
1178 OPCODE(OGF_BTSTACK, GATT_DISCOVER_CHARACTERISTICS_FOR_SERVICE), "HX"
1179};
1180
1181/**
1182 * @param handle
1183 * @param service
1184 * @param uuid128
1185 */
1186const hci_cmd_t gatt_discover_characteristics_for_service_by_uuid128_cmd = {
1187 OPCODE(OGF_BTSTACK, GATT_DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID128), "HXU"
1188};
1189
1190/**
1191 * @param handle
1192 * @param characteristic
1193 */
1194const hci_cmd_t gatt_discover_characteristic_descriptors_cmd = {
1195 OPCODE(OGF_BTSTACK, GATT_DISCOVER_CHARACTERISTIC_DESCRIPTORS), "HY"
1196};
1197
1198/**
1199 * @param handle
1200 * @param characteristic
1201 */
1202const hci_cmd_t gatt_read_value_of_characteristic_cmd = {
1203 OPCODE(OGF_BTSTACK, GATT_READ_VALUE_OF_CHARACTERISTIC), "HY"
1204};
1205
1206/**
1207 * @param handle
1208 * @param characteristic
1209 */
1210const hci_cmd_t gatt_read_long_value_of_characteristic_cmd = {
1211 OPCODE(OGF_BTSTACK, GATT_READ_LONG_VALUE_OF_CHARACTERISTIC), "HY"
1212};
1213
1214/**
1215 * @param handle
1216 * @param characteristic
1217 * @param data_length
1218 * @param data
1219 */
1220const hci_cmd_t gatt_write_value_of_characteristic_without_response_cmd = {
1221 OPCODE(OGF_BTSTACK, GATT_WRITE_VALUE_OF_CHARACTERISTIC_WITHOUT_RESPONSE), "HYLV"
1222};
1223
1224/**
1225 * @param handle
1226 * @param characteristic
1227 * @param data_length
1228 * @param data
1229 */
1230const hci_cmd_t gatt_write_value_of_characteristic_cmd = {
1231 OPCODE(OGF_BTSTACK, GATT_WRITE_VALUE_OF_CHARACTERISTIC), "HYLV"
1232};
1233
1234/**
1235 * @param handle
1236 * @param characteristic
1237 * @param data_length
1238 * @param data
1239 */
1240const hci_cmd_t gatt_write_long_value_of_characteristic_cmd = {
1241 OPCODE(OGF_BTSTACK, GATT_WRITE_LONG_VALUE_OF_CHARACTERISTIC), "HYLV"
1242};
1243
1244/**
1245 * @param handle
1246 * @param characteristic
1247 * @param data_length
1248 * @param data
1249 */
1250const hci_cmd_t gatt_reliable_write_long_value_of_characteristic_cmd = {
1251 OPCODE(OGF_BTSTACK, GATT_RELIABLE_WRITE_LONG_VALUE_OF_CHARACTERISTIC), "HYLV"
1252};
1253
1254/**
1255 * @param handle
1256 * @param descriptor
1257 */
1258const hci_cmd_t gatt_read_characteristic_descriptor_cmd = {
1259 OPCODE(OGF_BTSTACK, GATT_READ_CHARACTERISTIC_DESCRIPTOR), "HZ"
1260};
1261
1262/**
1263 * @param handle
1264 * @param descriptor
1265 */
1266const hci_cmd_t gatt_read_long_characteristic_descriptor_cmd = {
1267 OPCODE(OGF_BTSTACK, GATT_READ_LONG_CHARACTERISTIC_DESCRIPTOR), "HZ"
1268};
1269
1270/**
1271 * @param handle
1272 * @param descriptor
1273 * @param data_length
1274 * @param data
1275 */
1276const hci_cmd_t gatt_write_characteristic_descriptor_cmd = {
1277 OPCODE(OGF_BTSTACK, GATT_WRITE_CHARACTERISTIC_DESCRIPTOR), "HZLV"
1278};
1279
1280/**
1281 * @param handle
1282 * @param descriptor
1283 * @param data_length
1284 * @param data
1285 */
1286const hci_cmd_t gatt_write_long_characteristic_descriptor_cmd = {
1287 OPCODE(OGF_BTSTACK, GATT_WRITE_LONG_CHARACTERISTIC_DESCRIPTOR), "HZLV"
1288};
1289
1290/**
1291 * @param handle
1292 * @param characteristic
1293 * @param configuration
1294 */
1295const hci_cmd_t gatt_write_client_characteristic_configuration_cmd = {
1296 OPCODE(OGF_BTSTACK, GATT_WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION), "HY2"
1297};
Note: See TracBrowser for help on using the repository browser.