/*++ Copyright (c) Microsoft Corporation. All rights reserved. Module Name: USBDLIB.H Abstract: Services exported by USBD. Environment: Kernel & user mode Revision History: 06-10-96 : created --*/ #ifndef __USBDLIB_H__ #define __USBDLIB_H__ typedef struct _USBD_INTERFACE_LIST_ENTRY { PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor; PUSBD_INTERFACE_INFORMATION Interface; } USBD_INTERFACE_LIST_ENTRY, *PUSBD_INTERFACE_LIST_ENTRY; // // Macros for building URB requests // #define UsbBuildInterruptOrBulkTransferRequest(urb, \ length, \ pipeHandle, \ transferBuffer, \ transferBufferMDL, \ transferBufferLength, \ transferFlags, \ link) { \ (urb)->UrbHeader.Function = URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER; \ (urb)->UrbHeader.Length = (length); \ (urb)->UrbBulkOrInterruptTransfer.PipeHandle = (pipeHandle); \ (urb)->UrbBulkOrInterruptTransfer.TransferBufferLength = (transferBufferLength); \ (urb)->UrbBulkOrInterruptTransfer.TransferBufferMDL = (transferBufferMDL); \ (urb)->UrbBulkOrInterruptTransfer.TransferBuffer = (transferBuffer); \ (urb)->UrbBulkOrInterruptTransfer.TransferFlags = (transferFlags); \ (urb)->UrbBulkOrInterruptTransfer.UrbLink = (link); } #define UsbBuildGetDescriptorRequest(urb, \ length, \ descriptorType, \ descriptorIndex, \ languageId, \ transferBuffer, \ transferBufferMDL, \ transferBufferLength, \ link) { \ (urb)->UrbHeader.Function = URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE; \ (urb)->UrbHeader.Length = (length); \ (urb)->UrbControlDescriptorRequest.TransferBufferLength = (transferBufferLength); \ (urb)->UrbControlDescriptorRequest.TransferBufferMDL = (transferBufferMDL); \ (urb)->UrbControlDescriptorRequest.TransferBuffer = (transferBuffer); \ (urb)->UrbControlDescriptorRequest.DescriptorType = (descriptorType); \ (urb)->UrbControlDescriptorRequest.Index = (descriptorIndex); \ (urb)->UrbControlDescriptorRequest.LanguageId = (languageId); \ (urb)->UrbControlDescriptorRequest.UrbLink = (link); } #define UsbBuildGetStatusRequest(urb, \ op, \ index, \ transferBuffer, \ transferBufferMDL, \ link) { \ (urb)->UrbHeader.Function = (op); \ (urb)->UrbHeader.Length = sizeof(struct _URB_CONTROL_GET_STATUS_REQUEST); \ (urb)->UrbControlGetStatusRequest.TransferBufferLength = sizeof(USHORT); \ (urb)->UrbControlGetStatusRequest.TransferBufferMDL = (transferBufferMDL); \ (urb)->UrbControlGetStatusRequest.TransferBuffer = (transferBuffer); \ (urb)->UrbControlGetStatusRequest.Index = (index); \ (urb)->UrbControlGetStatusRequest.UrbLink = (link); } #define UsbBuildFeatureRequest(urb, \ op, \ featureSelector, \ index, \ link) { \ (urb)->UrbHeader.Function = (op); \ (urb)->UrbHeader.Length = sizeof(struct _URB_CONTROL_FEATURE_REQUEST); \ (urb)->UrbControlFeatureRequest.FeatureSelector = (featureSelector); \ (urb)->UrbControlFeatureRequest.Index = (index); \ (urb)->UrbControlFeatureRequest.UrbLink = (link); } #define UsbBuildSelectConfigurationRequest(urb, \ length, \ configurationDescriptor) { \ (urb)->UrbHeader.Function = URB_FUNCTION_SELECT_CONFIGURATION; \ (urb)->UrbHeader.Length = (length); \ (urb)->UrbSelectConfiguration.ConfigurationDescriptor = (configurationDescriptor); } #define UsbBuildSelectInterfaceRequest(urb, \ length, \ configurationHandle, \ interfaceNumber, \ alternateSetting) { \ (urb)->UrbHeader.Function = URB_FUNCTION_SELECT_INTERFACE; \ (urb)->UrbHeader.Length = (length); \ (urb)->UrbSelectInterface.Interface.AlternateSetting = (alternateSetting); \ (urb)->UrbSelectInterface.Interface.InterfaceNumber = (interfaceNumber); \ (urb)->UrbSelectInterface.ConfigurationHandle = (configurationHandle); } #define UsbBuildVendorRequest(urb, \ cmd, \ length, \ transferFlags, \ reservedbits, \ request, \ value, \ index, \ transferBuffer, \ transferBufferMDL, \ transferBufferLength, \ link) { \ (urb)->UrbHeader.Function = cmd; \ (urb)->UrbHeader.Length = (length); \ (urb)->UrbControlVendorClassRequest.TransferBufferLength = (transferBufferLength); \ (urb)->UrbControlVendorClassRequest.TransferBufferMDL = (transferBufferMDL); \ (urb)->UrbControlVendorClassRequest.TransferBuffer = (transferBuffer); \ (urb)->UrbControlVendorClassRequest.RequestTypeReservedBits = (reservedbits); \ (urb)->UrbControlVendorClassRequest.Request = (request); \ (urb)->UrbControlVendorClassRequest.Value = (value); \ (urb)->UrbControlVendorClassRequest.Index = (index); \ (urb)->UrbControlVendorClassRequest.TransferFlags = (transferFlags); \ (urb)->UrbControlVendorClassRequest.UrbLink = (link); } // This is just a special vendor class request. #define UsbBuildOsFeatureDescriptorRequest(urb, \ length, \ interface, \ index, \ transferBuffer, \ transferBufferMDL, \ transferBufferLength, \ link) { \ (urb)->UrbHeader.Function = URB_FUNCTION_GET_MS_FEATURE_DESCRIPTOR; \ (urb)->UrbHeader.Length = (length); \ (urb)->UrbOSFeatureDescriptorRequest.TransferBufferLength = (transferBufferLength); \ (urb)->UrbOSFeatureDescriptorRequest.TransferBufferMDL = (transferBufferMDL); \ (urb)->UrbOSFeatureDescriptorRequest.TransferBuffer = (transferBuffer); \ (urb)->UrbOSFeatureDescriptorRequest.InterfaceNumber = (interface); \ (urb)->UrbOSFeatureDescriptorRequest.MS_FeatureDescriptorIndex = (index); \ (urb)->UrbOSFeatureDescriptorRequest.UrbLink = (link); } // // Get the USB status code // #define URB_STATUS(urb) ((urb)->UrbHeader.Status) // // Macros used for select interface and select configuration requests // // // Calculates the size needed for a SELECT_CONFIGURATION URB request given // the number of interfaces and the total number of pipes in all interfaces // selected. // #ifdef OSR21_COMPAT #define GET_SELECT_CONFIGURATION_REQUEST_SIZE(totalInterfaces, totalPipes) \ (sizeof(struct _URB_SELECT_CONFIGURATION) + \ ((totalInterfaces-1) * sizeof(USBD_INTERFACE_INFORMATION)) + \ ((totalPipes)*sizeof(USBD_PIPE_INFORMATION))) #else #define GET_SELECT_CONFIGURATION_REQUEST_SIZE(totalInterfaces, totalPipes) \ (sizeof(struct _URB_SELECT_CONFIGURATION) + \ ((totalInterfaces-1) * sizeof(USBD_INTERFACE_INFORMATION)) + \ ((totalPipes-1)*sizeof(USBD_PIPE_INFORMATION))) #endif // // Calculates the size needed for a SELECT_INTERFACE URB request given // the number of pipes in the alternate interface selected. // #ifdef OSR21_COMPAT #define GET_SELECT_INTERFACE_REQUEST_SIZE(totalPipes) \ (sizeof(struct _URB_SELECT_INTERFACE) + \ ((totalPipes)*sizeof(USBD_PIPE_INFORMATION))) #else #define GET_SELECT_INTERFACE_REQUEST_SIZE(totalPipes) \ (sizeof(struct _URB_SELECT_INTERFACE) + \ ((totalPipes-1)*sizeof(USBD_PIPE_INFORMATION))) #endif // // Calculates the size of the interface information structure needed to describe // a give interface based on the number of endpoints. // #ifdef OSR21_COMPAT #define GET_USBD_INTERFACE_SIZE(numEndpoints) (sizeof(USBD_INTERFACE_INFORMATION) + \ sizeof(USBD_PIPE_INFORMATION)*(numEndpoints)) #else #define GET_USBD_INTERFACE_SIZE(numEndpoints) (sizeof(USBD_INTERFACE_INFORMATION) + \ (sizeof(USBD_PIPE_INFORMATION)*(numEndpoints)) \ - sizeof(USBD_PIPE_INFORMATION)) #endif // // Calculates the size of an iso urb request given the number of packets // #define GET_ISO_URB_SIZE(n) (sizeof(struct _URB_ISOCH_TRANSFER)+\ sizeof(USBD_ISO_PACKET_DESCRIPTOR)*n) #ifndef _USBD_ DECLSPEC_IMPORT VOID USBD_Debug_LogEntry( IN CHAR *Name, IN ULONG Info1, IN ULONG Info2, IN ULONG Info3 ); DECLSPEC_IMPORT VOID USBD_GetUSBDIVersion( PUSBD_VERSION_INFORMATION VersionInformation ); DECLSPEC_IMPORT PUSB_INTERFACE_DESCRIPTOR USBD_ParseConfigurationDescriptor( IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, IN UCHAR InterfaceNumber, IN UCHAR AlternateSetting ); /*++ Routine Description: This function is replaced by USBD_ParseConfigurationDescriptorEx Arguments: Return Value: --*/ DECLSPEC_IMPORT PURB USBD_CreateConfigurationRequest( IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, IN OUT PUSHORT Siz ); /*++ Routine Description: This function is replaced by USBD_CreateConfigurationRequestEx Arguments: Return Value: --*/ // // These APIS replace USBD_CreateConfigurationRequest, // USBD_ParseConfigurationDescriptor // DECLSPEC_IMPORT PUSB_COMMON_DESCRIPTOR USBD_ParseDescriptors( IN PVOID DescriptorBuffer, IN ULONG TotalLength, IN PVOID StartPosition, IN LONG DescriptorType ); /*++ Routine Description: Parses a group of standard USB configuration descriptors (returned from a device) for a specific descriptor type. Arguments: DescriptorBuffer - pointer to a block of contiguous USB desscriptors TotalLength - size in bytes of the Descriptor buffer StartPosition - starting position in the buffer to begin parsing, this must point to the begining of a USB descriptor. DescriptorType - USB descritor type to locate. Return Value: pointer to a usb descriptor with a DescriptorType field matching the input parameter or NULL if not found. --*/ DECLSPEC_IMPORT PUSB_INTERFACE_DESCRIPTOR USBD_ParseConfigurationDescriptorEx( IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, IN PVOID StartPosition, IN LONG InterfaceNumber, IN LONG AlternateSetting, IN LONG InterfaceClass, IN LONG InterfaceSubClass, IN LONG InterfaceProtocol ); /*++ Routine Description: Parses a standard USB configuration descriptor (returned from a device) for a specific interface, alternate setting class subclass or protocol codes Arguments: ConfigurationDescriptor - pointer to USB configuration descriptor, returned from a device (includes all interface and endpoint descriptors). StartPosition - pointer to starting position within the configuration descrptor to begin parsing -- this must be a valid usb descriptor. InterfaceNumber - interface number to find, (-1) match any AlternateSetting - alt setting number to find, (-1) match any InterfaceClass - class to find, (-1) match any InterfaceSubClass - subclass to find, (-1) match any InterfaceProtocol - protocol to find, (-1) match any Return Value: returns a pointer to the first interface descriptor matching the parameters passed in (starting from startposition) or NULL if no match is found. --*/ DECLSPEC_IMPORT PURB USBD_CreateConfigurationRequestEx( IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, IN PUSBD_INTERFACE_LIST_ENTRY InterfaceList ); /*++ Routine Description: Allocates and initilaizes a urb of sufficient size to configure a device based on the list of interfaces passed in. The interface list is a contiguous array of USBD_INTERFACE_LIST_ENTRIES each pointing to a specific interface descriptor to be incorporated in the request, the list is terminated by a list entry with an InterfaceDescriptor pointer of NULL. On return the interface field of each list entry is filled in with a pointer to the USBD_INTERFACE_INFORMATION structure within the URB corrisponding to the same interface descriptor. Arguments: ConfigurationDescriptor - pointer to USB configuration descriptor, returned from a device (includes all interface and endpoint descriptors). InterfaceList - list of interfaces we are interested in. Return Value: Pointer to initailized select_configuration urb. --*/ __declspec(dllexport) ULONG USBD_GetInterfaceLength( IN PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor, IN PUCHAR BufferEnd ); /*++ Routine Description: Returns the length (in bytes) of a given interface descriptor including all endpoint and class descriptors Arguments: InterfaceDescriptor BufferEnd - Pointer to the end of the buffer containing the descriptors Return Value: length of descriptors --*/ __declspec(dllexport) VOID USBD_RegisterHcFilter( PDEVICE_OBJECT DeviceObject, PDEVICE_OBJECT FilterDeviceObject ); /*++ Routine Description: Called by an HC filter driver after it attaches to the top of the host controller driver stack. Arguments: DeviceObject - current top of stack FilterDeviceObject - device object for the filter driver Return Value: none --*/ __declspec(dllexport) NTSTATUS USBD_GetPdoRegistryParameter( IN PDEVICE_OBJECT PhysicalDeviceObject, IN OUT PVOID Parameter, IN ULONG ParameterLength, IN PWCHAR KeyName, IN ULONG KeyNameLength ); /*++ Routine Description: Arguments: Return Value: --*/ __declspec(dllexport) NTSTATUS USBD_QueryBusTime( IN PDEVICE_OBJECT RootHubPdo, IN PULONG CurrentFrame ); /*++ Routine Description: Returns the current frame, callable at any IRQL Arguments: Return Value: --*/ DECLSPEC_IMPORT ULONG USBD_CalculateUsbBandwidth( ULONG MaxPacketSize, UCHAR EndpointType, BOOLEAN LowSpeed ); /*++ Routine Description: Returns bus bw consumed based on the endpoint type and packet size Arguments: Return Value: --*/ #endif /* _USBD_ */ #endif /* __USBDLIB_H__ */