aboutsummaryrefslogtreecommitdiff
path: root/pw_bluetooth/public/pw_bluetooth/hci_common.emb
blob: 211d80489668cf4f93c4a7e01164348100ae669e (plain)
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.