unsafe void GetDevDescriptor() { int len = 56; // total size of buffer byte[] buffer = new byte[len]; bool bRetVal; fixed (byte* buf = buffer) { SINGLE_TRANSFER* transfer = (SINGLE_TRANSFER*)buf; transfer->SetupPacket.bmRequest = CyConst.TGT_DEVICE | CyConst.REQ_STD | CyConst.DIR_FROM_DEVICE; transfer->SetupPacket.bRequest = CyConst.USB_REQUEST_GET_DESCRIPTOR; transfer->SetupPacket.wValue = CyConst.USB_DEVICE_DESCRIPTOR_TYPE << 8; transfer->SetupPacket.wLength = 18; // size of the USB_DEVICE_DESCRIPTOR part transfer->SetupPacket.dwTimeOut = 5; transfer->BufferOffset = 38; // size of the SINGLE_TRANSFER part transfer->BufferLength = 18; fixed (byte* lpInBuffer = buffer) { fixed (byte* lpOutBuffer = buffer) { fixed (int* lpBytesXfered = _bytesXfered) { bRetVal = PInvoke.DeviceIoControl(_hDevice, CyConst.IOCTL_ADAPT_SEND_EP0_CONTROL_TRANSFER, (IntPtr)lpInBuffer, len, (IntPtr)lpOutBuffer, len, (IntPtr)lpBytesXfered, (IntPtr)null); } } } _usbdStatus = transfer->UsbdStatus; _ntStatus = transfer->NtStatus; if (bRetVal) { USB_DEVICE_DESCRIPTOR* descriptor = (USB_DEVICE_DESCRIPTOR*)(buf + 38); _usbDeviceDescriptor = *descriptor; _bcdUSB = descriptor->bcdUSB; _vendorID = descriptor->idVendor; _productID = descriptor->idProduct; _devClass = descriptor->bDeviceClass; _devSubClass = descriptor->bDeviceSubClass; _devProtocol = descriptor->bDeviceProtocol; if ((_bcdUSB & CyConst.bcdUSBJJMask) == CyConst.USB20MajorVer) _maxPacketSize = descriptor->bMaxPacketSize0; else _maxPacketSize = (int)(1 << descriptor->bMaxPacketSize0); _bcdDevice = descriptor->bcdDevice; _configs = descriptor->bNumConfigurations; } } }
public void GetDeviceDescriptor(ref USB_DEVICE_DESCRIPTOR descr) { if (_alreadyDisposed) throw new ObjectDisposedException(""); descr = _usbDeviceDescriptor; }