Exemple #1
0
        public List <DfuDevice> GetDfuDevices(ushort idVendor, ushort idProduct)
        {
            var list        = IntPtr.Zero;
            var dfu_devices = new List <DfuDevice>();
            var ret         = NativeMethods.libusb_get_device_list(handle, ref list);

            if (ret < 0)
            {
                throw new Exception(string.Format("Error: {0} while trying to get the device list", ret));
            }

            var devices = new IntPtr[ret];

            Marshal.Copy(list, devices, 0, ret);

            // This is awful nested looping -- we should fix it.
            for (int i = 0; i < ret; i++)
            {
                var device_descriptor = new DeviceDescriptor();
                var ptr = IntPtr.Zero;

                if (NativeMethods.libusb_get_device_descriptor(devices[i], ref device_descriptor) != 0)
                {
                    continue;
                }

                if (device_descriptor.idVendor != idVendor && device_descriptor.idProduct != idProduct)
                {
                    continue;
                }

                for (int j = 0; j < device_descriptor.bNumConfigurations; j++)
                {
                    ret = NativeMethods.libusb_get_config_descriptor(devices[i], (ushort)j, out ptr);

                    if (ret < 0)
                    {
                        throw new Exception(string.Format("Error: {0} while trying to get the config descriptor", ret));
                    }

                    var config_descriptor = Marshal.PtrToStructure <ConfigDescriptor>(ptr);

                    for (int k = 0; k < config_descriptor.bNumInterfaces; k++)
                    {
                        var p = config_descriptor.interfaces + j * Marshal.SizeOf <@Interface>();

                        if (p == IntPtr.Zero)
                        {
                            continue;
                        }

                        var @interface = Marshal.PtrToStructure <@Interface>(p);
                        for (int l = 0; l < @interface.num_altsetting; l++)
                        {
                            var interface_descriptor = @interface.Altsetting[l];

                            // Ensure this is a DFU descriptor
                            if (interface_descriptor.bInterfaceClass != 0xfe || interface_descriptor.bInterfaceSubClass != 0x1)
                            {
                                continue;
                            }

                            var dfu_descriptor = FindDescriptor(interface_descriptor.extra, interface_descriptor.extra_length, (byte)Consts.USB_DT_DFU);
                            if (dfu_descriptor != null)
                            {
                                dfu_devices.Add(new DfuDevice(devices[i], interface_descriptor, dfu_descriptor.Value));
                            }
                        }
                    }
                }
            }

            NativeMethods.libusb_free_device_list(list, 1);
            return(dfu_devices);
        }
Exemple #2
0
 internal static extern int libusb_get_device_descriptor(IntPtr dev, ref DeviceDescriptor desc);