//==================================================================================================================================================================== /// <summary> /// Gets the interface settings for the specified interface number /// </summary> /// <param name="deviceHandle">The device handle</param> /// <param name="alternateInterfaceNumber">The interface number</param> /// <param name="usbAltInterfaceDescriptor">An instance of UsbInterfaceDescriptor</param> /// <returns>True if the call succeeded otherwise false</returns> //==================================================================================================================================================================== private bool McUsb_QueryInterfaceSettings(SafeFileHandle deviceHandle, byte alternateInterfaceNumber, ref UsbInterfaceDescriptor usbAltInterfaceDescriptor) { int bytesReturned = 0; byte[] inBuffer = new byte[]{alternateInterfaceNumber}; byte[] outBuffer = new byte[sizeof(UsbInterfaceDescriptor)]; bool result = DeviceIoControl(deviceHandle, DeviceIOControlCodes.QueryInterfaceSettings, inBuffer, inBuffer.Length, outBuffer, outBuffer.Length, ref bytesReturned, IntPtr.Zero); int bufferIndex = 0; usbAltInterfaceDescriptor.Length = outBuffer[bufferIndex++]; usbAltInterfaceDescriptor.DescriptorType = outBuffer[bufferIndex++]; usbAltInterfaceDescriptor.InterfaceNumber = outBuffer[bufferIndex++]; usbAltInterfaceDescriptor.AlternateSetting = outBuffer[bufferIndex++]; usbAltInterfaceDescriptor.NumEndpoints = outBuffer[bufferIndex++]; usbAltInterfaceDescriptor.InterfaceClass = outBuffer[bufferIndex++]; usbAltInterfaceDescriptor.InterfaceSubClass = outBuffer[bufferIndex++]; usbAltInterfaceDescriptor.InterfaceProtocol = outBuffer[bufferIndex++]; usbAltInterfaceDescriptor.Interface = outBuffer[bufferIndex]; return result; }
//========================================================================= /// <summary> /// Initialize and configures the USB device /// </summary> /// <param name="deviceHandle">The handle to the device</param> /// <param name="deviceInfo">The device number</param> //========================================================================= protected void InitializeDevice(SafeFileHandle deviceHandle, DeviceInfo deviceInfo) { UsbInterfaceDescriptor uid = new UsbInterfaceDescriptor(); UsbPipeInformation pipeInfo = new UsbPipeInformation(); uid.Length = 0; uid.DescriptorType = 0; uid.InterfaceNumber = 0; uid.AlternateSetting = 0; uid.NumEndpoints = 0; uid.InterfaceClass = 0; uid.InterfaceSubClass = 0; uid.InterfaceProtocol = 0; uid.Interface = 0; pipeInfo.PipeType = 0; pipeInfo.PipeId = 0; pipeInfo.MaximumPacketSize = 0; pipeInfo.Interval = 0; if (!deviceHandle.IsInvalid) { if (McUsb_QueryInterfaceSettings(deviceHandle, 0, ref uid) == true) { m_deviceInitialized = true; // get the bulk pipes info for (byte i = 0; i < uid.NumEndpoints; i++) { McUsb_QueryPipe(deviceHandle, 0, i, ref pipeInfo); unsafe { if (pipeInfo.PipeType == UsbPipeType.Bulk) { if ((pipeInfo.PipeId & 0x80) == 0x80) { deviceInfo.EndPointIn = pipeInfo.PipeId; deviceInfo.MaxPacketSize = pipeInfo.MaximumPacketSize; } else { deviceInfo.EndPointOut = pipeInfo.PipeId; } } } } } } else { m_errorCode = ErrorCodes.DeviceHandleAlreadyCreated; } }