uefi_raw/protocol/usb/
mod.rs

1// SPDX-License-Identifier: MIT OR Apache-2.0
2
3use core::ffi;
4
5use bitflags::bitflags;
6
7use crate::{Status, newtype_enum};
8
9pub mod host_controller;
10pub mod io;
11
12newtype_enum! {
13    pub enum DataDirection: i32 => {
14        DATA_IN = 0,
15        DATA_OUT = 1,
16        NO_DATA = 2,
17    }
18}
19
20#[derive(Clone, Copy, Debug, PartialEq, Eq)]
21#[repr(C)]
22pub struct DeviceRequest {
23    pub request_type: u8,
24    pub request: u8,
25    pub value: u16,
26    pub index: u16,
27    pub length: u16,
28}
29
30bitflags! {
31    #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
32    #[repr(transparent)]
33    pub struct UsbTransferStatus: u32 {
34        const NOT_EXECUTE = 0x0001;
35        const STALL = 0x0002;
36        const BUFFER = 0x0004;
37        const BABBLE = 0x0008;
38        const NAK = 0x0010;
39        const CRC = 0x0020;
40        const TIMEOUT = 0x0040;
41        const BIT_STUFF = 0x0080;
42        const SYSTEM = 0x0100;
43    }
44}
45
46impl UsbTransferStatus {
47    pub const SUCCESS: Self = Self::empty();
48}
49
50pub type AsyncUsbTransferCallback = unsafe extern "efiapi" fn(
51    data: *mut ffi::c_void,
52    data_length: usize,
53    context: *mut ffi::c_void,
54    status: UsbTransferStatus,
55) -> Status;
56
57#[derive(Clone, Copy, Debug, PartialEq, Eq)]
58#[repr(C)]
59pub struct DeviceDescriptor {
60    pub length: u8,
61    pub descriptor_type: u8,
62    pub bcd_usb: u16,
63    pub device_class: u8,
64    pub device_subclass: u8,
65    pub device_protocol: u8,
66    pub max_packet_size: u8,
67    pub id_vendor: u16,
68    pub id_product: u16,
69    pub bcd_device: u16,
70    pub str_manufacturer: u8,
71    pub str_product: u8,
72    pub str_serial_number: u8,
73    pub num_configurations: u8,
74}
75
76#[derive(Clone, Copy, Debug, PartialEq, Eq)]
77#[repr(C)]
78pub struct ConfigDescriptor {
79    pub length: u8,
80    pub descriptor_type: u8,
81    pub total_length: u16,
82    pub num_interfaces: u8,
83    pub configuration_value: u8,
84    pub configuration: u8,
85    pub attributes: u8,
86    pub max_power: u8,
87}
88
89#[derive(Clone, Copy, Debug, PartialEq, Eq)]
90#[repr(C)]
91pub struct InterfaceDescriptor {
92    pub length: u8,
93    pub descriptor_type: u8,
94    pub interface_number: u8,
95    pub alternate_setting: u8,
96    pub num_endpoints: u8,
97    pub interface_class: u8,
98    pub interface_subclass: u8,
99    pub interface_protocol: u8,
100    pub interface: u8,
101}
102
103#[derive(Clone, Copy, Debug, PartialEq, Eq)]
104#[repr(C)]
105pub struct EndpointDescriptor {
106    pub length: u8,
107    pub descriptor_type: u8,
108    pub endpoint_address: u8,
109    pub attributes: u8,
110    pub max_packet_size: u16,
111    pub interval: u8,
112}