Line data Source code
1 0 : /* hci_vs.h - Bluetooth Host Control Interface Vendor Specific definitions */
2 :
3 : /*
4 : * Copyright (c) 2017-2018 Nordic Semiconductor ASA
5 : * Copyright (c) 2015-2016 Intel Corporation
6 : *
7 : * SPDX-License-Identifier: Apache-2.0
8 : */
9 : #ifndef ZEPHYR_INCLUDE_BLUETOOTH_HCI_VS_H_
10 : #define ZEPHYR_INCLUDE_BLUETOOTH_HCI_VS_H_
11 :
12 : #include <stdint.h>
13 :
14 : #include <zephyr/bluetooth/addr.h>
15 : #include <zephyr/bluetooth/hci.h>
16 : #include <zephyr/bluetooth/hci_types.h>
17 : #include <zephyr/net_buf.h>
18 :
19 : #ifdef __cplusplus
20 : extern "C" {
21 : #endif
22 :
23 0 : #define BT_VS_CMD_BIT_VERSION 0
24 0 : #define BT_VS_CMD_BIT_SUP_CMD 1
25 0 : #define BT_VS_CMD_BIT_SUP_FEAT 2
26 0 : #define BT_VS_CMD_BIT_SET_EVT_MASK 3
27 0 : #define BT_VS_CMD_BIT_RESET 4
28 0 : #define BT_VS_CMD_BIT_WRITE_BDADDR 5
29 0 : #define BT_VS_CMD_BIT_SET_TRACE_ENABLE 6
30 0 : #define BT_VS_CMD_BIT_READ_BUILD_INFO 7
31 0 : #define BT_VS_CMD_BIT_READ_STATIC_ADDRS 8
32 0 : #define BT_VS_CMD_BIT_READ_KEY_ROOTS 9
33 0 : #define BT_VS_CMD_BIT_READ_CHIP_TEMP 10
34 0 : #define BT_VS_CMD_BIT_READ_HOST_STACK_CMD 11
35 0 : #define BT_VS_CMD_BIT_SET_SCAN_REP_ENABLE 12
36 0 : #define BT_VS_CMD_BIT_WRITE_TX_POWER 13
37 0 : #define BT_VS_CMD_BIT_READ_TX_POWER 14
38 :
39 0 : #define BT_VS_CMD_SUP_FEAT(cmd) BT_LE_FEAT_TEST(cmd, \
40 : BT_VS_CMD_BIT_SUP_FEAT)
41 0 : #define BT_VS_CMD_READ_STATIC_ADDRS(cmd) BT_LE_FEAT_TEST(cmd, \
42 : BT_VS_CMD_BIT_READ_STATIC_ADDRS)
43 0 : #define BT_VS_CMD_READ_KEY_ROOTS(cmd) BT_LE_FEAT_TEST(cmd, \
44 : BT_VS_CMD_BIT_READ_KEY_ROOTS)
45 :
46 0 : #define BT_HCI_VS_HW_PLAT_INTEL 0x0001
47 0 : #define BT_HCI_VS_HW_PLAT_NORDIC 0x0002
48 0 : #define BT_HCI_VS_HW_PLAT_NXP 0x0003
49 :
50 0 : #define BT_HCI_VS_HW_VAR_NORDIC_NRF51X 0x0001
51 0 : #define BT_HCI_VS_HW_VAR_NORDIC_NRF52X 0x0002
52 0 : #define BT_HCI_VS_HW_VAR_NORDIC_NRF53X 0x0003
53 0 : #define BT_HCI_VS_HW_VAR_NORDIC_NRF54HX 0x0004
54 0 : #define BT_HCI_VS_HW_VAR_NORDIC_NRF54LX 0x0005
55 :
56 0 : #define BT_HCI_VS_FW_VAR_STANDARD_CTLR 0x0001
57 0 : #define BT_HCI_VS_FW_VAR_VS_CTLR 0x0002
58 0 : #define BT_HCI_VS_FW_VAR_FW_LOADER 0x0003
59 0 : #define BT_HCI_VS_FW_VAR_RESCUE_IMG 0x0004
60 0 : #define BT_HCI_OP_VS_READ_VERSION_INFO BT_OP(BT_OGF_VS, 0x0001)
61 0 : struct bt_hci_rp_vs_read_version_info {
62 0 : uint8_t status;
63 0 : uint16_t hw_platform;
64 0 : uint16_t hw_variant;
65 0 : uint8_t fw_variant;
66 0 : uint8_t fw_version;
67 0 : uint16_t fw_revision;
68 0 : uint32_t fw_build;
69 : } __packed;
70 :
71 0 : #define BT_HCI_OP_VS_READ_SUPPORTED_COMMANDS BT_OP(BT_OGF_VS, 0x0002)
72 0 : struct bt_hci_rp_vs_read_supported_commands {
73 0 : uint8_t status;
74 0 : uint8_t commands[64];
75 : } __packed;
76 :
77 0 : #define BT_HCI_OP_VS_READ_SUPPORTED_FEATURES BT_OP(BT_OGF_VS, 0x0003)
78 0 : struct bt_hci_rp_vs_read_supported_features {
79 0 : uint8_t status;
80 0 : uint8_t features[8];
81 : } __packed;
82 :
83 0 : #define BT_HCI_OP_VS_SET_EVENT_MASK BT_OP(BT_OGF_VS, 0x0004)
84 0 : struct bt_hci_cp_vs_set_event_mask {
85 0 : uint8_t event_mask[8];
86 : } __packed;
87 :
88 0 : #define BT_HCI_VS_RESET_SOFT 0x00
89 0 : #define BT_HCI_VS_RESET_HARD 0x01
90 0 : #define BT_HCI_OP_VS_RESET BT_OP(BT_OGF_VS, 0x0005)
91 0 : struct bt_hci_cp_vs_reset {
92 0 : uint8_t type;
93 : } __packed;
94 :
95 0 : #define BT_HCI_OP_VS_WRITE_BD_ADDR BT_OP(BT_OGF_VS, 0x0006)
96 0 : struct bt_hci_cp_vs_write_bd_addr {
97 0 : bt_addr_t bdaddr;
98 : } __packed;
99 :
100 0 : #define BT_HCI_VS_TRACE_DISABLED 0x00
101 0 : #define BT_HCI_VS_TRACE_ENABLED 0x01
102 :
103 0 : #define BT_HCI_VS_TRACE_HCI_EVTS 0x00
104 0 : #define BT_HCI_VS_TRACE_VDC 0x01
105 0 : #define BT_HCI_OP_VS_SET_TRACE_ENABLE BT_OP(BT_OGF_VS, 0x0007)
106 0 : struct bt_hci_cp_vs_set_trace_enable {
107 0 : uint8_t enable;
108 0 : uint8_t type;
109 : } __packed;
110 :
111 0 : #define BT_HCI_OP_VS_READ_BUILD_INFO BT_OP(BT_OGF_VS, 0x0008)
112 0 : struct bt_hci_rp_vs_read_build_info {
113 0 : uint8_t status;
114 0 : uint8_t info[0];
115 : } __packed;
116 :
117 0 : struct bt_hci_vs_static_addr {
118 0 : bt_addr_t bdaddr;
119 0 : uint8_t ir[16];
120 : } __packed;
121 :
122 0 : #define BT_HCI_OP_VS_READ_STATIC_ADDRS BT_OP(BT_OGF_VS, 0x0009)
123 0 : struct bt_hci_rp_vs_read_static_addrs {
124 0 : uint8_t status;
125 0 : uint8_t num_addrs;
126 0 : struct bt_hci_vs_static_addr a[0];
127 : } __packed;
128 :
129 0 : #define BT_HCI_OP_VS_READ_KEY_HIERARCHY_ROOTS BT_OP(BT_OGF_VS, 0x000a)
130 0 : struct bt_hci_rp_vs_read_key_hierarchy_roots {
131 0 : uint8_t status;
132 0 : uint8_t ir[16];
133 0 : uint8_t er[16];
134 : } __packed;
135 :
136 0 : #define BT_HCI_OP_VS_READ_CHIP_TEMP BT_OP(BT_OGF_VS, 0x000b)
137 0 : struct bt_hci_rp_vs_read_chip_temp {
138 0 : uint8_t status;
139 0 : int8_t temps;
140 : } __packed;
141 :
142 0 : struct bt_hci_vs_cmd {
143 0 : uint16_t vendor_id;
144 0 : uint16_t opcode_base;
145 : } __packed;
146 :
147 0 : #define BT_HCI_VS_VID_ANDROID 0x0001
148 0 : #define BT_HCI_VS_VID_MICROSOFT 0x0002
149 0 : #define BT_HCI_OP_VS_READ_HOST_STACK_CMDS BT_OP(BT_OGF_VS, 0x000c)
150 0 : struct bt_hci_rp_vs_read_host_stack_cmds {
151 0 : uint8_t status;
152 0 : uint8_t num_cmds;
153 0 : struct bt_hci_vs_cmd c[0];
154 : } __packed;
155 :
156 0 : #define BT_HCI_VS_SCAN_REQ_REPORTS_DISABLED 0x00
157 0 : #define BT_HCI_VS_SCAN_REQ_REPORTS_ENABLED 0x01
158 0 : #define BT_HCI_OP_VS_SET_SCAN_REQ_REPORTS BT_OP(BT_OGF_VS, 0x000d)
159 0 : struct bt_hci_cp_vs_set_scan_req_reports {
160 0 : uint8_t enable;
161 : } __packed;
162 :
163 0 : #define BT_HCI_VS_LL_HANDLE_TYPE_ADV 0x00
164 0 : #define BT_HCI_VS_LL_HANDLE_TYPE_SCAN 0x01
165 0 : #define BT_HCI_VS_LL_HANDLE_TYPE_CONN 0x02
166 0 : #define BT_HCI_VS_LL_TX_POWER_LEVEL_NO_PREF 0x7F
167 0 : #define BT_HCI_OP_VS_WRITE_TX_POWER_LEVEL BT_OP(BT_OGF_VS, 0x000e)
168 0 : struct bt_hci_cp_vs_write_tx_power_level {
169 0 : uint8_t handle_type;
170 0 : uint16_t handle;
171 0 : int8_t tx_power_level;
172 : } __packed;
173 :
174 0 : struct bt_hci_rp_vs_write_tx_power_level {
175 0 : uint8_t status;
176 0 : uint8_t handle_type;
177 0 : uint16_t handle;
178 0 : int8_t selected_tx_power;
179 : } __packed;
180 :
181 0 : #define BT_HCI_OP_VS_READ_TX_POWER_LEVEL BT_OP(BT_OGF_VS, 0x000f)
182 0 : struct bt_hci_cp_vs_read_tx_power_level {
183 0 : uint8_t handle_type;
184 0 : uint16_t handle;
185 : } __packed;
186 :
187 0 : struct bt_hci_rp_vs_read_tx_power_level {
188 0 : uint8_t status;
189 0 : uint8_t handle_type;
190 0 : uint16_t handle;
191 0 : int8_t tx_power_level;
192 : } __packed;
193 :
194 0 : #define BT_HCI_OP_VS_READ_USB_TRANSPORT_MODE BT_OP(BT_OGF_VS, 0x0010)
195 :
196 0 : struct bt_hci_rp_vs_read_usb_transport_mode {
197 0 : uint8_t status;
198 0 : uint8_t num_supported_modes;
199 0 : uint8_t supported_mode[0];
200 : } __packed;
201 :
202 0 : #define BT_HCI_VS_USB_H2_MODE 0x00
203 0 : #define BT_HCI_VS_USB_H4_MODE 0x01
204 :
205 0 : #define BT_HCI_OP_VS_SET_USB_TRANSPORT_MODE BT_OP(BT_OGF_VS, 0x0011)
206 :
207 0 : struct bt_hci_cp_vs_set_usb_transport_mode {
208 0 : uint8_t mode;
209 : } __packed;
210 :
211 0 : #define BT_HCI_OP_VS_SET_MIN_NUM_USED_CHANS BT_OP(BT_OGF_VS, 0x0012)
212 :
213 0 : struct bt_hci_cp_vs_set_min_num_used_chans {
214 0 : uint16_t handle;
215 0 : uint8_t phys;
216 0 : uint8_t min_used_chans;
217 : } __packed;
218 :
219 : /* Events */
220 :
221 0 : struct bt_hci_evt_vs {
222 0 : uint8_t subevent;
223 : } __packed;
224 :
225 0 : #define BT_HCI_EVT_VS_FATAL_ERROR 0x02
226 :
227 0 : #define BT_HCI_EVT_VS_ERROR_DATA_TYPE_STACK_FRAME 0x01
228 0 : #define BT_HCI_EVT_VS_ERROR_DATA_TYPE_CTRL_ASSERT 0x02
229 0 : #define BT_HCI_EVT_VS_ERROR_DATA_TYPE_TRACE 0x03
230 0 : struct bt_hci_vs_fata_error_cpu_data_cortex_m {
231 0 : uint32_t a1;
232 0 : uint32_t a2;
233 0 : uint32_t a3;
234 0 : uint32_t a4;
235 0 : uint32_t ip;
236 0 : uint32_t lr;
237 0 : uint32_t xpsr;
238 : } __packed;
239 0 : #define BT_HCI_EVT_VS_ERROR_CPU_TYPE_CORTEX_M 0x01
240 0 : struct bt_hci_vs_fatal_error_stack_frame {
241 0 : uint32_t reason;
242 0 : uint8_t cpu_type;
243 0 : uint8_t cpu_data[0];
244 : } __packed;
245 :
246 0 : struct bt_hci_evt_vs_fatal_error_trace_data {
247 0 : uint64_t pc;
248 0 : uint8_t err_info[0];
249 : } __packed;
250 :
251 0 : struct bt_hci_evt_vs_fatal_error {
252 0 : uint8_t type;
253 0 : uint8_t data[0];
254 : } __packed;
255 :
256 0 : #define BT_HCI_VS_TRACE_LMP_TX 0x01
257 0 : #define BT_HCI_VS_TRACE_LMP_RX 0x02
258 0 : #define BT_HCI_VS_TRACE_LLCP_TX 0x03
259 0 : #define BT_HCI_VS_TRACE_LLCP_RX 0x04
260 0 : #define BT_HCI_VS_TRACE_LE_CONN_IND 0x05
261 0 : #define BT_HCI_EVT_VS_TRACE_INFO 0x03
262 0 : struct bt_hci_evt_vs_trace_info {
263 0 : uint8_t type;
264 0 : uint8_t data[0];
265 : } __packed;
266 :
267 0 : #define BT_HCI_EVT_VS_SCAN_REQ_RX 0x04
268 0 : struct bt_hci_evt_vs_scan_req_rx {
269 0 : bt_addr_le_t addr;
270 0 : int8_t rssi;
271 : } __packed;
272 :
273 0 : struct bt_hci_le_iq_sample16 {
274 0 : int16_t i;
275 0 : int16_t q;
276 : } __packed;
277 :
278 0 : #define BT_HCI_EVT_VS_LE_CONNECTIONLESS_IQ_REPORT 0x5
279 0 : #define BT_HCI_VS_LE_CTE_REPORT_NO_VALID_SAMPLE 0x8000
280 0 : struct bt_hci_evt_vs_le_connectionless_iq_report {
281 0 : uint16_t sync_handle;
282 0 : uint8_t chan_idx;
283 0 : int16_t rssi;
284 0 : uint8_t rssi_ant_id;
285 0 : uint8_t cte_type;
286 0 : uint8_t slot_durations;
287 0 : uint8_t packet_status;
288 0 : uint16_t per_evt_counter;
289 0 : uint8_t sample_count;
290 0 : struct bt_hci_le_iq_sample16 sample[0];
291 : } __packed;
292 :
293 0 : #define BT_HCI_EVT_VS_LE_CONNECTION_IQ_REPORT 0x6
294 0 : struct bt_hci_evt_vs_le_connection_iq_report {
295 0 : uint16_t conn_handle;
296 0 : uint8_t rx_phy;
297 0 : uint8_t data_chan_idx;
298 0 : int16_t rssi;
299 0 : uint8_t rssi_ant_id;
300 0 : uint8_t cte_type;
301 0 : uint8_t slot_durations;
302 0 : uint8_t packet_status;
303 0 : uint16_t conn_evt_counter;
304 0 : uint8_t sample_count;
305 0 : struct bt_hci_le_iq_sample16 sample[0];
306 : } __packed;
307 :
308 : /* Event mask bits */
309 :
310 0 : #define BT_EVT_MASK_VS_FATAL_ERROR BT_EVT_BIT(1)
311 0 : #define BT_EVT_MASK_VS_TRACE_INFO BT_EVT_BIT(2)
312 0 : #define BT_EVT_MASK_VS_SCAN_REQ_RX BT_EVT_BIT(3)
313 0 : #define BT_EVT_MASK_VS_LE_CONNECTIONLESS_IQ_REPORT BT_EVT_BIT(4)
314 0 : #define BT_EVT_MASK_VS_LE_CONNECTION_IQ_REPORT BT_EVT_BIT(5)
315 :
316 0 : #define DEFAULT_VS_EVT_MASK \
317 : BT_EVT_MASK_VS_FATAL_ERROR | BT_EVT_MASK_VS_TRACE_INFO | BT_EVT_MASK_VS_SCAN_REQ_RX | \
318 : BT_EVT_MASK_VS_LE_CONNECTIONLESS_IQ_REPORT | \
319 : BT_EVT_MASK_VS_LE_CONNECTION_IQ_REPORT
320 :
321 : /* Mesh HCI commands */
322 0 : #define BT_HCI_MESH_REVISION 0x01
323 :
324 0 : #define BT_HCI_OP_VS_MESH BT_OP(BT_OGF_VS, 0x0042)
325 0 : #define BT_HCI_MESH_EVT_PREFIX 0xF0
326 :
327 0 : struct bt_hci_cp_mesh {
328 0 : uint8_t opcode;
329 : } __packed;
330 :
331 0 : #define BT_HCI_OC_MESH_GET_OPTS 0x00
332 0 : struct bt_hci_rp_mesh_get_opts {
333 0 : uint8_t status;
334 0 : uint8_t opcode;
335 0 : uint8_t revision;
336 0 : uint8_t ch_map;
337 0 : int8_t min_tx_power;
338 0 : int8_t max_tx_power;
339 0 : uint8_t max_scan_filter;
340 0 : uint8_t max_filter_pattern;
341 0 : uint8_t max_adv_slot;
342 0 : uint8_t max_tx_window;
343 0 : uint8_t evt_prefix_len;
344 0 : uint8_t evt_prefix;
345 : } __packed;
346 :
347 0 : #define BT_HCI_MESH_PATTERN_LEN_MAX 0x0f
348 :
349 0 : #define BT_HCI_OC_MESH_SET_SCAN_FILTER 0x01
350 0 : struct bt_hci_mesh_pattern {
351 0 : uint8_t pattern_len;
352 0 : uint8_t pattern[0];
353 : } __packed;
354 :
355 0 : struct bt_hci_cp_mesh_set_scan_filter {
356 0 : uint8_t scan_filter;
357 0 : uint8_t filter_dup;
358 0 : uint8_t num_patterns;
359 0 : struct bt_hci_mesh_pattern patterns[0];
360 : } __packed;
361 0 : struct bt_hci_rp_mesh_set_scan_filter {
362 0 : uint8_t status;
363 0 : uint8_t opcode;
364 0 : uint8_t scan_filter;
365 : } __packed;
366 :
367 0 : #define BT_HCI_OC_MESH_ADVERTISE 0x02
368 0 : struct bt_hci_cp_mesh_advertise {
369 0 : uint8_t adv_slot;
370 0 : uint8_t own_addr_type;
371 0 : bt_addr_t random_addr;
372 0 : uint8_t ch_map;
373 0 : int8_t tx_power;
374 0 : uint8_t min_tx_delay;
375 0 : uint8_t max_tx_delay;
376 0 : uint8_t retx_count;
377 0 : uint8_t retx_interval;
378 0 : uint8_t scan_delay;
379 0 : uint16_t scan_duration;
380 0 : uint8_t scan_filter;
381 0 : uint8_t data_len;
382 0 : uint8_t data[31];
383 : } __packed;
384 0 : struct bt_hci_rp_mesh_advertise {
385 0 : uint8_t status;
386 0 : uint8_t opcode;
387 0 : uint8_t adv_slot;
388 : } __packed;
389 :
390 0 : #define BT_HCI_OC_MESH_ADVERTISE_TIMED 0x03
391 0 : struct bt_hci_cp_mesh_advertise_timed {
392 0 : uint8_t adv_slot;
393 0 : uint8_t own_addr_type;
394 0 : bt_addr_t random_addr;
395 0 : uint8_t ch_map;
396 0 : int8_t tx_power;
397 0 : uint8_t retx_count;
398 0 : uint8_t retx_interval;
399 0 : uint32_t instant;
400 0 : uint16_t tx_delay;
401 0 : uint16_t tx_window;
402 0 : uint8_t data_len;
403 0 : uint8_t data[31];
404 : } __packed;
405 0 : struct bt_hci_rp_mesh_advertise_timed {
406 0 : uint8_t status;
407 0 : uint8_t opcode;
408 0 : uint8_t adv_slot;
409 : } __packed;
410 :
411 0 : #define BT_HCI_OC_MESH_ADVERTISE_CANCEL 0x04
412 0 : struct bt_hci_cp_mesh_advertise_cancel {
413 0 : uint8_t adv_slot;
414 : } __packed;
415 0 : struct bt_hci_rp_mesh_advertise_cancel {
416 0 : uint8_t status;
417 0 : uint8_t opcode;
418 0 : uint8_t adv_slot;
419 : } __packed;
420 :
421 0 : #define BT_HCI_OC_MESH_SET_SCANNING 0x05
422 0 : struct bt_hci_cp_mesh_set_scanning {
423 0 : uint8_t enable;
424 0 : uint8_t ch_map;
425 0 : uint8_t scan_filter;
426 : } __packed;
427 0 : struct bt_hci_rp_mesh_set_scanning {
428 0 : uint8_t status;
429 0 : uint8_t opcode;
430 : } __packed;
431 :
432 : /* Events */
433 0 : struct bt_hci_evt_mesh {
434 0 : uint8_t prefix;
435 0 : uint8_t subevent;
436 : } __packed;
437 :
438 0 : #define BT_HCI_EVT_MESH_ADV_COMPLETE 0x00
439 0 : struct bt_hci_evt_mesh_adv_complete {
440 0 : uint8_t adv_slot;
441 : } __packed;
442 :
443 0 : #define BT_HCI_EVT_MESH_SCANNING_REPORT 0x01
444 0 : struct bt_hci_evt_mesh_scan_report {
445 0 : bt_addr_le_t addr;
446 0 : uint8_t chan;
447 0 : int8_t rssi;
448 0 : uint32_t instant;
449 0 : uint8_t data_len;
450 0 : uint8_t data[0];
451 : } __packed;
452 0 : struct bt_hci_evt_mesh_scanning_report {
453 0 : uint8_t num_reports;
454 0 : struct bt_hci_evt_mesh_scan_report reports[0];
455 : } __packed;
456 :
457 0 : struct net_buf *hci_vs_err_stack_frame(unsigned int reason, const struct arch_esf *esf);
458 0 : struct net_buf *hci_vs_err_trace(const char *file, uint32_t line, uint64_t pc);
459 0 : struct net_buf *hci_vs_err_assert(const char *file, uint32_t line);
460 :
461 : #ifdef __cplusplus
462 : }
463 : #endif
464 :
465 : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_HCI_VS_H_ */
|