Skip to content

Commit 30b9ced

Browse files
committed
uefi-raw: Add EFI_USB2_HC_PROTOCOL bindings
1 parent 6583ae5 commit 30b9ced

File tree

3 files changed

+159
-0
lines changed

3 files changed

+159
-0
lines changed

uefi-raw/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
- Added `AtaPassThruProtocol`.
1414
- Added `DevicePathUtilitiesProtocol`.
1515
- Added `UsbIoProtocol`.
16+
- Added `Usb2HostControllerProtocol`.
1617

1718

1819
# uefi-raw - 0.10.0 (2025-02-07)
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
// SPDX-License-Identifier: MIT OR Apache-2.0
2+
3+
use core::ffi;
4+
5+
use crate::{guid, Boolean, Guid, Status};
6+
7+
use super::{AsyncUsbTransferCallback, DataDirection, DeviceRequest, UsbTransferStatus};
8+
9+
newtype_enum! {
10+
pub enum HostControllerState: i32 => {
11+
HALT = 0,
12+
OPERATIONAL = 1,
13+
SUSPEND = 2,
14+
}
15+
}
16+
17+
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
18+
#[repr(C)]
19+
pub struct TransactionTranslator {
20+
pub hub_address: u8,
21+
pub port_number: u8,
22+
}
23+
24+
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
25+
#[repr(C)]
26+
pub struct PortStatus {
27+
pub port_status: u16,
28+
pub port_change_status: u16,
29+
}
30+
31+
newtype_enum! {
32+
pub enum PortFeature: i32 => {
33+
ENABLE = 1,
34+
SUSPEND = 2,
35+
RESET = 4,
36+
POWER = 8,
37+
OWNER = 13,
38+
CONNECT_CHANGE = 16,
39+
ENABLE_CHANGE = 17,
40+
SUSPEND_CHANGE = 18,
41+
OVER_CURRENT_CHARGE = 19,
42+
RESET_CHANGE = 20,
43+
}
44+
}
45+
46+
#[derive(Debug)]
47+
#[repr(C)]
48+
pub struct Usb2HostControllerProtocol {
49+
pub get_capability: unsafe extern "efiapi" fn(
50+
this: *const Self,
51+
max_speed: *mut u8,
52+
port_number: *mut u8,
53+
is_64_bit_capable: *mut u8,
54+
) -> Status,
55+
pub reset: unsafe extern "efiapi" fn(this: *mut Self, attributes: u16) -> Status,
56+
pub get_state:
57+
unsafe extern "efiapi" fn(this: *mut Self, state: *mut HostControllerState) -> Status,
58+
pub set_state: unsafe extern "efiapi" fn(this: *mut Self, state: HostControllerState) -> Status,
59+
pub control_transfer: unsafe extern "efiapi" fn(
60+
this: *mut Self,
61+
device_address: u8,
62+
device_speed: u8,
63+
maximum_packet_length: usize,
64+
request: *const DeviceRequest,
65+
transfer_direction: DataDirection,
66+
data: *mut ffi::c_void,
67+
data_length: *mut usize,
68+
timeout: usize,
69+
translator: *const TransactionTranslator,
70+
transfer_result: *mut UsbTransferStatus,
71+
) -> Status,
72+
pub bulk_transfer: unsafe extern "efiapi" fn(
73+
this: *mut Self,
74+
device_address: u8,
75+
endpoint_address: u8,
76+
device_speed: u8,
77+
maximum_packet_length: usize,
78+
data_buffers_number: u8,
79+
data: *const *const ffi::c_void,
80+
data_length: *mut usize,
81+
data_toggle: *mut u8,
82+
timeout: usize,
83+
translator: *const TransactionTranslator,
84+
transfer_result: *mut UsbTransferStatus,
85+
) -> Status,
86+
pub async_interrupt_transfer: unsafe extern "efiapi" fn(
87+
this: *mut Self,
88+
device_address: u8,
89+
endpoint_address: u8,
90+
device_speed: u8,
91+
maximum_packet_length: usize,
92+
is_new_transfer: Boolean,
93+
data_toggle: *mut u8,
94+
polling_interval: usize,
95+
data_length: usize,
96+
translator: *const TransactionTranslator,
97+
callback_function: AsyncUsbTransferCallback,
98+
context: *mut ffi::c_void,
99+
) -> Status,
100+
pub sync_interrupt_transfer: unsafe extern "efiapi" fn(
101+
this: *mut Self,
102+
device_address: u8,
103+
endpoint_address: u8,
104+
device_speed: u8,
105+
maximum_packet_length: usize,
106+
data: *mut ffi::c_void,
107+
data_length: *mut usize,
108+
data_toggle: *mut u8,
109+
timeout: usize,
110+
translator: *const TransactionTranslator,
111+
transfer_result: *mut UsbTransferStatus,
112+
) -> Status,
113+
pub isochronous_transfer: unsafe extern "efiapi" fn(
114+
this: *mut Self,
115+
device_address: u8,
116+
endpoint_address: u8,
117+
device_speed: u8,
118+
maximum_packet_length: usize,
119+
data_buffers_number: u8,
120+
data: *const *const ffi::c_void,
121+
data_length: usize,
122+
translator: *const TransactionTranslator,
123+
transfer_result: *mut UsbTransferStatus,
124+
) -> Status,
125+
pub async_isochronous_transfer: unsafe extern "efiapi" fn(
126+
this: *mut Self,
127+
device_address: u8,
128+
endpoint_address: u8,
129+
device_speed: u8,
130+
maximum_packet_length: usize,
131+
data_buffers_number: u8,
132+
data: *const *const ffi::c_void,
133+
data_length: usize,
134+
translator: *const TransactionTranslator,
135+
isochronous_callback: AsyncUsbTransferCallback,
136+
context: *mut ffi::c_void,
137+
) -> Status,
138+
pub get_root_hub_port_status: unsafe extern "efiapi" fn(
139+
this: *mut Self,
140+
port_number: u8,
141+
port_status: *mut PortStatus,
142+
) -> Status,
143+
pub set_root_hub_port_feature: unsafe extern "efiapi" fn(
144+
this: *mut Self,
145+
port_number: u8,
146+
port_feature: PortFeature,
147+
) -> Status,
148+
pub clear_root_hub_port_feature:
149+
unsafe extern "efiapi" fn(this: *mut Self, port_number: u8, feature: PortFeature) -> Status,
150+
151+
pub major_revision: u16,
152+
pub minor_revision: u16,
153+
}
154+
155+
impl Usb2HostControllerProtocol {
156+
pub const GUID: Guid = guid!("3e745226-9818-45b6-a2ac-d7cd0e8ba2bc");
157+
}

uefi-raw/src/protocol/usb/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use core::ffi;
44

55
use crate::Status;
66

7+
pub mod host_controller;
78
pub mod io;
89

910
newtype_enum! {

0 commit comments

Comments
 (0)