Пример #1
0
        unsafe internal CyUSBBOS(IntPtr handle, byte[] BosDescrData)
        {
            // initialize to null
            USB20_DeviceExt = null;
            SS_DeviceCap    = null;
            Container_ID    = null;


            // parse the Bos Descriptor data
            fixed(byte *buf = BosDescrData)
            {
                USB_BOS_DESCRIPTOR *BosDesc = (USB_BOS_DESCRIPTOR *)buf;

                _bLength         = BosDesc->bLength;
                _bDescriptorType = BosDesc->bDescriptorType;
                _bNumDeviceCaps  = BosDesc->bNumDeviceCaps;
                _wToatalLength   = BosDesc->wToatalLength;

                int totallen = _wToatalLength;

                totallen -= BosDesc->bLength;

                if (totallen < 0)
                {
                    return;
                }

                byte *DevCap = (byte *)(buf + BosDesc->bLength); // get nex descriptor

                for (int i = 0; i < _bNumDeviceCaps; i++)
                {
                    //check capability type
                    switch (DevCap[2])
                    {
                    case CyConst.USB_BOS_CAPABILITY_TYPE_USB20_EXT:
                    {
                        USB_BOS_USB20_DEVICE_EXTENSION *USB20_ext = (USB_BOS_USB20_DEVICE_EXTENSION *)DevCap;
                        totallen       -= USB20_ext->bLength;
                        DevCap          = (byte *)DevCap + USB20_ext->bLength;
                        USB20_DeviceExt = new CyBOS_USB20_DEVICE_EXT(handle, USB20_ext);
                        break;
                    }

                    case CyConst.USB_BOS_CAPABILITY_TYPE_SUPERSPEED_USB:
                    {
                        USB_BOS_SS_DEVICE_CAPABILITY *SS_Capability = (USB_BOS_SS_DEVICE_CAPABILITY *)DevCap;
                        totallen    -= SS_Capability->bLength;
                        DevCap       = (byte *)DevCap + SS_Capability->bLength;
                        SS_DeviceCap = new CyBOS_SS_DEVICE_CAPABILITY(handle, SS_Capability);
                        break;
                    }

                    case CyConst.USB_BOS_CAPABILITY_TYPE_CONTAINER_ID:
                    {
                        USB_BOS_CONTAINER_ID *USB_ContainerID = (USB_BOS_CONTAINER_ID *)DevCap;
                        totallen    -= USB_ContainerID->bLength;
                        DevCap       = (byte *)DevCap + USB_ContainerID->bLength;
                        Container_ID = new CyBOS_CONTAINER_ID(handle, USB_ContainerID);
                        break;
                    }

                    default:
                    {
                        InvalidDevCap = new InvalidDeviceCapability();
                        break;
                    }
                    }
                    if (totallen < 0)
                    {
                        break;
                    }
                }
            }
        }
Пример #2
0
        internal unsafe CyUSBBOS(IntPtr handle, byte[] BosDescrData)
        {
            // initialize to null
            USB20_DeviceExt = null;
            SS_DeviceCap = null;
            Container_ID = null;

            // parse the Bos Descriptor data
            fixed (byte* buf = BosDescrData)
            {
                USB_BOS_DESCRIPTOR* BosDesc = (USB_BOS_DESCRIPTOR*)buf;
                _bLength = BosDesc->bLength;
                _bDescriptorType = BosDesc->bDescriptorType;
                _bNumDeviceCaps = BosDesc->bNumDeviceCaps;
                _wToatalLength = BosDesc->wToatalLength;

                int totallen = _wToatalLength;
                totallen -= BosDesc->bLength;

                if (totallen < 0)
                    return;

                byte* DevCap = (byte*)(buf + BosDesc->bLength); // get nex descriptor

                for (int i = 0; i < _bNumDeviceCaps; i++)
                {
                    //check capability type
                    switch (DevCap[2])
                    {
                        case CyConst.USB_BOS_CAPABILITY_TYPE_USB20_EXT:
                            {
                                USB_BOS_USB20_DEVICE_EXTENSION* USB20_ext = (USB_BOS_USB20_DEVICE_EXTENSION*)DevCap;
                                totallen -= USB20_ext->bLength;
                                DevCap = (byte*)DevCap + USB20_ext->bLength;
                                USB20_DeviceExt = new CyBOS_USB20_DEVICE_EXT(handle, USB20_ext);
                                break;
                            }
                        case CyConst.USB_BOS_CAPABILITY_TYPE_SUPERSPEED_USB:
                            {
                                USB_BOS_SS_DEVICE_CAPABILITY* SS_Capability = (USB_BOS_SS_DEVICE_CAPABILITY*)DevCap;
                                totallen -= SS_Capability->bLength;
                                DevCap = (byte*)DevCap + SS_Capability->bLength;
                                SS_DeviceCap = new CyBOS_SS_DEVICE_CAPABILITY(handle, SS_Capability);
                                break;
                            }
                        case CyConst.USB_BOS_CAPABILITY_TYPE_CONTAINER_ID:
                            {
                                USB_BOS_CONTAINER_ID* USB_ContainerID = (USB_BOS_CONTAINER_ID*)DevCap;
                                totallen -= USB_ContainerID->bLength;
                                DevCap = (byte*)DevCap + USB_ContainerID->bLength;
                                Container_ID = new CyBOS_CONTAINER_ID(handle, USB_ContainerID);
                                break;
                            }
                        default:
                            {
                                InvalidDevCap = new InvalidDeviceCapability();
                                break;
                            }
                    }
                    if (totallen < 0)
                        break;
                }

            }
        }