diff options
Diffstat (limited to 'Kernel/Bus/USB/USBDescriptors.h')
-rw-r--r-- | Kernel/Bus/USB/USBDescriptors.h | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/Kernel/Bus/USB/USBDescriptors.h b/Kernel/Bus/USB/USBDescriptors.h new file mode 100644 index 0000000000..0e8486bd8a --- /dev/null +++ b/Kernel/Bus/USB/USBDescriptors.h @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2021, Jesse Buhagiar <jooster669@gmail.com> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <AK/Types.h> + +namespace Kernel::USB { + +struct [[gnu::packed]] USBDescriptorCommon { + u8 length; + u8 descriptor_type; +}; + +// +// Device Descriptor +// ================= +// +// This descriptor type (stored on the device), represents the device, and gives +// information related to it, such as the USB specification it complies to, +// as well as the vendor and product ID of the device. +// +// https://beyondlogic.org/usbnutshell/usb5.shtml#DeviceDescriptors +struct [[gnu::packed]] USBDeviceDescriptor { + USBDescriptorCommon descriptor_header; + u16 usb_spec_compliance_bcd; + u8 device_class; + u8 device_sub_class; + u8 device_protocol; + u8 max_packet_size; + u16 vendor_id; + u16 product_id; + u16 device_release_bcd; + u8 manufacturer_id_descriptor_index; + u8 product_string_descriptor_index; + u8 serial_number_descriptor_index; + u8 num_configurations; +}; + +// +// Configuration Descriptor +// ======================== +// +// A USB device can have multiple configurations, which tells us about how the +// device is physically configured (e.g how it's powered, max power consumption etc). +// +struct [[gnu::packed]] USBConfigurationDescriptor { + USBDescriptorCommon descriptor_header; + u16 total_length; + u8 number_of_interfaces; + u8 configuration_value; + u8 configuration_string_descriptor_index; + u8 attributes_bitmap; + u8 max_power_in_ma; +}; + +// +// Interface Descriptor +// ==================== +// +// An interface descriptor describes to us one or more endpoints, grouped +// together to define a singular function of a device. +// As an example, a USB webcam might have two interface descriptors; one +// for the camera, and one for the microphone. +// +struct [[gnu::packed]] USBInterfaceDescriptor { + USBDescriptorCommon descriptor_header; + u8 interface_id; + u8 alternate_setting; + u8 number_of_endpoints; + u8 interface_class_code; + u8 interface_sub_class_code; + u8 interface_protocol; + u8 interface_string_descriptor_index; +}; + +// +// Endpoint Descriptor +// =================== +// +// The lowest leaf in the configuration tree. And endpoint descriptor describes +// the physical transfer properties of the endpoint (that isn't endpoint0). +// The description given by this structure is used by a pipe to create a +// "connection" from the host to the device. +// https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/usb-endpoints-and-their-pipes +struct [[gnu::packed]] USBEndpointDescriptor { + USBDescriptorCommon descriptor_header; + u8 endpoint_address; + u8 endpoint_attributes_bitmap; + u16 max_packet_size; + u8 poll_interval_in_frames; +}; + +static constexpr u8 DESCRIPTOR_TYPE_DEVICE = 0x01; +static constexpr u8 DESCRIPTOR_TYPE_CONFIGURATION = 0x02; +static constexpr u8 DESCRIPTOR_TYPE_STRING = 0x03; +static constexpr u8 DESCRIPTOR_TYPE_INTERFACE = 0x04; +static constexpr u8 DESCRIPTOR_TYPE_ENDPOINT = 0x05; +static constexpr u8 DESCRIPTOR_TYPE_DEVICE_QUALIFIER = 0x06; + +} |