Rust XHCI Data Structure Types.

This commit is contained in:
Drew 2025-12-05 21:15:00 -08:00
parent d5d7e2c7ab
commit 8b022a6b24
11 changed files with 809 additions and 4 deletions

View file

@ -0,0 +1,134 @@
use bitfield_struct::bitfield;
#[bitfield(u128)]
pub struct SlotContextFields {
/// Route String. This field is used by hubs to route packets to the correct downstream port. The
/// format of the Route String is defined in section 8.9 the USB3 specification.
/// As Input, this field shall be set for all USB devices, irrespective of their speed, to indicate their
/// location in the USB topology.
#[bits(20)]
pub route_string: u32,
/// Speed. This field is deprecated in this version of the specification and shall be Reserved.
/// This field indicates the speed of the device. Refer to the PORTSC Port Speed field in Table 5-27
/// for the definition of the valid values
#[bits(4)]
pub speed: u8,
__: bool,
/// Multi-TT (MTT). This flag is set to '1' by software if this is a High-speed hub that supports
/// Multiple TTs and the Multiple TT Interface has been enabled by software, or if this is a Low-
/// /Full-speed device or Full-speed hub and connected to the xHC through a parent108 High-speed
/// hub that supports Multiple TTs and the Multiple TT Interface of the parent hub has been
/// enabled by software, or 0 if not.
pub multi_tt: bool,
/// Hub. This flag is set to '1' by software if this device is a USB hub, or '0' if it is a USB function
pub hub: bool,
/// Context Entries. This field identifies the index of the last valid Endpoint Context within this
/// Device Context structure. The value of 0 is Reserved and is not a valid entry for this field. Valid
/// entries for this field shall be in the range of 1-31. This field indicates the size of the Device
/// Context structure. For example, ((Context Entries+1) * 32 bytes) = Total bytes for this structure.
///
/// Note, Output Context Entries values are written by the xHC, and Input Context Entries values are
/// written by software.
#[bits(5)]
pub context_entries: u8,
/// Max Exit Latency. The Maximum Exit Latency is in microseconds, and indicates the worst case
/// time it takes to wake up all the links in the path to the device, given the current USB link level
/// power management settings.
///
/// Refer to section 4.23.5.2 for more information on the use of this field.
pub max_exit_latency: u16,
/// Root Hub Port Number. This field identifies the Root Hub Port Number used to access the USB
/// device. Refer to section 4.19.7 for port numbering information.
///
/// Note: Ports are numbered from 1 to MaxPorts
pub root_hub_port_number: u8,
/// Number of Ports. If this device is a hub (Hub = 1), then this field is set by software to identify
/// the number of downstream facing ports supported by the hub. Refer to the bNbrPorts field
/// description in the Hub Descriptor (Table 11-13) of the USB2 spec. If this device is not a hub (Hub
/// = 0), then this field shall be 0
pub number_of_ports: u8,
/// Parent Hub Slot ID. If this device is Low-/Full-speed and connected through a High-speed hub,
/// then this field shall contain the Slot ID of the parent High-speed hub109.
///
/// For SS and SSP bus instance, if this device is connected through a higher rank hub110 then this
/// field shall contain the Slot ID of the parent hub. For example, a Gen1 x1 connected behind a
/// Gen1 x2 hub, or Gen1 x2 device connected behind Gen2 x2 hub.
///
/// This field shall be 0 if any of the following are true:
/// Device is attached to a Root Hub port
/// Device is a High-Speed device
/// Device is the highest rank SS/SSP device supported by xHCI
pub parent_hub_slot_id: u8,
/// Parent Port Number. If this device is Low-/Full-speed and connected through a High-speed
/// hub, then this field shall contain the number of the downstream facing port of the parent High-
/// speed hub109.
/// For SS and SSP bus instance, if this device is connected through a higher rank hub110 then this
/// field shall contain the number of the downstream facing port of the parent hub. For example, a
/// Gen1 x1 connected behind a Gen1 x2 hub, or Gen1 x2 device connected behind Gen2 x2 hub.
/// This field shall be 0 if any of the following are true:
/// Device is attached to a Root Hub port
/// Device is a High-Speed device
/// Device is the highest rank SS/SSP device supported by xH
pub parent_port_number: u8,
/// TT Think Time (TTT). If this is a High-speed hub (Hub = 1 and Speed = High-Speed), then this
/// field shall be set by software to identify the time the TT of the hub requires to proceed to the
/// next full-/low-speed transaction.
/// Value Think Time
/// 0 TT requires at most 8 FS bit times of inter-transaction gap on a full-/low-speed
/// downstream bus.
/// 1 TT requires at most 16 FS bit times.
/// 2 TT requires at most 24 FS bit times.
/// 3 TT requires at most 32 FS bit times.
/// Refer to the TT Think Time sub-field of the wHubCharacteristics field description in the Hub
/// Descriptor (Table 11-13) and section 11.18.2 of the USB2 spec for more information on TT
/// Think Time. If this device is not a High-speed hub (Hub = 0 or Speed != High-speed), then this
/// field shall be 0.
#[bits(2)]
pub tt_think_time: u8,
#[bits(4)]
__: u8,
/// Interrupter Target. This field defines the index of the Interrupter that will receive Bandwidth
/// Request Events and Device Notification Events generated by this slot, or when a Ring Underrun
/// or Ring Overrun condition is reported (refer to section 4.10.3.1). Valid values are between 0 and
/// MaxIntrs-1
#[bits(10)]
pub interrupter_target: u16,
/// USB Device Address. This field identifies the address assigned to the USB device by the xHC,
/// and is set upon the successful completion of a Set Address Command. Refer to the USB2 spec
/// for a more detailed description.
///
/// As Output, this field is invalid if the Slot State = Disabled or Default.
/// As Input, software shall initialize the field to 0.
pub usb_device_address: u8,
#[bits(19)]
__: u32,
/// Slot State. This field is updated by the xHC when a Device Slot transitions from one state to
/// another.
/// Value Slot State
/// 0 Disabled/Enabled
/// 1 Default
/// 2 Addressed
/// 3 Configured
/// 31-4 Reserved
///
/// Slot States are defined in section 4.5.3.
///
/// As Output, since software initializes all fields of the Device Context data structure to 0, this field
/// shall initially indicate the Disabled state.
///
/// As Input, software shall initialize the field to 0.
/// Refer to section 4.5.3 for more information on Slot State.
#[bits(5)]
pub slot_state: u8,
}
#[repr(C)]
#[derive(Default)]
pub struct SlotContext {
pub fields: SlotContextFields,
__: u128,
}
const _: () = assert!(size_of::<SlotContext>() == 0x20);