mirror of
https://github.com/reactos/reactos.git
synced 2024-10-22 05:46:19 +00:00
c2d0d784c7
- Create a branch to do a proper merge of USB work from a trunk base instead of from cmake-bringup - In the future, DO NOT under any circumstances branch another branch. This leads to merge problems! svn path=/branches/usb-bringup-trunk/; revision=55018
240 lines
5.8 KiB
C
240 lines
5.8 KiB
C
#pragma once
|
|
|
|
#include "hardware.h"
|
|
#include <ntifs.h>
|
|
#include <ntddk.h>
|
|
#include <stdio.h>
|
|
#define NDEBUG
|
|
#include <debug.h>
|
|
#include <hubbusif.h>
|
|
#include <usbioctl.h>
|
|
#include <usb.h>
|
|
|
|
#define USB_POOL_TAG (ULONG)'ebsu'
|
|
|
|
#define DEVICEINTIALIZED 0x01
|
|
#define DEVICESTARTED 0x02
|
|
#define DEVICEBUSY 0x04
|
|
#define DEVICESTOPPED 0x08
|
|
#define DEVICESTALLED 0x10
|
|
#define DEVICEREMOVED 0x20
|
|
|
|
|
|
#define MAX_USB_DEVICES 127
|
|
#define EHCI_MAX_SIZE_TRANSFER 0x100000
|
|
|
|
#define C_HUB_LOCAL_POWER 0
|
|
#define C_HUB_OVER_CURRENT 1
|
|
#define PORT_CONNECTION 0
|
|
#define PORT_ENABLE 1
|
|
#define PORT_SUSPEND 2
|
|
#define PORT_OVER_CURRENT 3
|
|
#define PORT_RESET 4
|
|
#define PORT_POWER 8
|
|
#define PORT_LOW_SPEED 9
|
|
#define PORT_HIGH_SPEED 9
|
|
#define C_PORT_CONNECTION 16
|
|
#define C_PORT_ENABLE 17
|
|
#define C_PORT_SUSPEND 18
|
|
#define C_PORT_OVER_CURRENT 19
|
|
#define C_PORT_RESET 20
|
|
#define PORT_TEST 21
|
|
#define PORT_INDICATOR 22
|
|
#define USB_PORT_STATUS_CHANGE 0x4000
|
|
|
|
typedef struct _USB_ENDPOINT
|
|
{
|
|
ULONG Flags;
|
|
LIST_ENTRY UrbList;
|
|
struct _USB_INTERFACE *Interface;
|
|
USB_ENDPOINT_DESCRIPTOR EndPointDescriptor;
|
|
} USB_ENDPOINT, *PUSB_ENDPOINT;
|
|
|
|
typedef struct _USB_INTERFACE
|
|
{
|
|
struct _USB_CONFIGURATION *Config;
|
|
USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
|
|
USB_ENDPOINT *EndPoints[];
|
|
} USB_INTERFACE, *PUSB_INTERFACE;
|
|
|
|
typedef struct _USB_CONFIGURATION
|
|
{
|
|
struct _USB_DEVICE *Device;
|
|
USB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor;
|
|
USB_INTERFACE *Interfaces[];
|
|
} USB_CONFIGURATION, *PUSB_CONFIGURATION;
|
|
|
|
typedef struct _USB_DEVICE
|
|
{
|
|
UCHAR Address;
|
|
ULONG Port;
|
|
PVOID ParentDevice;
|
|
BOOLEAN IsHub;
|
|
USB_DEVICE_SPEED DeviceSpeed;
|
|
USB_DEVICE_TYPE DeviceType;
|
|
ULONG DeviceState;
|
|
PDEVICE_OBJECT UsbDevicePdo;
|
|
USB_DEVICE_DESCRIPTOR DeviceDescriptor;
|
|
UNICODE_STRING LanguageIDs;
|
|
UNICODE_STRING iManufacturer;
|
|
UNICODE_STRING iProduct;
|
|
UNICODE_STRING iSerialNumber;
|
|
USB_CONFIGURATION *ActiveConfig;
|
|
USB_INTERFACE *ActiveInterface;
|
|
USB_CONFIGURATION **Configs;
|
|
} USB_DEVICE, *PUSB_DEVICE;
|
|
|
|
|
|
|
|
typedef struct _COMMON_DEVICE_EXTENSION
|
|
{
|
|
BOOLEAN IsFdo;
|
|
PDRIVER_OBJECT DriverObject;
|
|
PDEVICE_OBJECT DeviceObject;
|
|
} COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
|
|
|
|
typedef struct _FDO_DEVICE_EXTENSION
|
|
{
|
|
COMMON_DEVICE_EXTENSION Common;
|
|
PDRIVER_OBJECT DriverObject;
|
|
PDEVICE_OBJECT DeviceObject;
|
|
PDEVICE_OBJECT LowerDevice;
|
|
PDEVICE_OBJECT Pdo;
|
|
ULONG DeviceState;
|
|
PVOID RootHubDeviceHandle;
|
|
ULONG Vector;
|
|
KIRQL Irql;
|
|
|
|
KTIMER UpdateTimer;
|
|
KINTERRUPT_MODE Mode;
|
|
BOOLEAN IrqShared;
|
|
PKINTERRUPT EhciInterrupt;
|
|
KDPC DpcObject;
|
|
KDPC TimerDpcObject;
|
|
|
|
KAFFINITY Affinity;
|
|
|
|
ULONG BusNumber;
|
|
ULONG BusAddress;
|
|
ULONG PCIAddress;
|
|
USHORT VendorId;
|
|
USHORT DeviceId;
|
|
|
|
BUS_INTERFACE_STANDARD BusInterface;
|
|
|
|
union
|
|
{
|
|
ULONG ResourcePort;
|
|
ULONG ResourceMemory;
|
|
};
|
|
|
|
EHCI_HOST_CONTROLLER hcd;
|
|
PERIODICFRAMELIST PeriodicFrameList;
|
|
|
|
FAST_MUTEX FrameListMutex;
|
|
|
|
BOOLEAN AsyncComplete;
|
|
|
|
} FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
|
|
|
|
typedef struct _PDO_DEVICE_EXTENSION
|
|
{
|
|
COMMON_DEVICE_EXTENSION Common;
|
|
PDEVICE_OBJECT DeviceObject;
|
|
PDEVICE_OBJECT ControllerFdo;
|
|
PUSB_DEVICE UsbDevices[127];
|
|
LIST_ENTRY IrpQueue;
|
|
KSPIN_LOCK IrpQueueLock;
|
|
PIRP CurrentIrp;
|
|
HANDLE ThreadHandle;
|
|
ULONG ChildDeviceCount;
|
|
BOOLEAN HaltQueue;
|
|
PVOID CallbackContext;
|
|
RH_INIT_CALLBACK *CallbackRoutine;
|
|
USB_IDLE_CALLBACK IdleCallback;
|
|
PVOID IdleContext;
|
|
KTIMER Timer;
|
|
KEVENT QueueDrainedEvent;
|
|
FAST_MUTEX ListLock;
|
|
} PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
|
|
|
|
typedef struct _WORKITEMDATA
|
|
{
|
|
WORK_QUEUE_ITEM WorkItem;
|
|
PVOID Context;
|
|
} WORKITEMDATA, *PWORKITEMDATA;
|
|
|
|
VOID NTAPI
|
|
UrbWorkerThread(PVOID Context);
|
|
|
|
NTSTATUS NTAPI
|
|
GetBusInterface(PDEVICE_OBJECT pcifido, PBUS_INTERFACE_STANDARD busInterface);
|
|
|
|
NTSTATUS NTAPI
|
|
ForwardAndWaitCompletionRoutine(PDEVICE_OBJECT DeviceObject, PIRP Irp, PKEVENT Event);
|
|
|
|
NTSTATUS NTAPI
|
|
ForwardAndWait(PDEVICE_OBJECT DeviceObject, PIRP Irp);
|
|
|
|
NTSTATUS NTAPI
|
|
ForwardIrpAndForget(PDEVICE_OBJECT DeviceObject,PIRP Irp);
|
|
|
|
NTSTATUS NTAPI
|
|
FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
|
|
|
|
NTSTATUS NTAPI
|
|
PdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
|
|
|
|
NTSTATUS NTAPI
|
|
AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo);
|
|
|
|
NTSTATUS
|
|
DuplicateUnicodeString(ULONG Flags, PCUNICODE_STRING SourceString, PUNICODE_STRING DestinationString);
|
|
|
|
PWSTR
|
|
GetSymbolicName(PDEVICE_OBJECT DeviceObject);
|
|
|
|
PWSTR
|
|
GetPhysicalDeviceObjectName(PDEVICE_OBJECT DeviceObject);
|
|
|
|
NTSTATUS NTAPI
|
|
PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
|
|
|
|
NTSTATUS NTAPI
|
|
FdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
|
|
|
|
USBD_STATUS
|
|
ExecuteControlRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, UCHAR Address, ULONG Port, PVOID Buffer, ULONG BufferLength);
|
|
|
|
VOID
|
|
RequestURBCancel (PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp);
|
|
|
|
VOID
|
|
RemoveUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp);
|
|
|
|
VOID
|
|
QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp);
|
|
|
|
VOID
|
|
CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension);
|
|
|
|
NTSTATUS
|
|
HandleUrbRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp);
|
|
|
|
PUSB_DEVICE
|
|
DeviceHandleToUsbDevice(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PUSB_DEVICE_HANDLE DeviceHandle);
|
|
|
|
VOID
|
|
DumpDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR DeviceDescriptor);
|
|
|
|
VOID
|
|
DumpFullConfigurationDescriptor(PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor);
|
|
|
|
|
|
VOID
|
|
DumpTransferDescriptor(PQUEUE_TRANSFER_DESCRIPTOR TransferDescriptor);
|
|
|
|
VOID
|
|
DumpQueueHead(PQUEUE_HEAD QueueHead);
|
|
|