示例#1
0
        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;
                }
            }
        }
示例#2
0
 public void GetDeviceDescriptor(ref USB_DEVICE_DESCRIPTOR descr)
 {
     if (_alreadyDisposed) throw new ObjectDisposedException("");
     descr = _usbDeviceDescriptor;
 }