#ifndef INTERFACES_HPP #define INTERFACES_HPP //--------------------------------------------------------------------------- // // Object Hierarchy // -------------------------------------------------------------------- // | IRootHCDController | // | IHCDController Intel USB Universal Host Controller - 3A37 | // | IHCDController - Intel USB Universal HostController - 3A38 | // | IHCDController - Intel USB Universal HostController - 3A38 | // |------------------------------------------------------------------| // // // IHCDController Intel USB Universal Host Controller - 3A37 // IHubController // IUSBHardwareDevice // IDMAMemoryManager // IUSBQueue <- interacts with -> IUSBRequest // // // Each IHCDController creates an IUSBHardwareDevice class upon initialization. The // IUSBHardwareDevice class is used to abstract usb controller specifics. The IHubController // manages all attached devices and handles hub control ioctl requests. // // Each IUSBHardwareDevice has one IDMAMemoryManager and one IUSBQueue. The IDMAMemoryManager // is used to handle dma memory allocations. The IUSBQueue manages requests which are send to the // usb hardware. See IUSBRequest class for details. // struct _UHCI_QUEUE_HEAD; struct IDMAMemoryManager; struct IUSBQueue; //========================================================================================= // // class IUSBHardwareDevice // // Description: This class provides access to the usb hardware controller // #define DEFINE_ABSTRACT_USBUHCIHARDWAREDEVICE() \ STDMETHOD_(VOID, GetQueueHead)( THIS_ \ IN ULONG QueueHeadIndex, \ IN struct _UHCI_QUEUE_HEAD **OutQueueHead) PURE; #define IMP_IUHCIHARDWAREDEVICE \ STDMETHODIMP_(VOID) GetQueueHead( \ IN ULONG QueueHeadIndex, \ IN struct _UHCI_QUEUE_HEAD **OutQueueHead); DECLARE_INTERFACE_(IUHCIHardwareDevice, IUSBHardwareDevice) { DEFINE_ABSTRACT_UNKNOWN() DEFINE_ABSTRACT_USBHARDWAREDEVICE() DEFINE_ABSTRACT_USBUHCIHARDWAREDEVICE() }; typedef IUHCIHardwareDevice *PUHCIHARDWAREDEVICE; //========================================================================================= // // class IUSBRequest // // Description: This class is used to issue request to usb controller. The class is // initialized using InitializeXXX methods. You also need to call SetEndpoint to define the endpoint // In addition you can call SetCompletionDetails if you need to wait for the end of // the request or want to complete an irp. You call AddUSBRequest to add the request to the queue. // Once the request is completed the CompletionCallback is invoked. The CompletionCallback // will take care of any completion details which have been set. If the request is cancelled, the // CancelCallback routine is invoked. // #define DEFINE_ABSTRACT_USBUHCIREQUEST() \ STDMETHOD_(NTSTATUS, GetEndpointDescriptor)( THIS_ \ IN struct _UHCI_QUEUE_HEAD**OutDescriptor) PURE; \ \ STDMETHOD_(UCHAR, GetInterval)( THIS) PURE; \ \ STDMETHOD_(USB_DEVICE_SPEED, GetDeviceSpeed)( THIS) PURE; \ \ STDMETHOD_(VOID, CompletionCallback)( THIS) PURE; \ \ STDMETHOD_(VOID, FreeEndpointDescriptor)( THIS_ \ IN struct _UHCI_QUEUE_HEAD *OutDescriptor) PURE; #define IMP_IUHCIREQUEST \ STDMETHODIMP_(NTSTATUS) GetEndpointDescriptor(THIS_ \ IN struct _UHCI_QUEUE_HEAD**OutDescriptor); \ \ STDMETHODIMP_(UCHAR) GetInterval(THIS); \ \ STDMETHODIMP_(USB_DEVICE_SPEED) GetDeviceSpeed(THIS); \ \ STDMETHODIMP_(VOID) CompletionCallback(THIS); \ \ STDMETHODIMP_(VOID) FreeEndpointDescriptor(THIS_ \ IN struct _UHCI_QUEUE_HEAD * OutDescriptor); DECLARE_INTERFACE_(IUHCIRequest, IUSBRequest) { DEFINE_ABSTRACT_UNKNOWN() DEFINE_ABSTRACT_USBREQUEST() DEFINE_ABSTRACT_USBUHCIREQUEST() }; typedef IUHCIRequest *PUHCIREQUEST; //========================================================================================= // // class IUSBQueue // // Description: This class manages pending requests // #define DEFINE_ABSTRACT_USBUHCIQUEUE() \ STDMETHOD_(VOID, TransferInterrupt)( \ IN UCHAR ErrorInterrupt) PURE; #define IMP_IUHCIQUEUE \ STDMETHODIMP_(VOID) TransferInterrupt( \ IN UCHAR ErrorInterrupt); DECLARE_INTERFACE_(IUHCIQueue, IUSBQueue) { DEFINE_ABSTRACT_UNKNOWN() DEFINE_ABSTRACT_USBQUEUE() DEFINE_ABSTRACT_USBUHCIQUEUE() }; typedef IUHCIQueue *PUHCIQUEUE; #endif /* INTERFACES_HPP */