1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
|
# Copyright 2023 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
# This file contains Emboss definitions for Host Controller Interface packets
# and types found in the Bluetooth Core Specification. The Emboss compiler is
# used to generate a C++ header from this file.
[$default byte_order: "LittleEndian"]
[(cpp) namespace: "pw::bluetooth::emboss"]
# =========================== Common Definitions =================================
enum StatusCode:
-- HCI Error Codes. Refer to Core Spec v5.0, Vol 2, Part D for definitions and
-- descriptions. All enum values are in increasing numerical order, however the
-- values are listed below for clarity.
[maximum_bits: 8]
SUCCESS = 0x00
UNKNOWN_COMMAND = 0x01
UNKNOWN_CONNECTION_ID = 0x02
HARDWARE_FAILURE = 0x03
PAGE_TIMEOUT = 0x04
AUTHENTICATION_FAILURE = 0x05
PIN_OR_KEY_MISSING = 0x06
MEMORY_CAPACITY_EXCEEDED = 0x07
CONNECTION_TIMEOUT = 0x08
CONNECTION_LIMIT_EXCEEDED = 0x09
SYNCHRONOUS_CONNECTION_LIMIT_EXCEEDED = 0x0A
CONNECTION_ALREADY_EXISTS = 0x0B
COMMAND_DISALLOWED = 0x0C
CONNECTION_REJECTED_LIMITED_RESOURCES = 0x0D
CONNECTION_REJECTED_SECURITY = 0x0E
CONNECTION_REJECTED_BAD_BD_ADDR = 0x0F
CONNECTION_ACCEPT_TIMEOUT_EXCEEDED = 0x10
UNSUPPORTED_FEATURE_OR_PARAMETER = 0x11
INVALID_HCI_COMMAND_PARAMETERS = 0x12
REMOTE_USER_TERMINATED_CONNECTION = 0x13
REMOTE_DEVICE_TERMINATED_CONNECTION_LOW_RESOURCES = 0x14
REMOTE_DEVICE_TERMINATED_CONNECTION_POWER_OFF = 0x15
CONNECTION_TERMINATED_BY_LOCAL_HOST = 0x16
REPEATED_ATTEMPTS = 0x17
PAIRING_NOT_ALLOWED = 0x18
UNKNOWN_LMP_PDU = 0x19
UNSUPPORTED_REMOTE_FEATURE = 0x1A
SCO_OFFSET_REJECTED = 0x1B
SCO_INTERVAL_REJECTED = 0x1C
SCO_AIRMODE_REJECTED = 0x1D
INVALID_LMP_OR_LL_PARAMETERS = 0x1E
UNSPECIFIED_ERROR = 0x1F
UNSUPPORTED_LMP_OR_LL_PARAMETER_VALUE = 0x20
ROLE_CHANGE_NOT_ALLOWED = 0x21
LMP_OR_LL_RESPONSE_TIMEOUT = 0x22
LMP_ERROR_TRANSACTION_COLLISION = 0x23
LMP_PDU_NOT_ALLOWED = 0x24
ENCRYPTION_MODE_NOT_ACCEPTABLE = 0x25
LINK_KEY_CANNOT_BE_CHANGED = 0x26
REQUESTED_QOS_NOT_SUPPORTED = 0x27
INSTANT_PASSED = 0x28
PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED = 0x29
DIFFERENT_TRANSACTION_COLLISION = 0x2A
RESERVED_0 = 0x2B
QOS_UNACCEPTABLE_PARAMETER = 0x2C
QOS_REJECTED = 0x2D
CHANNEL_CLASSIFICATION_NOT_SUPPORTED = 0x2E
INSUFFICIENT_SECURITY = 0x2F
PARAMETER_OUT_OF_MANDATORY_RANGE = 0x30
RESERVED_1 = 0x31
ROLE_SWITCH_PENDING = 0x32
RESERVED_2 = 0x33
RESERVED_SLOT_VIOLATION = 0x34
ROLE_SWITCH_FAILED = 0x35
EXTENDED_INQUIRY_RESPONSE_TOO_LARGE = 0x36
SECURE_SIMPLE_PAIRING_NOT_SUPPORTED_BY_HOST = 0x37
HOST_BUSY_PAIRING = 0x38
CONNECTION_REJECTED_NO_SUITABLE_CHANNEL_FOUND = 0x39
CONTROLLER_BUSY = 0x3A
UNACCEPTABLE_CONNECTION_PARAMETERS = 0x3B
DIRECTED_ADVERTISING_TIMEOUT = 0x3C
CONNECTION_TERMINATED_MIC_FAILURE = 0x3D
CONNECTION_FAILED_TO_BE_ESTABLISHED = 0x3E
MAC_CONNECTION_FAILED = 0x3F
COARSE_CLOCK_ADJUSTMENT_REJECTED = 0x40
# 5.0
TYPE_0_SUBMAP_NOT_DEFINED = 0x41
UNKNOWN_ADVERTISING_IDENTIFIER = 0x42
LIMIT_REACHED = 0x43
OPERATION_CANCELLED_BY_HOST = 0x44
enum MajorDeviceClass:
[maximum_bits: 5]
MISCELLANEOUS = 0x00
COMPUTER = 0x01
PHONE = 0x02
LAN = 0x03
AUDIO_VIDEO = 0x04
PERIPHERAL = 0x05
IMAGING = 0x06
WEARABLE = 0x07
TOY = 0x08
HEALTH = 0x09
UNCATEGORIZED = 0x1F
bits MajorServiceClasses:
0 [+1] Flag limited_discoverable_mode
$next [+1] Flag le_audio
$next [+1] Flag reserved
$next [+1] Flag positioning
$next [+1] Flag networking
$next [+1] Flag rendering
$next [+1] Flag capturing
$next [+1] Flag object_transfer
$next [+1] Flag audio
$next [+1] Flag telephony
$next [+1] Flag information
enum ComputerMinorDeviceClass:
[maximum_bits: 6]
UNCATEGORIZED = 0x00
DESKTOP_WORKSTATION = 0x01
SERVER_CLASS = 0x02
LAPTOP = 0x03
HANDHELD_PC = 0x04
PALM_SIZE_PC = 0x05
WEARABLE = 0x06
TABLET = 0x07
enum PhoneMinorDeviceClass:
[maximum_bits: 6]
UNCATEGORIZED = 0x00
CELLULAR = 0x01
CORDLESS = 0x02
SMARTPHONE = 0x03
WIRED_MODEM_OR_VOID_GATEWAY = 0x04
COMMON_ISDN_ACCESS = 0x05
enum LANMinorDeviceClass:
[maximum_bits: 6]
FULLY_AVAILABLE = 0x00
UTILIZED_1_TO_17 = 0x08
UTILIZED_17_TO_33 = 0x10
UTILIZED_33_TO_50 = 0x18
UTILIZED_50_TO_67 = 0x20
UTILIZED_67_TO_83 = 0x28
UTILIZED_83_TO_99 = 0x30
NO_SERVICE_AVAILABLE = 0x38
enum AudioVideoMinorDeviceClass:
[maximum_bits: 6]
UNCATEGORIZED = 0x00
WEARABLE_HEADSET_DEVICE = 0x01
HANDS_FREE_DEVICE = 0x02
RESERVED_0 = 0x03
MICROPHONE = 0x04
LOUDSPEAKER = 0x05
HEADPHONES = 0x06
PORTABLE_AUDIO = 0x07
CAR_AUDIO = 0x08
SET_TOP_BOX = 0x09
HIFI_AUDIO_DEVICE = 0x0A
VCR = 0x0B
VIDEO_CAMERA = 0x0C
CAMCORDER = 0x0D
VIDEO_MONITOR = 0x0E
VIDEO_DISPLAY_AND_LOUDSPEAKER = 0x0F
VIDEO_CONFERENCING = 0x10
RESERVED_1 = 0x11
GAMING_TOY = 0x12
enum PeripheralMinorDeviceClass0:
[maximum_bits: 4]
UNCATEGORIZED = 0x00
JOYSTICK = 0x01
GAMEPAD = 0x02
REMOTE_CONTROL = 0x03
SENSING_DEVICE = 0x04
DIGITIZER_TABLET = 0x05
CARD_READER = 0x06
DIGITAL_PEN = 0x07
HANDHELD_SCANNER = 0x08
HANDHELD_GESTURAL_INPUT_DEVICE = 0x09
enum PeripheralMinorDeviceClass1:
[maximum_bits: 2]
UNCATEGORIZED = 0x00
KEYBOARD = 0x01
POINTING_DEVICE = 0x02
COMBO_KEYBOARD_POINTING_DEVICE = 0x03
bits PeripheralMinorDeviceClass:
0 [+4] PeripheralMinorDeviceClass0 device_class_0
$next [+2] PeripheralMinorDeviceClass1 device_class_1
enum ImagingMinorDeviceClass:
[maximum_bits: 2]
UNCATEGORIZED = 0x00
bits ImagingMinorDeviceClassBits:
0 [+2] ImagingMinorDeviceClass device_class
$next [+1] Flag display
$next [+1] Flag camera
$next [+1] Flag scanner
$next [+1] Flag printer
enum WearableMinorDeviceClass:
[maximum_bits: 6]
WRISTWATCH = 0x01
PAGER = 0x02
JACKET = 0x03
HELMET = 0x04
GLASSES = 0x05
enum ToyMinorDeviceClass:
[maximum_bits: 6]
ROBOT = 0x01
VEHICLE = 0x02
DOLL = 0x03
CONTROLLER = 0x04
GAME = 0x05
enum HealthMinorDeviceClass:
[maximum_bits: 6]
UNDEFINED = 0x00
BLOOD_PRESSURE_MONITOR = 0x01
THERMOMETER = 0x02
WEIGHING_SCALE = 0x03
GLUCOSE_METER = 0x04
PULSE_OXIMETER = 0x05
HEART_PULSE_RATE_MONITOR = 0x06
HEALTH_DATA_DISPLAY = 0x07
STEP_COUNTER = 0x08
BODY_COMPOSITION_ANALYZER = 0x09
PEAK_FLOW_MONITOR = 0x0A
MEDICATION_MONITOR = 0x0B
KNEE_PROSTHESIS = 0x0C
ANKLE_PROSTHESIS = 0x0D
GENERIC_HEALTH_MANAGER = 0x0E
PERSONAL_MOBILITY_DEVICE = 0x0F
enum GenericEnableParam:
-- Binary values that can be generically passed to HCI commands that expect a
-- 1-octet boolean "enable"/"disable" parameter.
[maximum_bits: 8]
DISABLE = 0x00
ENABLE = 0x01
enum GenericPresenceParam:
[maximum_bits: 8]
NOT_PRESENT = 0x00
PRESENT = 0x01
struct BdAddr:
-- Bluetooth Device Address
0 [+6] UInt bd_addr
bits ClassOfDevice:
-- Defined in Assigned Numbers for the Baseband
-- https://www.bluetooth.com/specifications/assigned-numbers/baseband
0 [+2] UInt zero
[requires: this == 0]
if major_device_class == MajorDeviceClass.COMPUTER:
2 [+6] ComputerMinorDeviceClass computer_minor_device_class
if major_device_class == MajorDeviceClass.PHONE:
2 [+6] PhoneMinorDeviceClass phone_minor_device_class
if major_device_class == MajorDeviceClass.LAN:
2 [+6] LANMinorDeviceClass lan_minor_device_class
if major_device_class == MajorDeviceClass.AUDIO_VIDEO:
2 [+6] AudioVideoMinorDeviceClass audio_video_minor_device_class
if major_device_class == MajorDeviceClass.PERIPHERAL:
2 [+6] PeripheralMinorDeviceClass peripheral_minor_device_class
if major_device_class == MajorDeviceClass.IMAGING:
2 [+6] ImagingMinorDeviceClassBits imaging_minor_device_class
if major_device_class == MajorDeviceClass.WEARABLE:
2 [+6] WearableMinorDeviceClass wearable_minor_device_class
if major_device_class == MajorDeviceClass.TOY:
2 [+6] ToyMinorDeviceClass toy_minor_device_class
if major_device_class == MajorDeviceClass.HEALTH:
2 [+6] HealthMinorDeviceClass health_minor_device_class
8 [+5] MajorDeviceClass major_device_class
$next [+11] MajorServiceClasses major_service_classes
enum ConnectionRole:
[maximum_bits: 8]
CENTRAL = 0x00
PERIPHERAL = 0x01
enum LEPeerAddressType:
-- Possible values that can be used for the address_type parameters in various
-- HCI commands
[maximum_bits: 8]
PUBLIC = 0x00
RANDOM = 0x01
ANONYMOUS = 0xFF
enum LEPeerAddressTypeNoAnon:
-- Possible values that can be used for the address_type parameters in various
-- HCI commands
[maximum_bits: 8]
PUBLIC = 0x00
RANDOM = 0x01
ANONYMOUS = 0xFF
bits ClockOffset:
-- Clock Offset. The lower 15 bits are set to the clock offset as retrieved
-- by an Inquiry. The highest bit is set to 1 if the rest of this parameter
-- is valid.
15 [+1] Flag valid
if valid:
0 [+15] UInt clock_offset
enum LEPrimaryAdvertisingPHY:
[maximum_bits: 8]
LE_1M = 0x01
LE_CODED = 0x03
LE_CODED_S2 = 0x04
enum LESecondaryAdvertisingPHY:
[maximum_bits: 8]
NONE = 0x00
LE_1M = 0x01
LE_2M = 0x02
LE_CODED = 0x03
LE_CODED_S2 = 0x04
enum LEAddressType:
-- Possible values that can be reported for various |*_address_type| parameters in various LE packets.
[maximum_bits: 8]
PUBLIC = 0x00
-- Public Device Address (default)
RANDOM = 0x01
-- Random Device Address
PUBLIC_IDENTITY = 0x02
-- Public Identity Address (corresponds to Resolved Private Address)
RANDOM_IDENTITY = 0x03
-- Random (static) Identity Address (corresponds to Resolved Private Address)
ANONYMOUS = 0xFF
-- No address provided (anonymous advertisement)
-- This is a special value that is only used in LE Advertising Report events.
enum PageScanRepetitionMode:
-- The page scan repetition mode, representing a maximum time between Page Scans.
-- (See Core Spec v5.0, Volume 2, Part B, Section 8.3.1)
[maximum_bits: 8]
R0_ = 0x00 # Continuous Scan
R1_ = 0x01 # <= 1.28s
R2_ = 0x02 # <= 2.56s
enum CodingFormat:
-- Coding formats from assigned numbers.
-- (https://www.bluetooth.com/specifications/assigned-numbers/host-controller-interface)
[maximum_bits: 8]
U_LAW = 0x00
A_LAW = 0x01
CVSD = 0x02
TRANSPARENT = 0x03
LINEAR_PCM = 0x04
MSBC = 0x05
LC3 = 0x06
G729A = 0x07
VENDOR_SPECIFIC = 0xFF
enum IoCapability:
-- All other values reserved for future use.
[maximum_bits: 8]
DISPLAY_ONLY = 0x00
DISPLAY_YES_NO = 0x01
KEYBOARD_ONLY = 0x02
NO_INPUT_NO_OUTPUT = 0x03
# inclusive-language: disable
enum AuthenticationRequirements:
-- All options without MITM do not require MITM protection, and a numeric
-- comparison with automatic accept is allowed.
-- All options with MITM do require MITM protection, and IO capabilities should
-- be used to determine the authentication procedure.
[maximum_bits: 8]
NO_BONDING = 0x00
MITM_NO_BONDING = 0x01
DEDICATED_BONDING = 0x02
MITM_DEDICATED_BONDING = 0x03
GENERAL_BONDING = 0x04
MITM_GENERAL_BONDING = 0x05
# inclusive-language: enable
struct LinkKey:
0 [+16] UInt:8[16] value
# ========================= HCI packet headers ==========================
bits OpCodeBits:
# Emboss currently lacks support for default field values and cross-type integral equality.
# (https://github.com/google/emboss/issues/21)
# (https://github.com/google/emboss/issues/23)
# Upon the addition of these features, we will transition OpCodeBits to be a parameterized
# field which defaults for each HCI packet type to its corresponding OpCode.
0 [+10] UInt ocf
$next [+6] UInt ogf
struct CommandHeader:
-- HCI Command packet header.
0 [+2] OpCodeBits opcode
$next [+1] UInt parameter_total_size
struct EventHeader:
-- HCI Event packet header.
0 [+1] UInt event_code
$next [+1] UInt parameter_total_size
struct CommandCompleteEvent:
-- Core Spec v5.3 Vol 4, Part E, Section 7.7.14
-- EventHeader.opcode == 0xe
let hdr_size = EventHeader.$size_in_bytes
0 [+hdr_size] EventHeader header
$next [+1] UInt num_hci_command_packets
$next [+2] OpCodeBits command_opcode
let event_fixed_size = $size_in_bytes-hdr_size
let return_parameters_size = header.parameter_total_size-event_fixed_size
struct VendorDebugEvent:
-- This opcode is reserved for vendor-specific debugging events.
-- See Core Spec v5.3 Vol 4, Part E, Section 5.4.4.
let hdr_size = EventHeader.$size_in_bytes
0 [+hdr_size] EventHeader header
$next [+1] UInt subevent_code
-- The event code for the vendor subevent.
|