Skip to content

Instantly share code, notes, and snippets.

@tannewt
Last active July 6, 2023 23:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tannewt/4c03dfe354c5d979720c7167730554b3 to your computer and use it in GitHub Desktop.
Save tannewt/4c03dfe354c5d979720c7167730554b3 to your computer and use it in GitHub Desktop.
Start of Kaitai struct definition for usb descriptors
meta:
id: usb_descriptors
endian: le
bit-endian: le
seq:
- id: descriptor
type: usb_descriptor
repeat: eos
enums:
descriptor_type:
0x01: device
0x02: configuration
0x03: string
0x04: interface
0x05: endpoint
0x06: device_qualifier
0x07: other_speed_configuration
0x08: interface_power
0x09: otg
0x0A: debug
0x0B: interface_association
0x21: cs_device
0x0F: bos
0x10: device_capability
0x29: hub_descriptor
device_class:
0x00: reserved
0x02: communications
0x09: hub
0x11: billboard
0xDC: diagnostic
0xEF: miscellaneous
0xFF: vendor
interface_class:
0x00: reserved
0x01: audio
0x02: communications
0x03: human_interface_device
0x05: physical
0x06: image
0x07: printer
0x08: mass_storage
0x0A: cdc_data
0x0B: smart_card
0x0D: content_security
0x0E: video
0x0F: personal_healthcare
0x10: audio_video
0x12: type_c_bridge
0x13: bulk_display
0x3C: i3c
0xDC: diagnostic
0xE0: wireless_controller
0xEF: miscellaneous
0xFF: vendor
hub_protocol:
0x00: full_speed_hub
0x01: hi_speed_hub_with_single_tt
0x02: hi_speed_hub_with_multiple_tts
audio_video_sub_class:
0x01: avcontrol_interface
0x02: avdata_video_streaming_interface
0x03: avdata_audio_streaming_interface
hid_subclass:
0x00: no_subclass
0x01: boot
hid_protocol:
0x00: none
0x01: keyboard
0x02: mouse
transfer_type:
0: control
1: isochronous
2: bulk
3: interrupt
synchronization_type:
0: no_synchronization
1: asynchronous
2: adaptive
3: synchronous
usage_type:
0: data_endpoint
1: feedback_endpoint
2: implicit_feedback_data_endpoint
hid_country_code:
00: not_supported
01: arabic
02: belgian
03: canadian_bilingual
04: canadian_french
05: czech_republic
06: danish
07: finnish
08: french
09: german
10: greek
11: hebrew
12: hungary
13: international_iso
14: italian
15: japan_katakana
16: korean
17: latin_american
18: netherlands_dutch
19: norwegian
20: persian_farsi
21: poland
22: portuguese
23: russia
24: slovakia
25: spanish
26: swedish
27: swiss_french
28: swiss_german
29: switzerland
30: taiwan
31: turkish_q
32: uk
33: us
34: yugoslavia
35: turkish_f
types:
usb_descriptor:
seq:
- id: b_length
type: u1
doc: Total length of the descriptor
- id: b_descriptor_type
type: u1
enum: descriptor_type
doc: Type of the descriptor
- id: body
size: b_length - 2
type:
switch-on: b_descriptor_type
cases:
'descriptor_type::device': device_descriptor
'descriptor_type::configuration': configuration_descriptor
'descriptor_type::string': string_descriptor
'descriptor_type::interface': interface_descriptor
'descriptor_type::endpoint': endpoint_descriptor
'descriptor_type::cs_device': class_specific_descriptor
device_descriptor:
doc-ref: USB 2.0 Table 9-8
seq:
- id: bcd_usb
type: u2
- id: b_device_class
type: u1
enum: device_class
- id: b_device_sub_class
type: u1
- id: b_device_protocol
type: u1
- id: b_max_packet_size0
type: u1
- id: id_vendor
type: u2
- id: id_product
type: u2
- id: bcd_device
type: u2
- id: i_manufacturer
type: u1
- id: i_product
type: u1
- id: i_serial_number
type: u1
- id: b_num_configurations
type: u1
configuration_descriptor:
doc-ref: USB 2.0 Table 9-10
seq:
- id: w_total_length
type: u2
- id: b_num_interfaces
type: u1
- id: b_configuration_value
type: u1
- id: i_configuration
type: u1
- id: bm_attributes
type: u1
- id: b_max_power
type: u1
doc: Max power in milliamps
string_descriptor:
doc-ref: USB 2.0 Table 9-16
seq:
- id: b_string
type: str
encoding: UTF-16
size: _parent.b_length - 2
interface_descriptor:
doc-ref: USB 2.0 Table 9-12
seq:
- id: b_interface_number
type: u1
- id: b_alternate_setting
type: u1
- id: b_num_endpoints
type: u1
- id: b_interface_class
type: u1
enum: interface_class
- id: b_interface_sub_class
type: u1
enum: hid_subclass
- id: b_interface_protocol
type: u1
enum: hid_protocol
- id: i_interface
type: u1
endpoint_descriptor:
doc-ref: USB 2.0 Table 9-13
seq:
- id: b_endpoint_address
type: u1
# - id: bm_attributes
# type: u1
- id: transfer_type
type: b2
enum: transfer_type
- id: synchronization_type
type: b2
enum: synchronization_type
if: transfer_type == transfer_type::isochronous
- id: usage_type
type: b2
enum: usage_type
if: transfer_type == transfer_type::isochronous
- type: b2
if: transfer_type == transfer_type::isochronous
- type: b6
if: transfer_type != transfer_type::isochronous
- id: w_max_packet_size
type: u2
- id: b_interval
type: u1
descriptor_info:
seq:
- id: b_descriptor_type
type: u1
- id: w_descriptor_length
type: u2
hid_descriptor:
seq:
- id: bcd_hid
type: u2
- id: b_country_code
type: u1
enum: hid_country_code
- id: b_num_descriptors
type: u1
- id: descriptors
type: descriptor_info
repeat: eos
class_specific_descriptor:
seq:
- id: class_descriptor
size: _parent.b_length - 2
type: hid_descriptor
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment